diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0009-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0009-fusion_run_modeling_script.json new file mode 100644 index 0000000..b54d680 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0009-fusion_run_modeling_script.json @@ -0,0 +1,62 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"baseline\": [{\"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\", \"modified\": false, \"name\": \"Untitled\", \"saved\": false}], \"action\": \"begin\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"baseline\\\": [{\\\"creationId\\\": \\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\", \\\"modified\\\": false, \\\"name\\\": \\\"Untitled\\\", \\\"saved\\\": false}], \\\"action\\\": \\\"begin\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234197.3307214, + "mutating": true, + "stdout": "{\n \"_hint\": \"Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [\n {\n \"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"modified\": false,\n \"name\": \"Untitled\",\n \"saved\": false\n }\n ],\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 0,\n \"openDocumentCount\": 1,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1753,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234199.0915403, + "raw": { + "_hint": "Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [ + { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "modified": false, + "name": "Untitled", + "saved": false + } + ], + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 0, + "openDocumentCount": 1, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1753, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0010-fusion_mech_capabilities.json b/docs/mechanical-verification/cp8/ordinary/calls/0010-fusion_mech_capabilities.json new file mode 100644 index 0000000..b817369 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0010-fusion_mech_capabilities.json @@ -0,0 +1,6432 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_capabilities", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234199.0928245, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"durationMs\": 157,\n \"error\": \"\",\n \"idempotency\": {\n \"admission\": \"FULL SQLite commit before native dispatch\",\n \"capacity\": 10000,\n \"databaseByteLimit\": 67108864,\n \"recordByteLimit\": 4194304,\n \"restartBehavior\": \"old-session history is readable; native execution never replays across sessions\",\n \"scope\": \"durable history keyed by add-in session and operation ID\",\n \"storageVersion\": 1\n },\n \"operations\": {\n \"assembly_properties\": {\n \"description\": \"High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.\",\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"bom\": {\n \"description\": \"Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance. Includes exact current active configuration provenance; incomplete configuration scope refuses. Visibility does not remove quantity.\",\n \"properties\": {\n \"explodePurchased\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"bom_export\": {\n \"description\": \"Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions. Both CSV modes include document/revision and current active configuration table/row provenance.\",\n \"properties\": {\n \"explodePurchased\": {\n \"type\": \"boolean\"\n },\n \"filename\": {\n \"type\": \"string\"\n },\n \"mode\": {\n \"enum\": [\n \"flat\",\n \"structured\"\n ]\n },\n \"overwrite\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"filename\"\n ],\n \"type\": \"object\"\n },\n \"cad_import\": {\n \"description\": \"Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\n \"properties\": {\n \"asPurchased\": {\n \"type\": \"boolean\"\n },\n \"filename\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"parent\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"provenance\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"sourceUrl\": {\n \"type\": \"string\"\n },\n \"supplier\": {\n \"type\": \"string\"\n },\n \"supplierPartNumber\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"supplier\",\n \"supplierPartNumber\",\n \"sourceUrl\"\n ],\n \"type\": \"object\"\n },\n \"sha256\": {\n \"type\": \"string\"\n },\n \"transform\": {\n \"additionalProperties\": false,\n \"description\": \"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"axis\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"filename\",\n \"provenance\"\n ],\n \"type\": \"object\"\n },\n \"component_create\": {\n \"description\": \"Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\n \"properties\": {\n \"metadata\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"asPurchased\": {\n \"type\": \"boolean\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"excludeFromBom\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"partNumber\": {\n \"type\": \"string\"\n },\n \"sourceUrl\": {\n \"type\": \"string\"\n },\n \"supplier\": {\n \"type\": \"string\"\n },\n \"supplierPartNumber\": {\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"parent\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"transform\": {\n \"additionalProperties\": false,\n \"description\": \"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"axis\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"component_metadata\": {\n \"description\": \"Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.\",\n \"properties\": {\n \"changes\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"asPurchased\": {\n \"type\": \"boolean\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"excludeFromBom\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"partNumber\": {\n \"type\": \"string\"\n },\n \"sourceUrl\": {\n \"type\": \"string\"\n },\n \"supplier\": {\n \"type\": \"string\"\n },\n \"supplierPartNumber\": {\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"component\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"changes\"\n ],\n \"type\": \"object\"\n },\n \"configuration_inspect\": {\n \"description\": \"Read the loaded Design configuration graph without activation or recompute: ordinary rows, the separate native reserved test row, all supported typed cells including inactive/test cells, exact controlled-source links and current ordinary row. Unreadable fields and unknown/theme/hierarchical/inserted scopes remain explicit incomplete diagnostics. Configuration lifecycle and configured-design model mutations remain disabled pending native recovery/archive gates.\",\n \"properties\": {},\n \"required\": [\n \"op\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"construction_axis\": {\n \"description\": \"Create a parametric axis from native references (edge/circular face/two intersecting planes/two distinct points). Root-space external geometry requires exact occurrence context. For cross-component geometry into a non-root target component, creationOccurrence must identify a root-context instance of that target. Returns component-space native axis geometry/health. No direct-only infinite-line or preview snap APIs.\",\n \"properties\": {\n \"component\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"creationOccurrence\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entities\": {\n \"items\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 2,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"edge\",\n \"circular_face\",\n \"two_planes\",\n \"two_points\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"type\",\n \"entities\"\n ],\n \"type\": \"object\"\n },\n \"entity_delete\": {\n \"description\": \"Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.\",\n \"properties\": {\n \"entity\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"export\": {\n \"description\": \"Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.\",\n \"properties\": {\n \"format\": {\n \"default\": \"step\",\n \"enum\": [\n \"step\",\n \"stl\",\n \"3mf\",\n \"f3d\",\n \"iges\",\n \"sat\",\n \"smt\",\n \"usdz\",\n \"fbx\",\n \"skp\"\n ]\n },\n \"outputPath\": {\n \"type\": \"string\"\n },\n \"overwrite\": {\n \"default\": false,\n \"type\": \"boolean\"\n },\n \"refinement\": {\n \"default\": \"medium\",\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"outputPath\"\n ],\n \"type\": \"object\"\n },\n \"feature_create\": {\n \"description\": \"Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.\",\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"direction\": {\n \"enum\": [\n \"positive\",\n \"negative\",\n \"symmetric\"\n ]\n },\n \"distance\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"new_body\",\n \"join\",\n \"cut\",\n \"intersect\"\n ]\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"profiles\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"taper\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"extrude\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"profiles\",\n \"distance\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"new_body\",\n \"join\",\n \"cut\",\n \"intersect\"\n ]\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"profiles\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"revolve\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"profiles\",\n \"axis\",\n \"angle\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"edges\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"radius\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"tangentChain\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"fillet\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"edges\",\n \"radius\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"distance\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"edges\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"tangentChain\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"chamfer\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"edges\",\n \"distance\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"faces\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"tangentChain\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"thickness\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"type\": {\n \"enum\": [\n \"shell\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"faces\",\n \"thickness\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"depth\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"diameter\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"points\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"hole\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"points\",\n \"diameter\",\n \"depth\",\n \"bodies\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"new_body\",\n \"join\",\n \"cut\",\n \"intersect\"\n ]\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"profiles\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"loft\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"profiles\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"new_body\",\n \"join\",\n \"cut\",\n \"intersect\"\n ]\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"path\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"profiles\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"sweep\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"profiles\",\n \"path\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"body\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keepTools\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"join\",\n \"cut\",\n \"intersect\"\n ]\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"tools\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"combine\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"body\",\n \"tools\",\n \"operation\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"extend\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"split\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"bodies\",\n \"plane\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"axis\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"origin\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"translation\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"move\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"bodies\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"mirror\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"bodies\",\n \"plane\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"axis2\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"count\": {\n \"maximum\": 1000,\n \"minimum\": 2,\n \"type\": \"integer\"\n },\n \"count2\": {\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"spacing\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"spacing2\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"rectangular_pattern\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"bodies\",\n \"axis\",\n \"count\",\n \"spacing\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"bodies\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"count\": {\n \"maximum\": 1000,\n \"minimum\": 2,\n \"type\": \"integer\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"circular_pattern\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"bodies\",\n \"axis\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"faces\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"tangentChain\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"draft\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"faces\",\n \"plane\",\n \"angle\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"designation\": {\n \"type\": \"string\"\n },\n \"faces\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"internal\": {\n \"type\": \"boolean\"\n },\n \"modeled\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"documentId\": {\n \"type\": \"string\"\n },\n \"revision\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"threadClass\": {\n \"type\": \"string\"\n },\n \"threadType\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"thread\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"faces\",\n \"internal\",\n \"threadType\",\n \"designation\",\n \"threadClass\"\n ],\n \"type\": \"object\"\n }\n ],\n \"properties\": {\n \"angle\": {},\n \"axis\": {},\n \"axis2\": {},\n \"bodies\": {},\n \"body\": {},\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"count\": {},\n \"count2\": {},\n \"depth\": {},\n \"designation\": {},\n \"diameter\": {},\n \"direction\": {},\n \"distance\": {},\n \"edges\": {},\n \"extend\": {},\n \"faces\": {},\n \"internal\": {},\n \"keepTools\": {},\n \"modeled\": {},\n \"name\": {\n \"type\": \"string\"\n },\n \"operation\": {},\n \"origin\": {},\n \"path\": {},\n \"plane\": {},\n \"points\": {},\n \"profiles\": {},\n \"radius\": {},\n \"spacing\": {},\n \"spacing2\": {},\n \"tangentChain\": {},\n \"taper\": {},\n \"thickness\": {},\n \"threadClass\": {},\n \"threadType\": {},\n \"tools\": {},\n \"translation\": {},\n \"type\": {\n \"enum\": [\n \"extrude\",\n \"revolve\",\n \"fillet\",\n \"chamfer\",\n \"shell\",\n \"hole\",\n \"loft\",\n \"sweep\",\n \"combine\",\n \"split\",\n \"move\",\n \"mirror\",\n \"rectangular_pattern\",\n \"circular_pattern\",\n \"draft\",\n \"thread\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"feature_edit\": {\n \"description\": \"Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.\",\n \"properties\": {\n \"feature\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"parameters\": {\n \"additionalProperties\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"feature\"\n ],\n \"type\": \"object\"\n },\n \"geometry_query\": {\n \"description\": \"Complete body-scoped topology query, no arbitrary first-match selection. selection one (default) refuses zero/multiple matches; many may return empty. Geometry types are exact native types; size ranges inclusive in mm/mm2, near is minimum distance in the explicit frame; direction is outward planar face normal or linear edge tangent. Returned refs retain instance context even for component-space filters. Exceeding maxResults fails rather than truncating.\",\n \"properties\": {\n \"body\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"filters\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"area\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"max\": {\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"min\": {\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"direction\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"orientation\": {\n \"enum\": [\n \"same\",\n \"parallel\"\n ]\n },\n \"tolerance\": {\n \"maximum\": 90,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"vector\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"vector\"\n ],\n \"type\": \"object\"\n },\n \"length\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"max\": {\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"min\": {\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"near\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"point\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"tolerance\": {\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"point\",\n \"tolerance\"\n ],\n \"type\": \"object\"\n },\n \"radius\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"max\": {\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"min\": {\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"Plane\",\n \"Cylinder\",\n \"Cone\",\n \"Sphere\",\n \"Torus\",\n \"NurbsSurface\",\n \"Line3D\",\n \"Arc3D\",\n \"Circle3D\",\n \"Ellipse3D\",\n \"EllipticalArc3D\",\n \"NurbsCurve3D\",\n \"Point3D\",\n \"degenerate\"\n ]\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"kind\": {\n \"enum\": [\n \"faces\",\n \"edges\",\n \"vertices\"\n ]\n },\n \"maxResults\": {\n \"maximum\": 1024,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"selection\": {\n \"enum\": [\n \"one\",\n \"many\"\n ]\n },\n \"space\": {\n \"enum\": [\n \"root\",\n \"component\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"body\",\n \"kind\",\n \"space\"\n ],\n \"type\": \"object\"\n },\n \"health\": {\n \"description\": \"Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.\",\n \"properties\": {\n \"recompute\": {\n \"default\": false,\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"inspect\": {\n \"description\": \"Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.\",\n \"properties\": {},\n \"required\": [\n \"op\"\n ],\n \"type\": \"object\"\n },\n \"inspect_entity\": {\n \"properties\": {\n \"entity\": {\n \"description\": \"Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"interference\": {\n \"description\": \"Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.\",\n \"properties\": {\n \"entities\": {\n \"items\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"includeTouching\": {\n \"type\": \"boolean\"\n },\n \"volumeTolerance\": {\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"entities\"\n ],\n \"type\": \"object\"\n },\n \"joint_create\": {\n \"description\": \"Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Use regular_joint_create for geometry-solving placement.\",\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"rigid\"\n ]\n }\n },\n \"required\": [\n \"type\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"revolute\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"slider\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"cylindrical\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"slideAxis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"pin_slot\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"primarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"primarySlideValue\": {\n \"type\": \"number\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"secondarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"secondarySlideValue\": {\n \"type\": \"number\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"planar\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"pitchLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"pitchValue\": {\n \"type\": \"number\"\n },\n \"rollLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rollValue\": {\n \"type\": \"number\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"target\": {\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"ball\"\n ]\n },\n \"yawLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"yawValue\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"type\",\n \"geometry\"\n ],\n \"type\": \"object\"\n }\n ],\n \"properties\": {\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrenceOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"occurrenceTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"pitchLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"pitchValue\": {\n \"type\": \"number\"\n },\n \"primarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"primarySlideValue\": {\n \"type\": \"number\"\n },\n \"rollLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rollValue\": {\n \"type\": \"number\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"secondarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"secondarySlideValue\": {\n \"type\": \"number\"\n },\n \"slideAxis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"type\": {\n \"enum\": [\n \"rigid\",\n \"revolute\",\n \"slider\",\n \"cylindrical\",\n \"pin_slot\",\n \"planar\",\n \"ball\"\n ]\n },\n \"yawLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"yawValue\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"type\",\n \"occurrenceOne\",\n \"occurrenceTwo\"\n ],\n \"type\": \"object\"\n },\n \"joint_delete\": {\n \"description\": \"Delete one selected Joint or AsBuiltJoint with recovery verification.\",\n \"properties\": {\n \"joint\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"joint\"\n ],\n \"type\": \"object\"\n },\n \"joint_edit\": {\n \"description\": \"Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery. For driven root joints, active motion links must preserve their settings and their partner motion must follow the native ratio; a coupling mismatch aborts.\",\n \"properties\": {\n \"joint\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"pitchLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"pitchValue\": {\n \"type\": \"number\"\n },\n \"primarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"primarySlideValue\": {\n \"type\": \"number\"\n },\n \"rollLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rollValue\": {\n \"type\": \"number\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"secondarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"secondarySlideValue\": {\n \"type\": \"number\"\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"yawLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"yawValue\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"joint\"\n ],\n \"type\": \"object\"\n },\n \"joint_origin_create\": {\n \"description\": \"Create a native component-definition joint origin from guarded native geometry, with mm offsets/deg angle and optional straight axis references. Child occurrence origin references are exposed by inspect_entity(occurrence).\",\n \"properties\": {\n \"angle\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"component\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"flipped\": {\n \"type\": \"boolean\"\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"offsetX\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetY\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetZ\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"xAxisEntity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"zAxisEntity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"geometry\"\n ],\n \"type\": \"object\"\n },\n \"joint_origin_delete\": {\n \"description\": \"Delete a native joint origin; unhealthy downstream joints cause transaction rollback.\",\n \"properties\": {\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"origin\"\n ],\n \"type\": \"object\"\n },\n \"joint_origin_edit\": {\n \"description\": \"Edit a native joint origin definition; rolls before its timeline item and restores the original marker in finally. Recomputes and verifies attachment, axes, offsets, angle, name and flip.\",\n \"properties\": {\n \"angle\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"flipped\": {\n \"type\": \"boolean\"\n },\n \"geometry\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"offsetX\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetY\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetZ\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"xAxisEntity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"zAxisEntity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"origin\"\n ],\n \"type\": \"object\"\n },\n \"material_assign\": {\n \"description\": \"Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.\",\n \"properties\": {\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"libraryId\": {\n \"type\": \"string\"\n },\n \"materialId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"entity\",\n \"materialId\"\n ],\n \"type\": \"object\"\n },\n \"material_list\": {\n \"description\": \"List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.\",\n \"properties\": {\n \"libraryId\": {\n \"type\": \"string\"\n },\n \"limit\": {\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"query\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"op\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"mcmaster_discover\": {\n \"description\": \"Discover Fusion native Insert McMaster-Carr command and requirements in the active design.\",\n \"properties\": {},\n \"required\": [\n \"op\"\n ],\n \"type\": \"object\"\n },\n \"mcmaster_open\": {\n \"description\": \"Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.\",\n \"properties\": {},\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"measure\": {\n \"description\": \"Native engineering minimum distance or angle in root assembly space. Non-root definition refs require an occurrence context. Distance needs2 entities; angle needs2 lines/planes or3 points (second apex). Returns mm/deg and native witness positions in root mm. witnessValidation identifies native points or native geometry directions used for valid parallel angles with degenerate native points; degenerate point angles and unavailable/inconsistent witnesses fail.\",\n \"properties\": {\n \"entities\": {\n \"items\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"space\": {\n \"enum\": [\n \"root\"\n ]\n },\n \"type\": {\n \"enum\": [\n \"distance\",\n \"angle\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"type\",\n \"space\",\n \"entities\"\n ],\n \"type\": \"object\"\n },\n \"motion_link_create\": {\n \"description\": \"Create a native motion link between two root-owned joints, or two different motions of jointOne when jointTwo is omitted. Positive ratio magnitudes use mm for translation and deg for rotation; reversed selects opposite direction. Requires the November 2025+ API; no script fallback.\",\n \"properties\": {\n \"jointOne\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"jointTwo\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"motionOne\": {\n \"enum\": [\n \"rotation\",\n \"slide\",\n \"primarySlide\",\n \"secondarySlide\",\n \"pitch\",\n \"roll\",\n \"yaw\"\n ]\n },\n \"motionTwo\": {\n \"enum\": [\n \"rotation\",\n \"slide\",\n \"primarySlide\",\n \"secondarySlide\",\n \"pitch\",\n \"roll\",\n \"yaw\"\n ]\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"reversed\": {\n \"type\": \"boolean\"\n },\n \"valueOne\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"valueTwo\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"jointOne\",\n \"motionOne\",\n \"motionTwo\",\n \"valueOne\",\n \"valueTwo\"\n ],\n \"type\": \"object\"\n },\n \"motion_link_delete\": {\n \"description\": \"Delete a root-owned motion link under the same transaction/recovery contract.\",\n \"properties\": {\n \"link\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"link\"\n ],\n \"type\": \"object\"\n },\n \"motion_link_edit\": {\n \"description\": \"Edit a root-owned motion link ratio, degree-of-freedom pair, direction, name or suppression. Joint membership is immutable; recreate the link to change members. Verify exact joint identities, ratio, flags and health.\",\n \"properties\": {\n \"link\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"motionOne\": {\n \"enum\": [\n \"rotation\",\n \"slide\",\n \"primarySlide\",\n \"secondarySlide\",\n \"pitch\",\n \"roll\",\n \"yaw\"\n ]\n },\n \"motionTwo\": {\n \"enum\": [\n \"rotation\",\n \"slide\",\n \"primarySlide\",\n \"secondarySlide\",\n \"pitch\",\n \"roll\",\n \"yaw\"\n ]\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"reversed\": {\n \"type\": \"boolean\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n },\n \"valueOne\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"valueTwo\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"link\"\n ],\n \"type\": \"object\"\n },\n \"new_design\": {\n \"description\": \"Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.\",\n \"properties\": {\n \"box\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"depth\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n },\n \"height\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n },\n \"width\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"width\",\n \"height\",\n \"depth\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\"\n ],\n \"type\": \"object\"\n },\n \"occurrence_delete\": {\n \"description\": \"Delete one selected occurrence through the shared transaction executor.\",\n \"properties\": {\n \"occurrence\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"occurrence\"\n ],\n \"type\": \"object\"\n },\n \"occurrence_insert\": {\n \"description\": \"Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\n \"properties\": {\n \"component\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"independentCopy\": {\n \"type\": \"boolean\"\n },\n \"parent\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"transform\": {\n \"additionalProperties\": false,\n \"description\": \"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"axis\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"component\"\n ],\n \"type\": \"object\"\n },\n \"occurrence_update\": {\n \"description\": \"Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.\",\n \"properties\": {\n \"grounded\": {\n \"type\": \"boolean\"\n },\n \"groundedToParent\": {\n \"type\": \"boolean\"\n },\n \"occurrence\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"transform\": {\n \"additionalProperties\": false,\n \"description\": \"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"axis\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 3,\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"occurrence\"\n ],\n \"type\": \"object\"\n },\n \"parameter_batch\": {\n \"description\": \"Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.\",\n \"properties\": {\n \"changes\": {\n \"items\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"create\"\n ]\n },\n \"comment\": {\n \"type\": \"string\"\n },\n \"expression\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"unit\": {\n \"enum\": [\n \"mm\",\n \"deg\",\n \"kg\",\n \"\"\n ]\n }\n },\n \"required\": [\n \"action\",\n \"name\",\n \"expression\",\n \"unit\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"set\"\n ]\n },\n \"expression\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"action\",\n \"name\",\n \"expression\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"action\",\n \"name\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"maxItems\": 128,\n \"minItems\": 1,\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"changes\"\n ],\n \"type\": \"object\"\n },\n \"parameter_create\": {\n \"properties\": {\n \"comment\": {\n \"type\": \"string\"\n },\n \"expression\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"unit\": {\n \"enum\": [\n \"mm\",\n \"deg\",\n \"kg\",\n \"\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"name\",\n \"expression\",\n \"unit\"\n ],\n \"type\": \"object\"\n },\n \"parameter_set\": {\n \"description\": \"Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.\",\n \"properties\": {\n \"expression\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"name\",\n \"expression\"\n ],\n \"type\": \"object\"\n },\n \"plane_create\": {\n \"description\": \"Create offset plane (offset in mm) or angled plane around axis (angle in deg).\",\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"offset\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"offset\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"required\": [\n \"documentId\",\n \"revision\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"angle\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"axis\",\n \"angle\"\n ],\n \"type\": \"object\"\n }\n ],\n \"properties\": {\n \"angle\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"type\": {\n \"enum\": [\n \"offset\",\n \"angle\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"regular_joint_create\": {\n \"description\": \"Create a geometry-solving regular joint in the root component using two distinct instance-context attachments or joint origins. All seven native motion families; offsets mm, angle and angular limits deg. Read back freshly resolved attachment graph, native parameters and root-space occurrence placement. Root/non-root sides must be unambiguous; both grounded and ancestor/descendant pairs are refused. Inferred joints are unsupported. Existing pending positions must be captured or reverted first. Before applying drive values, checks native joint-transform anchor offset magnitude/axiality and zero-angle axis collinearity. Native joint matrices have explicit provenance; physical angle/flip sense requires independent occurrence-geometry acceptance.\",\n \"properties\": {\n \"angle\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"flipped\": {\n \"type\": \"boolean\"\n },\n \"geometryOne\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"origin\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"geometryTwo\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"origin\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"locked\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"pitchLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"pitchValue\": {\n \"type\": \"number\"\n },\n \"primarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"primarySlideValue\": {\n \"type\": \"number\"\n },\n \"rollLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rollValue\": {\n \"type\": \"number\"\n },\n \"rotationLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"rotationValue\": {\n \"type\": \"number\"\n },\n \"secondarySlideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"secondarySlideValue\": {\n \"type\": \"number\"\n },\n \"slideAxis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"slideLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"slideValue\": {\n \"type\": \"number\"\n },\n \"type\": {\n \"enum\": [\n \"rigid\",\n \"revolute\",\n \"slider\",\n \"cylindrical\",\n \"pin_slot\",\n \"planar\",\n \"ball\"\n ]\n },\n \"yawLimits\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"maximum\": {\n \"type\": \"number\"\n },\n \"maximumEnabled\": {\n \"type\": \"boolean\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"minimumEnabled\": {\n \"type\": \"boolean\"\n },\n \"rest\": {\n \"type\": \"number\"\n },\n \"restEnabled\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"yawValue\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"type\",\n \"geometryOne\",\n \"geometryTwo\"\n ],\n \"type\": \"object\"\n },\n \"regular_joint_edit\": {\n \"description\": \"Redefine root-owned regular joint geometry, motion family, offsets, angle, flip or lock. Restore timeline in finally and verify after recompute. Use joint_edit for name, suppression, limits and drive values; joint_delete for deletion.\",\n \"properties\": {\n \"angle\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"axis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"flipped\": {\n \"type\": \"boolean\"\n },\n \"geometryOne\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"origin\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"geometryTwo\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"edge\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"keyPoint\": {\n \"enum\": [\n \"center\",\n \"start\",\n \"middle\",\n \"end\"\n ]\n }\n },\n \"required\": [\n \"entity\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"origin\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"origin\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"joint\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"locked\": {\n \"type\": \"boolean\"\n },\n \"offset\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetX\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"offsetY\": {\n \"description\": \"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"maxLength\": 512,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n ]\n },\n \"slideAxis\": {\n \"enum\": [\n \"x\",\n \"y\",\n \"z\"\n ]\n },\n \"type\": {\n \"enum\": [\n \"rigid\",\n \"revolute\",\n \"slider\",\n \"cylindrical\",\n \"pin_slot\",\n \"planar\",\n \"ball\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"joint\"\n ],\n \"type\": \"object\"\n },\n \"rigid_group_create\": {\n \"description\": \"Create a native rigid group from exact occurrence instances; includeChildren defaults true.\",\n \"properties\": {\n \"includeChildren\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"occurrences\": {\n \"items\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 2,\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"occurrences\"\n ],\n \"type\": \"object\"\n },\n \"rigid_group_delete\": {\n \"description\": \"Delete an exact rigid group with transaction recovery.\",\n \"properties\": {\n \"group\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"group\"\n ],\n \"type\": \"object\"\n },\n \"rigid_group_edit\": {\n \"description\": \"Rename or suppress an exact rigid group with transaction recovery.\",\n \"properties\": {\n \"group\": {\n \"description\": \"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"suppressed\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"group\"\n ],\n \"type\": \"object\"\n },\n \"sketch_constraint\": {\n \"description\": \"Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.\",\n \"properties\": {\n \"entities\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sketch\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"horizontal\",\n \"vertical\",\n \"coincident\",\n \"parallel\",\n \"perpendicular\",\n \"tangent\",\n \"equal\",\n \"concentric\",\n \"collinear\",\n \"midpoint\",\n \"symmetry\",\n \"fix\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"sketch\",\n \"type\",\n \"entities\"\n ],\n \"type\": \"object\"\n },\n \"sketch_create\": {\n \"description\": \"Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.\",\n \"properties\": {\n \"component\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"plane\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"xy\",\n \"xz\",\n \"yz\"\n ]\n },\n {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\"\n ],\n \"type\": \"object\"\n },\n \"sketch_curve_edit\": {\n \"description\": \"Edit one native sketch curve with sketch-space mm pick. trim removes the nearest segment; extend chooses nearest endpoint; split requires an interior on-curve point; break uses neighboring intersections. Fresh replacement refs are returned; original may be deleted. In-place extend returns the original with a fresh ref only after its geometry change survives recompute. No change or empty break/split fails. Full trim deletion requires allowDelete true. Linked/derived/deferred-compute geometry refused.\",\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"trim\",\n \"extend\",\n \"split\",\n \"break\"\n ]\n },\n \"allowDelete\": {\n \"type\": \"boolean\"\n },\n \"createConstraints\": {\n \"type\": \"boolean\"\n },\n \"curve\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"pick\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"sketch\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"sketch\",\n \"curve\",\n \"action\",\n \"pick\"\n ],\n \"type\": \"object\"\n },\n \"sketch_diagnostics\": {\n \"description\": \"Read native sketch health/message, fully-constrained/fixed/linked/reference flags, geometric constraints and driving dimensions. Reports no solver DOF count or conflict-set explanation; no recompute/mutation.\",\n \"properties\": {\n \"sketch\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sketch\"\n ],\n \"type\": \"object\"\n },\n \"sketch_dimension\": {\n \"description\": \"Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.\",\n \"properties\": {\n \"entities\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"expression\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"parameterName\": {\n \"type\": \"string\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"sketch\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"distance\",\n \"horizontal\",\n \"vertical\",\n \"radius\",\n \"diameter\",\n \"angle\"\n ]\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"sketch\",\n \"type\",\n \"entities\",\n \"expression\",\n \"position\"\n ],\n \"type\": \"object\"\n },\n \"sketch_edit\": {\n \"description\": \"Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.\",\n \"properties\": {\n \"changes\": {\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"properties\": {\n \"center\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"end\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"fixed\": {\n \"type\": \"boolean\"\n },\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"radius\": {\n \"type\": \"number\"\n },\n \"start\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"entity\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"sketch\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"sketch\",\n \"entity\",\n \"changes\"\n ],\n \"type\": \"object\"\n },\n \"sketch_geometry\": {\n \"description\": \"Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.\",\n \"properties\": {\n \"items\": {\n \"items\": {\n \"oneOf\": [\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"position\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"point\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"position\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"end\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"start\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"line\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"start\",\n \"end\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"end\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"start\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"rectangle\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"start\",\n \"end\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"center\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"radius\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n },\n \"type\": {\n \"enum\": [\n \"circle\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"center\",\n \"radius\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"center\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"start\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"sweep\": {\n \"type\": \"number\"\n },\n \"type\": {\n \"enum\": [\n \"arc\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"center\",\n \"start\",\n \"sweep\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"angle\": {\n \"type\": \"number\"\n },\n \"center\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"radius\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n },\n \"sides\": {\n \"maximum\": 128,\n \"minimum\": 3,\n \"type\": \"integer\"\n },\n \"type\": {\n \"enum\": [\n \"polygon\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"center\",\n \"radius\",\n \"sides\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"end\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"start\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"slot\"\n ]\n },\n \"width\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"type\",\n \"start\",\n \"end\",\n \"width\"\n ],\n \"type\": \"object\"\n },\n {\n \"additionalProperties\": false,\n \"properties\": {\n \"closed\": {\n \"type\": \"boolean\"\n },\n \"construction\": {\n \"type\": \"boolean\"\n },\n \"points\": {\n \"items\": {\n \"items\": {\n \"type\": \"number\"\n },\n \"maxItems\": 3,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"maxItems\": 128,\n \"minItems\": 2,\n \"type\": \"array\"\n },\n \"type\": {\n \"enum\": [\n \"spline\"\n ]\n }\n },\n \"required\": [\n \"type\",\n \"points\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"maxItems\": 128,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sketch\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"sketch\",\n \"items\"\n ],\n \"type\": \"object\"\n },\n \"sketch_offset\": {\n \"description\": \"Modern createOffsetInput/addOffset2. Curves must be native 2D, unique, in connected flow order (never reordered). Nonzero signed mm number/expression: positive right, negative left; a single circle/ellipse positive outside. Topology matched defaults true. Read back native signed distance, parent/child refs and controlling parameter after recompute. No retired Sketch.offset fallback.\",\n \"properties\": {\n \"curves\": {\n \"items\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"distance\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n \"sketch\": {\n \"description\": \"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"topologyMatched\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"op\",\n \"target\",\n \"sessionId\",\n \"operationId\",\n \"sketch\",\n \"curves\",\n \"distance\"\n ],\n \"type\": \"object\"\n },\n \"sketch_project\": {\n \"description\": \"Project selected topology into a sketch with Fusion associative projection.\",\n \"properties\": {\n \"entities\": {\n \"items\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": 256,\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"sketch\": {\n \"description\": \"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\n \"required\": [\n \"documentId\",\n \"revision\",\n \"objectType\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\",\n \"sketch\",\n \"entities\"\n ],\n \"type\": \"object\"\n },\n \"transaction_probe\": {\n \"description\": \"Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.\",\n \"properties\": {},\n \"required\": [\n \"op\",\n \"sessionId\",\n \"operationId\",\n \"target\"\n ],\n \"type\": \"object\"\n }\n },\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"idempotency\\\":{\\\"admission\\\":\\\"FULL SQLite commit before native dispatch\\\",\\\"capacity\\\":10000,\\\"databaseByteLimit\\\":67108864,\\\"recordByteLimit\\\":4194304,\\\"restartBehavior\\\":\\\"old-session history is readable; native execution never replays across sessions\\\",\\\"scope\\\":\\\"durable history keyed by add-in session and operation ID\\\",\\\"storageVersion\\\":1},\\\"operations\\\":{\\\"assembly_properties\\\":{\\\"description\\\":\\\"High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.\\\",\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"bom\\\":{\\\"description\\\":\\\"Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance. Includes exact current active configuration provenance; incomplete configuration scope refuses. Visibility does not remove quantity.\\\",\\\"properties\\\":{\\\"explodePurchased\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"bom_export\\\":{\\\"description\\\":\\\"Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions. Both CSV modes include document/revision and current active configuration table/row provenance.\\\",\\\"properties\\\":{\\\"explodePurchased\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"filename\\\":{\\\"type\\\":\\\"string\\\"},\\\"mode\\\":{\\\"enum\\\":[\\\"flat\\\",\\\"structured\\\"]},\\\"overwrite\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"filename\\\"],\\\"type\\\":\\\"object\\\"},\\\"cad_import\\\":{\\\"description\\\":\\\"Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\\\",\\\"properties\\\":{\\\"asPurchased\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"filename\\\":{\\\"type\\\":\\\"string\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"parent\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"provenance\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"description\\\":{\\\"type\\\":\\\"string\\\"},\\\"sourceUrl\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplier\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplierPartNumber\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"supplier\\\",\\\"supplierPartNumber\\\",\\\"sourceUrl\\\"],\\\"type\\\":\\\"object\\\"},\\\"sha256\\\":{\\\"type\\\":\\\"string\\\"},\\\"transform\\\":{\\\"additionalProperties\\\":false,\\\"description\\\":\\\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"axis\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"filename\\\",\\\"provenance\\\"],\\\"type\\\":\\\"object\\\"},\\\"component_create\\\":{\\\"description\\\":\\\"Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\\\",\\\"properties\\\":{\\\"metadata\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"asPurchased\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"description\\\":{\\\"type\\\":\\\"string\\\"},\\\"excludeFromBom\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"partNumber\\\":{\\\"type\\\":\\\"string\\\"},\\\"sourceUrl\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplier\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplierPartNumber\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"parent\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"transform\\\":{\\\"additionalProperties\\\":false,\\\"description\\\":\\\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"axis\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"name\\\"],\\\"type\\\":\\\"object\\\"},\\\"component_metadata\\\":{\\\"description\\\":\\\"Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.\\\",\\\"properties\\\":{\\\"changes\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"asPurchased\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"description\\\":{\\\"type\\\":\\\"string\\\"},\\\"excludeFromBom\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"partNumber\\\":{\\\"type\\\":\\\"string\\\"},\\\"sourceUrl\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplier\\\":{\\\"type\\\":\\\"string\\\"},\\\"supplierPartNumber\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"component\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"changes\\\"],\\\"type\\\":\\\"object\\\"},\\\"configuration_inspect\\\":{\\\"description\\\":\\\"Read the loaded Design configuration graph without activation or recompute: ordinary rows, the separate native reserved test row, all supported typed cells including inactive/test cells, exact controlled-source links and current ordinary row. Unreadable fields and unknown/theme/hierarchical/inserted scopes remain explicit incomplete diagnostics. Configuration lifecycle and configured-design model mutations remain disabled pending native recovery/archive gates.\\\",\\\"properties\\\":{},\\\"required\\\":[\\\"op\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"construction_axis\\\":{\\\"description\\\":\\\"Create a parametric axis from native references (edge/circular face/two intersecting planes/two distinct points). Root-space external geometry requires exact occurrence context. For cross-component geometry into a non-root target component, creationOccurrence must identify a root-context instance of that target. Returns component-space native axis geometry/health. No direct-only infinite-line or preview snap APIs.\\\",\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"creationOccurrence\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":2,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"edge\\\",\\\"circular_face\\\",\\\"two_planes\\\",\\\"two_points\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"type\\\",\\\"entities\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity_delete\\\":{\\\"description\\\":\\\"Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.\\\",\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"export\\\":{\\\"description\\\":\\\"Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.\\\",\\\"properties\\\":{\\\"format\\\":{\\\"default\\\":\\\"step\\\",\\\"enum\\\":[\\\"step\\\",\\\"stl\\\",\\\"3mf\\\",\\\"f3d\\\",\\\"iges\\\",\\\"sat\\\",\\\"smt\\\",\\\"usdz\\\",\\\"fbx\\\",\\\"skp\\\"]},\\\"outputPath\\\":{\\\"type\\\":\\\"string\\\"},\\\"overwrite\\\":{\\\"default\\\":false,\\\"type\\\":\\\"boolean\\\"},\\\"refinement\\\":{\\\"default\\\":\\\"medium\\\",\\\"enum\\\":[\\\"low\\\",\\\"medium\\\",\\\"high\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"outputPath\\\"],\\\"type\\\":\\\"object\\\"},\\\"feature_create\\\":{\\\"description\\\":\\\"Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.\\\",\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"direction\\\":{\\\"enum\\\":[\\\"positive\\\",\\\"negative\\\",\\\"symmetric\\\"]},\\\"distance\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{\\\"enum\\\":[\\\"new_body\\\",\\\"join\\\",\\\"cut\\\",\\\"intersect\\\"]},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"profiles\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"taper\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"extrude\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"profiles\\\",\\\"distance\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{\\\"enum\\\":[\\\"new_body\\\",\\\"join\\\",\\\"cut\\\",\\\"intersect\\\"]},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"profiles\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"revolve\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"profiles\\\",\\\"axis\\\",\\\"angle\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"edges\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"radius\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"tangentChain\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"fillet\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"edges\\\",\\\"radius\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"distance\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"edges\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"tangentChain\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"chamfer\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"edges\\\",\\\"distance\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"faces\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"tangentChain\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"thickness\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"type\\\":{\\\"enum\\\":[\\\"shell\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"faces\\\",\\\"thickness\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"depth\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"diameter\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"points\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"hole\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"points\\\",\\\"diameter\\\",\\\"depth\\\",\\\"bodies\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{\\\"enum\\\":[\\\"new_body\\\",\\\"join\\\",\\\"cut\\\",\\\"intersect\\\"]},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"profiles\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"loft\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"profiles\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{\\\"enum\\\":[\\\"new_body\\\",\\\"join\\\",\\\"cut\\\",\\\"intersect\\\"]},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"path\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"profiles\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"sweep\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"profiles\\\",\\\"path\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"body\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keepTools\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{\\\"enum\\\":[\\\"join\\\",\\\"cut\\\",\\\"intersect\\\"]},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"tools\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"combine\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"body\\\",\\\"tools\\\",\\\"operation\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"extend\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"split\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"bodies\\\",\\\"plane\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"axis\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"origin\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"translation\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"move\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"bodies\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"mirror\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"bodies\\\",\\\"plane\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"axis2\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"count\\\":{\\\"maximum\\\":1000,\\\"minimum\\\":2,\\\"type\\\":\\\"integer\\\"},\\\"count2\\\":{\\\"maximum\\\":1000,\\\"minimum\\\":1,\\\"type\\\":\\\"integer\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"spacing\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"spacing2\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"rectangular_pattern\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"bodies\\\",\\\"axis\\\",\\\"count\\\",\\\"spacing\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"bodies\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"count\\\":{\\\"maximum\\\":1000,\\\"minimum\\\":2,\\\"type\\\":\\\"integer\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"circular_pattern\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"bodies\\\",\\\"axis\\\",\\\"count\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"faces\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"tangentChain\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"draft\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"faces\\\",\\\"plane\\\",\\\"angle\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"designation\\\":{\\\"type\\\":\\\"string\\\"},\\\"faces\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"internal\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"modeled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"documentId\\\":{\\\"type\\\":\\\"string\\\"},\\\"revision\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"threadClass\\\":{\\\"type\\\":\\\"string\\\"},\\\"threadType\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"thread\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"faces\\\",\\\"internal\\\",\\\"threadType\\\",\\\"designation\\\",\\\"threadClass\\\"],\\\"type\\\":\\\"object\\\"}],\\\"properties\\\":{\\\"angle\\\":{},\\\"axis\\\":{},\\\"axis2\\\":{},\\\"bodies\\\":{},\\\"body\\\":{},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"count\\\":{},\\\"count2\\\":{},\\\"depth\\\":{},\\\"designation\\\":{},\\\"diameter\\\":{},\\\"direction\\\":{},\\\"distance\\\":{},\\\"edges\\\":{},\\\"extend\\\":{},\\\"faces\\\":{},\\\"internal\\\":{},\\\"keepTools\\\":{},\\\"modeled\\\":{},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"operation\\\":{},\\\"origin\\\":{},\\\"path\\\":{},\\\"plane\\\":{},\\\"points\\\":{},\\\"profiles\\\":{},\\\"radius\\\":{},\\\"spacing\\\":{},\\\"spacing2\\\":{},\\\"tangentChain\\\":{},\\\"taper\\\":{},\\\"thickness\\\":{},\\\"threadClass\\\":{},\\\"threadType\\\":{},\\\"tools\\\":{},\\\"translation\\\":{},\\\"type\\\":{\\\"enum\\\":[\\\"extrude\\\",\\\"revolve\\\",\\\"fillet\\\",\\\"chamfer\\\",\\\"shell\\\",\\\"hole\\\",\\\"loft\\\",\\\"sweep\\\",\\\"combine\\\",\\\"split\\\",\\\"move\\\",\\\"mirror\\\",\\\"rectangular_pattern\\\",\\\"circular_pattern\\\",\\\"draft\\\",\\\"thread\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"type\\\"],\\\"type\\\":\\\"object\\\"},\\\"feature_edit\\\":{\\\"description\\\":\\\"Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.\\\",\\\"properties\\\":{\\\"feature\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"parameters\\\":{\\\"additionalProperties\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":\\\"object\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"feature\\\"],\\\"type\\\":\\\"object\\\"},\\\"geometry_query\\\":{\\\"description\\\":\\\"Complete body-scoped topology query, no arbitrary first-match selection. selection one (default) refuses zero/multiple matches; many may return empty. Geometry types are exact native types; size ranges inclusive in mm/mm2, near is minimum distance in the explicit frame; direction is outward planar face normal or linear edge tangent. Returned refs retain instance context even for component-space filters. Exceeding maxResults fails rather than truncating.\\\",\\\"properties\\\":{\\\"body\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"filters\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"area\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"max\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"min\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"direction\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"orientation\\\":{\\\"enum\\\":[\\\"same\\\",\\\"parallel\\\"]},\\\"tolerance\\\":{\\\"maximum\\\":90,\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"vector\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[\\\"vector\\\"],\\\"type\\\":\\\"object\\\"},\\\"length\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"max\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"min\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"near\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"point\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"tolerance\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"point\\\",\\\"tolerance\\\"],\\\"type\\\":\\\"object\\\"},\\\"radius\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"max\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"min\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"Plane\\\",\\\"Cylinder\\\",\\\"Cone\\\",\\\"Sphere\\\",\\\"Torus\\\",\\\"NurbsSurface\\\",\\\"Line3D\\\",\\\"Arc3D\\\",\\\"Circle3D\\\",\\\"Ellipse3D\\\",\\\"EllipticalArc3D\\\",\\\"NurbsCurve3D\\\",\\\"Point3D\\\",\\\"degenerate\\\"]}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"kind\\\":{\\\"enum\\\":[\\\"faces\\\",\\\"edges\\\",\\\"vertices\\\"]},\\\"maxResults\\\":{\\\"maximum\\\":1024,\\\"minimum\\\":1,\\\"type\\\":\\\"integer\\\"},\\\"selection\\\":{\\\"enum\\\":[\\\"one\\\",\\\"many\\\"]},\\\"space\\\":{\\\"enum\\\":[\\\"root\\\",\\\"component\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"body\\\",\\\"kind\\\",\\\"space\\\"],\\\"type\\\":\\\"object\\\"},\\\"health\\\":{\\\"description\\\":\\\"Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.\\\",\\\"properties\\\":{\\\"recompute\\\":{\\\"default\\\":false,\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"inspect\\\":{\\\"description\\\":\\\"Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.\\\",\\\"properties\\\":{},\\\"required\\\":[\\\"op\\\"],\\\"type\\\":\\\"object\\\"},\\\"inspect_entity\\\":{\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.\\\",\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"interference\\\":{\\\"description\\\":\\\"Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.\\\",\\\"properties\\\":{\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"includeTouching\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"volumeTolerance\\\":{\\\"minimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"entities\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_create\\\":{\\\"description\\\":\\\"Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Use regular_joint_create for geometry-solving placement.\\\",\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"rigid\\\"]}},\\\"required\\\":[\\\"type\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"revolute\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"slider\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"cylindrical\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"slideAxis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"pin_slot\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"primarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"primarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"secondarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"secondarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"planar\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"pitchLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"pitchValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rollLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rollValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"target\\\":{\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"ball\\\"]},\\\"yawLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"yawValue\\\":{\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"type\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"}],\\\"properties\\\":{\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrenceOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrenceTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"pitchLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"pitchValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"primarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"primarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rollLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rollValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"secondarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"secondarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"slideAxis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"rigid\\\",\\\"revolute\\\",\\\"slider\\\",\\\"cylindrical\\\",\\\"pin_slot\\\",\\\"planar\\\",\\\"ball\\\"]},\\\"yawLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"yawValue\\\":{\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"type\\\",\\\"occurrenceOne\\\",\\\"occurrenceTwo\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_delete\\\":{\\\"description\\\":\\\"Delete one selected Joint or AsBuiltJoint with recovery verification.\\\",\\\"properties\\\":{\\\"joint\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"joint\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_edit\\\":{\\\"description\\\":\\\"Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery. For driven root joints, active motion links must preserve their settings and their partner motion must follow the native ratio; a coupling mismatch aborts.\\\",\\\"properties\\\":{\\\"joint\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"pitchLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"pitchValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"primarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"primarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rollLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rollValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"secondarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"secondarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"yawLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"yawValue\\\":{\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"joint\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_origin_create\\\":{\\\"description\\\":\\\"Create a native component-definition joint origin from guarded native geometry, with mm offsets/deg angle and optional straight axis references. Child occurrence origin references are exposed by inspect_entity(occurrence).\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"component\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"flipped\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"maxLength\\\":120,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"},\\\"offsetX\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetY\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetZ\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"xAxisEntity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"zAxisEntity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"geometry\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_origin_delete\\\":{\\\"description\\\":\\\"Delete a native joint origin; unhealthy downstream joints cause transaction rollback.\\\",\\\"properties\\\":{\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"origin\\\"],\\\"type\\\":\\\"object\\\"},\\\"joint_origin_edit\\\":{\\\"description\\\":\\\"Edit a native joint origin definition; rolls before its timeline item and restores the original marker in finally. Recomputes and verifies attachment, axes, offsets, angle, name and flip.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"flipped\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"geometry\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"maxLength\\\":120,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"},\\\"offsetX\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetY\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetZ\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"xAxisEntity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"zAxisEntity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"origin\\\"],\\\"type\\\":\\\"object\\\"},\\\"material_assign\\\":{\\\"description\\\":\\\"Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.\\\",\\\"properties\\\":{\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"libraryId\\\":{\\\"type\\\":\\\"string\\\"},\\\"materialId\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"entity\\\",\\\"materialId\\\"],\\\"type\\\":\\\"object\\\"},\\\"material_list\\\":{\\\"description\\\":\\\"List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.\\\",\\\"properties\\\":{\\\"libraryId\\\":{\\\"type\\\":\\\"string\\\"},\\\"limit\\\":{\\\"maximum\\\":1000,\\\"minimum\\\":1,\\\"type\\\":\\\"integer\\\"},\\\"query\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"mcmaster_discover\\\":{\\\"description\\\":\\\"Discover Fusion native Insert McMaster-Carr command and requirements in the active design.\\\",\\\"properties\\\":{},\\\"required\\\":[\\\"op\\\"],\\\"type\\\":\\\"object\\\"},\\\"mcmaster_open\\\":{\\\"description\\\":\\\"Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.\\\",\\\"properties\\\":{},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"measure\\\":{\\\"description\\\":\\\"Native engineering minimum distance or angle in root assembly space. Non-root definition refs require an occurrence context. Distance needs2 entities; angle needs2 lines/planes or3 points (second apex). Returns mm/deg and native witness positions in root mm. witnessValidation identifies native points or native geometry directions used for valid parallel angles with degenerate native points; degenerate point angles and unavailable/inconsistent witnesses fail.\\\",\\\"properties\\\":{\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"space\\\":{\\\"enum\\\":[\\\"root\\\"]},\\\"type\\\":{\\\"enum\\\":[\\\"distance\\\",\\\"angle\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"type\\\",\\\"space\\\",\\\"entities\\\"],\\\"type\\\":\\\"object\\\"},\\\"motion_link_create\\\":{\\\"description\\\":\\\"Create a native motion link between two root-owned joints, or two different motions of jointOne when jointTwo is omitted. Positive ratio magnitudes use mm for translation and deg for rotation; reversed selects opposite direction. Requires the November 2025+ API; no script fallback.\\\",\\\"properties\\\":{\\\"jointOne\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"jointTwo\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"motionOne\\\":{\\\"enum\\\":[\\\"rotation\\\",\\\"slide\\\",\\\"primarySlide\\\",\\\"secondarySlide\\\",\\\"pitch\\\",\\\"roll\\\",\\\"yaw\\\"]},\\\"motionTwo\\\":{\\\"enum\\\":[\\\"rotation\\\",\\\"slide\\\",\\\"primarySlide\\\",\\\"secondarySlide\\\",\\\"pitch\\\",\\\"roll\\\",\\\"yaw\\\"]},\\\"name\\\":{\\\"maxLength\\\":120,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"},\\\"reversed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"valueOne\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"valueTwo\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"jointOne\\\",\\\"motionOne\\\",\\\"motionTwo\\\",\\\"valueOne\\\",\\\"valueTwo\\\"],\\\"type\\\":\\\"object\\\"},\\\"motion_link_delete\\\":{\\\"description\\\":\\\"Delete a root-owned motion link under the same transaction/recovery contract.\\\",\\\"properties\\\":{\\\"link\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"link\\\"],\\\"type\\\":\\\"object\\\"},\\\"motion_link_edit\\\":{\\\"description\\\":\\\"Edit a root-owned motion link ratio, degree-of-freedom pair, direction, name or suppression. Joint membership is immutable; recreate the link to change members. Verify exact joint identities, ratio, flags and health.\\\",\\\"properties\\\":{\\\"link\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"motionOne\\\":{\\\"enum\\\":[\\\"rotation\\\",\\\"slide\\\",\\\"primarySlide\\\",\\\"secondarySlide\\\",\\\"pitch\\\",\\\"roll\\\",\\\"yaw\\\"]},\\\"motionTwo\\\":{\\\"enum\\\":[\\\"rotation\\\",\\\"slide\\\",\\\"primarySlide\\\",\\\"secondarySlide\\\",\\\"pitch\\\",\\\"roll\\\",\\\"yaw\\\"]},\\\"name\\\":{\\\"maxLength\\\":120,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"},\\\"reversed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"valueOne\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"valueTwo\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"link\\\"],\\\"type\\\":\\\"object\\\"},\\\"new_design\\\":{\\\"description\\\":\\\"Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.\\\",\\\"properties\\\":{\\\"box\\\":{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"depth\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"height\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"width\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"width\\\",\\\"height\\\",\\\"depth\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrence_delete\\\":{\\\"description\\\":\\\"Delete one selected occurrence through the shared transaction executor.\\\",\\\"properties\\\":{\\\"occurrence\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"occurrence\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrence_insert\\\":{\\\"description\\\":\\\"Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\\\",\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"independentCopy\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"parent\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"transform\\\":{\\\"additionalProperties\\\":false,\\\"description\\\":\\\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"axis\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"component\\\"],\\\"type\\\":\\\"object\\\"},\\\"occurrence_update\\\":{\\\"description\\\":\\\"Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.\\\",\\\"properties\\\":{\\\"grounded\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"groundedToParent\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"occurrence\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"transform\\\":{\\\"additionalProperties\\\":false,\\\"description\\\":\\\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"axis\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":3,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"occurrence\\\"],\\\"type\\\":\\\"object\\\"},\\\"parameter_batch\\\":{\\\"description\\\":\\\"Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.\\\",\\\"properties\\\":{\\\"changes\\\":{\\\"items\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"action\\\":{\\\"enum\\\":[\\\"create\\\"]},\\\"comment\\\":{\\\"type\\\":\\\"string\\\"},\\\"expression\\\":{\\\"type\\\":\\\"string\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"unit\\\":{\\\"enum\\\":[\\\"mm\\\",\\\"deg\\\",\\\"kg\\\",\\\"\\\"]}},\\\"required\\\":[\\\"action\\\",\\\"name\\\",\\\"expression\\\",\\\"unit\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"action\\\":{\\\"enum\\\":[\\\"set\\\"]},\\\"expression\\\":{\\\"type\\\":\\\"string\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"action\\\",\\\"name\\\",\\\"expression\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"action\\\":{\\\"enum\\\":[\\\"delete\\\"]},\\\"name\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"action\\\",\\\"name\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"maxItems\\\":128,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"changes\\\"],\\\"type\\\":\\\"object\\\"},\\\"parameter_create\\\":{\\\"properties\\\":{\\\"comment\\\":{\\\"type\\\":\\\"string\\\"},\\\"expression\\\":{\\\"type\\\":\\\"string\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"unit\\\":{\\\"enum\\\":[\\\"mm\\\",\\\"deg\\\",\\\"kg\\\",\\\"\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"name\\\",\\\"expression\\\",\\\"unit\\\"],\\\"type\\\":\\\"object\\\"},\\\"parameter_set\\\":{\\\"description\\\":\\\"Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.\\\",\\\"properties\\\":{\\\"expression\\\":{\\\"type\\\":\\\"string\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"name\\\",\\\"expression\\\"],\\\"type\\\":\\\"object\\\"},\\\"plane_create\\\":{\\\"description\\\":\\\"Create offset plane (offset in mm) or angled plane around axis (angle in deg).\\\",\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"offset\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"offset\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"offset\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"op\\\":{\\\"type\\\":\\\"string\\\"},\\\"operationId\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"sessionId\\\":{\\\"type\\\":\\\"string\\\"},\\\"target\\\":{\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"angle\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"axis\\\",\\\"angle\\\"],\\\"type\\\":\\\"object\\\"}],\\\"properties\\\":{\\\"angle\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"offset\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"type\\\":{\\\"enum\\\":[\\\"offset\\\",\\\"angle\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"type\\\"],\\\"type\\\":\\\"object\\\"},\\\"regular_joint_create\\\":{\\\"description\\\":\\\"Create a geometry-solving regular joint in the root component using two distinct instance-context attachments or joint origins. All seven native motion families; offsets mm, angle and angular limits deg. Read back freshly resolved attachment graph, native parameters and root-space occurrence placement. Root/non-root sides must be unambiguous; both grounded and ancestor/descendant pairs are refused. Inferred joints are unsupported. Existing pending positions must be captured or reverted first. Before applying drive values, checks native joint-transform anchor offset magnitude/axiality and zero-angle axis collinearity. Native joint matrices have explicit provenance; physical angle/flip sense requires independent occurrence-geometry acceptance.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"flipped\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"geometryOne\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"origin\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"geometryTwo\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"origin\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"locked\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"offset\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"pitchLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"pitchValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"primarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"primarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rollLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rollValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"rotationLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"rotationValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"secondarySlideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"secondarySlideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"slideAxis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"slideLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"slideValue\\\":{\\\"type\\\":\\\"number\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"rigid\\\",\\\"revolute\\\",\\\"slider\\\",\\\"cylindrical\\\",\\\"pin_slot\\\",\\\"planar\\\",\\\"ball\\\"]},\\\"yawLimits\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"maximum\\\":{\\\"type\\\":\\\"number\\\"},\\\"maximumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"minimum\\\":{\\\"type\\\":\\\"number\\\"},\\\"minimumEnabled\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"rest\\\":{\\\"type\\\":\\\"number\\\"},\\\"restEnabled\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"yawValue\\\":{\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"type\\\",\\\"geometryOne\\\",\\\"geometryTwo\\\"],\\\"type\\\":\\\"object\\\"},\\\"regular_joint_edit\\\":{\\\"description\\\":\\\"Redefine root-owned regular joint geometry, motion family, offsets, angle, flip or lock. Restore timeline in finally and verify after recompute. Use joint_edit for name, suppression, limits and drive values; joint_delete for deletion.\\\",\\\"properties\\\":{\\\"angle\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"axis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"flipped\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"geometryOne\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"origin\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"geometryTwo\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"edge\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"keyPoint\\\":{\\\"enum\\\":[\\\"center\\\",\\\"start\\\",\\\"middle\\\",\\\"end\\\"]}},\\\"required\\\":[\\\"entity\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"origin\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"origin\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"joint\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"locked\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"offset\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetX\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"offsetY\\\":{\\\"description\\\":\\\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\\\",\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"maxLength\\\":512,\\\"minLength\\\":1,\\\"type\\\":\\\"string\\\"}]},\\\"slideAxis\\\":{\\\"enum\\\":[\\\"x\\\",\\\"y\\\",\\\"z\\\"]},\\\"type\\\":{\\\"enum\\\":[\\\"rigid\\\",\\\"revolute\\\",\\\"slider\\\",\\\"cylindrical\\\",\\\"pin_slot\\\",\\\"planar\\\",\\\"ball\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"joint\\\"],\\\"type\\\":\\\"object\\\"},\\\"rigid_group_create\\\":{\\\"description\\\":\\\"Create a native rigid group from exact occurrence instances; includeChildren defaults true.\\\",\\\"properties\\\":{\\\"includeChildren\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"occurrences\\\":{\\\"items\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"occurrences\\\"],\\\"type\\\":\\\"object\\\"},\\\"rigid_group_delete\\\":{\\\"description\\\":\\\"Delete an exact rigid group with transaction recovery.\\\",\\\"properties\\\":{\\\"group\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"group\\\"],\\\"type\\\":\\\"object\\\"},\\\"rigid_group_edit\\\":{\\\"description\\\":\\\"Rename or suppress an exact rigid group with transaction recovery.\\\",\\\"properties\\\":{\\\"group\\\":{\\\"description\\\":\\\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"suppressed\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"group\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_constraint\\\":{\\\"description\\\":\\\"Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.\\\",\\\"properties\\\":{\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"horizontal\\\",\\\"vertical\\\",\\\"coincident\\\",\\\"parallel\\\",\\\"perpendicular\\\",\\\"tangent\\\",\\\"equal\\\",\\\"concentric\\\",\\\"collinear\\\",\\\"midpoint\\\",\\\"symmetry\\\",\\\"fix\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"sketch\\\",\\\"type\\\",\\\"entities\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_create\\\":{\\\"description\\\":\\\"Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.\\\",\\\"properties\\\":{\\\"component\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"name\\\":{\\\"type\\\":\\\"string\\\"},\\\"plane\\\":{\\\"oneOf\\\":[{\\\"enum\\\":[\\\"xy\\\",\\\"xz\\\",\\\"yz\\\"]},{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_curve_edit\\\":{\\\"description\\\":\\\"Edit one native sketch curve with sketch-space mm pick. trim removes the nearest segment; extend chooses nearest endpoint; split requires an interior on-curve point; break uses neighboring intersections. Fresh replacement refs are returned; original may be deleted. In-place extend returns the original with a fresh ref only after its geometry change survives recompute. No change or empty break/split fails. Full trim deletion requires allowDelete true. Linked/derived/deferred-compute geometry refused.\\\",\\\"properties\\\":{\\\"action\\\":{\\\"enum\\\":[\\\"trim\\\",\\\"extend\\\",\\\"split\\\",\\\"break\\\"]},\\\"allowDelete\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"createConstraints\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"curve\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"pick\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"sketch\\\",\\\"curve\\\",\\\"action\\\",\\\"pick\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_diagnostics\\\":{\\\"description\\\":\\\"Read native sketch health/message, fully-constrained/fixed/linked/reference flags, geometric constraints and driving dimensions. Reports no solver DOF count or conflict-set explanation; no recompute/mutation.\\\",\\\"properties\\\":{\\\"sketch\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sketch\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_dimension\\\":{\\\"description\\\":\\\"Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.\\\",\\\"properties\\\":{\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"expression\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"parameterName\\\":{\\\"type\\\":\\\"string\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"distance\\\",\\\"horizontal\\\",\\\"vertical\\\",\\\"radius\\\",\\\"diameter\\\",\\\"angle\\\"]}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"sketch\\\",\\\"type\\\",\\\"entities\\\",\\\"expression\\\",\\\"position\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_edit\\\":{\\\"description\\\":\\\"Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.\\\",\\\"properties\\\":{\\\"changes\\\":{\\\"additionalProperties\\\":false,\\\"minProperties\\\":1,\\\"properties\\\":{\\\"center\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"end\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"fixed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"radius\\\":{\\\"type\\\":\\\"number\\\"},\\\"start\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"}},\\\"required\\\":[],\\\"type\\\":\\\"object\\\"},\\\"entity\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"sketch\\\",\\\"entity\\\",\\\"changes\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_geometry\\\":{\\\"description\\\":\\\"Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.\\\",\\\"properties\\\":{\\\"items\\\":{\\\"items\\\":{\\\"oneOf\\\":[{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"position\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"point\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"position\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"end\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"start\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"line\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"start\\\",\\\"end\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"end\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"start\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"rectangle\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"start\\\",\\\"end\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"center\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"radius\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"circle\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"center\\\",\\\"radius\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"center\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"start\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"sweep\\\":{\\\"type\\\":\\\"number\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"arc\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"center\\\",\\\"start\\\",\\\"sweep\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"angle\\\":{\\\"type\\\":\\\"number\\\"},\\\"center\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"radius\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"},\\\"sides\\\":{\\\"maximum\\\":128,\\\"minimum\\\":3,\\\"type\\\":\\\"integer\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"polygon\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"center\\\",\\\"radius\\\",\\\"sides\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"end\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"start\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"slot\\\"]},\\\"width\\\":{\\\"exclusiveMinimum\\\":0,\\\"type\\\":\\\"number\\\"}},\\\"required\\\":[\\\"type\\\",\\\"start\\\",\\\"end\\\",\\\"width\\\"],\\\"type\\\":\\\"object\\\"},{\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"closed\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"construction\\\":{\\\"type\\\":\\\"boolean\\\"},\\\"points\\\":{\\\"items\\\":{\\\"items\\\":{\\\"type\\\":\\\"number\\\"},\\\"maxItems\\\":3,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"maxItems\\\":128,\\\"minItems\\\":2,\\\"type\\\":\\\"array\\\"},\\\"type\\\":{\\\"enum\\\":[\\\"spline\\\"]}},\\\"required\\\":[\\\"type\\\",\\\"points\\\"],\\\"type\\\":\\\"object\\\"}]},\\\"maxItems\\\":128,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"sketch\\\",\\\"items\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_offset\\\":{\\\"description\\\":\\\"Modern createOffsetInput/addOffset2. Curves must be native 2D, unique, in connected flow order (never reordered). Nonzero signed mm number/expression: positive right, negative left; a single circle/ellipse positive outside. Topology matched defaults true. Read back native signed distance, parent/child refs and controlling parameter after recompute. No retired Sketch.offset fallback.\\\",\\\"properties\\\":{\\\"curves\\\":{\\\"items\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"distance\\\":{\\\"oneOf\\\":[{\\\"type\\\":\\\"number\\\"},{\\\"type\\\":\\\"string\\\"}]},\\\"sketch\\\":{\\\"description\\\":\\\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"topologyMatched\\\":{\\\"type\\\":\\\"boolean\\\"}},\\\"required\\\":[\\\"op\\\",\\\"target\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"sketch\\\",\\\"curves\\\",\\\"distance\\\"],\\\"type\\\":\\\"object\\\"},\\\"sketch_project\\\":{\\\"description\\\":\\\"Project selected topology into a sketch with Fusion associative projection.\\\",\\\"properties\\\":{\\\"entities\\\":{\\\"items\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"},\\\"maxItems\\\":256,\\\"minItems\\\":1,\\\"type\\\":\\\"array\\\"},\\\"sketch\\\":{\\\"description\\\":\\\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\\\",\\\"required\\\":[\\\"documentId\\\",\\\"revision\\\",\\\"objectType\\\"],\\\"type\\\":\\\"object\\\"}},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\",\\\"sketch\\\",\\\"entities\\\"],\\\"type\\\":\\\"object\\\"},\\\"transaction_probe\\\":{\\\"description\\\":\\\"Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.\\\",\\\"properties\\\":{},\\\"required\\\":[\\\"op\\\",\\\"sessionId\\\",\\\"operationId\\\",\\\"target\\\"],\\\"type\\\":\\\"object\\\"}},\\\"schemaVersion\\\":1,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60,\\\"transactions\\\":{\\\"externalEffects\\\":\\\"exports publish atomically; model recovery does not undo files\\\",\\\"genericAtomicBatch\\\":false,\\\"newDesignRecovery\\\":\\\"discard only the new unsaved document\\\",\\\"parameterRecovery\\\":\\\"compensating expression restore with semantic readback\\\",\\\"typedModelOperations\\\":{\\\"backend\\\":\\\"PTransaction\\\",\\\"evidence\\\":null,\\\"scope\\\":\\\"one active Fusion Design; no document lifecycle, files or cloud effects\\\",\\\"verified\\\":false}},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"transactions\": {\n \"externalEffects\": \"exports publish atomically; model recovery does not undo files\",\n \"genericAtomicBatch\": false,\n \"newDesignRecovery\": \"discard only the new unsaved document\",\n \"parameterRecovery\": \"compensating expression restore with semantic readback\",\n \"typedModelOperations\": {\n \"backend\": \"PTransaction\",\n \"evidence\": null,\n \"scope\": \"one active Fusion Design; no document lifecycle, files or cloud effects\",\n \"verified\": false\n }\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234199.261767, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "durationMs": 157, + "error": "", + "idempotency": { + "admission": "FULL SQLite commit before native dispatch", + "capacity": 10000, + "databaseByteLimit": 67108864, + "recordByteLimit": 4194304, + "restartBehavior": "old-session history is readable; native execution never replays across sessions", + "scope": "durable history keyed by add-in session and operation ID", + "storageVersion": 1 + }, + "operations": { + "assembly_properties": { + "description": "High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.", + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "target" + ], + "type": "object" + }, + "bom": { + "description": "Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance. Includes exact current active configuration provenance; incomplete configuration scope refuses. Visibility does not remove quantity.", + "properties": { + "explodePurchased": { + "type": "boolean" + } + }, + "required": [ + "op", + "target" + ], + "type": "object" + }, + "bom_export": { + "description": "Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions. Both CSV modes include document/revision and current active configuration table/row provenance.", + "properties": { + "explodePurchased": { + "type": "boolean" + }, + "filename": { + "type": "string" + }, + "mode": { + "enum": [ + "flat", + "structured" + ] + }, + "overwrite": { + "type": "boolean" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "filename" + ], + "type": "object" + }, + "cad_import": { + "description": "Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.", + "properties": { + "asPurchased": { + "type": "boolean" + }, + "filename": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "sourceUrl": { + "type": "string" + }, + "supplier": { + "type": "string" + }, + "supplierPartNumber": { + "type": "string" + } + }, + "required": [ + "supplier", + "supplierPartNumber", + "sourceUrl" + ], + "type": "object" + }, + "sha256": { + "type": "string" + }, + "transform": { + "additionalProperties": false, + "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.", + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "filename", + "provenance" + ], + "type": "object" + }, + "component_create": { + "description": "Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.", + "properties": { + "metadata": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "asPurchased": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "excludeFromBom": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "partNumber": { + "type": "string" + }, + "sourceUrl": { + "type": "string" + }, + "supplier": { + "type": "string" + }, + "supplierPartNumber": { + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "name": { + "type": "string" + }, + "parent": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "transform": { + "additionalProperties": false, + "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.", + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "name" + ], + "type": "object" + }, + "component_metadata": { + "description": "Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.", + "properties": { + "changes": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "asPurchased": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "excludeFromBom": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "partNumber": { + "type": "string" + }, + "sourceUrl": { + "type": "string" + }, + "supplier": { + "type": "string" + }, + "supplierPartNumber": { + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "component": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "changes" + ], + "type": "object" + }, + "configuration_inspect": { + "description": "Read the loaded Design configuration graph without activation or recompute: ordinary rows, the separate native reserved test row, all supported typed cells including inactive/test cells, exact controlled-source links and current ordinary row. Unreadable fields and unknown/theme/hierarchical/inserted scopes remain explicit incomplete diagnostics. Configuration lifecycle and configured-design model mutations remain disabled pending native recovery/archive gates.", + "properties": {}, + "required": [ + "op", + "target" + ], + "type": "object" + }, + "construction_axis": { + "description": "Create a parametric axis from native references (edge/circular face/two intersecting planes/two distinct points). Root-space external geometry requires exact occurrence context. For cross-component geometry into a non-root target component, creationOccurrence must identify a root-context instance of that target. Returns component-space native axis geometry/health. No direct-only infinite-line or preview snap APIs.", + "properties": { + "component": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "creationOccurrence": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entities": { + "items": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 2, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "type": { + "enum": [ + "edge", + "circular_face", + "two_planes", + "two_points" + ] + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "type", + "entities" + ], + "type": "object" + }, + "entity_delete": { + "description": "Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.", + "properties": { + "entity": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "entity" + ], + "type": "object" + }, + "export": { + "description": "Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.", + "properties": { + "format": { + "default": "step", + "enum": [ + "step", + "stl", + "3mf", + "f3d", + "iges", + "sat", + "smt", + "usdz", + "fbx", + "skp" + ] + }, + "outputPath": { + "type": "string" + }, + "overwrite": { + "default": false, + "type": "boolean" + }, + "refinement": { + "default": "medium", + "enum": [ + "low", + "medium", + "high" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "outputPath" + ], + "type": "object" + }, + "feature_create": { + "description": "Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "direction": { + "enum": [ + "positive", + "negative", + "symmetric" + ] + }, + "distance": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operation": { + "enum": [ + "new_body", + "join", + "cut", + "intersect" + ] + }, + "operationId": { + "type": "string" + }, + "profiles": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "taper": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "extrude" + ] + } + }, + "required": [ + "type", + "profiles", + "distance" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "axis": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operation": { + "enum": [ + "new_body", + "join", + "cut", + "intersect" + ] + }, + "operationId": { + "type": "string" + }, + "profiles": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "revolve" + ] + } + }, + "required": [ + "type", + "profiles", + "axis", + "angle" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "edges": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "radius": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "sessionId": { + "type": "string" + }, + "tangentChain": { + "type": "boolean" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "fillet" + ] + } + }, + "required": [ + "type", + "edges", + "radius" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "distance": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "edges": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "tangentChain": { + "type": "boolean" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "chamfer" + ] + } + }, + "required": [ + "type", + "edges", + "distance" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "faces": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "tangentChain": { + "type": "boolean" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "thickness": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "type": { + "enum": [ + "shell" + ] + } + }, + "required": [ + "type", + "faces", + "thickness" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "depth": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "diameter": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "points": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "hole" + ] + } + }, + "required": [ + "type", + "points", + "diameter", + "depth", + "bodies" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operation": { + "enum": [ + "new_body", + "join", + "cut", + "intersect" + ] + }, + "operationId": { + "type": "string" + }, + "profiles": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "loft" + ] + } + }, + "required": [ + "type", + "profiles" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operation": { + "enum": [ + "new_body", + "join", + "cut", + "intersect" + ] + }, + "operationId": { + "type": "string" + }, + "path": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "profiles": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "sweep" + ] + } + }, + "required": [ + "type", + "profiles", + "path" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "body": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keepTools": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operation": { + "enum": [ + "join", + "cut", + "intersect" + ] + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "tools": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "type": { + "enum": [ + "combine" + ] + } + }, + "required": [ + "type", + "body", + "tools", + "operation" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "extend": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "split" + ] + } + }, + "required": [ + "type", + "bodies", + "plane" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "origin": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "translation": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "move" + ] + } + }, + "required": [ + "type", + "bodies" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "mirror" + ] + } + }, + "required": [ + "type", + "bodies", + "plane" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "axis2": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "count": { + "maximum": 1000, + "minimum": 2, + "type": "integer" + }, + "count2": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "spacing": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "spacing2": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "rectangular_pattern" + ] + } + }, + "required": [ + "type", + "bodies", + "axis", + "count", + "spacing" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "axis": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "bodies": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "count": { + "maximum": 1000, + "minimum": 2, + "type": "integer" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "circular_pattern" + ] + } + }, + "required": [ + "type", + "bodies", + "axis", + "count" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "faces": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "sessionId": { + "type": "string" + }, + "tangentChain": { + "type": "boolean" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "draft" + ] + } + }, + "required": [ + "type", + "faces", + "plane", + "angle" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "designation": { + "type": "string" + }, + "faces": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "internal": { + "type": "boolean" + }, + "modeled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "documentId": { + "type": "string" + }, + "revision": { + "type": "string" + } + }, + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "threadClass": { + "type": "string" + }, + "threadType": { + "type": "string" + }, + "type": { + "enum": [ + "thread" + ] + } + }, + "required": [ + "type", + "faces", + "internal", + "threadType", + "designation", + "threadClass" + ], + "type": "object" + } + ], + "properties": { + "angle": {}, + "axis": {}, + "axis2": {}, + "bodies": {}, + "body": {}, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "count": {}, + "count2": {}, + "depth": {}, + "designation": {}, + "diameter": {}, + "direction": {}, + "distance": {}, + "edges": {}, + "extend": {}, + "faces": {}, + "internal": {}, + "keepTools": {}, + "modeled": {}, + "name": { + "type": "string" + }, + "operation": {}, + "origin": {}, + "path": {}, + "plane": {}, + "points": {}, + "profiles": {}, + "radius": {}, + "spacing": {}, + "spacing2": {}, + "tangentChain": {}, + "taper": {}, + "thickness": {}, + "threadClass": {}, + "threadType": {}, + "tools": {}, + "translation": {}, + "type": { + "enum": [ + "extrude", + "revolve", + "fillet", + "chamfer", + "shell", + "hole", + "loft", + "sweep", + "combine", + "split", + "move", + "mirror", + "rectangular_pattern", + "circular_pattern", + "draft", + "thread" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "type" + ], + "type": "object" + }, + "feature_edit": { + "description": "Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.", + "properties": { + "feature": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "parameters": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "suppressed": { + "type": "boolean" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "feature" + ], + "type": "object" + }, + "geometry_query": { + "description": "Complete body-scoped topology query, no arbitrary first-match selection. selection one (default) refuses zero/multiple matches; many may return empty. Geometry types are exact native types; size ranges inclusive in mm/mm2, near is minimum distance in the explicit frame; direction is outward planar face normal or linear edge tangent. Returned refs retain instance context even for component-space filters. Exceeding maxResults fails rather than truncating.", + "properties": { + "body": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "filters": { + "additionalProperties": false, + "properties": { + "area": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "max": { + "minimum": 0, + "type": "number" + }, + "min": { + "minimum": 0, + "type": "number" + } + }, + "required": [], + "type": "object" + }, + "direction": { + "additionalProperties": false, + "properties": { + "orientation": { + "enum": [ + "same", + "parallel" + ] + }, + "tolerance": { + "maximum": 90, + "minimum": 0, + "type": "number" + }, + "vector": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [ + "vector" + ], + "type": "object" + }, + "length": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "max": { + "minimum": 0, + "type": "number" + }, + "min": { + "minimum": 0, + "type": "number" + } + }, + "required": [], + "type": "object" + }, + "near": { + "additionalProperties": false, + "properties": { + "point": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "tolerance": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "point", + "tolerance" + ], + "type": "object" + }, + "radius": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "max": { + "minimum": 0, + "type": "number" + }, + "min": { + "minimum": 0, + "type": "number" + } + }, + "required": [], + "type": "object" + }, + "type": { + "enum": [ + "Plane", + "Cylinder", + "Cone", + "Sphere", + "Torus", + "NurbsSurface", + "Line3D", + "Arc3D", + "Circle3D", + "Ellipse3D", + "EllipticalArc3D", + "NurbsCurve3D", + "Point3D", + "degenerate" + ] + } + }, + "required": [], + "type": "object" + }, + "kind": { + "enum": [ + "faces", + "edges", + "vertices" + ] + }, + "maxResults": { + "maximum": 1024, + "minimum": 1, + "type": "integer" + }, + "selection": { + "enum": [ + "one", + "many" + ] + }, + "space": { + "enum": [ + "root", + "component" + ] + } + }, + "required": [ + "op", + "target", + "body", + "kind", + "space" + ], + "type": "object" + }, + "health": { + "description": "Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.", + "properties": { + "recompute": { + "default": false, + "type": "boolean" + } + }, + "required": [ + "op", + "target" + ], + "type": "object" + }, + "inspect": { + "description": "Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.", + "properties": {}, + "required": [ + "op" + ], + "type": "object" + }, + "inspect_entity": { + "properties": { + "entity": { + "description": "Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.", + "type": "object" + } + }, + "required": [ + "op", + "target", + "entity" + ], + "type": "object" + }, + "interference": { + "description": "Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.", + "properties": { + "entities": { + "items": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 2, + "type": "array" + }, + "includeTouching": { + "type": "boolean" + }, + "volumeTolerance": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "op", + "target", + "entities" + ], + "type": "object" + }, + "joint_create": { + "description": "Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Use regular_joint_create for geometry-solving placement.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "rigid" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "revolute" + ] + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "slider" + ] + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "cylindrical" + ] + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "slideAxis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "pin_slot" + ] + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "primarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "primarySlideValue": { + "type": "number" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "secondarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "secondarySlideValue": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "planar" + ] + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "pitchLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "pitchValue": { + "type": "number" + }, + "rollLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rollValue": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "suppressed": { + "type": "boolean" + }, + "target": { + "type": "object" + }, + "type": { + "enum": [ + "ball" + ] + }, + "yawLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "yawValue": { + "type": "number" + } + }, + "required": [ + "type", + "geometry" + ], + "type": "object" + } + ], + "properties": { + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "geometry": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "occurrenceOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "occurrenceTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "pitchLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "pitchValue": { + "type": "number" + }, + "primarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "primarySlideValue": { + "type": "number" + }, + "rollLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rollValue": { + "type": "number" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "secondarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "secondarySlideValue": { + "type": "number" + }, + "slideAxis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "suppressed": { + "type": "boolean" + }, + "type": { + "enum": [ + "rigid", + "revolute", + "slider", + "cylindrical", + "pin_slot", + "planar", + "ball" + ] + }, + "yawLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "yawValue": { + "type": "number" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "type", + "occurrenceOne", + "occurrenceTwo" + ], + "type": "object" + }, + "joint_delete": { + "description": "Delete one selected Joint or AsBuiltJoint with recovery verification.", + "properties": { + "joint": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "joint" + ], + "type": "object" + }, + "joint_edit": { + "description": "Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery. For driven root joints, active motion links must preserve their settings and their partner motion must follow the native ratio; a coupling mismatch aborts.", + "properties": { + "joint": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "pitchLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "pitchValue": { + "type": "number" + }, + "primarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "primarySlideValue": { + "type": "number" + }, + "rollLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rollValue": { + "type": "number" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "secondarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "secondarySlideValue": { + "type": "number" + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "suppressed": { + "type": "boolean" + }, + "yawLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "yawValue": { + "type": "number" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "joint" + ], + "type": "object" + }, + "joint_origin_create": { + "description": "Create a native component-definition joint origin from guarded native geometry, with mm offsets/deg angle and optional straight axis references. Child occurrence origin references are exposed by inspect_entity(occurrence).", + "properties": { + "angle": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "component": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "flipped": { + "type": "boolean" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "offsetX": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetY": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetZ": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "xAxisEntity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "zAxisEntity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "geometry" + ], + "type": "object" + }, + "joint_origin_delete": { + "description": "Delete a native joint origin; unhealthy downstream joints cause transaction rollback.", + "properties": { + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "origin" + ], + "type": "object" + }, + "joint_origin_edit": { + "description": "Edit a native joint origin definition; rolls before its timeline item and restores the original marker in finally. Recomputes and verifies attachment, axes, offsets, angle, name and flip.", + "properties": { + "angle": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "flipped": { + "type": "boolean" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "offsetX": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetY": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetZ": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "xAxisEntity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "zAxisEntity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "origin" + ], + "type": "object" + }, + "material_assign": { + "description": "Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.", + "properties": { + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "libraryId": { + "type": "string" + }, + "materialId": { + "type": "string" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "entity", + "materialId" + ], + "type": "object" + }, + "material_list": { + "description": "List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.", + "properties": { + "libraryId": { + "type": "string" + }, + "limit": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "query": { + "type": "string" + } + }, + "required": [ + "op", + "target" + ], + "type": "object" + }, + "mcmaster_discover": { + "description": "Discover Fusion native Insert McMaster-Carr command and requirements in the active design.", + "properties": {}, + "required": [ + "op" + ], + "type": "object" + }, + "mcmaster_open": { + "description": "Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.", + "properties": {}, + "required": [ + "op", + "sessionId", + "operationId", + "target" + ], + "type": "object" + }, + "measure": { + "description": "Native engineering minimum distance or angle in root assembly space. Non-root definition refs require an occurrence context. Distance needs2 entities; angle needs2 lines/planes or3 points (second apex). Returns mm/deg and native witness positions in root mm. witnessValidation identifies native points or native geometry directions used for valid parallel angles with degenerate native points; degenerate point angles and unavailable/inconsistent witnesses fail.", + "properties": { + "entities": { + "items": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "space": { + "enum": [ + "root" + ] + }, + "type": { + "enum": [ + "distance", + "angle" + ] + } + }, + "required": [ + "op", + "target", + "type", + "space", + "entities" + ], + "type": "object" + }, + "motion_link_create": { + "description": "Create a native motion link between two root-owned joints, or two different motions of jointOne when jointTwo is omitted. Positive ratio magnitudes use mm for translation and deg for rotation; reversed selects opposite direction. Requires the November 2025+ API; no script fallback.", + "properties": { + "jointOne": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "jointTwo": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "motionOne": { + "enum": [ + "rotation", + "slide", + "primarySlide", + "secondarySlide", + "pitch", + "roll", + "yaw" + ] + }, + "motionTwo": { + "enum": [ + "rotation", + "slide", + "primarySlide", + "secondarySlide", + "pitch", + "roll", + "yaw" + ] + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "reversed": { + "type": "boolean" + }, + "valueOne": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "valueTwo": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "jointOne", + "motionOne", + "motionTwo", + "valueOne", + "valueTwo" + ], + "type": "object" + }, + "motion_link_delete": { + "description": "Delete a root-owned motion link under the same transaction/recovery contract.", + "properties": { + "link": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "link" + ], + "type": "object" + }, + "motion_link_edit": { + "description": "Edit a root-owned motion link ratio, degree-of-freedom pair, direction, name or suppression. Joint membership is immutable; recreate the link to change members. Verify exact joint identities, ratio, flags and health.", + "properties": { + "link": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "motionOne": { + "enum": [ + "rotation", + "slide", + "primarySlide", + "secondarySlide", + "pitch", + "roll", + "yaw" + ] + }, + "motionTwo": { + "enum": [ + "rotation", + "slide", + "primarySlide", + "secondarySlide", + "pitch", + "roll", + "yaw" + ] + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "reversed": { + "type": "boolean" + }, + "suppressed": { + "type": "boolean" + }, + "valueOne": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "valueTwo": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "link" + ], + "type": "object" + }, + "new_design": { + "description": "Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.", + "properties": { + "box": { + "additionalProperties": false, + "properties": { + "depth": { + "exclusiveMinimum": 0, + "type": "number" + }, + "height": { + "exclusiveMinimum": 0, + "type": "number" + }, + "width": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "width", + "height", + "depth" + ], + "type": "object" + }, + "name": { + "type": "string" + } + }, + "required": [ + "op", + "sessionId", + "operationId" + ], + "type": "object" + }, + "occurrence_delete": { + "description": "Delete one selected occurrence through the shared transaction executor.", + "properties": { + "occurrence": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "occurrence" + ], + "type": "object" + }, + "occurrence_insert": { + "description": "Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.", + "properties": { + "component": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "independentCopy": { + "type": "boolean" + }, + "parent": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "transform": { + "additionalProperties": false, + "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.", + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "component" + ], + "type": "object" + }, + "occurrence_update": { + "description": "Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.", + "properties": { + "grounded": { + "type": "boolean" + }, + "groundedToParent": { + "type": "boolean" + }, + "occurrence": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "transform": { + "additionalProperties": false, + "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.", + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 3, + "type": "array" + } + }, + "required": [], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "occurrence" + ], + "type": "object" + }, + "parameter_batch": { + "description": "Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.", + "properties": { + "changes": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "action": { + "enum": [ + "create" + ] + }, + "comment": { + "type": "string" + }, + "expression": { + "type": "string" + }, + "name": { + "type": "string" + }, + "unit": { + "enum": [ + "mm", + "deg", + "kg", + "" + ] + } + }, + "required": [ + "action", + "name", + "expression", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "enum": [ + "set" + ] + }, + "expression": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "action", + "name", + "expression" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "enum": [ + "delete" + ] + }, + "name": { + "type": "string" + } + }, + "required": [ + "action", + "name" + ], + "type": "object" + } + ] + }, + "maxItems": 128, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "changes" + ], + "type": "object" + }, + "parameter_create": { + "properties": { + "comment": { + "type": "string" + }, + "expression": { + "type": "string" + }, + "name": { + "type": "string" + }, + "unit": { + "enum": [ + "mm", + "deg", + "kg", + "" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "name", + "expression", + "unit" + ], + "type": "object" + }, + "parameter_set": { + "description": "Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.", + "properties": { + "expression": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "name", + "expression" + ], + "type": "object" + }, + "plane_create": { + "description": "Create offset plane (offset in mm) or angled plane around axis (angle in deg).", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "offset": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "sessionId": { + "type": "string" + }, + "target": { + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "offset" + ] + } + }, + "required": [ + "type", + "offset" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "axis": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "op": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "sessionId": { + "type": "string" + }, + "target": { + "required": [ + "documentId", + "revision" + ], + "type": "object" + }, + "type": { + "enum": [ + "angle" + ] + } + }, + "required": [ + "type", + "axis", + "angle" + ], + "type": "object" + } + ], + "properties": { + "angle": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "axis": { + "oneOf": [ + { + "enum": [ + "x", + "y", + "z" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "offset": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + }, + "type": { + "enum": [ + "offset", + "angle" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "type" + ], + "type": "object" + }, + "regular_joint_create": { + "description": "Create a geometry-solving regular joint in the root component using two distinct instance-context attachments or joint origins. All seven native motion families; offsets mm, angle and angular limits deg. Read back freshly resolved attachment graph, native parameters and root-space occurrence placement. Root/non-root sides must be unambiguous; both grounded and ancestor/descendant pairs are refused. Inferred joints are unsupported. Existing pending positions must be captured or reverted first. Before applying drive values, checks native joint-transform anchor offset magnitude/axiality and zero-angle axis collinearity. Native joint matrices have explicit provenance; physical angle/flip sense requires independent occurrence-geometry acceptance.", + "properties": { + "angle": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "flipped": { + "type": "boolean" + }, + "geometryOne": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "geometryTwo": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "locked": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "offset": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "pitchLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "pitchValue": { + "type": "number" + }, + "primarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "primarySlideValue": { + "type": "number" + }, + "rollLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rollValue": { + "type": "number" + }, + "rotationLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "rotationValue": { + "type": "number" + }, + "secondarySlideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "secondarySlideValue": { + "type": "number" + }, + "slideAxis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "slideLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "slideValue": { + "type": "number" + }, + "type": { + "enum": [ + "rigid", + "revolute", + "slider", + "cylindrical", + "pin_slot", + "planar", + "ball" + ] + }, + "yawLimits": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "maximum": { + "type": "number" + }, + "maximumEnabled": { + "type": "boolean" + }, + "minimum": { + "type": "number" + }, + "minimumEnabled": { + "type": "boolean" + }, + "rest": { + "type": "number" + }, + "restEnabled": { + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, + "yawValue": { + "type": "number" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "type", + "geometryOne", + "geometryTwo" + ], + "type": "object" + }, + "regular_joint_edit": { + "description": "Redefine root-owned regular joint geometry, motion family, offsets, angle, flip or lock. Restore timeline in finally and verify after recompute. Use joint_edit for name, suppression, limits and drive values; joint_delete for deletion.", + "properties": { + "angle": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "axis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "flipped": { + "type": "boolean" + }, + "geometryOne": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "geometryTwo": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "edge": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "entity": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "keyPoint": { + "enum": [ + "center", + "start", + "middle", + "end" + ] + } + }, + "required": [ + "entity" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "origin": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "joint": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "locked": { + "type": "boolean" + }, + "offset": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetX": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "offsetY": { + "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.", + "oneOf": [ + { + "type": "number" + }, + { + "maxLength": 512, + "minLength": 1, + "type": "string" + } + ] + }, + "slideAxis": { + "enum": [ + "x", + "y", + "z" + ] + }, + "type": { + "enum": [ + "rigid", + "revolute", + "slider", + "cylindrical", + "pin_slot", + "planar", + "ball" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "joint" + ], + "type": "object" + }, + "rigid_group_create": { + "description": "Create a native rigid group from exact occurrence instances; includeChildren defaults true.", + "properties": { + "includeChildren": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "occurrences": { + "items": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "occurrences" + ], + "type": "object" + }, + "rigid_group_delete": { + "description": "Delete an exact rigid group with transaction recovery.", + "properties": { + "group": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "group" + ], + "type": "object" + }, + "rigid_group_edit": { + "description": "Rename or suppress an exact rigid group with transaction recovery.", + "properties": { + "group": { + "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "suppressed": { + "type": "boolean" + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "group" + ], + "type": "object" + }, + "sketch_constraint": { + "description": "Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.", + "properties": { + "entities": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sketch": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "type": { + "enum": [ + "horizontal", + "vertical", + "coincident", + "parallel", + "perpendicular", + "tangent", + "equal", + "concentric", + "collinear", + "midpoint", + "symmetry", + "fix" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "sketch", + "type", + "entities" + ], + "type": "object" + }, + "sketch_create": { + "description": "Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.", + "properties": { + "component": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "plane": { + "oneOf": [ + { + "enum": [ + "xy", + "xz", + "yz" + ] + }, + { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target" + ], + "type": "object" + }, + "sketch_curve_edit": { + "description": "Edit one native sketch curve with sketch-space mm pick. trim removes the nearest segment; extend chooses nearest endpoint; split requires an interior on-curve point; break uses neighboring intersections. Fresh replacement refs are returned; original may be deleted. In-place extend returns the original with a fresh ref only after its geometry change survives recompute. No change or empty break/split fails. Full trim deletion requires allowDelete true. Linked/derived/deferred-compute geometry refused.", + "properties": { + "action": { + "enum": [ + "trim", + "extend", + "split", + "break" + ] + }, + "allowDelete": { + "type": "boolean" + }, + "createConstraints": { + "type": "boolean" + }, + "curve": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "pick": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "sketch": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "sketch", + "curve", + "action", + "pick" + ], + "type": "object" + }, + "sketch_diagnostics": { + "description": "Read native sketch health/message, fully-constrained/fixed/linked/reference flags, geometric constraints and driving dimensions. Reports no solver DOF count or conflict-set explanation; no recompute/mutation.", + "properties": { + "sketch": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "target", + "sketch" + ], + "type": "object" + }, + "sketch_dimension": { + "description": "Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.", + "properties": { + "entities": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "expression": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "parameterName": { + "type": "string" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "sketch": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "type": { + "enum": [ + "distance", + "horizontal", + "vertical", + "radius", + "diameter", + "angle" + ] + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "sketch", + "type", + "entities", + "expression", + "position" + ], + "type": "object" + }, + "sketch_edit": { + "description": "Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.", + "properties": { + "changes": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "center": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "construction": { + "type": "boolean" + }, + "end": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "fixed": { + "type": "boolean" + }, + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "radius": { + "type": "number" + }, + "start": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + } + }, + "required": [], + "type": "object" + }, + "entity": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "sketch": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "sketch", + "entity", + "changes" + ], + "type": "object" + }, + "sketch_geometry": { + "description": "Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.", + "properties": { + "items": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "position": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "point" + ] + } + }, + "required": [ + "type", + "position" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "construction": { + "type": "boolean" + }, + "end": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "start": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "line" + ] + } + }, + "required": [ + "type", + "start", + "end" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "construction": { + "type": "boolean" + }, + "end": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "start": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "rectangle" + ] + } + }, + "required": [ + "type", + "start", + "end" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "center": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "construction": { + "type": "boolean" + }, + "radius": { + "exclusiveMinimum": 0, + "type": "number" + }, + "type": { + "enum": [ + "circle" + ] + } + }, + "required": [ + "type", + "center", + "radius" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "center": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "construction": { + "type": "boolean" + }, + "start": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "sweep": { + "type": "number" + }, + "type": { + "enum": [ + "arc" + ] + } + }, + "required": [ + "type", + "center", + "start", + "sweep" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "type": "number" + }, + "center": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "construction": { + "type": "boolean" + }, + "radius": { + "exclusiveMinimum": 0, + "type": "number" + }, + "sides": { + "maximum": 128, + "minimum": 3, + "type": "integer" + }, + "type": { + "enum": [ + "polygon" + ] + } + }, + "required": [ + "type", + "center", + "radius", + "sides" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "construction": { + "type": "boolean" + }, + "end": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "start": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "slot" + ] + }, + "width": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "start", + "end", + "width" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "closed": { + "type": "boolean" + }, + "construction": { + "type": "boolean" + }, + "points": { + "items": { + "items": { + "type": "number" + }, + "maxItems": 3, + "minItems": 2, + "type": "array" + }, + "maxItems": 128, + "minItems": 2, + "type": "array" + }, + "type": { + "enum": [ + "spline" + ] + } + }, + "required": [ + "type", + "points" + ], + "type": "object" + } + ] + }, + "maxItems": 128, + "minItems": 1, + "type": "array" + }, + "sketch": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "sketch", + "items" + ], + "type": "object" + }, + "sketch_offset": { + "description": "Modern createOffsetInput/addOffset2. Curves must be native 2D, unique, in connected flow order (never reordered). Nonzero signed mm number/expression: positive right, negative left; a single circle/ellipse positive outside. Topology matched defaults true. Read back native signed distance, parent/child refs and controlling parameter after recompute. No retired Sketch.offset fallback.", + "properties": { + "curves": { + "items": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "distance": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "sketch": { + "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "topologyMatched": { + "type": "boolean" + } + }, + "required": [ + "op", + "target", + "sessionId", + "operationId", + "sketch", + "curves", + "distance" + ], + "type": "object" + }, + "sketch_project": { + "description": "Project selected topology into a sketch with Fusion associative projection.", + "properties": { + "entities": { + "items": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "sketch": { + "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.", + "required": [ + "documentId", + "revision", + "objectType" + ], + "type": "object" + } + }, + "required": [ + "op", + "sessionId", + "operationId", + "target", + "sketch", + "entities" + ], + "type": "object" + }, + "transaction_probe": { + "description": "Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.", + "properties": {}, + "required": [ + "op", + "sessionId", + "operationId", + "target" + ], + "type": "object" + } + }, + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"idempotency\":{\"admission\":\"FULL SQLite commit before native dispatch\",\"capacity\":10000,\"databaseByteLimit\":67108864,\"recordByteLimit\":4194304,\"restartBehavior\":\"old-session history is readable; native execution never replays across sessions\",\"scope\":\"durable history keyed by add-in session and operation ID\",\"storageVersion\":1},\"operations\":{\"assembly_properties\":{\"description\":\"High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.\",\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"target\"],\"type\":\"object\"},\"bom\":{\"description\":\"Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance. Includes exact current active configuration provenance; incomplete configuration scope refuses. Visibility does not remove quantity.\",\"properties\":{\"explodePurchased\":{\"type\":\"boolean\"}},\"required\":[\"op\",\"target\"],\"type\":\"object\"},\"bom_export\":{\"description\":\"Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions. Both CSV modes include document/revision and current active configuration table/row provenance.\",\"properties\":{\"explodePurchased\":{\"type\":\"boolean\"},\"filename\":{\"type\":\"string\"},\"mode\":{\"enum\":[\"flat\",\"structured\"]},\"overwrite\":{\"type\":\"boolean\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"filename\"],\"type\":\"object\"},\"cad_import\":{\"description\":\"Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\"properties\":{\"asPurchased\":{\"type\":\"boolean\"},\"filename\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"parent\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"provenance\":{\"additionalProperties\":false,\"properties\":{\"description\":{\"type\":\"string\"},\"sourceUrl\":{\"type\":\"string\"},\"supplier\":{\"type\":\"string\"},\"supplierPartNumber\":{\"type\":\"string\"}},\"required\":[\"supplier\",\"supplierPartNumber\",\"sourceUrl\"],\"type\":\"object\"},\"sha256\":{\"type\":\"string\"},\"transform\":{\"additionalProperties\":false,\"description\":\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\"properties\":{\"angle\":{\"type\":\"number\"},\"axis\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"}},\"required\":[],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"filename\",\"provenance\"],\"type\":\"object\"},\"component_create\":{\"description\":\"Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\"properties\":{\"metadata\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"asPurchased\":{\"type\":\"boolean\"},\"description\":{\"type\":\"string\"},\"excludeFromBom\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"partNumber\":{\"type\":\"string\"},\"sourceUrl\":{\"type\":\"string\"},\"supplier\":{\"type\":\"string\"},\"supplierPartNumber\":{\"type\":\"string\"}},\"required\":[],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"parent\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"transform\":{\"additionalProperties\":false,\"description\":\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\"properties\":{\"angle\":{\"type\":\"number\"},\"axis\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"}},\"required\":[],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"name\"],\"type\":\"object\"},\"component_metadata\":{\"description\":\"Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.\",\"properties\":{\"changes\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"asPurchased\":{\"type\":\"boolean\"},\"description\":{\"type\":\"string\"},\"excludeFromBom\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"partNumber\":{\"type\":\"string\"},\"sourceUrl\":{\"type\":\"string\"},\"supplier\":{\"type\":\"string\"},\"supplierPartNumber\":{\"type\":\"string\"}},\"required\":[],\"type\":\"object\"},\"component\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"changes\"],\"type\":\"object\"},\"configuration_inspect\":{\"description\":\"Read the loaded Design configuration graph without activation or recompute: ordinary rows, the separate native reserved test row, all supported typed cells including inactive/test cells, exact controlled-source links and current ordinary row. Unreadable fields and unknown/theme/hierarchical/inserted scopes remain explicit incomplete diagnostics. Configuration lifecycle and configured-design model mutations remain disabled pending native recovery/archive gates.\",\"properties\":{},\"required\":[\"op\",\"target\"],\"type\":\"object\"},\"construction_axis\":{\"description\":\"Create a parametric axis from native references (edge/circular face/two intersecting planes/two distinct points). Root-space external geometry requires exact occurrence context. For cross-component geometry into a non-root target component, creationOccurrence must identify a root-context instance of that target. Returns component-space native axis geometry/health. No direct-only infinite-line or preview snap APIs.\",\"properties\":{\"component\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"creationOccurrence\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entities\":{\"items\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":2,\"minItems\":1,\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"type\":{\"enum\":[\"edge\",\"circular_face\",\"two_planes\",\"two_points\"]}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"type\",\"entities\"],\"type\":\"object\"},\"entity_delete\":{\"description\":\"Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.\",\"properties\":{\"entity\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"entity\"],\"type\":\"object\"},\"export\":{\"description\":\"Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.\",\"properties\":{\"format\":{\"default\":\"step\",\"enum\":[\"step\",\"stl\",\"3mf\",\"f3d\",\"iges\",\"sat\",\"smt\",\"usdz\",\"fbx\",\"skp\"]},\"outputPath\":{\"type\":\"string\"},\"overwrite\":{\"default\":false,\"type\":\"boolean\"},\"refinement\":{\"default\":\"medium\",\"enum\":[\"low\",\"medium\",\"high\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"outputPath\"],\"type\":\"object\"},\"feature_create\":{\"description\":\"Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.\",\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"direction\":{\"enum\":[\"positive\",\"negative\",\"symmetric\"]},\"distance\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"new_body\",\"join\",\"cut\",\"intersect\"]},\"operationId\":{\"type\":\"string\"},\"profiles\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"taper\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"extrude\"]}},\"required\":[\"type\",\"profiles\",\"distance\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"axis\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"new_body\",\"join\",\"cut\",\"intersect\"]},\"operationId\":{\"type\":\"string\"},\"profiles\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"revolve\"]}},\"required\":[\"type\",\"profiles\",\"axis\",\"angle\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"edges\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"radius\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"sessionId\":{\"type\":\"string\"},\"tangentChain\":{\"type\":\"boolean\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"fillet\"]}},\"required\":[\"type\",\"edges\",\"radius\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"distance\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"edges\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"tangentChain\":{\"type\":\"boolean\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"chamfer\"]}},\"required\":[\"type\",\"edges\",\"distance\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"faces\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"tangentChain\":{\"type\":\"boolean\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"thickness\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"type\":{\"enum\":[\"shell\"]}},\"required\":[\"type\",\"faces\",\"thickness\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"depth\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"diameter\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"points\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"hole\"]}},\"required\":[\"type\",\"points\",\"diameter\",\"depth\",\"bodies\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"new_body\",\"join\",\"cut\",\"intersect\"]},\"operationId\":{\"type\":\"string\"},\"profiles\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"loft\"]}},\"required\":[\"type\",\"profiles\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"new_body\",\"join\",\"cut\",\"intersect\"]},\"operationId\":{\"type\":\"string\"},\"path\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"profiles\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"sweep\"]}},\"required\":[\"type\",\"profiles\",\"path\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"body\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keepTools\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"join\",\"cut\",\"intersect\"]},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"tools\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"type\":{\"enum\":[\"combine\"]}},\"required\":[\"type\",\"body\",\"tools\",\"operation\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"extend\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"split\"]}},\"required\":[\"type\",\"bodies\",\"plane\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"type\":\"number\"},\"axis\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"origin\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"translation\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"move\"]}},\"required\":[\"type\",\"bodies\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"mirror\"]}},\"required\":[\"type\",\"bodies\",\"plane\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"axis2\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"count\":{\"maximum\":1000,\"minimum\":2,\"type\":\"integer\"},\"count2\":{\"maximum\":1000,\"minimum\":1,\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"spacing\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"spacing2\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"rectangular_pattern\"]}},\"required\":[\"type\",\"bodies\",\"axis\",\"count\",\"spacing\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"axis\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"bodies\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"count\":{\"maximum\":1000,\"minimum\":2,\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"circular_pattern\"]}},\"required\":[\"type\",\"bodies\",\"axis\",\"count\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"faces\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"sessionId\":{\"type\":\"string\"},\"tangentChain\":{\"type\":\"boolean\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"draft\"]}},\"required\":[\"type\",\"faces\",\"plane\",\"angle\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"designation\":{\"type\":\"string\"},\"faces\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"internal\":{\"type\":\"boolean\"},\"modeled\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"target\":{\"additionalProperties\":false,\"properties\":{\"documentId\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"threadClass\":{\"type\":\"string\"},\"threadType\":{\"type\":\"string\"},\"type\":{\"enum\":[\"thread\"]}},\"required\":[\"type\",\"faces\",\"internal\",\"threadType\",\"designation\",\"threadClass\"],\"type\":\"object\"}],\"properties\":{\"angle\":{},\"axis\":{},\"axis2\":{},\"bodies\":{},\"body\":{},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"count\":{},\"count2\":{},\"depth\":{},\"designation\":{},\"diameter\":{},\"direction\":{},\"distance\":{},\"edges\":{},\"extend\":{},\"faces\":{},\"internal\":{},\"keepTools\":{},\"modeled\":{},\"name\":{\"type\":\"string\"},\"operation\":{},\"origin\":{},\"path\":{},\"plane\":{},\"points\":{},\"profiles\":{},\"radius\":{},\"spacing\":{},\"spacing2\":{},\"tangentChain\":{},\"taper\":{},\"thickness\":{},\"threadClass\":{},\"threadType\":{},\"tools\":{},\"translation\":{},\"type\":{\"enum\":[\"extrude\",\"revolve\",\"fillet\",\"chamfer\",\"shell\",\"hole\",\"loft\",\"sweep\",\"combine\",\"split\",\"move\",\"mirror\",\"rectangular_pattern\",\"circular_pattern\",\"draft\",\"thread\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"type\"],\"type\":\"object\"},\"feature_edit\":{\"description\":\"Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.\",\"properties\":{\"feature\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"parameters\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"suppressed\":{\"type\":\"boolean\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"feature\"],\"type\":\"object\"},\"geometry_query\":{\"description\":\"Complete body-scoped topology query, no arbitrary first-match selection. selection one (default) refuses zero/multiple matches; many may return empty. Geometry types are exact native types; size ranges inclusive in mm/mm2, near is minimum distance in the explicit frame; direction is outward planar face normal or linear edge tangent. Returned refs retain instance context even for component-space filters. Exceeding maxResults fails rather than truncating.\",\"properties\":{\"body\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"filters\":{\"additionalProperties\":false,\"properties\":{\"area\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"max\":{\"minimum\":0,\"type\":\"number\"},\"min\":{\"minimum\":0,\"type\":\"number\"}},\"required\":[],\"type\":\"object\"},\"direction\":{\"additionalProperties\":false,\"properties\":{\"orientation\":{\"enum\":[\"same\",\"parallel\"]},\"tolerance\":{\"maximum\":90,\"minimum\":0,\"type\":\"number\"},\"vector\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"}},\"required\":[\"vector\"],\"type\":\"object\"},\"length\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"max\":{\"minimum\":0,\"type\":\"number\"},\"min\":{\"minimum\":0,\"type\":\"number\"}},\"required\":[],\"type\":\"object\"},\"near\":{\"additionalProperties\":false,\"properties\":{\"point\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"tolerance\":{\"minimum\":0,\"type\":\"number\"}},\"required\":[\"point\",\"tolerance\"],\"type\":\"object\"},\"radius\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"max\":{\"minimum\":0,\"type\":\"number\"},\"min\":{\"minimum\":0,\"type\":\"number\"}},\"required\":[],\"type\":\"object\"},\"type\":{\"enum\":[\"Plane\",\"Cylinder\",\"Cone\",\"Sphere\",\"Torus\",\"NurbsSurface\",\"Line3D\",\"Arc3D\",\"Circle3D\",\"Ellipse3D\",\"EllipticalArc3D\",\"NurbsCurve3D\",\"Point3D\",\"degenerate\"]}},\"required\":[],\"type\":\"object\"},\"kind\":{\"enum\":[\"faces\",\"edges\",\"vertices\"]},\"maxResults\":{\"maximum\":1024,\"minimum\":1,\"type\":\"integer\"},\"selection\":{\"enum\":[\"one\",\"many\"]},\"space\":{\"enum\":[\"root\",\"component\"]}},\"required\":[\"op\",\"target\",\"body\",\"kind\",\"space\"],\"type\":\"object\"},\"health\":{\"description\":\"Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.\",\"properties\":{\"recompute\":{\"default\":false,\"type\":\"boolean\"}},\"required\":[\"op\",\"target\"],\"type\":\"object\"},\"inspect\":{\"description\":\"Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.\",\"properties\":{},\"required\":[\"op\"],\"type\":\"object\"},\"inspect_entity\":{\"properties\":{\"entity\":{\"description\":\"Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.\",\"type\":\"object\"}},\"required\":[\"op\",\"target\",\"entity\"],\"type\":\"object\"},\"interference\":{\"description\":\"Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.\",\"properties\":{\"entities\":{\"items\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":2,\"type\":\"array\"},\"includeTouching\":{\"type\":\"boolean\"},\"volumeTolerance\":{\"minimum\":0,\"type\":\"number\"}},\"required\":[\"op\",\"target\",\"entities\"],\"type\":\"object\"},\"joint_create\":{\"description\":\"Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Use regular_joint_create for geometry-solving placement.\",\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"rigid\"]}},\"required\":[\"type\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"sessionId\":{\"type\":\"string\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"revolute\"]}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"sessionId\":{\"type\":\"string\"},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"slider\"]}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"sessionId\":{\"type\":\"string\"},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"cylindrical\"]}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"sessionId\":{\"type\":\"string\"},\"slideAxis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"pin_slot\"]}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"primarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"primarySlideValue\":{\"type\":\"number\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"secondarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"secondarySlideValue\":{\"type\":\"number\"},\"sessionId\":{\"type\":\"string\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"planar\"]}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"pitchLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"pitchValue\":{\"type\":\"number\"},\"rollLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rollValue\":{\"type\":\"number\"},\"sessionId\":{\"type\":\"string\"},\"suppressed\":{\"type\":\"boolean\"},\"target\":{\"type\":\"object\"},\"type\":{\"enum\":[\"ball\"]},\"yawLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"yawValue\":{\"type\":\"number\"}},\"required\":[\"type\",\"geometry\"],\"type\":\"object\"}],\"properties\":{\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"occurrenceOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"occurrenceTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"pitchLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"pitchValue\":{\"type\":\"number\"},\"primarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"primarySlideValue\":{\"type\":\"number\"},\"rollLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rollValue\":{\"type\":\"number\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"secondarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"secondarySlideValue\":{\"type\":\"number\"},\"slideAxis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"suppressed\":{\"type\":\"boolean\"},\"type\":{\"enum\":[\"rigid\",\"revolute\",\"slider\",\"cylindrical\",\"pin_slot\",\"planar\",\"ball\"]},\"yawLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"yawValue\":{\"type\":\"number\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"type\",\"occurrenceOne\",\"occurrenceTwo\"],\"type\":\"object\"},\"joint_delete\":{\"description\":\"Delete one selected Joint or AsBuiltJoint with recovery verification.\",\"properties\":{\"joint\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"joint\"],\"type\":\"object\"},\"joint_edit\":{\"description\":\"Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery. For driven root joints, active motion links must preserve their settings and their partner motion must follow the native ratio; a coupling mismatch aborts.\",\"properties\":{\"joint\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"pitchLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"pitchValue\":{\"type\":\"number\"},\"primarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"primarySlideValue\":{\"type\":\"number\"},\"rollLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rollValue\":{\"type\":\"number\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"secondarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"secondarySlideValue\":{\"type\":\"number\"},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"suppressed\":{\"type\":\"boolean\"},\"yawLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"yawValue\":{\"type\":\"number\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"joint\"],\"type\":\"object\"},\"joint_origin_create\":{\"description\":\"Create a native component-definition joint origin from guarded native geometry, with mm offsets/deg angle and optional straight axis references. Child occurrence origin references are exposed by inspect_entity(occurrence).\",\"properties\":{\"angle\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"component\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"flipped\":{\"type\":\"boolean\"},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"maxLength\":120,\"minLength\":1,\"type\":\"string\"},\"offsetX\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetY\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetZ\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"xAxisEntity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"zAxisEntity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"geometry\"],\"type\":\"object\"},\"joint_origin_delete\":{\"description\":\"Delete a native joint origin; unhealthy downstream joints cause transaction rollback.\",\"properties\":{\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"origin\"],\"type\":\"object\"},\"joint_origin_edit\":{\"description\":\"Edit a native joint origin definition; rolls before its timeline item and restores the original marker in finally. Recomputes and verifies attachment, axes, offsets, angle, name and flip.\",\"properties\":{\"angle\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"flipped\":{\"type\":\"boolean\"},\"geometry\":{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},\"name\":{\"maxLength\":120,\"minLength\":1,\"type\":\"string\"},\"offsetX\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetY\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetZ\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"xAxisEntity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"zAxisEntity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"origin\"],\"type\":\"object\"},\"material_assign\":{\"description\":\"Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.\",\"properties\":{\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"libraryId\":{\"type\":\"string\"},\"materialId\":{\"type\":\"string\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"entity\",\"materialId\"],\"type\":\"object\"},\"material_list\":{\"description\":\"List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.\",\"properties\":{\"libraryId\":{\"type\":\"string\"},\"limit\":{\"maximum\":1000,\"minimum\":1,\"type\":\"integer\"},\"query\":{\"type\":\"string\"}},\"required\":[\"op\",\"target\"],\"type\":\"object\"},\"mcmaster_discover\":{\"description\":\"Discover Fusion native Insert McMaster-Carr command and requirements in the active design.\",\"properties\":{},\"required\":[\"op\"],\"type\":\"object\"},\"mcmaster_open\":{\"description\":\"Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.\",\"properties\":{},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\"],\"type\":\"object\"},\"measure\":{\"description\":\"Native engineering minimum distance or angle in root assembly space. Non-root definition refs require an occurrence context. Distance needs2 entities; angle needs2 lines/planes or3 points (second apex). Returns mm/deg and native witness positions in root mm. witnessValidation identifies native points or native geometry directions used for valid parallel angles with degenerate native points; degenerate point angles and unavailable/inconsistent witnesses fail.\",\"properties\":{\"entities\":{\"items\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"space\":{\"enum\":[\"root\"]},\"type\":{\"enum\":[\"distance\",\"angle\"]}},\"required\":[\"op\",\"target\",\"type\",\"space\",\"entities\"],\"type\":\"object\"},\"motion_link_create\":{\"description\":\"Create a native motion link between two root-owned joints, or two different motions of jointOne when jointTwo is omitted. Positive ratio magnitudes use mm for translation and deg for rotation; reversed selects opposite direction. Requires the November 2025+ API; no script fallback.\",\"properties\":{\"jointOne\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"jointTwo\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"motionOne\":{\"enum\":[\"rotation\",\"slide\",\"primarySlide\",\"secondarySlide\",\"pitch\",\"roll\",\"yaw\"]},\"motionTwo\":{\"enum\":[\"rotation\",\"slide\",\"primarySlide\",\"secondarySlide\",\"pitch\",\"roll\",\"yaw\"]},\"name\":{\"maxLength\":120,\"minLength\":1,\"type\":\"string\"},\"reversed\":{\"type\":\"boolean\"},\"valueOne\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"valueTwo\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"jointOne\",\"motionOne\",\"motionTwo\",\"valueOne\",\"valueTwo\"],\"type\":\"object\"},\"motion_link_delete\":{\"description\":\"Delete a root-owned motion link under the same transaction/recovery contract.\",\"properties\":{\"link\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"link\"],\"type\":\"object\"},\"motion_link_edit\":{\"description\":\"Edit a root-owned motion link ratio, degree-of-freedom pair, direction, name or suppression. Joint membership is immutable; recreate the link to change members. Verify exact joint identities, ratio, flags and health.\",\"properties\":{\"link\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"motionOne\":{\"enum\":[\"rotation\",\"slide\",\"primarySlide\",\"secondarySlide\",\"pitch\",\"roll\",\"yaw\"]},\"motionTwo\":{\"enum\":[\"rotation\",\"slide\",\"primarySlide\",\"secondarySlide\",\"pitch\",\"roll\",\"yaw\"]},\"name\":{\"maxLength\":120,\"minLength\":1,\"type\":\"string\"},\"reversed\":{\"type\":\"boolean\"},\"suppressed\":{\"type\":\"boolean\"},\"valueOne\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"valueTwo\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"link\"],\"type\":\"object\"},\"new_design\":{\"description\":\"Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.\",\"properties\":{\"box\":{\"additionalProperties\":false,\"properties\":{\"depth\":{\"exclusiveMinimum\":0,\"type\":\"number\"},\"height\":{\"exclusiveMinimum\":0,\"type\":\"number\"},\"width\":{\"exclusiveMinimum\":0,\"type\":\"number\"}},\"required\":[\"width\",\"height\",\"depth\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"}},\"required\":[\"op\",\"sessionId\",\"operationId\"],\"type\":\"object\"},\"occurrence_delete\":{\"description\":\"Delete one selected occurrence through the shared transaction executor.\",\"properties\":{\"occurrence\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"occurrence\"],\"type\":\"object\"},\"occurrence_insert\":{\"description\":\"Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.\",\"properties\":{\"component\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"independentCopy\":{\"type\":\"boolean\"},\"parent\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"transform\":{\"additionalProperties\":false,\"description\":\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\"properties\":{\"angle\":{\"type\":\"number\"},\"axis\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"}},\"required\":[],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"component\"],\"type\":\"object\"},\"occurrence_update\":{\"description\":\"Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.\",\"properties\":{\"grounded\":{\"type\":\"boolean\"},\"groundedToParent\":{\"type\":\"boolean\"},\"occurrence\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"transform\":{\"additionalProperties\":false,\"description\":\"Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.\",\"properties\":{\"angle\":{\"type\":\"number\"},\"axis\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":3,\"type\":\"array\"}},\"required\":[],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"occurrence\"],\"type\":\"object\"},\"parameter_batch\":{\"description\":\"Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.\",\"properties\":{\"changes\":{\"items\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"create\"]},\"comment\":{\"type\":\"string\"},\"expression\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"unit\":{\"enum\":[\"mm\",\"deg\",\"kg\",\"\"]}},\"required\":[\"action\",\"name\",\"expression\",\"unit\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"set\"]},\"expression\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"action\",\"name\",\"expression\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"delete\"]},\"name\":{\"type\":\"string\"}},\"required\":[\"action\",\"name\"],\"type\":\"object\"}]},\"maxItems\":128,\"minItems\":1,\"type\":\"array\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"changes\"],\"type\":\"object\"},\"parameter_create\":{\"properties\":{\"comment\":{\"type\":\"string\"},\"expression\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"unit\":{\"enum\":[\"mm\",\"deg\",\"kg\",\"\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"name\",\"expression\",\"unit\"],\"type\":\"object\"},\"parameter_set\":{\"description\":\"Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.\",\"properties\":{\"expression\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"name\",\"expression\"],\"type\":\"object\"},\"plane_create\":{\"description\":\"Create offset plane (offset in mm) or angled plane around axis (angle in deg).\",\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"offset\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"sessionId\":{\"type\":\"string\"},\"target\":{\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"offset\"]}},\"required\":[\"type\",\"offset\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"axis\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"op\":{\"type\":\"string\"},\"operationId\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"sessionId\":{\"type\":\"string\"},\"target\":{\"required\":[\"documentId\",\"revision\"],\"type\":\"object\"},\"type\":{\"enum\":[\"angle\"]}},\"required\":[\"type\",\"axis\",\"angle\"],\"type\":\"object\"}],\"properties\":{\"angle\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"axis\":{\"oneOf\":[{\"enum\":[\"x\",\"y\",\"z\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"offset\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]},\"type\":{\"enum\":[\"offset\",\"angle\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"type\"],\"type\":\"object\"},\"regular_joint_create\":{\"description\":\"Create a geometry-solving regular joint in the root component using two distinct instance-context attachments or joint origins. All seven native motion families; offsets mm, angle and angular limits deg. Read back freshly resolved attachment graph, native parameters and root-space occurrence placement. Root/non-root sides must be unambiguous; both grounded and ancestor/descendant pairs are refused. Inferred joints are unsupported. Existing pending positions must be captured or reverted first. Before applying drive values, checks native joint-transform anchor offset magnitude/axiality and zero-angle axis collinearity. Native joint matrices have explicit provenance; physical angle/flip sense requires independent occurrence-geometry acceptance.\",\"properties\":{\"angle\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"flipped\":{\"type\":\"boolean\"},\"geometryOne\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"origin\"],\"type\":\"object\"}]},\"geometryTwo\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"origin\"],\"type\":\"object\"}]},\"locked\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"offset\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"pitchLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"pitchValue\":{\"type\":\"number\"},\"primarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"primarySlideValue\":{\"type\":\"number\"},\"rollLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rollValue\":{\"type\":\"number\"},\"rotationLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"rotationValue\":{\"type\":\"number\"},\"secondarySlideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"secondarySlideValue\":{\"type\":\"number\"},\"slideAxis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"slideLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"slideValue\":{\"type\":\"number\"},\"type\":{\"enum\":[\"rigid\",\"revolute\",\"slider\",\"cylindrical\",\"pin_slot\",\"planar\",\"ball\"]},\"yawLimits\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"maximum\":{\"type\":\"number\"},\"maximumEnabled\":{\"type\":\"boolean\"},\"minimum\":{\"type\":\"number\"},\"minimumEnabled\":{\"type\":\"boolean\"},\"rest\":{\"type\":\"number\"},\"restEnabled\":{\"type\":\"boolean\"}},\"required\":[],\"type\":\"object\"},\"yawValue\":{\"type\":\"number\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"type\",\"geometryOne\",\"geometryTwo\"],\"type\":\"object\"},\"regular_joint_edit\":{\"description\":\"Redefine root-owned regular joint geometry, motion family, offsets, angle, flip or lock. Restore timeline in finally and verify after recompute. Use joint_edit for name, suppression, limits and drive values; joint_delete for deletion.\",\"properties\":{\"angle\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"axis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"flipped\":{\"type\":\"boolean\"},\"geometryOne\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"origin\"],\"type\":\"object\"}]},\"geometryTwo\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"edge\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"entity\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"keyPoint\":{\"enum\":[\"center\",\"start\",\"middle\",\"end\"]}},\"required\":[\"entity\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"origin\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"origin\"],\"type\":\"object\"}]},\"joint\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"locked\":{\"type\":\"boolean\"},\"offset\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetX\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"offsetY\":{\"description\":\"Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression.\",\"oneOf\":[{\"type\":\"number\"},{\"maxLength\":512,\"minLength\":1,\"type\":\"string\"}]},\"slideAxis\":{\"enum\":[\"x\",\"y\",\"z\"]},\"type\":{\"enum\":[\"rigid\",\"revolute\",\"slider\",\"cylindrical\",\"pin_slot\",\"planar\",\"ball\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"joint\"],\"type\":\"object\"},\"rigid_group_create\":{\"description\":\"Create a native rigid group from exact occurrence instances; includeChildren defaults true.\",\"properties\":{\"includeChildren\":{\"type\":\"boolean\"},\"name\":{\"type\":\"string\"},\"occurrences\":{\"items\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":2,\"type\":\"array\"}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"occurrences\"],\"type\":\"object\"},\"rigid_group_delete\":{\"description\":\"Delete an exact rigid group with transaction recovery.\",\"properties\":{\"group\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"group\"],\"type\":\"object\"},\"rigid_group_edit\":{\"description\":\"Rename or suppress an exact rigid group with transaction recovery.\",\"properties\":{\"group\":{\"description\":\"Guarded reference from inspect in this document/revision; occurrence references retain instance context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"suppressed\":{\"type\":\"boolean\"}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"group\"],\"type\":\"object\"},\"sketch_constraint\":{\"description\":\"Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.\",\"properties\":{\"entities\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sketch\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"type\":{\"enum\":[\"horizontal\",\"vertical\",\"coincident\",\"parallel\",\"perpendicular\",\"tangent\",\"equal\",\"concentric\",\"collinear\",\"midpoint\",\"symmetry\",\"fix\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"sketch\",\"type\",\"entities\"],\"type\":\"object\"},\"sketch_create\":{\"description\":\"Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.\",\"properties\":{\"component\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"plane\":{\"oneOf\":[{\"enum\":[\"xy\",\"xz\",\"yz\"]},{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\"],\"type\":\"object\"},\"sketch_curve_edit\":{\"description\":\"Edit one native sketch curve with sketch-space mm pick. trim removes the nearest segment; extend chooses nearest endpoint; split requires an interior on-curve point; break uses neighboring intersections. Fresh replacement refs are returned; original may be deleted. In-place extend returns the original with a fresh ref only after its geometry change survives recompute. No change or empty break/split fails. Full trim deletion requires allowDelete true. Linked/derived/deferred-compute geometry refused.\",\"properties\":{\"action\":{\"enum\":[\"trim\",\"extend\",\"split\",\"break\"]},\"allowDelete\":{\"type\":\"boolean\"},\"createConstraints\":{\"type\":\"boolean\"},\"curve\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"pick\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"sketch\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"sketch\",\"curve\",\"action\",\"pick\"],\"type\":\"object\"},\"sketch_diagnostics\":{\"description\":\"Read native sketch health/message, fully-constrained/fixed/linked/reference flags, geometric constraints and driving dimensions. Reports no solver DOF count or conflict-set explanation; no recompute/mutation.\",\"properties\":{\"sketch\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"target\",\"sketch\"],\"type\":\"object\"},\"sketch_dimension\":{\"description\":\"Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.\",\"properties\":{\"entities\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"expression\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"parameterName\":{\"type\":\"string\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"sketch\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"type\":{\"enum\":[\"distance\",\"horizontal\",\"vertical\",\"radius\",\"diameter\",\"angle\"]}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"sketch\",\"type\",\"entities\",\"expression\",\"position\"],\"type\":\"object\"},\"sketch_edit\":{\"description\":\"Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.\",\"properties\":{\"changes\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"center\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"construction\":{\"type\":\"boolean\"},\"end\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"fixed\":{\"type\":\"boolean\"},\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"radius\":{\"type\":\"number\"},\"start\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"}},\"required\":[],\"type\":\"object\"},\"entity\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"sketch\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"sketch\",\"entity\",\"changes\"],\"type\":\"object\"},\"sketch_geometry\":{\"description\":\"Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.\",\"properties\":{\"items\":{\"items\":{\"oneOf\":[{\"additionalProperties\":false,\"properties\":{\"position\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"point\"]}},\"required\":[\"type\",\"position\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"construction\":{\"type\":\"boolean\"},\"end\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"start\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"line\"]}},\"required\":[\"type\",\"start\",\"end\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"construction\":{\"type\":\"boolean\"},\"end\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"start\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"rectangle\"]}},\"required\":[\"type\",\"start\",\"end\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"center\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"construction\":{\"type\":\"boolean\"},\"radius\":{\"exclusiveMinimum\":0,\"type\":\"number\"},\"type\":{\"enum\":[\"circle\"]}},\"required\":[\"type\",\"center\",\"radius\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"center\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"construction\":{\"type\":\"boolean\"},\"start\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"sweep\":{\"type\":\"number\"},\"type\":{\"enum\":[\"arc\"]}},\"required\":[\"type\",\"center\",\"start\",\"sweep\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"angle\":{\"type\":\"number\"},\"center\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"construction\":{\"type\":\"boolean\"},\"radius\":{\"exclusiveMinimum\":0,\"type\":\"number\"},\"sides\":{\"maximum\":128,\"minimum\":3,\"type\":\"integer\"},\"type\":{\"enum\":[\"polygon\"]}},\"required\":[\"type\",\"center\",\"radius\",\"sides\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"construction\":{\"type\":\"boolean\"},\"end\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"start\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"slot\"]},\"width\":{\"exclusiveMinimum\":0,\"type\":\"number\"}},\"required\":[\"type\",\"start\",\"end\",\"width\"],\"type\":\"object\"},{\"additionalProperties\":false,\"properties\":{\"closed\":{\"type\":\"boolean\"},\"construction\":{\"type\":\"boolean\"},\"points\":{\"items\":{\"items\":{\"type\":\"number\"},\"maxItems\":3,\"minItems\":2,\"type\":\"array\"},\"maxItems\":128,\"minItems\":2,\"type\":\"array\"},\"type\":{\"enum\":[\"spline\"]}},\"required\":[\"type\",\"points\"],\"type\":\"object\"}]},\"maxItems\":128,\"minItems\":1,\"type\":\"array\"},\"sketch\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"sketch\",\"items\"],\"type\":\"object\"},\"sketch_offset\":{\"description\":\"Modern createOffsetInput/addOffset2. Curves must be native 2D, unique, in connected flow order (never reordered). Nonzero signed mm number/expression: positive right, negative left; a single circle/ellipse positive outside. Topology matched defaults true. Read back native signed distance, parent/child refs and controlling parameter after recompute. No retired Sketch.offset fallback.\",\"properties\":{\"curves\":{\"items\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"distance\":{\"oneOf\":[{\"type\":\"number\"},{\"type\":\"string\"}]},\"sketch\":{\"description\":\"Current guarded entity reference; root-space child geometry requires its exact occurrence context.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"topologyMatched\":{\"type\":\"boolean\"}},\"required\":[\"op\",\"target\",\"sessionId\",\"operationId\",\"sketch\",\"curves\",\"distance\"],\"type\":\"object\"},\"sketch_project\":{\"description\":\"Project selected topology into a sketch with Fusion associative projection.\",\"properties\":{\"entities\":{\"items\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"},\"maxItems\":256,\"minItems\":1,\"type\":\"array\"},\"sketch\":{\"description\":\"Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.\",\"required\":[\"documentId\",\"revision\",\"objectType\"],\"type\":\"object\"}},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\",\"sketch\",\"entities\"],\"type\":\"object\"},\"transaction_probe\":{\"description\":\"Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.\",\"properties\":{},\"required\":[\"op\",\"sessionId\",\"operationId\",\"target\"],\"type\":\"object\"}},\"schemaVersion\":1,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60,\"transactions\":{\"externalEffects\":\"exports publish atomically; model recovery does not undo files\",\"genericAtomicBatch\":false,\"newDesignRecovery\":\"discard only the new unsaved document\",\"parameterRecovery\":\"compensating expression restore with semantic readback\",\"typedModelOperations\":{\"backend\":\"PTransaction\",\"evidence\":null,\"scope\":\"one active Fusion Design; no document lifecycle, files or cloud effects\",\"verified\":false}},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60, + "transactions": { + "externalEffects": "exports publish atomically; model recovery does not undo files", + "genericAtomicBatch": false, + "newDesignRecovery": "discard only the new unsaved document", + "parameterRecovery": "compensating expression restore with semantic readback", + "typedModelOperations": { + "backend": "PTransaction", + "evidence": null, + "scope": "one active Fusion Design; no document lifecycle, files or cloud effects", + "verified": false + } + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0011-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0011-fusion_mechanical.json new file mode 100644 index 0000000..57561da --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0011-fusion_mechanical.json @@ -0,0 +1,118 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234199.2747328, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {},\n \"bodyCount\": 0,\n \"description\": \"\",\n \"id\": \"c169c0d2-e69d-46cc-bf64-cfb80329df49\",\n \"material\": null,\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-02-30-171\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\",\n \"rootComponentId\": \"c169c0d2-e69d-46cc-bf64-cfb80329df49\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 0\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 0,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [],\n \"rigidGroups\": [],\n \"sketches\": [],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\",\n \"revision\": \"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 0,\n \"openDocumentCount\": 1,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 774,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{},\\\"bodyCount\\\":0,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"c169c0d2-e69d-46cc-bf64-cfb80329df49\\\",\\\"material\\\":null,\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-02-30-171\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\\\",\\\"rootComponentId\\\":\\\"c169c0d2-e69d-46cc-bf64-cfb80329df49\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":0}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":0,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[],\\\"rigidGroups\\\":[],\\\"sketches\\\":[],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\\\",\\\"revision\\\":\\\"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":0,\\\"openDocumentCount\\\":1,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234200.0567222, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [], + "complete": true, + "components": [ + { + "attributes": {}, + "bodyCount": 0, + "description": "", + "id": "c169c0d2-e69d-46cc-bf64-cfb80329df49", + "material": null, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-02-30-171", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8", + "rootComponentId": "c169c0d2-e69d-46cc-bf64-cfb80329df49", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 0 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "name": "Untitled", + "saved": false + }, + "features": [], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 0, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [], + "rigidGroups": [], + "sketches": [], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9", + "revision": "65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 0, + "openDocumentCount": 1, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 774, + "error": "", + "operation": "inspect", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[],\"complete\":true,\"components\":[{\"attributes\":{},\"bodyCount\":0,\"description\":\"\",\"id\":\"c169c0d2-e69d-46cc-bf64-cfb80329df49\",\"material\":null,\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-02-30-171\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\",\"rootComponentId\":\"c169c0d2-e69d-46cc-bf64-cfb80329df49\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":0}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\"name\":\"Untitled\",\"saved\":false},\"features\":[],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":0,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[],\"rigidGroups\":[],\"sketches\":[],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\",\"revision\":\"65ec9e81cae345289086cfddecfd1072f9b0863adef254564c87bcb25c02faa8\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":0,\"openDocumentCount\":1,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0012-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0012-fusion_run_modeling_script.json new file mode 100644 index 0000000..479609b --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0012-fusion_run_modeling_script.json @@ -0,0 +1,59 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"inventory\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n\nlabels = []\nfor document in app.documents:\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\nresult['openDocuments'] = sorted(labels)\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"action\\\": \\\"inventory\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\\nlabels = []\\nfor document in app.documents:\\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\\nresult['openDocuments'] = sorted(labels)\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234200.0586407, + "mutating": false, + "stdout": "{\n \"_hint\": \"Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [],\n \"openDocuments\": [\n \"baseline:0\"\n ],\n \"provisionalImportCount\": 0,\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 0,\n \"openDocumentCount\": 1,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1761,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234201.8281074, + "raw": { + "_hint": "Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [], + "openDocuments": [ + "baseline:0" + ], + "provisionalImportCount": 0, + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 0, + "openDocumentCount": 1, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1761, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0013-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0013-fusion_mechanical.json new file mode 100644 index 0000000..6f2cba3 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0013-fusion_mechanical.json @@ -0,0 +1,248 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "new_design", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "name": "Untitled", + "box": { + "width": 20, + "height": 30, + "depth": 10 + } + }, + "requestJson": "{\"op\": \"new_design\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\", \"name\": \"Untitled\", \"box\": {\"width\": 20, \"height\": 30, \"depth\": 10}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234201.8292272, + "mutating": true, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"requestedName\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 1312,\n \"error\": \"\",\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"requestedName\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234203.149099, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "requestedName": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 1312, + "error": "", + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"requestedName\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0014-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0014-fusion_run_modeling_script.json new file mode 100644 index 0000000..056d47d --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0014-fusion_run_modeling_script.json @@ -0,0 +1,67 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"role\": \"01-ordinary\", \"action\": \"register\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"role\\\": \\\"01-ordinary\\\", \\\"action\\\": \\\"register\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234203.1540902, + "mutating": true, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"checkpoint\": null,\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1755,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234204.9169793, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "checkpoint": null, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1755, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0015-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0015-fusion_mechanical.json new file mode 100644 index 0000000..22ff11d --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0015-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234204.9197397, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 765,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234205.6917253, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 765, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0016-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0016-fusion_run_modeling_script.json new file mode 100644 index 0000000..d12637a --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0016-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234205.6928086, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 10.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"faces\": 6,\n \"mass\": 0.0162,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 6000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 6000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"10.0 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"mass\": 0.0162,\n \"volume\": 6000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1759,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234207.4590733, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 10.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "faces": 6, + "mass": 0.0162, + "material": "Aluminum", + "name": "Block", + "volume": 6000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 6000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "10.0 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "mass": 0.0162, + "volume": 6000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1759, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0017-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0017-fusion_mechanical.json new file mode 100644 index 0000000..6de007f --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0017-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234207.4599717, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 799,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234208.2672095, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 799, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0018-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0018-fusion_mechanical.json new file mode 100644 index 0000000..d2cd914 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0018-fusion_mechanical.json @@ -0,0 +1,93 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "assembly_properties", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + } + }, + "requestJson": "{\"op\": \"assembly_properties\", \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234208.2691183, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"area\": 2200.0,\n \"averageDensity\": 2.7e-6,\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"entity\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"mass\": 0.0162,\n \"materialBasis\": \"Fusion assigned/default material; supplier provenance does not certify modeled material density\",\n \"scope\": \"component_subtree\",\n \"space\": \"component\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"area\": \"mm2\",\n \"averageDensity\": \"kg/mm3\",\n \"centerOfMass\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 764,\n \"error\": \"\",\n \"operation\": \"assembly_properties\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"area\\\":2200.0,\\\"averageDensity\\\":2.7e-6,\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"entity\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"mass\\\":0.0162,\\\"materialBasis\\\":\\\"Fusion assigned/default material; supplier provenance does not certify modeled material density\\\",\\\"scope\\\":\\\"component_subtree\\\",\\\"space\\\":\\\"component\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"area\\\":\\\"mm2\\\",\\\"averageDensity\\\":\\\"kg/mm3\\\",\\\"centerOfMass\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"assembly_properties\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234209.0398202, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "area": 2200.0, + "averageDensity": 2.7e-06, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "entity": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "mass": 0.0162, + "materialBasis": "Fusion assigned/default material; supplier provenance does not certify modeled material density", + "scope": "component_subtree", + "space": "component", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "area": "mm2", + "averageDensity": "kg/mm3", + "centerOfMass": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 764, + "error": "", + "operation": "assembly_properties", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"area\":2200.0,\"averageDensity\":2.7e-6,\"centerOfMass\":[10.0,15.0,5.0],\"entity\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"mass\":0.0162,\"materialBasis\":\"Fusion assigned/default material; supplier provenance does not certify modeled material density\",\"scope\":\"component_subtree\",\"space\":\"component\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"area\":\"mm2\",\"averageDensity\":\"kg/mm3\",\"centerOfMass\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"assembly_properties\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0019-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0019-fusion_run_modeling_script.json new file mode 100644 index 0000000..7e08fc2 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0019-fusion_run_modeling_script.json @@ -0,0 +1,77 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"inventory\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n\nlabels = []\nfor document in app.documents:\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\nresult['openDocuments'] = sorted(labels)\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"action\\\": \\\"inventory\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\\nlabels = []\\nfor document in app.documents:\\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\\nresult['openDocuments'] = sorted(labels)\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234209.0457594, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [\n {\n \"checkpoint\": null,\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\"\n }\n ],\n \"openDocuments\": [\n \"baseline:0\",\n \"owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n ],\n \"provisionalImportCount\": 0,\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1753,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234210.8056746, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [ + { + "checkpoint": null, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + } + ], + "openDocuments": [ + "baseline:0", + "owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + ], + "provisionalImportCount": 0, + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1753, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0020-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0020-fusion_mech_operation_status.json new file mode 100644 index 0000000..fbc7bb3 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0020-fusion_mech_operation_status.json @@ -0,0 +1,289 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234210.8078003, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 32,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234202.016997,\n \"events\": [\n {\n \"at\": 1791234202.016997,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234202.0256662,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234202.036122,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234202.5080516,\n \"phase\": \"succeeded\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\"\n },\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"phase\": \"succeeded\",\n \"requestDigest\": \"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\n \"requestedTarget\": null,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234202.5080516\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234202.016997,\\\"events\\\":[{\\\"at\\\":1791234202.016997,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234202.0256662,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234202.036122,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234202.5080516,\\\"phase\\\":\\\"succeeded\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\\\"},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"phase\\\":\\\"succeeded\\\",\\\"requestDigest\\\":\\\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\\\",\\\"requestedTarget\\\":null,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234202.5080516},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"succeeded\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"requestedName\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":true},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"succeeded\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"succeeded\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"requestedName\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": true\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"succeeded\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234210.8476772, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 32, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234202.016997, + "events": [ + { + "at": 1791234202.016997, + "phase": "admitted" + }, + { + "at": 1791234202.0256662, + "phase": "dispatched" + }, + { + "at": 1791234202.036122, + "phase": "executing" + }, + { + "at": 1791234202.5080516, + "phase": "succeeded" + } + ], + "observedDocument": { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9" + }, + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "phase": "succeeded", + "requestDigest": "e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93", + "requestedTarget": null, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234202.5080516 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234202.016997,\"events\":[{\"at\":1791234202.016997,\"phase\":\"admitted\"},{\"at\":1791234202.0256662,\"phase\":\"dispatched\"},{\"at\":1791234202.036122,\"phase\":\"executing\"},{\"at\":1791234202.5080516,\"phase\":\"succeeded\"}],\"observedDocument\":{\"creationId\":\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\"},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"phase\":\"succeeded\",\"requestDigest\":\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\"requestedTarget\":null,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234202.5080516},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"succeeded\",\"reconciliationRequired\":false,\"result\":{\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"requestedName\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":true},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"succeeded\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "succeeded", + "reconciliationRequired": false, + "result": { + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "requestedName": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": true + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "succeeded", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0021-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0021-fusion_run_modeling_script.json new file mode 100644 index 0000000..40b1c85 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0021-fusion_run_modeling_script.json @@ -0,0 +1,77 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"inventory\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n\nlabels = []\nfor document in app.documents:\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\nresult['openDocuments'] = sorted(labels)\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"action\\\": \\\"inventory\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\\nlabels = []\\nfor document in app.documents:\\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\\nresult['openDocuments'] = sorted(labels)\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234210.8515391, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [\n {\n \"checkpoint\": null,\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\"\n }\n ],\n \"openDocuments\": [\n \"baseline:0\",\n \"owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n ],\n \"provisionalImportCount\": 0,\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1737,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234212.595013, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [ + { + "checkpoint": null, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + } + ], + "openDocuments": [ + "baseline:0", + "owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + ], + "provisionalImportCount": 0, + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1737, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0022-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0022-fusion_mechanical.json new file mode 100644 index 0000000..253e63c --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0022-fusion_mechanical.json @@ -0,0 +1,249 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "new_design", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "name": "Untitled", + "box": { + "width": 20, + "height": 30, + "depth": 10 + } + }, + "requestJson": "{\"op\": \"new_design\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\", \"name\": \"Untitled\", \"box\": {\"width\": 20, \"height\": 30, \"depth\": 10}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234212.5963109, + "mutating": true, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"requestedName\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 778,\n \"error\": \"\",\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"requestedName\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"replayed\\\":true,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"replayed\": true,\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234213.3814309, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "requestedName": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 778, + "error": "", + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"requestedName\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"replayed\":true,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "replayed": true, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0023-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0023-fusion_run_modeling_script.json new file mode 100644 index 0000000..d402742 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0023-fusion_run_modeling_script.json @@ -0,0 +1,77 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"inventory\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n\nlabels = []\nfor document in app.documents:\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\nresult['openDocuments'] = sorted(labels)\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"action\\\": \\\"inventory\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\\nlabels = []\\nfor document in app.documents:\\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\\nresult['openDocuments'] = sorted(labels)\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234213.3843622, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [\n {\n \"checkpoint\": null,\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\"\n }\n ],\n \"openDocuments\": [\n \"baseline:0\",\n \"owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n ],\n \"provisionalImportCount\": 0,\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1733,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234215.1243203, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [ + { + "checkpoint": null, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + } + ], + "openDocuments": [ + "baseline:0", + "owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + ], + "provisionalImportCount": 0, + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1733, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0024-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0024-fusion_run_modeling_script.json new file mode 100644 index 0000000..237d4c7 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0024-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234215.1248987, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 10.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"faces\": 6,\n \"mass\": 0.0162,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 6000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 6000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"10.0 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"mass\": 0.0162,\n \"volume\": 6000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1739,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234216.8708308, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 10.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "faces": 6, + "mass": 0.0162, + "material": "Aluminum", + "name": "Block", + "volume": 6000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 6000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "10.0 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "mass": 0.0162, + "volume": 6000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1739, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0025-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0025-fusion_mechanical.json new file mode 100644 index 0000000..6bd79eb --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0025-fusion_mechanical.json @@ -0,0 +1,47 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "new_design", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "name": "Untitled", + "box": { + "width": 20, + "height": 30, + "depth": 11 + } + }, + "requestJson": "{\"op\": \"new_design\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\", \"name\": \"Untitled\", \"box\": {\"width\": 20, \"height\": 30, \"depth\": 11}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234216.8734388, + "mutating": true, + "stdout": "{\n \"_contribute\": \"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"conflict\": {\n \"existingRequestDigest\": \"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\n \"scope\": \"submitted_request\"\n },\n \"durationMs\": 1965,\n \"error\": \"operationId was already used with different arguments.\",\n \"errorCode\": \"operation_conflict\",\n \"nativeExecutionStarted\": false,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"outcome\": \"not_executed\",\n \"output\": \"{\\\"_contribute\\\":\\\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"conflict\\\":{\\\"existingRequestDigest\\\":\\\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\\\",\\\"scope\\\":\\\"submitted_request\\\"},\\\"error\\\":\\\"operationId was already used with different arguments.\\\",\\\"errorCode\\\":\\\"operation_conflict\\\",\\\"nativeExecutionStarted\\\":false,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"outcome\\\":\\\"not_executed\\\",\\\"requestDigest\\\":\\\"f1d307896d13106d840819d1833623f79e09cf61fab40c70f0527d24194695e9\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":false,\\\"timeoutSeconds\\\":60}\",\n \"requestDigest\": \"f1d307896d13106d840819d1833623f79e09cf61fab40c70f0527d24194695e9\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"error\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": false,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234218.8455658, + "raw": { + "_contribute": "If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "conflict": { + "existingRequestDigest": "e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93", + "scope": "submitted_request" + }, + "durationMs": 1965, + "error": "operationId was already used with different arguments.", + "errorCode": "operation_conflict", + "nativeExecutionStarted": false, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "outcome": "not_executed", + "output": "{\"_contribute\":\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"conflict\":{\"existingRequestDigest\":\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\"scope\":\"submitted_request\"},\"error\":\"operationId was already used with different arguments.\",\"errorCode\":\"operation_conflict\",\"nativeExecutionStarted\":false,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"outcome\":\"not_executed\",\"requestDigest\":\"f1d307896d13106d840819d1833623f79e09cf61fab40c70f0527d24194695e9\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":false,\"timeoutSeconds\":60}", + "requestDigest": "f1d307896d13106d840819d1833623f79e09cf61fab40c70f0527d24194695e9", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "error", + "statusVerb": "fusion_get_app_state", + "success": false, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0026-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0026-fusion_run_modeling_script.json new file mode 100644 index 0000000..a911ace --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0026-fusion_run_modeling_script.json @@ -0,0 +1,77 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"inventory\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n\nlabels = []\nfor document in app.documents:\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\nresult['openDocuments'] = sorted(labels)\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"action\\\": \\\"inventory\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\\nlabels = []\\nfor document in app.documents:\\n matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original]\\n matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']]\\n require(len(matches) <= 1, 'Native document ownership is ambiguous')\\n labels.append(matches[0] if matches else 'unowned:' + document.creationId)\\nresult['openDocuments'] = sorted(labels)\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234218.8462102, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documents\": [\n {\n \"checkpoint\": null,\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\"\n }\n ],\n \"openDocuments\": [\n \"baseline:0\",\n \"owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n ],\n \"provisionalImportCount\": 0,\n \"scratch\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1811,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234220.6649492, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documents": [ + { + "checkpoint": null, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + } + ], + "openDocuments": [ + "baseline:0", + "owned:3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + ], + "provisionalImportCount": 0, + "scratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1811, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0027-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0027-fusion_run_modeling_script.json new file mode 100644 index 0000000..5be15e1 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0027-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234220.665816, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 10.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"faces\": 6,\n \"mass\": 0.0162,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 6000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 6000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"10.0 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"mass\": 0.0162,\n \"volume\": 6000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1757,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234222.429849, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 10.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "faces": 6, + "mass": 0.0162, + "material": "Aluminum", + "name": "Block", + "volume": 6000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 6000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "10.0 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "mass": 0.0162, + "volume": 6000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1757, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0028-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0028-fusion_mech_operation_status.json new file mode 100644 index 0000000..f14aaed --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0028-fusion_mech_operation_status.json @@ -0,0 +1,289 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234222.4325624, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 81,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234202.016997,\n \"events\": [\n {\n \"at\": 1791234202.016997,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234202.0256662,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234202.036122,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234202.5080516,\n \"phase\": \"succeeded\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\"\n },\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"phase\": \"succeeded\",\n \"requestDigest\": \"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\n \"requestedTarget\": null,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234202.5080516\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234202.016997,\\\"events\\\":[{\\\"at\\\":1791234202.016997,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234202.0256662,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234202.036122,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234202.5080516,\\\"phase\\\":\\\"succeeded\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\\\"},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"phase\\\":\\\"succeeded\\\",\\\"requestDigest\\\":\\\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\\\",\\\"requestedTarget\\\":null,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234202.5080516},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"succeeded\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"requestedName\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"new_design\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":true},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"succeeded\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"succeeded\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"requestedName\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"operation\": \"new_design\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": true\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"succeeded\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234222.521507, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 81, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234202.016997, + "events": [ + { + "at": 1791234202.016997, + "phase": "admitted" + }, + { + "at": 1791234202.0256662, + "phase": "dispatched" + }, + { + "at": 1791234202.036122, + "phase": "executing" + }, + { + "at": 1791234202.5080516, + "phase": "succeeded" + } + ], + "observedDocument": { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9" + }, + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "phase": "succeeded", + "requestDigest": "e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93", + "requestedTarget": null, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234202.5080516 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234202.016997,\"events\":[{\"at\":1791234202.016997,\"phase\":\"admitted\"},{\"at\":1791234202.0256662,\"phase\":\"dispatched\"},{\"at\":1791234202.036122,\"phase\":\"executing\"},{\"at\":1791234202.5080516,\"phase\":\"succeeded\"}],\"observedDocument\":{\"creationId\":\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:9ac6d627-5b37-462a-82b3-e1313f068aa9\"},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"phase\":\"succeeded\",\"requestDigest\":\"e665502bce3651b2afaf5a01bb04a0b3954f32299485a0561bba963b26d3cd93\",\"requestedTarget\":null,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234202.5080516},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"succeeded\",\"reconciliationRequired\":false,\"result\":{\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"requestedName\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"new_design\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":true},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"succeeded\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "succeeded", + "reconciliationRequired": false, + "result": { + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "requestedName": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "operation": "new_design", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-create", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": true + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "succeeded", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0029-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0029-fusion_mechanical.json new file mode 100644 index 0000000..74318ac --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0029-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234222.5278168, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 2200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 10.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 5.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0162,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 6000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"10.0 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 10.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 777,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":2200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,10.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,5.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0162,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":6000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"10.0 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":10.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234223.312716, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 2200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 10.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 5.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0162, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 6000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 10.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 777, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":2200.0,\"bounds\":{\"max\":[20.0,30.0,10.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,5.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0162,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":6000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"10.0 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":10.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0030-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0030-fusion_mechanical.json new file mode 100644 index 0000000..8b07c31 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0030-fusion_mechanical.json @@ -0,0 +1,69 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "parameter_set", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "name": "depth", + "expression": "20 mm", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + } + }, + "requestJson": "{\"op\": \"parameter_set\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\", \"name\": \"depth\", \"expression\": \"20 mm\", \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234223.3162036, + "mutating": true, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": true,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"parameter\": {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n \"recoveryStrategy\": \"restore_parameter_expression\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"transactional\": false\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 861,\n \"error\": \"\",\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":true,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"parameter\\\":{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},\\\"recoveryStrategy\\\":\\\"restore_parameter_expression\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"transactional\\\":false},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234224.1845648, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "health": { + "complete": true, + "computeSucceeded": true, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "parameter": { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + "recoveryStrategy": "restore_parameter_expression", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "transactional": false + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 861, + "error": "", + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"health\":{\"complete\":true,\"computeSucceeded\":true,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"parameter\":{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},\"recoveryStrategy\":\"restore_parameter_expression\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"transactional\":false},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0031-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0031-fusion_mechanical.json new file mode 100644 index 0000000..21a2111 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0031-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234224.1851797, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 3200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 20.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0324,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 820,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":3200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,20.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0324,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234225.0136304, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 3200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 20.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0324, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 820, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":3200.0,\"bounds\":{\"max\":[20.0,30.0,20.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,10.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0324,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0032-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0032-fusion_run_modeling_script.json new file mode 100644 index 0000000..9a36aaf --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0032-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234225.0150292, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1783,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234226.8050754, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1783, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0033-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0033-fusion_mechanical.json new file mode 100644 index 0000000..5989e04 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0033-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234226.8058717, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 3200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 20.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0324,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 767,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":3200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,20.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0324,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234227.580253, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 3200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 20.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0324, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 767, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":3200.0,\"bounds\":{\"max\":[20.0,30.0,20.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,10.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0324,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0034-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0034-fusion_mechanical.json new file mode 100644 index 0000000..fd04aff --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0034-fusion_mechanical.json @@ -0,0 +1,93 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "assembly_properties", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + } + }, + "requestJson": "{\"op\": \"assembly_properties\", \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234227.5833292, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"area\": 3200.0,\n \"averageDensity\": 2.7e-6,\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"entity\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"mass\": 0.0324,\n \"materialBasis\": \"Fusion assigned/default material; supplier provenance does not certify modeled material density\",\n \"scope\": \"component_subtree\",\n \"space\": \"component\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"units\": {\n \"area\": \"mm2\",\n \"averageDensity\": \"kg/mm3\",\n \"centerOfMass\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 752,\n \"error\": \"\",\n \"operation\": \"assembly_properties\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"area\\\":3200.0,\\\"averageDensity\\\":2.7e-6,\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"entity\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"mass\\\":0.0324,\\\"materialBasis\\\":\\\"Fusion assigned/default material; supplier provenance does not certify modeled material density\\\",\\\"scope\\\":\\\"component_subtree\\\",\\\"space\\\":\\\"component\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"units\\\":{\\\"area\\\":\\\"mm2\\\",\\\"averageDensity\\\":\\\"kg/mm3\\\",\\\"centerOfMass\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"assembly_properties\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234228.3421376, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "area": 3200.0, + "averageDensity": 2.7e-06, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "entity": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "mass": 0.0324, + "materialBasis": "Fusion assigned/default material; supplier provenance does not certify modeled material density", + "scope": "component_subtree", + "space": "component", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "units": { + "area": "mm2", + "averageDensity": "kg/mm3", + "centerOfMass": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 752, + "error": "", + "operation": "assembly_properties", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"area\":3200.0,\"averageDensity\":2.7e-6,\"centerOfMass\":[10.0,15.0,10.0],\"entity\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"mass\":0.0324,\"materialBasis\":\"Fusion assigned/default material; supplier provenance does not certify modeled material density\",\"scope\":\"component_subtree\",\"space\":\"component\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"units\":{\"area\":\"mm2\",\"averageDensity\":\"kg/mm3\",\"centerOfMass\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"assembly_properties\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0035-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0035-fusion_mech_operation_status.json new file mode 100644 index 0000000..0908f76 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0035-fusion_mech_operation_status.json @@ -0,0 +1,113 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234228.3493874, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 34,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234223.44495,\n \"events\": [\n {\n \"at\": 1791234223.44495,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234223.4515686,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234223.4627895,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234223.534875,\n \"phase\": \"succeeded\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n },\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"phase\": \"succeeded\",\n \"requestDigest\": \"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\",\n \"requestedTarget\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234223.534875\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234223.44495,\\\"events\\\":[{\\\"at\\\":1791234223.44495,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234223.4515686,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234223.4627895,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234223.534875,\\\"phase\\\":\\\"succeeded\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\"},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"phase\\\":\\\"succeeded\\\",\\\"requestDigest\\\":\\\"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\\\",\\\"requestedTarget\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234223.534875},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"succeeded\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"data\\\":{\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":true,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"parameter\\\":{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},\\\"recoveryStrategy\\\":\\\"restore_parameter_expression\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"transactional\\\":false},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":true},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"succeeded\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"succeeded\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"data\": {\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": true,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"parameter\": {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n \"recoveryStrategy\": \"restore_parameter_expression\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"transactional\": false\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": true\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"succeeded\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234228.3901765, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 34, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234223.44495, + "events": [ + { + "at": 1791234223.44495, + "phase": "admitted" + }, + { + "at": 1791234223.4515686, + "phase": "dispatched" + }, + { + "at": 1791234223.4627895, + "phase": "executing" + }, + { + "at": 1791234223.534875, + "phase": "succeeded" + } + ], + "observedDocument": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + }, + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "phase": "succeeded", + "requestDigest": "13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828", + "requestedTarget": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234223.534875 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234223.44495,\"events\":[{\"at\":1791234223.44495,\"phase\":\"admitted\"},{\"at\":1791234223.4515686,\"phase\":\"dispatched\"},{\"at\":1791234223.4627895,\"phase\":\"executing\"},{\"at\":1791234223.534875,\"phase\":\"succeeded\"}],\"observedDocument\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"phase\":\"succeeded\",\"requestDigest\":\"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\",\"requestedTarget\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234223.534875},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"succeeded\",\"reconciliationRequired\":false,\"result\":{\"data\":{\"health\":{\"complete\":true,\"computeSucceeded\":true,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"parameter\":{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},\"recoveryStrategy\":\"restore_parameter_expression\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"transactional\":false},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":true},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"succeeded\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "succeeded", + "reconciliationRequired": false, + "result": { + "data": { + "health": { + "complete": true, + "computeSucceeded": true, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "parameter": { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + "recoveryStrategy": "restore_parameter_expression", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "transactional": false + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": true + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "succeeded", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0036-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0036-fusion_mechanical.json new file mode 100644 index 0000000..37b8284 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0036-fusion_mechanical.json @@ -0,0 +1,74 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "parameter_set", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "name": "depth", + "expression": "20 mm", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "caller": { + "sessionId": "ralph-envelope-only" + }, + "_callerBudgetMs": 60000 + }, + "requestJson": "{\"op\": \"parameter_set\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\", \"name\": \"depth\", \"expression\": \"20 mm\", \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"}, \"caller\": {\"sessionId\": \"ralph-envelope-only\"}, \"_callerBudgetMs\": 60000}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234228.3931231, + "mutating": true, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": true,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"parameter\": {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n \"recoveryStrategy\": \"restore_parameter_expression\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"transactional\": false\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 736,\n \"error\": \"\",\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":true,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"parameter\\\":{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},\\\"recoveryStrategy\\\":\\\"restore_parameter_expression\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"transactional\\\":false},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"replayed\\\":true,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"replayed\": true,\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234229.1364007, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "health": { + "complete": true, + "computeSucceeded": true, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "parameter": { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + "recoveryStrategy": "restore_parameter_expression", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "transactional": false + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 736, + "error": "", + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"health\":{\"complete\":true,\"computeSucceeded\":true,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"parameter\":{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},\"recoveryStrategy\":\"restore_parameter_expression\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"transactional\":false},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"replayed\":true,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "replayed": true, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0037-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0037-fusion_run_modeling_script.json new file mode 100644 index 0000000..92bc240 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0037-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234229.1393821, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1771,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234230.9168212, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1771, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0038-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0038-fusion_mech_operation_status.json new file mode 100644 index 0000000..3ba3aa0 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0038-fusion_mech_operation_status.json @@ -0,0 +1,113 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234230.9175656, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 88,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234223.44495,\n \"events\": [\n {\n \"at\": 1791234223.44495,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234223.4515686,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234223.4627895,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234223.534875,\n \"phase\": \"succeeded\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n },\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"phase\": \"succeeded\",\n \"requestDigest\": \"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\",\n \"requestedTarget\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234223.534875\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234223.44495,\\\"events\\\":[{\\\"at\\\":1791234223.44495,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234223.4515686,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234223.4627895,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234223.534875,\\\"phase\\\":\\\"succeeded\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\"},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"phase\\\":\\\"succeeded\\\",\\\"requestDigest\\\":\\\"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\\\",\\\"requestedTarget\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234223.534875},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"succeeded\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"data\\\":{\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":true,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"parameter\\\":{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},\\\"recoveryStrategy\\\":\\\"restore_parameter_expression\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"transactional\\\":false},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"parameter_set\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":true},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"succeeded\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"succeeded\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"data\": {\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": true,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"parameter\": {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n \"recoveryStrategy\": \"restore_parameter_expression\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"transactional\": false\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"operation\": \"parameter_set\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": true\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"succeeded\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234231.0121186, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 88, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234223.44495, + "events": [ + { + "at": 1791234223.44495, + "phase": "admitted" + }, + { + "at": 1791234223.4515686, + "phase": "dispatched" + }, + { + "at": 1791234223.4627895, + "phase": "executing" + }, + { + "at": 1791234223.534875, + "phase": "succeeded" + } + ], + "observedDocument": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + }, + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "phase": "succeeded", + "requestDigest": "13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828", + "requestedTarget": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234223.534875 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234223.44495,\"events\":[{\"at\":1791234223.44495,\"phase\":\"admitted\"},{\"at\":1791234223.4515686,\"phase\":\"dispatched\"},{\"at\":1791234223.4627895,\"phase\":\"executing\"},{\"at\":1791234223.534875,\"phase\":\"succeeded\"}],\"observedDocument\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"phase\":\"succeeded\",\"requestDigest\":\"13c5f19db24f72644eea170718cb893fe751a7e2bcfeebc5952a9438ddfa8828\",\"requestedTarget\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b4495a66c9ad2830889838c2e77f116374580d149e6585bb9059e1565e6a8cf0\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234223.534875},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"succeeded\",\"reconciliationRequired\":false,\"result\":{\"data\":{\"health\":{\"complete\":true,\"computeSucceeded\":true,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"parameter\":{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},\"recoveryStrategy\":\"restore_parameter_expression\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"transactional\":false},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"parameter_set\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":true},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"succeeded\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "succeeded", + "reconciliationRequired": false, + "result": { + "data": { + "health": { + "complete": true, + "computeSucceeded": true, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "parameter": { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + "recoveryStrategy": "restore_parameter_expression", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "transactional": false + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "operation": "parameter_set", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-depth", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": true + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "succeeded", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0039-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0039-fusion_mechanical.json new file mode 100644 index 0000000..e29d2b2 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0039-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234231.0172827, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 3200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 20.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0324,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 782,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":3200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,20.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0324,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234231.8055186, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 3200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 20.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0324, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 782, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":3200.0,\"bounds\":{\"max\":[20.0,30.0,20.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,10.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0324,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0040-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0040-fusion_mechanical.json new file mode 100644 index 0000000..42f4ead --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0040-fusion_mechanical.json @@ -0,0 +1,66 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "parameter_batch", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "changes": [ + { + "action": "set", + "name": "depth", + "expression": "15 mm" + }, + { + "action": "set", + "name": "depth", + "expression": "MissingDurableDepth + 1 mm" + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + } + }, + "requestJson": "{\"op\": \"parameter_batch\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\", \"changes\": [{\"action\": \"set\", \"name\": \"depth\", \"expression\": \"15 mm\"}, {\"action\": \"set\", \"name\": \"depth\", \"expression\": \"MissingDurableDepth + 1 mm\"}], \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234231.807534, + "mutating": true, + "stdout": "{\n \"_contribute\": \"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"causeCode\": \"invalid_expression\",\n \"durability\": {\n \"phase\": \"failed\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 2058,\n \"error\": \"Invalid expression for depth\",\n \"errorCode\": \"mutation_failed\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"output\": \"{\\\"_contribute\\\":\\\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"causeCode\\\":\\\"invalid_expression\\\",\\\"durability\\\":{\\\"phase\\\":\\\"failed\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"error\\\":\\\"Invalid expression for depth\\\",\\\"errorCode\\\":\\\"mutation_failed\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"recovery\\\":{\\\"strategy\\\":\\\"PTransaction.Abort\\\",\\\"verified\\\":true,\\\"witness\\\":\\\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":false,\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"},\\\"timeoutSeconds\\\":60}\",\n \"recovery\": {\n \"strategy\": \"PTransaction.Abort\",\n \"verified\": true,\n \"witness\": \"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"error\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": false,\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n },\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234233.8726087, + "raw": { + "_contribute": "If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "causeCode": "invalid_expression", + "durability": { + "phase": "failed", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 2058, + "error": "Invalid expression for depth", + "errorCode": "mutation_failed", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "output": "{\"_contribute\":\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"causeCode\":\"invalid_expression\",\"durability\":{\"phase\":\"failed\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"error\":\"Invalid expression for depth\",\"errorCode\":\"mutation_failed\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"recovery\":{\"strategy\":\"PTransaction.Abort\",\"verified\":true,\"witness\":\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":false,\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"},\"timeoutSeconds\":60}", + "recovery": { + "strategy": "PTransaction.Abort", + "verified": true, + "witness": "complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker" + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "error", + "statusVerb": "fusion_get_app_state", + "success": false, + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + }, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0041-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0041-fusion_run_modeling_script.json new file mode 100644 index 0000000..3c538eb --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0041-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234233.8759732, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1758,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234235.6408064, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1758, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0042-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0042-fusion_mech_operation_status.json new file mode 100644 index 0000000..3715663 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0042-fusion_mech_operation_status.json @@ -0,0 +1,100 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234235.64405, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 34,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234231.9286351,\n \"events\": [\n {\n \"at\": 1791234231.9286351,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234231.9376595,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234231.947326,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234232.0110946,\n \"phase\": \"failed\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n },\n \"operation\": \"parameter_batch\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"phase\": \"failed\",\n \"requestDigest\": \"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\",\n \"requestedTarget\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234232.0110946\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234231.9286351,\\\"events\\\":[{\\\"at\\\":1791234231.9286351,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234231.9376595,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234231.947326,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234232.0110946,\\\"phase\\\":\\\"failed\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\"},\\\"operation\\\":\\\"parameter_batch\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"phase\\\":\\\"failed\\\",\\\"requestDigest\\\":\\\"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\\\",\\\"requestedTarget\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234232.0110946},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"failed\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"causeCode\\\":\\\"invalid_expression\\\",\\\"durability\\\":{\\\"phase\\\":\\\"failed\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"error\\\":\\\"Invalid expression for depth\\\",\\\"errorCode\\\":\\\"mutation_failed\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"recovery\\\":{\\\"strategy\\\":\\\"PTransaction.Abort\\\",\\\"verified\\\":true,\\\"witness\\\":\\\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":false,\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"}},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"failed\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"failed\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"causeCode\": \"invalid_expression\",\n \"durability\": {\n \"phase\": \"failed\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"error\": \"Invalid expression for depth\",\n \"errorCode\": \"mutation_failed\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"recovery\": {\n \"strategy\": \"PTransaction.Abort\",\n \"verified\": true,\n \"witness\": \"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": false,\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n }\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"failed\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234235.6853042, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 34, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234231.9286351, + "events": [ + { + "at": 1791234231.9286351, + "phase": "admitted" + }, + { + "at": 1791234231.9376595, + "phase": "dispatched" + }, + { + "at": 1791234231.947326, + "phase": "executing" + }, + { + "at": 1791234232.0110946, + "phase": "failed" + } + ], + "observedDocument": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + }, + "operation": "parameter_batch", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "phase": "failed", + "requestDigest": "51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1", + "requestedTarget": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234232.0110946 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234231.9286351,\"events\":[{\"at\":1791234231.9286351,\"phase\":\"admitted\"},{\"at\":1791234231.9376595,\"phase\":\"dispatched\"},{\"at\":1791234231.947326,\"phase\":\"executing\"},{\"at\":1791234232.0110946,\"phase\":\"failed\"}],\"observedDocument\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"},\"operation\":\"parameter_batch\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"phase\":\"failed\",\"requestDigest\":\"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\",\"requestedTarget\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234232.0110946},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"failed\",\"reconciliationRequired\":false,\"result\":{\"causeCode\":\"invalid_expression\",\"durability\":{\"phase\":\"failed\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"error\":\"Invalid expression for depth\",\"errorCode\":\"mutation_failed\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"recovery\":{\"strategy\":\"PTransaction.Abort\",\"verified\":true,\"witness\":\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":false,\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"}},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"failed\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "failed", + "reconciliationRequired": false, + "result": { + "causeCode": "invalid_expression", + "durability": { + "phase": "failed", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "error": "Invalid expression for depth", + "errorCode": "mutation_failed", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "recovery": { + "strategy": "PTransaction.Abort", + "verified": true, + "witness": "complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": false, + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + } + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "failed", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0043-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0043-fusion_mechanical.json new file mode 100644 index 0000000..e6d6a4c --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0043-fusion_mechanical.json @@ -0,0 +1,67 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "parameter_batch", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "changes": [ + { + "action": "set", + "name": "depth", + "expression": "15 mm" + }, + { + "action": "set", + "name": "depth", + "expression": "MissingDurableDepth + 1 mm" + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + } + }, + "requestJson": "{\"op\": \"parameter_batch\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\", \"changes\": [{\"action\": \"set\", \"name\": \"depth\", \"expression\": \"15 mm\"}, {\"action\": \"set\", \"name\": \"depth\", \"expression\": \"MissingDurableDepth + 1 mm\"}], \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"}}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234235.6892157, + "mutating": true, + "stdout": "{\n \"_contribute\": \"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"causeCode\": \"invalid_expression\",\n \"durability\": {\n \"phase\": \"failed\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 1971,\n \"error\": \"Invalid expression for depth\",\n \"errorCode\": \"mutation_failed\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"output\": \"{\\\"_contribute\\\":\\\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"causeCode\\\":\\\"invalid_expression\\\",\\\"durability\\\":{\\\"phase\\\":\\\"failed\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"error\\\":\\\"Invalid expression for depth\\\",\\\"errorCode\\\":\\\"mutation_failed\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"recovery\\\":{\\\"strategy\\\":\\\"PTransaction.Abort\\\",\\\"verified\\\":true,\\\"witness\\\":\\\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\\\"},\\\"replayed\\\":true,\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":false,\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"},\\\"timeoutSeconds\\\":60}\",\n \"recovery\": {\n \"strategy\": \"PTransaction.Abort\",\n \"verified\": true,\n \"witness\": \"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"\n },\n \"replayed\": true,\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"error\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": false,\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n },\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234237.6690173, + "raw": { + "_contribute": "If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "causeCode": "invalid_expression", + "durability": { + "phase": "failed", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 1971, + "error": "Invalid expression for depth", + "errorCode": "mutation_failed", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "output": "{\"_contribute\":\"If this is a bridge defect or a gap, the source is open: adom-wiki repo clone adom/fusion-bridge (the wiki page is the repo; a GitHub mirror is linked from the page). File it with this reply JSON (adom-wiki issue create adom/fusion-bridge) or fix it and send a PR (adom-wiki pr create). The fusion-contributing skill has the steps, including trying your build on your own box behind a dev pin.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"causeCode\":\"invalid_expression\",\"durability\":{\"phase\":\"failed\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"error\":\"Invalid expression for depth\",\"errorCode\":\"mutation_failed\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"recovery\":{\"strategy\":\"PTransaction.Abort\",\"verified\":true,\"witness\":\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"},\"replayed\":true,\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":false,\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"},\"timeoutSeconds\":60}", + "recovery": { + "strategy": "PTransaction.Abort", + "verified": true, + "witness": "complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker" + }, + "replayed": true, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "error", + "statusVerb": "fusion_get_app_state", + "success": false, + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + }, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0044-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0044-fusion_run_modeling_script.json new file mode 100644 index 0000000..4f328d2 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0044-fusion_run_modeling_script.json @@ -0,0 +1,131 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"action\": \"witness\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"action\\\": \\\"witness\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234237.6728292, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"success\": true,\n \"witness\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n }\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1812,\n \"error\": \"\",\n \"output\": \"Modeling script ran successfully.\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234239.49216, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true, + "witness": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + } + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1812, + "error": "", + "output": "Modeling script ran successfully.", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0045-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0045-fusion_mech_operation_status.json new file mode 100644 index 0000000..28e8e03 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0045-fusion_mech_operation_status.json @@ -0,0 +1,100 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_operation_status", + "args": { + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort" + }, + "requestJson": "{\"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234239.492985, + "mutating": false, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"currentSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"durationMs\": 32,\n \"error\": \"\",\n \"historical\": false,\n \"history\": {\n \"createdAt\": 1791234231.9286351,\n \"events\": [\n {\n \"at\": 1791234231.9286351,\n \"phase\": \"admitted\"\n },\n {\n \"at\": 1791234231.9376595,\n \"phase\": \"dispatched\"\n },\n {\n \"at\": 1791234231.947326,\n \"phase\": \"executing\"\n },\n {\n \"at\": 1791234232.0110946,\n \"phase\": \"failed\"\n }\n ],\n \"observedDocument\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"dataFileId\": null,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"\n },\n \"operation\": \"parameter_batch\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"phase\": \"failed\",\n \"requestDigest\": \"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\",\n \"requestedTarget\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"sourceVersion\": \"1.12.0-dev.8\",\n \"storageVersion\": 1,\n \"updatedAt\": 1791234232.0110946\n },\n \"nativeExecutionStarted\": null,\n \"observedResult\": null,\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"outcome\": \"recorded\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"currentSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"historical\\\":false,\\\"history\\\":{\\\"createdAt\\\":1791234231.9286351,\\\"events\\\":[{\\\"at\\\":1791234231.9286351,\\\"phase\\\":\\\"admitted\\\"},{\\\"at\\\":1791234231.9376595,\\\"phase\\\":\\\"dispatched\\\"},{\\\"at\\\":1791234231.947326,\\\"phase\\\":\\\"executing\\\"},{\\\"at\\\":1791234232.0110946,\\\"phase\\\":\\\"failed\\\"}],\\\"observedDocument\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"dataFileId\\\":null,\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\"},\\\"operation\\\":\\\"parameter_batch\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"phase\\\":\\\"failed\\\",\\\"requestDigest\\\":\\\"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\\\",\\\"requestedTarget\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"sourceVersion\\\":\\\"1.12.0-dev.8\\\",\\\"storageVersion\\\":1,\\\"updatedAt\\\":1791234232.0110946},\\\"nativeExecutionStarted\\\":null,\\\"observedResult\\\":null,\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"outcome\\\":\\\"recorded\\\",\\\"persistenceFailure\\\":null,\\\"phase\\\":\\\"failed\\\",\\\"reconciliationRequired\\\":false,\\\"result\\\":{\\\"causeCode\\\":\\\"invalid_expression\\\",\\\"durability\\\":{\\\"phase\\\":\\\"failed\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"error\\\":\\\"Invalid expression for depth\\\",\\\"errorCode\\\":\\\"mutation_failed\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\\\",\\\"recovery\\\":{\\\"strategy\\\":\\\"PTransaction.Abort\\\",\\\"verified\\\":true,\\\"witness\\\":\\\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\\\"},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"success\\\":false,\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"}},\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"state\\\":\\\"failed\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"persistenceFailure\": null,\n \"phase\": \"failed\",\n \"reconciliationRequired\": false,\n \"result\": {\n \"causeCode\": \"invalid_expression\",\n \"durability\": {\n \"phase\": \"failed\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"error\": \"Invalid expression for depth\",\n \"errorCode\": \"mutation_failed\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\n \"recovery\": {\n \"strategy\": \"PTransaction.Abort\",\n \"verified\": true,\n \"witness\": \"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"\n },\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"success\": false,\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n }\n },\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"state\": \"failed\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234239.532002, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "currentSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "durationMs": 32, + "error": "", + "historical": false, + "history": { + "createdAt": 1791234231.9286351, + "events": [ + { + "at": 1791234231.9286351, + "phase": "admitted" + }, + { + "at": 1791234231.9376595, + "phase": "dispatched" + }, + { + "at": 1791234231.947326, + "phase": "executing" + }, + { + "at": 1791234232.0110946, + "phase": "failed" + } + ], + "observedDocument": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "dataFileId": null, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38" + }, + "operation": "parameter_batch", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "phase": "failed", + "requestDigest": "51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1", + "requestedTarget": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "sourceVersion": "1.12.0-dev.8", + "storageVersion": 1, + "updatedAt": 1791234232.0110946 + }, + "nativeExecutionStarted": null, + "observedResult": null, + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "outcome": "recorded", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"currentSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"historical\":false,\"history\":{\"createdAt\":1791234231.9286351,\"events\":[{\"at\":1791234231.9286351,\"phase\":\"admitted\"},{\"at\":1791234231.9376595,\"phase\":\"dispatched\"},{\"at\":1791234231.947326,\"phase\":\"executing\"},{\"at\":1791234232.0110946,\"phase\":\"failed\"}],\"observedDocument\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"dataFileId\":null,\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\"},\"operation\":\"parameter_batch\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"phase\":\"failed\",\"requestDigest\":\"51cad24383463392492b9f31205b0c8684ea99b01884527257993f54649371a1\",\"requestedTarget\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"1f857c58f281bac954328309c7bae9a5f33681a1b3dd3d5d6316c28b03910a96\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"sourceVersion\":\"1.12.0-dev.8\",\"storageVersion\":1,\"updatedAt\":1791234232.0110946},\"nativeExecutionStarted\":null,\"observedResult\":null,\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"outcome\":\"recorded\",\"persistenceFailure\":null,\"phase\":\"failed\",\"reconciliationRequired\":false,\"result\":{\"causeCode\":\"invalid_expression\",\"durability\":{\"phase\":\"failed\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"error\":\"Invalid expression for depth\",\"errorCode\":\"mutation_failed\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort\",\"recovery\":{\"strategy\":\"PTransaction.Abort\",\"verified\":true,\"witness\":\"complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker\"},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"success\":false,\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"}},\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"state\":\"failed\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "persistenceFailure": null, + "phase": "failed", + "reconciliationRequired": false, + "result": { + "causeCode": "invalid_expression", + "durability": { + "phase": "failed", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "error": "Invalid expression for depth", + "errorCode": "mutation_failed", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-abort", + "recovery": { + "strategy": "PTransaction.Abort", + "verified": true, + "witness": "complete supported configuration graph including inactive cells, parameters, feature state, sketch geometry/constraint graph and offset links, construction axes, body geometry metrics, component metadata/materials, occurrence transforms/grounding, joint attachments/origins/motion/limits, motion links and timeline marker" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "success": false, + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + } + }, + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "state": "failed", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0046-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0046-fusion_mechanical.json new file mode 100644 index 0000000..8d3ca8f --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0046-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234239.5377674, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 3200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 20.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0324,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 752,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":3200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,20.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0324,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234240.2967982, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 3200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 20.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0324, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 752, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":3200.0,\"bounds\":{\"max\":[20.0,30.0,20.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,10.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0324,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0047-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0047-fusion_mechanical.json new file mode 100644 index 0000000..6a09187 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0047-fusion_mechanical.json @@ -0,0 +1,257 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "inspect" + }, + "requestJson": "{\"op\": \"inspect\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234240.2977092, + "mutating": false, + "stdout": "{\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"bodies\": [\n {\n \"area\": 3200.0,\n \"bounds\": {\n \"max\": [\n 20.0,\n 30.0,\n 20.0\n ],\n \"min\": [\n 0.0,\n 0.0,\n 0.0\n ]\n },\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"edges\": 12,\n \"faces\": 6,\n \"isSolid\": true,\n \"mass\": 0.0324,\n \"name\": \"Block\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::BRepBody\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"\n },\n \"space\": \"component\",\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n },\n \"volume\": 12000.0\n }\n ],\n \"complete\": true,\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodyCount\": 1,\n \"description\": \"\",\n \"id\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"material\": {\n \"id\": \"PrismMaterial-002\",\n \"name\": \"Aluminum\"\n },\n \"name\": \"(Unsaved)\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Component\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"rootComponentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"token\": \"/v4BAAEAAwAAAAAAAAAAAAAA\"\n },\n \"sketchCount\": 1\n }\n ],\n \"configuration\": {\n \"complete\": true,\n \"configurationRowId\": \"\",\n \"configurationWritesEnabled\": false,\n \"configured\": false,\n \"configuredOccurrences\": [],\n \"isConfiguration\": false,\n \"readErrors\": [],\n \"scope\": \"loaded Design ordinary and reserved test rows; no activation or recompute\",\n \"table\": null,\n \"unsupported\": []\n },\n \"constructionAxes\": [],\n \"designIntent\": \"2\",\n \"document\": {\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"name\": \"Untitled\",\n \"saved\": false\n },\n \"features\": [\n {\n \"componentFeatureOrder\": 0,\n \"index\": 1,\n \"name\": \"Base extrusion\",\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::ExtrudeFeature\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"\n },\n \"suppressed\": false,\n \"type\": \"adsk::fusion::ExtrudeFeature\"\n }\n ],\n \"health\": {\n \"complete\": true,\n \"computeSucceeded\": null,\n \"faults\": [],\n \"healthy\": true,\n \"suppressed\": [],\n \"timelineCount\": 2,\n \"unknown\": []\n },\n \"jointOrigins\": [],\n \"joints\": [],\n \"motionLinks\": [],\n \"occurrences\": [],\n \"parameters\": [\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20.0 mm\",\n \"name\": \"width\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"30.0 mm\",\n \"name\": \"height\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"20 mm\",\n \"name\": \"depth\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"width\",\n \"name\": \"d5\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"height\",\n \"name\": \"d6\",\n \"unit\": \"mm\",\n \"value\": 30.0\n },\n {\n \"displayUnit\": \"mm\",\n \"expression\": \"depth\",\n \"name\": \"d7\",\n \"unit\": \"mm\",\n \"value\": 20.0\n },\n {\n \"displayUnit\": \"deg\",\n \"expression\": \"0.0 deg\",\n \"name\": \"d8\",\n \"unit\": \"deg\",\n \"value\": 0.0\n }\n ],\n \"rigidGroups\": [],\n \"sketches\": [\n {\n \"componentId\": \"92d6cb55-570d-46bd-9e50-af58cdf66248\",\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profileCount\": 1,\n \"ref\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"objectType\": \"adsk::fusion::Sketch\",\n \"occurrencePath\": null,\n \"occurrenceToken\": null,\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\n \"token\": \"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"\n }\n }\n ],\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n },\n \"units\": {\n \"angle\": \"deg\",\n \"area\": \"mm2\",\n \"length\": \"mm\",\n \"mass\": \"kg\",\n \"volume\": \"mm3\"\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 762,\n \"error\": \"\",\n \"operation\": \"inspect\",\n \"output\": \"{\\\"_hint\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_hintDocumentHygiene\\\":\\\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"bodies\\\":[{\\\"area\\\":3200.0,\\\"bounds\\\":{\\\"max\\\":[20.0,30.0,20.0],\\\"min\\\":[0.0,0.0,0.0]},\\\"centerOfMass\\\":[10.0,15.0,10.0],\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"edges\\\":12,\\\"faces\\\":6,\\\"isSolid\\\":true,\\\"mass\\\":0.0324,\\\"name\\\":\\\"Block\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::BRepBody\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\\\"},\\\"space\\\":\\\"component\\\",\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"},\\\"volume\\\":12000.0}],\\\"complete\\\":true,\\\"components\\\":[{\\\"attributes\\\":{\\\"requestedName\\\":\\\"Untitled\\\"},\\\"bodyCount\\\":1,\\\"description\\\":\\\"\\\",\\\"id\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"material\\\":{\\\"id\\\":\\\"PrismMaterial-002\\\",\\\"name\\\":\\\"Aluminum\\\"},\\\"name\\\":\\\"(Unsaved)\\\",\\\"partNumber\\\":\\\"2026-10-05-14-03-22-047\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Component\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"rootComponentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"token\\\":\\\"/v4BAAEAAwAAAAAAAAAAAAAA\\\"},\\\"sketchCount\\\":1}],\\\"configuration\\\":{\\\"complete\\\":true,\\\"configurationRowId\\\":\\\"\\\",\\\"configurationWritesEnabled\\\":false,\\\"configured\\\":false,\\\"configuredOccurrences\\\":[],\\\"isConfiguration\\\":false,\\\"readErrors\\\":[],\\\"scope\\\":\\\"loaded Design ordinary and reserved test rows; no activation or recompute\\\",\\\"table\\\":null,\\\"unsupported\\\":[]},\\\"constructionAxes\\\":[],\\\"designIntent\\\":\\\"2\\\",\\\"document\\\":{\\\"creationId\\\":\\\"94431d29-0acf-4799-b677-3f564085aa9d\\\",\\\"name\\\":\\\"Untitled\\\",\\\"saved\\\":false},\\\"features\\\":[{\\\"componentFeatureOrder\\\":0,\\\"index\\\":1,\\\"name\\\":\\\"Base extrusion\\\",\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::ExtrudeFeature\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\\\"},\\\"suppressed\\\":false,\\\"type\\\":\\\"adsk::fusion::ExtrudeFeature\\\"}],\\\"health\\\":{\\\"complete\\\":true,\\\"computeSucceeded\\\":null,\\\"faults\\\":[],\\\"healthy\\\":true,\\\"suppressed\\\":[],\\\"timelineCount\\\":2,\\\"unknown\\\":[]},\\\"jointOrigins\\\":[],\\\"joints\\\":[],\\\"motionLinks\\\":[],\\\"occurrences\\\":[],\\\"parameters\\\":[{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20.0 mm\\\",\\\"name\\\":\\\"width\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"30.0 mm\\\",\\\"name\\\":\\\"height\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"20 mm\\\",\\\"name\\\":\\\"depth\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"width\\\",\\\"name\\\":\\\"d5\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"height\\\",\\\"name\\\":\\\"d6\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":30.0},{\\\"displayUnit\\\":\\\"mm\\\",\\\"expression\\\":\\\"depth\\\",\\\"name\\\":\\\"d7\\\",\\\"unit\\\":\\\"mm\\\",\\\"value\\\":20.0},{\\\"displayUnit\\\":\\\"deg\\\",\\\"expression\\\":\\\"0.0 deg\\\",\\\"name\\\":\\\"d8\\\",\\\"unit\\\":\\\"deg\\\",\\\"value\\\":0.0}],\\\"rigidGroups\\\":[],\\\"sketches\\\":[{\\\"componentId\\\":\\\"92d6cb55-570d-46bd-9e50-af58cdf66248\\\",\\\"fullyConstrained\\\":false,\\\"name\\\":\\\"Base rectangle\\\",\\\"profileCount\\\":1,\\\"ref\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"objectType\\\":\\\"adsk::fusion::Sketch\\\",\\\"occurrencePath\\\":null,\\\"occurrenceToken\\\":null,\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\",\\\"token\\\":\\\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\\\"}}],\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"},\\\"units\\\":{\\\"angle\\\":\\\"deg\\\",\\\"area\\\":\\\"mm2\\\",\\\"length\\\":\\\"mm\\\",\\\"mass\\\":\\\"kg\\\",\\\"volume\\\":\\\"mm3\\\"}},\\\"documentHygiene\\\":{\\\"documents\\\":[{\\\"isModified\\\":false,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":false,\\\"saveStateKnown\\\":true},{\\\"isModified\\\":true,\\\"isSaved\\\":false,\\\"name\\\":\\\"Untitled\\\",\\\"needsSave\\\":true,\\\"saveStateKnown\\\":true}],\\\"inspectionComplete\\\":true,\\\"needsSaveCount\\\":1,\\\"openDocumentCount\\\":2,\\\"ownership\\\":\\\"notInferred\\\",\\\"recoveryHealth\\\":\\\"notInspected\\\"},\\\"operation\\\":\\\"inspect\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234241.0667264, + "raw": { + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "bodies": [ + { + "area": 3200.0, + "bounds": { + "max": [ + 20.0, + 30.0, + 20.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ] + }, + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "edges": 12, + "faces": 6, + "isSolid": true, + "mass": 0.0324, + "name": "Block", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::BRepBody", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==" + }, + "space": "component", + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + }, + "volume": 12000.0 + } + ], + "complete": true, + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodyCount": 1, + "description": "", + "id": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "material": { + "id": "PrismMaterial-002", + "name": "Aluminum" + }, + "name": "(Unsaved)", + "partNumber": "2026-10-05-14-03-22-047", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Component", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "rootComponentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "token": "/v4BAAEAAwAAAAAAAAAAAAAA" + }, + "sketchCount": 1 + } + ], + "configuration": { + "complete": true, + "configurationRowId": "", + "configurationWritesEnabled": false, + "configured": false, + "configuredOccurrences": [], + "isConfiguration": false, + "readErrors": [], + "scope": "loaded Design ordinary and reserved test rows; no activation or recompute", + "table": null, + "unsupported": [] + }, + "constructionAxes": [], + "designIntent": "2", + "document": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "saved": false + }, + "features": [ + { + "componentFeatureOrder": 0, + "index": 1, + "name": "Base extrusion", + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::ExtrudeFeature", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==" + }, + "suppressed": false, + "type": "adsk::fusion::ExtrudeFeature" + } + ], + "health": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + }, + "jointOrigins": [], + "joints": [], + "motionLinks": [], + "occurrences": [], + "parameters": [ + { + "displayUnit": "mm", + "expression": "20.0 mm", + "name": "width", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "30.0 mm", + "name": "height", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "20 mm", + "name": "depth", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "width", + "name": "d5", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "mm", + "expression": "height", + "name": "d6", + "unit": "mm", + "value": 30.0 + }, + { + "displayUnit": "mm", + "expression": "depth", + "name": "d7", + "unit": "mm", + "value": 20.0 + }, + { + "displayUnit": "deg", + "expression": "0.0 deg", + "name": "d8", + "unit": "deg", + "value": 0.0 + } + ], + "rigidGroups": [], + "sketches": [ + { + "componentId": "92d6cb55-570d-46bd-9e50-af58cdf66248", + "fullyConstrained": false, + "name": "Base rectangle", + "profileCount": 1, + "ref": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "objectType": "adsk::fusion::Sketch", + "occurrencePath": null, + "occurrenceToken": null, + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb", + "token": "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==" + } + } + ], + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + }, + "units": { + "angle": "deg", + "area": "mm2", + "length": "mm", + "mass": "kg", + "volume": "mm3" + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 762, + "error": "", + "operation": "inspect", + "output": "{\"_hint\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_hintDocumentHygiene\":\"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"bodies\":[{\"area\":3200.0,\"bounds\":{\"max\":[20.0,30.0,20.0],\"min\":[0.0,0.0,0.0]},\"centerOfMass\":[10.0,15.0,10.0],\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"edges\":12,\"faces\":6,\"isSolid\":true,\"mass\":0.0324,\"name\":\"Block\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::BRepBody\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3tjAAAAPH/CDiAAAAA==\"},\"space\":\"component\",\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"},\"volume\":12000.0}],\"complete\":true,\"components\":[{\"attributes\":{\"requestedName\":\"Untitled\"},\"bodyCount\":1,\"description\":\"\",\"id\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"material\":{\"id\":\"PrismMaterial-002\",\"name\":\"Aluminum\"},\"name\":\"(Unsaved)\",\"partNumber\":\"2026-10-05-14-03-22-047\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Component\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"rootComponentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"token\":\"/v4BAAEAAwAAAAAAAAAAAAAA\"},\"sketchCount\":1}],\"configuration\":{\"complete\":true,\"configurationRowId\":\"\",\"configurationWritesEnabled\":false,\"configured\":false,\"configuredOccurrences\":[],\"isConfiguration\":false,\"readErrors\":[],\"scope\":\"loaded Design ordinary and reserved test rows; no activation or recompute\",\"table\":null,\"unsupported\":[]},\"constructionAxes\":[],\"designIntent\":\"2\",\"document\":{\"creationId\":\"94431d29-0acf-4799-b677-3f564085aa9d\",\"name\":\"Untitled\",\"saved\":false},\"features\":[{\"componentFeatureOrder\":0,\"index\":1,\"name\":\"Base extrusion\",\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::ExtrudeFeature\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjMAgCMWrPaiAAAAA==\"},\"suppressed\":false,\"type\":\"adsk::fusion::ExtrudeFeature\"}],\"health\":{\"complete\":true,\"computeSucceeded\":null,\"faults\":[],\"healthy\":true,\"suppressed\":[],\"timelineCount\":2,\"unknown\":[]},\"jointOrigins\":[],\"joints\":[],\"motionLinks\":[],\"occurrences\":[],\"parameters\":[{\"displayUnit\":\"mm\",\"expression\":\"20.0 mm\",\"name\":\"width\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"30.0 mm\",\"name\":\"height\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"20 mm\",\"name\":\"depth\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"width\",\"name\":\"d5\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"mm\",\"expression\":\"height\",\"name\":\"d6\",\"unit\":\"mm\",\"value\":30.0},{\"displayUnit\":\"mm\",\"expression\":\"depth\",\"name\":\"d7\",\"unit\":\"mm\",\"value\":20.0},{\"displayUnit\":\"deg\",\"expression\":\"0.0 deg\",\"name\":\"d8\",\"unit\":\"deg\",\"value\":0.0}],\"rigidGroups\":[],\"sketches\":[{\"componentId\":\"92d6cb55-570d-46bd-9e50-af58cdf66248\",\"fullyConstrained\":false,\"name\":\"Base rectangle\",\"profileCount\":1,\"ref\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"objectType\":\"adsk::fusion::Sketch\",\"occurrencePath\":null,\"occurrenceToken\":null,\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\",\"token\":\"/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZQooIi4zCc/eJkxZwabq2nF8FVGGkYGymYGaaamBsmGqhm2RpaqJrkpRsrmuRmGqqa25gZGlokpqWmGqYAlYLNIMBDYDtM1AAWwey3sjAHACb4FYciAAAAA==\"}}],\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"},\"units\":{\"angle\":\"deg\",\"area\":\"mm2\",\"length\":\"mm\",\"mass\":\"kg\",\"volume\":\"mm3\"}},\"documentHygiene\":{\"documents\":[{\"isModified\":false,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":false,\"saveStateKnown\":true},{\"isModified\":true,\"isSaved\":false,\"name\":\"Untitled\",\"needsSave\":true,\"saveStateKnown\":true}],\"inspectionComplete\":true,\"needsSaveCount\":1,\"openDocumentCount\":2,\"ownership\":\"notInferred\",\"recoveryHealth\":\"notInspected\"},\"operation\":\"inspect\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0048-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0048-fusion_run_modeling_script.json new file mode 100644 index 0000000..a0d84da --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0048-fusion_run_modeling_script.json @@ -0,0 +1,100 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\", \"action\": \"capture\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"path\\\": \\\"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\\\", \\\"action\\\": \\\"capture\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234241.0679119, + "mutating": true, + "stdout": "{\n \"_cacheHint\": \"Pulled screenshots live in /home/adom/project/screenshots/adom-bridge/window/ (bucketed by kind: window/ for a specific window, screen/ for a full-desktop grab). Filenames are human-readable: `[-].png` \u2014 a sortable ISO stamp (the kind is the folder, so it's not repeated in the name), plus the hwnd for a window capture. If the shot was already within the safe size cap (the common case) it's ONE `.png` and localFullPath == localSafePath; only a shot LARGE enough to be downscaled gets a `.full.png` + `.safe.png` pair (Read the `.safe` one). A window's owned popups share the parent's stem with a `.popup-NN` tag (e.g. `2026-07-15T01-14-16.937-986710.png` + `...popup-01.png`), so a plain `ls` shows the whole capture grouped and the parent/child role without opening a sidecar. Each shot also gets a `.json` sidecar (source, dims, bytes, coordMap, rect, parent/popupIndex). Auto-janitored (older than the age cap or beyond the size cap pruned oldest-first, newest kept; sidecars follow their PNG) \u2014 no cleanup needed on your end. Inspect coverage with `adom-bridge janitor status`; force a sweep with `adom-bridge janitor '{\\\"sub\\\":\\\"run\\\"}'`. Tune via ADOM_SHOTS_DIR / ADOM_SHOTS_MAX_AGE_DAYS / ADOM_SHOTS_MAX_GB.\",\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"_timing\": {\n \"addinSec\": 0.76,\n \"dialogsSec\": 0.61,\n \"postSec\": 0.96,\n \"preSec\": 0.03,\n \"scope\": \"one exe pass-through of this verb only: excludes the relay hop, ab's queue, and any earlier pass-through a composite verb (routing, tour) made before this one, so the caller's wall clock can be longer\",\n \"totalSec\": 2.36\n },\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"bytes\": 16170,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"sha256\": \"d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 2493,\n \"error\": \"\",\n \"fullBytes\": 16170,\n \"fullPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"fullPathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"localFullExists\": true,\n \"localFullPath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"localSafeExists\": true,\n \"localSafePath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"narrative\": \"Captured and auto-pulled ONE PNG to /home/adom/project/screenshots/adom-bridge/window/ (already within the safe size cap, so no separate resized copy was made \u2014 localFullPath == localSafePath). Read it directly.\",\n \"output\": \"Modeling script ran successfully.\",\n \"safeBytes\": 16170,\n \"safePath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"safePathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"savedTo\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"schemaVersion\": 1,\n \"screenshots\": [\n {\n \"fullPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"fullPathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"label\": \"data.result.path\",\n \"localBytes\": 16170,\n \"localPath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\",\n \"localSafePath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\",\n \"parent\": \"01-ordinary-c7248642\",\n \"safePath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"safePathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"savedTo\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\"\n }\n ],\n \"shell\": \"rust\",\n \"source\": \"fusion_run_modeling_script\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234243.5671127, + "raw": { + "_cacheHint": "Pulled screenshots live in /home/adom/project/screenshots/adom-bridge/window/ (bucketed by kind: window/ for a specific window, screen/ for a full-desktop grab). Filenames are human-readable: `[-].png` \u2014 a sortable ISO stamp (the kind is the folder, so it's not repeated in the name), plus the hwnd for a window capture. If the shot was already within the safe size cap (the common case) it's ONE `.png` and localFullPath == localSafePath; only a shot LARGE enough to be downscaled gets a `.full.png` + `.safe.png` pair (Read the `.safe` one). A window's owned popups share the parent's stem with a `.popup-NN` tag (e.g. `2026-07-15T01-14-16.937-986710.png` + `...popup-01.png`), so a plain `ls` shows the whole capture grouped and the parent/child role without opening a sidecar. Each shot also gets a `.json` sidecar (source, dims, bytes, coordMap, rect, parent/popupIndex). Auto-janitored (older than the age cap or beyond the size cap pruned oldest-first, newest kept; sidecars follow their PNG) \u2014 no cleanup needed on your end. Inspect coverage with `adom-bridge janitor status`; force a sweep with `adom-bridge janitor '{\"sub\":\"run\"}'`. Tune via ADOM_SHOTS_DIR / ADOM_SHOTS_MAX_AGE_DAYS / ADOM_SHOTS_MAX_GB.", + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "_timing": { + "addinSec": 0.76, + "dialogsSec": 0.61, + "postSec": 0.96, + "preSec": 0.03, + "scope": "one exe pass-through of this verb only: excludes the relay hop, ab's queue, and any earlier pass-through a composite verb (routing, tour) made before this one, so the caller's wall clock can be longer", + "totalSec": 2.36 + }, + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "bytes": 16170, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 2493, + "error": "", + "fullBytes": 16170, + "fullPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "fullPathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "localFullExists": true, + "localFullPath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "localSafeExists": true, + "localSafePath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "narrative": "Captured and auto-pulled ONE PNG to /home/adom/project/screenshots/adom-bridge/window/ (already within the safe size cap, so no separate resized copy was made \u2014 localFullPath == localSafePath). Read it directly.", + "output": "Modeling script ran successfully.", + "safeBytes": 16170, + "safePath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "safePathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "savedTo": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "schemaVersion": 1, + "screenshots": [ + { + "fullPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "fullPathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "label": "data.result.path", + "localBytes": 16170, + "localPath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png", + "localSafePath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png", + "parent": "01-ordinary-c7248642", + "safePath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "safePathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "savedTo": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png" + } + ], + "shell": "rust", + "source": "fusion_run_modeling_script", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0049-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0049-fusion_run_modeling_script.json new file mode 100644 index 0000000..2a38259 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0049-fusion_run_modeling_script.json @@ -0,0 +1,93 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\", \"action\": \"file\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"path\\\": \\\"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\\\", \\\"action\\\": \\\"file\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234243.5679834, + "mutating": false, + "stdout": "{\n \"_cacheHint\": \"Pulled screenshots live in /home/adom/project/screenshots/adom-bridge/window/ (bucketed by kind: window/ for a specific window, screen/ for a full-desktop grab). Filenames are human-readable: `[-].png` \u2014 a sortable ISO stamp (the kind is the folder, so it's not repeated in the name), plus the hwnd for a window capture. If the shot was already within the safe size cap (the common case) it's ONE `.png` and localFullPath == localSafePath; only a shot LARGE enough to be downscaled gets a `.full.png` + `.safe.png` pair (Read the `.safe` one). A window's owned popups share the parent's stem with a `.popup-NN` tag (e.g. `2026-07-15T01-14-16.937-986710.png` + `...popup-01.png`), so a plain `ls` shows the whole capture grouped and the parent/child role without opening a sidecar. Each shot also gets a `.json` sidecar (source, dims, bytes, coordMap, rect, parent/popupIndex). Auto-janitored (older than the age cap or beyond the size cap pruned oldest-first, newest kept; sidecars follow their PNG) \u2014 no cleanup needed on your end. Inspect coverage with `adom-bridge janitor status`; force a sweep with `adom-bridge janitor '{\\\"sub\\\":\\\"run\\\"}'`. Tune via ADOM_SHOTS_DIR / ADOM_SHOTS_MAX_AGE_DAYS / ADOM_SHOTS_MAX_GB.\",\n \"_hint\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"base64\": \"iVBORw0KGgoAAAANSUhEUgAABQAAAAOECAYAAAD+FZwDAAAADmVYSWZNTQAqAAAACAAAAAAAAADSU5MAAAAJb0ZGcwAAAAAAAAAAANoqts4AACAASURBVHic7N1betzImaBhko/X4ysvwBtou0SqvIux19LubYx4kDcwC5irWZByKlJCEgQBJJA4Rfzxvu5+SJGSKwOWlJlfRfy4//Nf/nq6AwAAAABCejj6AQAAAAAA2xEAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAvvT0Q8AAABK8P/+7/+5fP7nv/z1sMcBADCXAAgAACOa8Pe/v327u7+/P3/+9PgoAgIAxbj/44XL6egHAQAAuekLf20pAiZCIACQOwEQAAA6UvxL4a/RFwAbQiAAkDsBEAAAfml2/X17fp7081MYPJ1+vpwWAgGAXAmAAABUb2r469sJ2ATAhvmAAEBuBEAAAKrVhL/nl5fL17pBrzF0DLjv59sNCADkRAAEAKBKKf61w1+jL+iNzQAcC4aPX76cPxcCAYAjCYAAAFSlb9ffUteioRAIABxJAAQAoApbhL8+TQzs2zWYQqAICADsTQAEACC0vcLfVHYDAgB7EwABAAgrxb+Xl5e7HF/wCoEAwF4EQAAAwrns+nt+Ph/FzfkFrxAIAGxNAAQAIIx2+Gv0zeLL8QWw+YAAwFYEQAAAQkjx79u3b5+CXykBMN085Onx8fy5EAgArEkABACgaH27/hp98S/J8QVwc/fg9PHr09P5cyEQAFiDAAgAQJHGwl+j1ACY/Pjx4+4fv/8uAgIAiwmAAAAUpQl/fcd9u0oOgA27AQGApQRAAACK8XPO388dfx/j3vtL2mtR8OPPzsdQAEzSmswHBABuJQACAJC99+O+L73fn9D8PsjxBXA3/DU/7gZNIRAAmEsABAAgW9fCX/IzkM17SZvrC+C+3X9DUggUAQGAKQRAAACy04S/l5fXy9eG4likAJjMjYCJEAgAjBEAAQDISop/7fDXGJqN9+u7s/4ZJb4AHgugj1++nD8XAgGAPgIgAABZ6Nv1N92yl7SlvCAej6B3QiAA0EsABADgUMvCX6OOADjJH4t5fPwiAgIAFwIgAACHWCf8NQTAi1+LSREwEQIBAAEQAIDdDc35u50AeNFZjBAIAAiAAADsZt1df20C4MXAYoRAAKiXAAgAwOaa8Pf8/PLhphXbiX9X4EFXFmM+IADURwAEAGBTKf6l8NcQADc2YTF2AwJAXQRAAAA20d711yYAbmzCYk6nnz/p6enx/FEIBIDYBEAAAFY1FP4aAuDGZgTARgqBIiAAxCUAAgCwiib8ffv2PBr5BMCNTVxMXwRMhEAAiEcABABgsRT/UvhrNJFvn9jXp+K7At8YABtCIADEIwACAHCz9q6/NgHwQAsCYPO/V/qeEAgAcQiAAADM1p3z145J7egnAB5gpQffvlGICAgAZRMAAQCYrAl/Ly+vl6+lUJT+vy/2CYAHWDEANv/7PT5+OX8UAgGgTAIgAACTpPjXDn+NsaOkxxEAtyAEAkCZBEAAAEb17frr6kZAATAjGyxGCASAsgiAAAD0mhL+8iUAXmy8I1AEBID8CYAAAHxQdvhrCIAXGy7G3YIBoAwCIAAAF0Nz/sojAF5sHAAbQiAA5EsABADgsuvv+fklg/l9axAAL3YKgM2Pv359On8uBAJAPgRAAICKNeHv27fnS/iLEQC7Kg6CGz/4vrtAJ2lHoAgIAHkQAAEAKpXiXwp/STv6CYBr/+qDHRQAE8eCASAPAiAAQGX6dv21CYBr/+qDHRgAG0IgABxLAAQAqER7zt8YAXDtX32wHR/8WAxs5gOKgACwPwEQACC4azv+ugTAtX/1wQ568GOzARMhEAD2IwACAAQ2NOevT8zw1xAAD/lHmw8IAFkQAAEAArp23Dd27OsjAB7yjx4IgO3ff4+PX84fhUAA2I4ACAAQSN1z/sYIgEdrx8C+338pBIqAALANARAAIIAm/L28vF6+NmX3VT0EwBLYDQgA2xAAAQAKl+Lfy+vrp9DTFwDrjH/Jui95i3oBXdSD/UkIBIB1CYAAAIW6HPd9efkZ9ryqG1FxAOwq6MELgQCwDgEQAKAw7fDXEACvEQAvCnzw5gMCwDICIABAIZrw9+35+dNRXgHwGgHwosAHn46zPz09nj8XAgFgPgEQAKAAKf61d/y1XWKgV3UjBMCLAh98M88yffz69en8uRAIANMJgAAAGes77tslAN7CXYFL0g6AyY8fP+7+8Y/fRUAAmEgABADI0KcbfNz139U3EQBvIQCWpBsAG3YDAsA0AiAAQGa6x337AmB3BuDPn7D5QwtEACzJUABM0p8F8wEBYJwACACQiaHjvr2xr49XdTMIgCXphr/mx90/G0IgAPQTAAEADtaEv5fX1/PHbuwQALcgAJZm6Ah8nxQCRUAAeCcAAgAcpBv+GjcHwC6v8kZUHADbClvI0BHgvu/ZDQgA7wRAAIADpPjXDX+r8ypvhAB4FmYhw+H88fHL+aMQCEDNBEAAgB0N7frbhFd5I26/OKEua6DFXNs5KwQCUDMBEABgB7uGv4ZXeSMEwLNQi5kmhUAREIDaCIAAABs6JPw1vMobIQCehVrMdHYDAlAbARAAYCO7zPkb41XeCAHwLNRi5hMCAaiFAAgAsLJm19/zy8vtd/Bdg1d5IwTAs1CLuZ0QCEB0AiAAwEra4a8hAOZKADwLtZjlzAcEICoBEABgBSn+fXt+/hT8BMBcCYBnoRazDrsBAYhIAAQAWKBv11/j0PiXeJU3QgA8C7WY9ZxOp7unp8fz50IgABEIgAAANxgLf43DA2CXV30jKg2CRT/47aQAePp1cb4+PYmAABRPAAQAmKEb/lLkS7GgjwBYEgGQd+0AmKQImAiBAJRKAAQAmCjFv+6Ov24AzC76tXnVN0IA5F03ACbpz/bTo2PBAJRJAAQAuGLouG/Wsa+PV30jBEDeDQXA5nt2BAJQGgEQAGBAE/5eXl/PH7tHfQXASARAPuoGwMvXTx+PBouAAJRAAAQA6OiGv4YAGFmlAbAr1GKWmRIAE7sBASiBAAgA0JLiXzf8heFV3wgB8CzUYpaZGgCbfxFgPiAAORMAAQDuhnf9heJV3wgB8CzUYpaZGwAbQiAAORIAAYCqNeHvtZnzd+Bj2VzoxS0lAJ6FWswyQwFwqhQCRUAAciEAAgBV6oa/RugXRqEXt5QAeBZqMcssDYCJ3YAA5EIABACqk+JfN/w1Qr8wCr24pQTAs1CL2c7cOCgEAnA0ARAAqMbQrr+20C+MQi9uKQHwLNRitnPr7kAhEICjCIAAQHiXG3y8pPB3+jS0vy30C6PQi1tKADwLtZjtmA8IQGkEQAAgtBT/foa/hgBIHwHwLNRitrM0AKY7CX99ejp/LgQCsAcBEAAI6eOuv3ef499p5EfBhF7c2ioNgkU/+P2scYOQFAETIRCAPQiAAEAoQ+GvIQAyjQDIsDUDYCOFQBEQgK0IgABACN3wl0Jf9w128/WPBED6CIAM2yIAJnYDArAVARAAKN7nOX99oW+IAEgfAZBhWwXAhhAIwNoEQACgWGPHfQXAHqEXtzYBkGFbB8Dm+79//Xr+XAgEYCkBEAAoThP+Xl/fzh+7b6Snx7/zr17w3WCqWuw1lQbArlCLWc8aAfDTf2dPEGy+lkKgCAjAEgIgAFCMbvhrCIArqWqxY5ZdiFCXMdRi1rNFALz8dw+EQLsBAVhCAAQAipDiXzf8rUMAvKhqsWMEwItQi1nP3gGwzXxAAG4hAAIAWWvP+Zu3s28qAfCiqsWOEQAvQi1mPUcFwPbfgU+Pj+ePQiAAUwiAAECWujf42Cb+JQLgRVWLHSMAXoRazHq2DICXf0ZPCOz7ezCFQBEQgGsEQAAgK0N39hUAd1DVYueYd2FCXcZQi1nPHgFwDrsBAbhGAAQAspHiXzf8NQTAHVS12DkEQMblEATTjkHzAQEYIgACAIcb2vXXJgDuoKrFziEAMi6XANgQAgHoEgABgMP0zfkbGoAvAO6gqsXOIQAyLrcA2EghUAQEIBEAAYBD9B33bQfA7YJflwB4UdVi5xAAGZdrAEx/j5oPCEAiAAIAuxo77rtf9BtzGvlRcFUtdo6KA2BX6MXdLucA2HzdsWCAugmAAMAujp3zN4cASJcAeBF6cbfLIQAO6YZBx4IB6iQAAgCbasLf8/Pz3f39w+DPyyP+JQIgXQLgRejF3a6kAJjYDQhQHwEQANhMin8p/CXd+JdP8OsSAOkSAC9CL+52pQXAxHxAgLoIgADA6q7t+ss3/iUCIF0C4EXoxd0u5wCYDM0HbAiBAPEJgADAaqbM+UtKCoDzvlu40ItbYtmFCXVZQy1mPbkHwKlSCBQBAWISAAGAxZrw9/r6dvna0LGzRADMVOjFLSEAXoRazHqiBMDEbkCAmARAAGCRFP/a4a9x7chZvgRAugTAi1CLWU+kANgQAgFiEQABgJv07fqLQQCkSwC8CLWY9UQMgA0hECAGARAAmKU956+MHX1zCYB0CYAXoRaznsgBsGE+IEDZBEAAYLIU/9o3+BAAg6tqsXNUfFfgUIvZTtQgaDcgQLkEQADgqqG7+wqAwVW12DkEQMZFDYBJmu/69enp/LkQCFAOARAAGDQU/hoCYHBVLXYOAZBxkQNg0tzkKYVAERCgDAIgAPBJE/6en5/v7u8fBn+eABhcVYudQwBkXA0BsPn737FggDIIgADAByn+pfDXaAJgzNjXRwC8qGqxS1T0eybUYrYTPQC2NTFQCATImwAIAJy1d/012rv/BMAp3w2mqsUuUemOwDALWV+NAfB8LPiP//v61XxAgBwJgABQue6cv9PpR++xXwFwyneDqWqxSwiAfFRTAGw0AbCRQqAICJAPARAAKtWEv9fXt8vXmsHufQTAKd8NpqrFLiEA8lGNATA5/fi4brsBAfIhAAJAhVL8a4e/Rl8ArCf8NQTAi6oWu4QAyEcC4LvzfMAn8wEBjiYAAkBFLrv+3j7Hv0rfr05wGvlRcFUtdgkBkI8EwHftf4kkBAIcRwAEgAqMhr+GVwQDBECuEQD5qNYA+MnAZUghUAQE2JcACACBTQp/Da8IBgiAXCMA8pEA+MvIZbAbEGBfAiAABHWe8zcl/DW8IhggAHKNAMhHAuAvEy6DEAiwDwEQAIKZteuvzSuCAQIg1wiAfCQA/jLjMgiBANsSAAEgiCb8vby+nj/OvnuvVwQDKr4rcOjFrUkA5CMB8JcbLoP5gADbEAABIIAU/5rw1xAA1yIAco0AyLCqY+ANSz+dTndfvz6dPxcCAdYjAAJAwbq7/toEwLUIgFwjADJMAJz5S06ny8fff/96/lwIBFhOAASAAo2Fv4YAuBYBkGsEQIYJgDN/yen06fMUAkVAgGUEQAAoSBP+np+f7+4fHgZ/3uz4l3hFMEAA5BoBkGEC4A2/7PT5FzoWDLCMAAgAhUjxL4W/RjcA3hT9xniFMMBdgblGEOSdAHjDL+sJgA0hEOA2AiAAZK6966/Rjn+rh7+GVwgDBECuEQB5V3UA7Jp4KYYCYHq+a74nBALMIwACQKa6c/5OP370HvsVAPcmAHKNAMg7AbBlxqXoi4DtANhIIVAEBLhOAASAzDTh7/Xt7fK1seNQAuDeBECumX6hQl3SUItZjwDYssKlMB8Q4DYCIABkJMW/dvhrDO2E2JRXCAMEQK4RAHknALasdCm6z4nN8+HT0+P5oxAI8JkACAAZ6Nv1dzivEAa4KzDXCIC8EwBbNg6ADSEQ4DMBEAAOlGX4a3iFMEAA5BoBkHcC4C8HXIYUAkVAgJ8EQAA4QNbhr+EVwgABkGsEQN4JgL8cdBnsBgT4SQAEgJ0NzfnLjlcIAwRArhEAeScA/nLQZWiOC7tRCFA7ARAAdtLs+nt5fd3+Bh5r8AphgADINQIg7wTAXw4OgA0hEKiVAAgAG2uHv4YAWLKKA2BXVYud4/YLU/QlLfrB76faIJhJAGykECgCAjURAAFgQyn+PT8/390/PHz4ugBYMgHwoqrFziEAMkwA3PkfOxAAE7sBgZoIgACwgb5df40i4l/iFcIAAfCiqsXOIQAyTAA84B/dEwHTc7H5gEBNBEAAWNFY+GsIgKUTAC+qWuwcAiDDBMB89M0HFAGBqARAAFhBE/7ad/cdOnYkAEZzGvlRcFUtdg4BkGECYD76nqftBgSiEgABYKEU//ru7Nt+Y1FM9GvzCmEiAZCuSgNgV6jFrEcAzIf5gEBNBEAAuFHfrr9QvEKYSACkSwA8C7WY9QiAeRmLgOl7v//+9fy5EAiUTgAEgJma8Pf29v38MeybuaDLWp8ASJcAeBZqMesJ+5xxTUHLbkfB5vMUAkVAoGQCIABM1A1/jbBv5oIua30CIF0C4Fmoxawn7HPGNQUte2hXoGPBQMkEQACYIMW/bvhrVPNmrpJlzueuwBdVLXaOSoNg0Q9+O9U8Z3QVtmzzAYFoBEAAGHGZ8/f6Nngjj2rezFWyzPkEwIuqFjuHAMi7ap4zrsn8MgwFwPZrgaenx/NHIRAogQAIAD2a8Pf8/HL38PBw/lwAPPoB5EoAvKhqsXMIgLyr5jnjmgIuQ18E7HstkEKgCAjkTgAEgJZ2+Eua+JcIgEc/gFwJgBdVLXYOAZB31TxnXBPoMqRQ6FgwkDsBEAB+SfEvHfX98ePHh/DXEACPfgC5EgAvqlrsHAIg76p5zrgm0GVo7xQUAoFcCYAAVK8952/MUADsCvvmLuiylhMAL6pa7ByVBsCuUIu5XdjniLkCXYbuUeH0499//yoCAlkRAAGoVjf8pcA3dtc/AfDoB5ArAfCiqsXOIQCehVrMesI+Z1wTbNl9rx/sBgRyIgACUKXmuG/bUACcGv4aYd/MBV3WcgLgRVWLnUMAPAu1mPWEfc64Jtiyx/4FohAI5EAABKAqQ8d950a+MWHfzAVd1nIC4EVVi51DADwLtZj1hH3OuCbYsscCYPP9dCw4EQKBIwiAAFShCX9vb9/PH7sv1AXACYIuazkB8KKqxc4hAJ6FWsx6wj5nXBN42UMxsPm6+YDAEQRAAELrhr+GALiCSpY5X8VBMPTilhAAz0ItZj3VPGd0VbLsoRjoWDCwNwEQgLBS/OuGvz1U82aukmXOJwDSJQCehVrMeqp5zrgm8GUwHxDIgQAIQDhDu/72Us2buUqWOZ8ASNuyixLqkoZazHqqec64JvBlGAqAP08f/Pze05MQCGxLAAQgjKPDX6OaN3OVLHM+AZA2AfAi1GLWU81zxjXBL0NfBGwHwEYKgSIgsAUBEIDi5RL+GtW8matkmfMJgLQJgBehFrOOap4vpqj2UnxeuN2AwBYEQACKdtScvznCvsELuqzl5l2YsJcx7MKWqvj3R6jFbCPs88UU1S59eOFCILAmARCAIjW7/l5f31a9g+8Wwr6hC7qs5SoOPG1hF7ZUxb8/Qi1mG2GfL6aodunXd41/FQKBFQiAABSlHf4aAuBBgi5ruYoDT1vYhS1V6e+PMAvZVtjniymqXfr0sRFfzQcEFhAAAShGin/Pzy93Dw8PH74uAB4k6LKWqzTwdIVd2FKV/v4Is5BthX2+mKLapc+bG2s3IHArARCA7PXt+mvkHv+SsG/ogi5ruUoDT1fYhS1V6e+PMAvZVtjni2sqXfZPw4vv+05zN+Hfv349fxQCgakEQACyNRb+GgLggYIua7lKA09X2IUt5a7AZ2EWsq6wzxfXVLrsn24LgI0UAkVAYAoBEIDsdMNfinzdF7wNAfBAQZe1nAB4FnZhSwmAZ2EWsq6wzxfXVLrsfqeezzo/oycCJkIgMEYABCArKf51d/x1A2AJ0a8t7Bu6oMtaTgA8C7uwpQTAszALWVfY54trKl12v/kBsCEEAmMEQACyMHTct7TY1yfsG7qgy1pOADwLu7ClBMCzMAtZV9jni2sqXfZnp5Eftb4+EAAbQiDQRwAE4FBN+Ht7+37+2H1RKwBmLOiy1jfvDo9hhF3Y2ioNxmEWsq6wzxfXVLrsd/0XYM5l6YuC5gMCbQIgAIfohr+GAFiQoMtanwDIGAGQd2GfL+YKfxmmLXDuZRiKgIkQCAiAAOwuxb9u+Iss7Bu6oMtanwDIGAGQd2GfL+YKfRmmL26NANgQAgEBEIDdDO36iy7sG7qgy1qfAMgYAZB3YZ8v5gp9GfYPgO3TFF+fns4fhUCojwAIwOZqDX+NsG/ogi5rfQIgYwRA3oV9vpgr9GXYLgB++vW/gmDfOJUUAkVAqIsACMBmag9/jWre0FWyzOUEQdoqvStwsQ98W9U8X1wT+jLsFwCvsRsQ6iIAArCJ2ub8janmDV0ly1xOAKRNAGRYNc8fXWGXneeOXyEQ6iAAArCqZtff69vb3f1d+XfwXUM1b+AqWeZyAiBtAiDDqnn+6Aq77Lz/vAuBEJsACMAqmvD3/PJy9/DwcP5cAPypmjdwlSxzOQGQtryDwGaKfeD7qub5oyvsssv4824+IMQkAAKwWIp/KfwlTfxLBMCfqnkDV8kylxMAaSsjCKyu2Ae+r2qeP7rCLrucP+92A0I8AiAAN2sf9+0633HOM0yvsG/ogi5rfQIgbeUEgU2FWci6wj5fXBN22WX9eRcBIZY/Hf0AACjPWPgDAKBPOhmRf91swt9///e/7/71r38e/GiAtQiAAEzWN+cPAICp2uNR5sXA7mCVtVNiO/wB8QiAAEzSnvN3zfn4LwAARUjxT/iD2ARAAEa1d/01PtzoQ+wDACiSXX9QDwEQgF7dOX8/fvxw7BdWsfUhrkxVuuzrXBhgf8If1EcABOCDJvy9ff9++drpdBL/AIB96OKbctwX6iQAAnCR4l87/I1x9BcAoBx2/UHdBEAAenf9tYl9AABlEv6ARAAEqNi18AezOLIFANkQ/oA2ARCgQsLfse47peyklAE38DdHfJ4vGHLtd4I5f0CXAAhQmTlz/gAA2Mr6W+ft+gOGCIAAlbDrDwAgJuEPuEYABAiuCX+vb2/HPhAA4GaO/9JH+AOmEgABAkvxT/jjMG4KcpP2ZXPJajT9D06oP2KhFgP7MOcPmEMABAhoaNff/X33HdbGvKEDAJbw2uGTJ7v+gBsIgACBOO4LABCT8AcsIQACBCD8AQDEJPwBaxAAAQo3NOdv9+O+AACs6smcP2AlAiBAocZ2/Yl/QPbMCF2dSwpx2PUHrE0ABCiM474AUJ/7TuI91ZJ4Kyvbwh+wFQEQoBBN+Hv7/v3ytdMp+KtgAIAqnBz3BTYlAAIUIMW/dvjrcuQXAKBMT0+P54/iH7AlARAgY327/tqEPwCAMgl/wJ4EQIAMhZ3zV9kcn6mqnevEL8N/MO7v/DGh/fvD7waIQPgDjiAAAmQkbPgDAOAc/4Q/4AgCIEAmUvwT/gAA4rHrDziaAAhwMLv+AABiEv6AXAiAAAeZGv7c6AOAqhh1SADCH5AbARDgANeO+4p+hOQmMMAU/q6gcOb8ATkSAAF2NLbrT/QDACiXXX9AzgRAgB2Y8wcAEJPwB5RAAATYUBP+3r5/v3ztdHKWCQCgdMIfUBIBEGAjKf61w1+XI7/AFO2/KfzrA+YwSg+2Y84fUBoBEGBlza6/79//8+Hrp19vvYQ/AGCp+07iPUm8u7DrDyiVAAiwkqHwBwDASg7a2ir8AaUTAAEWEv4AAOJy3BeIQAAEWCDFP+EPACAeu/6ASARAgBtc7u77NnyTD7iVuU5UyR0rJqj0IlW6bI4j/AERCYAAMwh/K/OmDgDIhPAHRCYAAkyU4t/Ly+vdw8PD0Q8FAIAVmfMHRCcAAlwxtuvv/r67hQ0AgFLY9QfUQgAEGOC4LwBATMIfUBsBEKCjG/7SLr/TyXA6WJ0ZkAOGL4xLBrCM8AfUSgAEaEnx79qOv1uP/bqzKwCwlfbrjGpeY8xcpjl/QM0EQIC768d9zfoDACiTXX8AAiBQuSb8ff/+H8d8c5A6q/8ZAIAVCH8A7wRAoErt8DfGzj8AgPI47gvwkQAIVCfFv7HwJ/oBZMAdT1bnklIDu/4A+gmAQDWu7foT/gAACtJ66fb0KPwBjBEAgfCmHvcFAKAswh/ANAIgEJbwBwAQV4p/wh/ANAIgENK1OX9AhgwoG9C+MKfB73z+LkBMdv0BzCcAAqHY9ReAovHJfeeinFwUoGaeJ6ol/AHcTgAEQmjC39vb92MfCAAAqxL+AJYTAIHipfgn/AHAdDbNUQpz/gDWIQACxbLrDwAgJrv+ANYlAALFEf4AKjR8L5SKGYZHPMIfwDYEQKAY7fB3f//zTc/p9PnNTvO93LmxAwDAT8IfwLYEQKAI7Tl/fYGvlOgHAMBH5vwBbE8ABLLW7Pr7/v0/54/dHX/CHwBAmez6A9iPAAhkqRv+GoIfAEDZhD+A/QmAQFaGwh/wzvzImo3f9MEtIZgq1O8VN4gpiuO+AMcQAIFspPgn/AEALJPjvyiy6w/gWAIgcLj23X0BAIhD+APIgwAIHKYJfy8vr3cPDw/HPhgAAFYj/AHkRQAEdtcOf4n4BwAQhzl/APkRAIFdpfj39v1775Bud/ilV6hJ9czif3uAotj1B5AvARDYxWXO3/dfc/68sQcACEH4A8ifAAhs6lP4AwAgBOEPoBwCILCZFP9eXqfd4MPxXwCAcpjzB1AWARBY3bVdf72xzxFgAKYyRgIOY9cfQJkEQGA1U4772uk38S4PJgAAHrZJREFU7L7zjvbkHS0AkAnhD6BsAiCwWDv8NYHvdBKvAABKJ/wBxCAAAouk+Nfs+Bva3WfXHwBAecz5A4hDAARu0uz6+/6f/5w/dnf8iX4AAGWy6w8gHgEQmKUb/hqCHxynmvmRbvwAV9z+h8QfLxLhDyAuARCYZCj8AQBkQ8m8meO+ALEJgMBVKf4JfwAA8dj1B1AHARAY1L67LwAAcQh/AHURAIFPuuHPfD8AgBiEP4A6CYDAByn+2fFH1sx3gpbxPxDV/HGpZqGwjDl/APUSAIEzx33zU82dXQHYgOcM3tn1B4AACJUT/gAAYnp8/HL+KPwBIABCpZrw17677+lktwAAQOmEPwC6BECoUDPnb+jmHm76AQBQphT/hD8AugRAqEjfrr824Q9iMD8SWHpnFPdVKY9dfwCMEQChAtfCXxa80wAAmE34A2AKARACKyL8MVna1WUnFwCQCH8AzCEAQlAp/gl/AADxmPMHwFwCIARj1x9AzcxTgMjs+gPgVgIgBCH8AQB0BGniwh8ASwmAEMzf/uu/REAAgCAc9wVgDQIgBPLvf//P+WOKgIkQCABQJrv+AFiTAAgBtUOgCAgAUA7hD4AtCIAQWAqBdgMCYQWZ7QX7mP8Hxh+pfQl/AGxJAITgHAuO5b7zBu7k7ZkIBLASf30ex5w/ALYmAEIliguBog4A7MbT7DHs+gNgLwIgVMZ8QACAYwl/AOxNAIRKmQ8IALAv4Q+AowiAULHijgXDFI6PA/4emM0l2545fwAcSQAEhMCCuSkIAOTNrj8AciAAAhfmAwIArEP4AyAnAiDwifmAAEA4O26Sd9wXgNwIgEAvx4IBIrjv/Gi8gBgiAMvY9QdArgRAYJRjwVA+syIB7ja904nwB0DuBEBgksOPBbs9IQCQGeEPgFIIgMBkjgUDAPxkzh8AJREAgdmEQACgVnb9AVAiARC4mfmAAFAqszXmEv4AKJkACCx2+HxAAGBV7TxYexoU/gCIQAAEVrH7seD0zqT2dyQAwKbM+QMgCgEQWJX5gABA6ez6AyAaARDYhPmAAEBphD8AohIAgU2ZDwjsxj0NGOL3BlcIfwBEJwACm3MsmEN54w/ACHP+AKiBAAjsZvVjwcIOAHAju/4AqIkACOzOsWAA4CiPX4Q/AOojAAKHcCwYANhbin/CHwA1EgCBQwmBsL/7zvn5k/PzQHB2/QFQOwEQyMLq8wErJewAwDvhDwB+EgCBrJgPCAAsJfwBwEcCIJAdx4IBgFuZ8wcAnwmAQLaEQGCR+86PnYi/yiWjZHb9AcAwARDInvmArErhAJgl9782hT8AuE4ABIphPiAAi+VWr7iZ8AcA0wmAQFEcCwYAzPkDgHkEQKBIQiAA1MeuPwC4jQAIFO3DfMDvIiDc4r4z4evkjCSR5T7Q7jDtC5PfRRH+AGAZARAI4Twf8G+/dgMKgRfCDgAlE/4AYB0CIBDGZTegEAgAxTPnDwDWIwAC4bRDoAgIAGWx6w8A1icAAmE5FgwA5RD+AGA7AiAQmmPBwIWbP9x9vghdHy9KFZesikXOtf9FcdwXALYlAAJVEAIBID92/QHAPgRAoCrmAwLA8YQ/ANiXAAhUyXxAANif8AcAxxAAgWo5FgwA+zHnDwCOIwAC1RMC4aP7zg0ATlHvitBeZtAlwhbm3iLErj8AOJ4ACPCL+YAAsB7hDwDyIQACdJgPCAC3E/4AID8CIEAPx4IBYD5z/gAgTwIgwAghEKjL+HQ3YxMZYtcfAORNAASYIMp8wGpu7jDH3Gn2AFx8Ef4AoAgCIMAM5gMCgPAHAKURAAFmciwYgJp9MecPAIojAALcKMqxYACYwq4/ACiXAAiwkGPBRGd2JFUxF/QT4Q8AyicAAqzAsWAAIvry5TfhDwACEAABViQEAhBBCn+J+AcAMQiAABswHxCAEgl/ABCTAAiwIfMBASiB8AcAsQmAABtzLBgK4MYPVMycPwCITwAE2IkQCEBO7PoDgHoIgAA7Mx8QgCMJfwBQHwEQ4CDmAwKwJ+EPAOolAAIcyLFgIG/DwxGNTSyLOX8AUDcBECADR4XA+85b+JO38KoGEIpdfwBAIgACZMR8QADWIPwBAG0CIECGzAcE4FaO+wIAXQIgQKbMBwRgDrv+AIAhAiBA5hwLJjdmR1KVAuaCCn8AwDUCIEAhHAsGoE34AwCmEgABCuJYMACJOX8AwBwCIECBhECAOtn1BwDcQgAEKJj5gAB1EP4AgCUEQIAAzAeElRVw44djtC/MafA7n7/LrYQ/AGANAiBAEI4FA8Rizh8AsBYBECAYIRCgbHb9AQBrEwABgjIfEKAswh8AsBUBECA48wEB8ib8AQBbEwABKjD1WPB9Z4z/yRh/dzYANmXOHwCwBwEQoCKOBQPkwa4/AGBPAiBAhRwLBjiG8AcAHEEABKiUuwUD7MtxXwDgKAIgQOWEQOA2lQ7IbC974pLt+gMAjiYAAnBmPiDAuoQ/ACAXAiAAH7TnA759/37wowEoj/AHAORGAATgk2Y34N//9rfzRyEQYBpz/gCAHAmAAAwSAgGmsesPAMiZAAjAVe0QWH0ErPS+B2PuOxfl5KJQEeEPACiBAAjAZCkE2g0IcHf35TfhDwAohwAIwCyOBQO1S/FP+AMASiIAAnATIRCojV1/AECpBEAAFjEfEIhO+AMASicAArAK8wGBaIQ/ACAKARCA1TgWDERhzh8AEIkACMDqHAsGSmXXHwAQkQAIwGYcCwZKIfwBAJEJgABsyrFgQrjv/Ph0yKMoSkmXzHFfACA6ARCAXQiBQG7s+gMAaiEAArAr8wGBowl/AEBtBEAADmE+ILA34Q8AqJUACMBhHAsG9mLOHwBQMwEQgMMJgcBW7PoDABAAAciI+YDAWoQ/AIB3AiAA2TEfELiV8AcA8JkACECWHAsG5jLnDwCgnwAIQNaEQOAau/4AAMYJgAAUwXxAyN1958enzf+Jwh8AwDQCIABFMR8QEP4AAOYRAAEojmPBUC9z/gAA5hMAASiWY8FQD7v+AABuJwACUDzHgvNy35kFd9phFhxxCX8AAMsJgACEcNix4P3vewDVcNwXAGAdAiAAoZgPCOWz6w8AYF0CIAAhmQ8I5RH+AAC2IQACEJr5gJA/4Q8AYFsCIADhORbM6sx+nG3okpnzBwCwPQEQgGoIgZAPu/4AAPYjAAJQHfMB4Ti/CX8AALsTAAGolvmAsB/hDwDgOAIgAFVzLBi295s5fwAAhxIAAeBuxWPBbg7xyX3nopxclGrY9QcAkAcBEABaHAuG5X777e/nj8IfAEAeBEAA6HAsGG6X4p/wBwCQFwEQAAYIgTCdXX8AAPkSAAHgitXmA0JAwh8AQP4EQACYyHxAeCf8AQCUQwAEgBkcCwZz/gAASiMAAsANhEBqZNcfAECZBEAAWMB8QGog/AEAlE0ABIAVmA9YufvOj0+HPIrVCX8AADEIgACwEseCicScPwCAOARAAFjZpxD4JgRSDrv+AADiEQABYCOXEPj3v4mAZE/4AwCISwAEgI2d5wP+3W5A8iT8AQDEJwACwA7auwGTmkPgfeeOGacod8wokDl/AAB1EAABYEeOBZMDu/4AAOoiAALAARwL5gjCHwBAnQRAADiIY8HsyXFfAIB6CYAAcDAhkC3Z9QcAgAAIAJkwH5A1CX8AADQEQADIjPmALCH8AQDQJQACQIYcC+YW5vwBANBHAASAjAmBTGHXHwAAYwRAACiA+YCFue/8+LTNP0b4AwBgCgEQAApiPiCJ8AcAwBwCIAAUxrHgupnzBwDAXAIgABRKCKyLXX8AANxKAASAwpkPGJvwBwDAUgIgAARhPmAswh8AAGsRAAEgEMeCYzDnDwCANQmAABCQY8FlsusPAIAtCIAAEJhjwWUQ/gAA2JIACADBORacN8d9AQDYmgAIAJUQAvNi1x8AAHsRAAGgMuYDHkv4AwBgbwIgAFTKfMB9CX8AABxFAASAijkWvA9z/gAAOJIACAAcGgLv//hP2+mP/0Tx29/t+gMA4HgCIABwYT7gOoQ/AAByIgACAJ+YD3gb4Q8AgBwJgABAL/MB50nxT/gDACBHAiAAMEoIHGfXHwAAuRMAAYBJzAf8SPgDAKAUAiAAMIv5gI77AgBQFgEQAJit1mPBdv0BAFAiARAAuFktx4KFPwAASiYAAgCLRT0WLPwBABCBAAgArCLasWBz/gAAiEIABABWVXoItOsPAIBoBEAAYBOlzQcU/gAAiEoABAA2lft8QOEPAIDoBEAAYHNzjgXf//GfttMf/9mKOX8AANRAAAQAdpPLfEC7/gAAqIkACADs7qj5gMIfAAA1EgABgMPsNR9Q+AMAoGYCIABwqK2PBZvzBwBA7QRAACALax8LtusPAAB+EgABgKwsPRYs/AEAwEcCIACQne6x4Ne3t0m/znFfAAD4TAAEALLVhMBmV99QCLTrDwAAhgmAAED22iGwHQGFPwAAuE4ABACKkUJgE/0S4Q8AAK57OPoBAADM0ewGFP8AAGAaARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAD44F//+ufRDwFY0Z+OfgAAAABAHprw9+e//PXYBwKsSgAEAAAAzvFP+IOYBEAAAAComF1/EJ8ACAAAABUS/qAeAiAAAABURPiD+giAAAAAUAlz/qBOAiAAAAAEZ9cf1E0ABAAAgKCEPyARAAEAACAY4Q9oEwABAAAgEHP+gC4BEAAAAAKw6w8YIgACAABAwYQ/4BoBEAAAAArluC8whQAIAAAAhbHrD5hDAAQAAIBCCH/ALQRAAAAAyJzwBywhAAIAAEDGzPkDlhIAAQAAIEN2/QFrEQABAAAgI8IfsDYBEAAAADIg/AFbEQABAADgYOb8AVsSAAEAAOAgdv0BexAAAQAAYGfCH7AnARAAAAB25LgvsDcBEAAAAHZg1x9wFAEQAAAANiT8AUcTAAEAAGADwh+QCwEQAAAAVmbOH5ATARAAAABWYtcfkCMBEAAAABYS/oCcCYAAAABwI+EPKIEACAAAADcw5w8ohQAIAAAAM9j1B5RGAAQAAIAJhD+gVAIgAAAAjBD+gNIJgAAAADDAnD8gAgEQAAAAOuz6AyIRAAEAAOAX4Q+ISAAEAACAO8d9gbgEQAAAAKpm1x8QnQAIAABAlYQ/oBYCIAAAAFUR/oDaCIAAAABUw5w/oEYCIAAAAOHZ9QfUTAAEAAAgLOEPQAAEAAAgIOEP4J0ACAAAQCjm/AF8JAACAAAQgl1/AP0EQAAAAIom/AGMEwABAAAokvAHMI0ACAAAQHHM+QOYTgAEAACgGHb9AcwnAAIAAJA94Q/gdgIgAAAAWXPcF2AZARAAAIAs2fUHsA4BEAAAgKwIfwDrEgABAADIgvAHsA0BEAAAgMOZ8wewHQEQAACAw9j1B7A9ARAAAIDdCX8A+xEAAQAA2I3wB7A/ARAAAIBdmPMHcAwBEAAAgE3Z9QdwLAEQAACATQh/AHkQAAEAAFid474A+RAAAQAAWI1dfwD5EQABAABYTPgDyJcACAAAwM2EP4D8CYAAAADcxJw/gDIIgAAAAMxi1x9AWQRAAAAAJhH+AMokAAIAADBK+AMomwAIAADAIHP+AMonAAIAAPCJXX8AcQiAAAAAXAh/APEIgAAAAAh/AIEJgAAAAJUz5w8gNgEQAACgUnb9AdRBAAQAAKiM8AdQFwEQAACgIo77AtRHAAQAAKiAXX8A9RIAAQAAAhP+ABAAAQAAAhL+AGgIgAAAAMGY8wdAmwAIAAAQhF1/APQRAAEAAAon/AEwRgAEAAAolPAHwBQCIAAAQIHM+QNgKgEQAACgIHb9ATCXAAgAAFAA4Q+AWwmAAAAAGRP+AFhKAIQg0gvCf/7zf50///e//+fgRwMAwBrM+QNgDQIgBNK8OEwhUAQEACiXXX8ArEkAhIDsBgQAKJPwB8AWBEAIqr0bMBECAQDy5rgvAFsRACE4IRAAIG92/QGwNQEQKmE+IABAXoQ//n87d5LdShVEURSY/6AYAC0mBHwM/pZtSZnKV0Sxd0vNbGqd9eICrCIAQjP2AQEA9hL+AFhNAISGnAUDAOxh5w+AHQRAaEwIBABYw6s/AHYSAAH7gAAAkwh/AEQgAALv7AMCAIwh/AEQiQAI3HAWDABwjZ0/AKIRAIFvCYEAAOd49QdAVAIg8JB9QACAx4Q/AKITAIFD7AMCANwS/gDIQgAEDnMWDADwxs4fAJkIgMBpzoIBgK68+gMgIwEQeJmzYACgC+EPgMwEQOASZ8EAQHXOfQHITgAEhhACAYBqvPoDoAoBEBjKPiAAkJ3wB0A1AiAwhX1AACAb4Q+AqgRAYBpnwQBAFnb+AKhMAASmEwIBgKi8+gOgAwEQWMY+IAAQhfAHQCcCILCcfUAAYBfhD4COBEBgC2fBAMBqdv4A6EoABLYSAgGA2bz6A6A7ARAIwT4gADCa8AcAbwRAIBT7gADACM59AeAnARAIx1kwAPAqr/4A4CsBEAjLWTAAcJTwBwD3CYBAeM6CAYB7hD8AeE4ABFJwFgwAfGbnDwCOEQCBVIRAAMCrPwA4RwAEUrIPCAD9CH8A8BoBEEjNPiAA1Cf8AcA1AiCQnrNgAKjLzh8AXCcAAmUIgQBQh1d/ADCOAAiUYx8QAPIS/gBgPAEQKMs+IADkIfwBwDwCIFCas2AAiM/OHwDMJQACLTgLBoB4vPoDgDUEQKAVZ8EAsJ/wBwBrCYBAO86CAWAf574AsJ4ACLQlBALAOl79AcA+AiDQnn1AAJhH+AOA/QRAgP/YBwSAcYQ/AIhDAAT4wFkwAFxn5w8AYhEAAb4hBALAeV79AUBMAiDAA/YBAeA54Q8AYhMAAQ6wDwgAXwl/AJCDAAhwkLNgAPjJzh8A5CEAApwkBALQmVd/AJCPAAjwIvuAAHQi/AFAXgIgwEX2AQGoTPgDgPwEQIABnAUDUJGdPwCoQQAEGMhZMAAVePUHALUIgAATOAsGICPhDwBqEgABJnEWDEAmzn0BoC4BEGAyIRCAyLz6A4D6BECARewDAhCJ8AcAfQiAAIvZBwRgJ+EPAPoRAAE2cBYMwA52/gCgJwEQYCMhEIAVvPoDgN4EQIAA7AMCMIPwBwD8IAACBGIfEIARhD8A4CMBECAYZ8EAXGHnDwD4TAAECEoIBOAMr/4AgHsEQIDg7AMC8IjwBwA8IwACJGEfEICPhD8A4CgBECARZ8EA/GDnDwA4QwAESMhZMEBPXv0BAK8QAAEScxYM0IPwBwBcIQACJOcsGKA2574AwFUCIEARQiBALV79AQCjCIAAxdgHBMhN+AMARhMAAYqyDwiQi/AHAMwiAAIU5iwYIAc7fwDATAIgQANCIEBMXv0BACsIgACN2AcEiEH4AwBWEgABGrIPCLCH8AcA7CAAAjTlLBhgLTt/AMAuAiBAc86CAeby6g8A2E0ABOBfzoIBxhL+AIAoBEAA3jkLBhjDuS8AEIkACMAXQiDAa7z6AwAiEgABuMs+IMAxwh8AEJkACMBT9gEBvif8AQAZCIAAHOIsGOCWnT8AIAsBEIBThECgO6/+AIBsBEAAXmIfEOhG+AMAshIAAbjEPiBQnfAHAGQnAAJwmbNgoCo7fwBABQIgAMMIgUAVXv0BAJUIgAAMZx8QyEr4AwAqEgABmMY+IJCF8AcAVCYAAjCVs2AgOjt/AEB1AiAASzgLBqLx6g8A6EIABGApZ8HAbsIfANCNAAjAcs6CgV2c+wIAHQmAAGwjBAKrePUHAHQmAAKwnX1AYBbhDwBAAAQgEPuAwCjCHwDATwIgAKE4CwausvMHAHBLAAQgJCEQOMurPwCA7wmAAIRmHxB4RvgDAHhMAAQgBfuAwGfCHwDAMQIgAGk4Cwb+Z+cPAOA4ARCAdIRA6MurPwCA8wRAANKyDwh9CH8AAK8TAAFIzz4g1CX8AQBcJwACUIKzYKjHzh8AwBgCIAClOAuG/Lz6AwAYSwAEoCRnwZCP8AcAMIcACEBZzoIhD+e+AADzCIAAlCcEQlxe/QEAzCcAAtCGfUCIQ/gDAFhHAASgHfuAsI/wBwCwngAIQEvOgmE9O38AAHsIgAC0JgTCfF79AQDsJQACwC/2AWEG4Q8AIAYBEAA+sA8I1wl/AACxCIAA8ImzYHidnT8AgHgEQAC4QwiE47z6AwCISwAEgCfsA8J9wh8AQHwCIAAcZB8Qbjn3BQDIQQAEgBOcBYNXfwAA2QiAAPACZ8F0JPwBAOQkAALABc6C6UD4AwDITQAEgIucBVOZnT8AgPwEQAAYRAikEq/+AADqEAABYDD7gGQm/AEA1CMAAsAk9gHJRPgDAKhLAASAiZwFk4GdPwCA2gRAAFhACCQir/4AAHoQAAFgIfuARCD8AQD0IgACwAb2AdlB+AMA6EkABIBNnAWzkp0/AIC+BEAA2MxZMDN59QcAgAAIAEE4C2Yk4Q8AgP8JgAAQiLNgRnDuCwDARwIgAAQkBPIKr/4AAPiOAAgAgdkH5AjhDwCARwRAAEjAPiDfEf4AADhCAASAJJwF85GdPwAAjhIAASAZIbA3r/4AADhLAASApOwD9iL8AQDwKgEQAJKzD1ib8AcAwFUCIAAU4Cy4Jjt/AACMIAACQCFCYA1e/QEAMJIACAAF2QfMSfgDAGAGARAACrMPmIPwBwDATAIgABTnLDg2O38AAMwmAAJAE86CY/HqDwCAVQRAAGjGWfBewh8AAKsJgADQkLPgPZz7AgCwgwAIAI0JgWt49QcAwE4CIABgH3AS4Q8AgAgEQADgnX3AMYQ/AAAiEQABgBvOgq+x8wcAQDQCIADwLSHwHK/+AACISgAEAB6yD/iY8AcAQHQCIABwiH3AW8IfAABZCIAAwGHOgt/Y+QMAIBMBEAA4rWsI9OoPAICMBEAA4GVd9gGFPwAAMhMAAYDLqu4DCn8AAFQgAAIAQ1Q7C7bzBwBAFQIgADBU9rNgr/4AAKhGAAQApsh2Fiz8AQBQlQAIAEyT5SzYuS8AAJUJgADAdFFDoFd/AAB0IAACAMtE2QcU/gAA6EQABACW27UPKPwBANCRAAgAbLH6LNjOHwAAXQmAAMBWs0OgV38AAHQnAAIAIYzeBxT+AADgjQAIAIRydR9Q+AMAgFsCIAAQzqtnwXb+AADgKwEQAAjraAj06g8AAO4TAAGA8O7tAwp/AADw3K///GH+a/dHAAAc9ecfv7//Fv4AAOA5LwABgFREPwAAOOe33R8AAAAAAMwjAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABT2N+WVY+uF4zKyAAAAAElFTkSuQmCC\",\n \"bytes\": 16170,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"sha256\": \"d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1\",\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 1,\n \"openDocumentCount\": 2,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1854,\n \"error\": \"\",\n \"fullBytes\": 16170,\n \"fullPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"fullPathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"localFullExists\": true,\n \"localFullPath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"localSafeExists\": true,\n \"localSafePath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"narrative\": \"Captured and auto-pulled ONE PNG to /home/adom/project/screenshots/adom-bridge/window/ (already within the safe size cap, so no separate resized copy was made \u2014 localFullPath == localSafePath). Read it directly.\",\n \"output\": \"Modeling script ran successfully.\",\n \"safeBytes\": 16170,\n \"safePath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"safePathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"savedTo\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png\",\n \"schemaVersion\": 1,\n \"screenshots\": [\n {\n \"fullPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"fullPathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"label\": \"data.result.path\",\n \"localBytes\": 16170,\n \"localPath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\",\n \"localSafePath\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\",\n \"parent\": \"01-ordinary-c7248642\",\n \"safePath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"safePathHost\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png\",\n \"savedTo\": \"/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png\"\n }\n ],\n \"shell\": \"rust\",\n \"source\": \"fusion_run_modeling_script\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234245.4288592, + "raw": { + "_cacheHint": "Pulled screenshots live in /home/adom/project/screenshots/adom-bridge/window/ (bucketed by kind: window/ for a specific window, screen/ for a full-desktop grab). Filenames are human-readable: `[-].png` \u2014 a sortable ISO stamp (the kind is the folder, so it's not repeated in the name), plus the hwnd for a window capture. If the shot was already within the safe size cap (the common case) it's ONE `.png` and localFullPath == localSafePath; only a shot LARGE enough to be downscaled gets a `.full.png` + `.safe.png` pair (Read the `.safe` one). A window's owned popups share the parent's stem with a `.popup-NN` tag (e.g. `2026-07-15T01-14-16.937-986710.png` + `...popup-01.png`), so a plain `ls` shows the whole capture grouped and the parent/child role without opening a sidecar. Each shot also gets a `.json` sidecar (source, dims, bytes, coordMap, rect, parent/popupIndex). Auto-janitored (older than the age cap or beyond the size cap pruned oldest-first, newest kept; sidecars follow their PNG) \u2014 no cleanup needed on your end. Inspect coverage with `adom-bridge janitor status`; force a sweep with `adom-bridge janitor '{\"sub\":\"run\"}'`. Tune via ADOM_SHOTS_DIR / ADOM_SHOTS_MAX_AGE_DAYS / ADOM_SHOTS_MAX_GB.", + "_hint": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 2 open, 1 need saving (Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "base64": "iVBORw0KGgoAAAANSUhEUgAABQAAAAOECAYAAAD+FZwDAAAADmVYSWZNTQAqAAAACAAAAAAAAADSU5MAAAAJb0ZGcwAAAAAAAAAAANoqts4AACAASURBVHic7N1betzImaBhko/X4ysvwBtou0SqvIux19LubYx4kDcwC5irWZByKlJCEgQBJJA4Rfzxvu5+SJGSKwOWlJlfRfy4//Nf/nq6AwAAAABCejj6AQAAAAAA2xEAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAvvT0Q8AAABK8P/+7/+5fP7nv/z1sMcBADCXAAgAACOa8Pe/v327u7+/P3/+9PgoAgIAxbj/44XL6egHAQAAuekLf20pAiZCIACQOwEQAAA6UvxL4a/RFwAbQiAAkDsBEAAAfml2/X17fp7081MYPJ1+vpwWAgGAXAmAAABUb2r469sJ2ATAhvmAAEBuBEAAAKrVhL/nl5fL17pBrzF0DLjv59sNCADkRAAEAKBKKf61w1+jL+iNzQAcC4aPX76cPxcCAYAjCYAAAFSlb9ffUteioRAIABxJAAQAoApbhL8+TQzs2zWYQqAICADsTQAEACC0vcLfVHYDAgB7EwABAAgrxb+Xl5e7HF/wCoEAwF4EQAAAwrns+nt+Ph/FzfkFrxAIAGxNAAQAIIx2+Gv0zeLL8QWw+YAAwFYEQAAAQkjx79u3b5+CXykBMN085Onx8fy5EAgArEkABACgaH27/hp98S/J8QVwc/fg9PHr09P5cyEQAFiDAAgAQJHGwl+j1ACY/Pjx4+4fv/8uAgIAiwmAAAAUpQl/fcd9u0oOgA27AQGApQRAAACK8XPO388dfx/j3vtL2mtR8OPPzsdQAEzSmswHBABuJQACAJC99+O+L73fn9D8PsjxBXA3/DU/7gZNIRAAmEsABAAgW9fCX/IzkM17SZvrC+C+3X9DUggUAQGAKQRAAACy04S/l5fXy9eG4likAJjMjYCJEAgAjBEAAQDISop/7fDXGJqN9+u7s/4ZJb4AHgugj1++nD8XAgGAPgIgAABZ6Nv1N92yl7SlvCAej6B3QiAA0EsABADgUMvCX6OOADjJH4t5fPwiAgIAFwIgAACHWCf8NQTAi1+LSREwEQIBAAEQAIDdDc35u50AeNFZjBAIAAiAAADsZt1df20C4MXAYoRAAKiXAAgAwOaa8Pf8/PLhphXbiX9X4EFXFmM+IADURwAEAGBTKf6l8NcQADc2YTF2AwJAXQRAAAA20d711yYAbmzCYk6nnz/p6enx/FEIBIDYBEAAAFY1FP4aAuDGZgTARgqBIiAAxCUAAgCwiib8ffv2PBr5BMCNTVxMXwRMhEAAiEcABABgsRT/UvhrNJFvn9jXp+K7At8YABtCIADEIwACAHCz9q6/NgHwQAsCYPO/V/qeEAgAcQiAAADM1p3z145J7egnAB5gpQffvlGICAgAZRMAAQCYrAl/Ly+vl6+lUJT+vy/2CYAHWDEANv/7PT5+OX8UAgGgTAIgAACTpPjXDn+NsaOkxxEAtyAEAkCZBEAAAEb17frr6kZAATAjGyxGCASAsgiAAAD0mhL+8iUAXmy8I1AEBID8CYAAAHxQdvhrCIAXGy7G3YIBoAwCIAAAF0Nz/sojAF5sHAAbQiAA5EsABADgsuvv+fklg/l9axAAL3YKgM2Pv359On8uBAJAPgRAAICKNeHv27fnS/iLEQC7Kg6CGz/4vrtAJ2lHoAgIAHkQAAEAKpXiXwp/STv6CYBr/+qDHRQAE8eCASAPAiAAQGX6dv21CYBr/+qDHRgAG0IgABxLAAQAqER7zt8YAXDtX32wHR/8WAxs5gOKgACwPwEQACC4azv+ugTAtX/1wQ568GOzARMhEAD2IwACAAQ2NOevT8zw1xAAD/lHmw8IAFkQAAEAArp23Dd27OsjAB7yjx4IgO3ff4+PX84fhUAA2I4ACAAQSN1z/sYIgEdrx8C+338pBIqAALANARAAIIAm/L28vF6+NmX3VT0EwBLYDQgA2xAAAQAKl+Lfy+vrp9DTFwDrjH/Jui95i3oBXdSD/UkIBIB1CYAAAIW6HPd9efkZ9ryqG1FxAOwq6MELgQCwDgEQAKAw7fDXEACvEQAvCnzw5gMCwDICIABAIZrw9+35+dNRXgHwGgHwosAHn46zPz09nj8XAgFgPgEQAKAAKf61d/y1XWKgV3UjBMCLAh98M88yffz69en8uRAIANMJgAAAGes77tslAN7CXYFL0g6AyY8fP+7+8Y/fRUAAmEgABADI0KcbfNz139U3EQBvIQCWpBsAG3YDAsA0AiAAQGa6x337AmB3BuDPn7D5QwtEACzJUABM0p8F8wEBYJwACACQiaHjvr2xr49XdTMIgCXphr/mx90/G0IgAPQTAAEADtaEv5fX1/PHbuwQALcgAJZm6Ah8nxQCRUAAeCcAAgAcpBv+GjcHwC6v8kZUHADbClvI0BHgvu/ZDQgA7wRAAIADpPjXDX+r8ypvhAB4FmYhw+H88fHL+aMQCEDNBEAAgB0N7frbhFd5I26/OKEua6DFXNs5KwQCUDMBEABgB7uGv4ZXeSMEwLNQi5kmhUAREIDaCIAAABs6JPw1vMobIQCehVrMdHYDAlAbARAAYCO7zPkb41XeCAHwLNRi5hMCAaiFAAgAsLJm19/zy8vtd/Bdg1d5IwTAs1CLuZ0QCEB0AiAAwEra4a8hAOZKADwLtZjlzAcEICoBEABgBSn+fXt+/hT8BMBcCYBnoRazDrsBAYhIAAQAWKBv11/j0PiXeJU3QgA8C7WY9ZxOp7unp8fz50IgABEIgAAANxgLf43DA2CXV30jKg2CRT/47aQAePp1cb4+PYmAABRPAAQAmKEb/lLkS7GgjwBYEgGQd+0AmKQImAiBAJRKAAQAmCjFv+6Ov24AzC76tXnVN0IA5F03ACbpz/bTo2PBAJRJAAQAuGLouG/Wsa+PV30jBEDeDQXA5nt2BAJQGgEQAGBAE/5eXl/PH7tHfQXASARAPuoGwMvXTx+PBouAAJRAAAQA6OiGv4YAGFmlAbAr1GKWmRIAE7sBASiBAAgA0JLiXzf8heFV3wgB8CzUYpaZGgCbfxFgPiAAORMAAQDuhnf9heJV3wgB8CzUYpaZGwAbQiAAORIAAYCqNeHvtZnzd+Bj2VzoxS0lAJ6FWswyQwFwqhQCRUAAciEAAgBV6oa/RugXRqEXt5QAeBZqMcssDYCJ3YAA5EIABACqk+JfN/w1Qr8wCr24pQTAs1CL2c7cOCgEAnA0ARAAqMbQrr+20C+MQi9uKQHwLNRitnPr7kAhEICjCIAAQHiXG3y8pPB3+jS0vy30C6PQi1tKADwLtZjtmA8IQGkEQAAgtBT/foa/hgBIHwHwLNRitrM0AKY7CX99ejp/LgQCsAcBEAAI6eOuv3ef499p5EfBhF7c2ioNgkU/+P2scYOQFAETIRCAPQiAAEAoQ+GvIQAyjQDIsDUDYCOFQBEQgK0IgABACN3wl0Jf9w128/WPBED6CIAM2yIAJnYDArAVARAAKN7nOX99oW+IAEgfAZBhWwXAhhAIwNoEQACgWGPHfQXAHqEXtzYBkGFbB8Dm+79//Xr+XAgEYCkBEAAoThP+Xl/fzh+7b6Snx7/zr17w3WCqWuw1lQbArlCLWc8aAfDTf2dPEGy+lkKgCAjAEgIgAFCMbvhrCIArqWqxY5ZdiFCXMdRi1rNFALz8dw+EQLsBAVhCAAQAipDiXzf8rUMAvKhqsWMEwItQi1nP3gGwzXxAAG4hAAIAWWvP+Zu3s28qAfCiqsWOEQAvQi1mPUcFwPbfgU+Pj+ePQiAAUwiAAECWujf42Cb+JQLgRVWLHSMAXoRazHq2DICXf0ZPCOz7ezCFQBEQgGsEQAAgK0N39hUAd1DVYueYd2FCXcZQi1nPHgFwDrsBAbhGAAQAspHiXzf8NQTAHVS12DkEQMblEATTjkHzAQEYIgACAIcb2vXXJgDuoKrFziEAMi6XANgQAgHoEgABgMP0zfkbGoAvAO6gqsXOIQAyLrcA2EghUAQEIBEAAYBD9B33bQfA7YJflwB4UdVi5xAAGZdrAEx/j5oPCEAiAAIAuxo77rtf9BtzGvlRcFUtdo6KA2BX6MXdLucA2HzdsWCAugmAAMAujp3zN4cASJcAeBF6cbfLIQAO6YZBx4IB6iQAAgCbasLf8/Pz3f39w+DPyyP+JQIgXQLgRejF3a6kAJjYDQhQHwEQANhMin8p/CXd+JdP8OsSAOkSAC9CL+52pQXAxHxAgLoIgADA6q7t+ss3/iUCIF0C4EXoxd0u5wCYDM0HbAiBAPEJgADAaqbM+UtKCoDzvlu40ItbYtmFCXVZQy1mPbkHwKlSCBQBAWISAAGAxZrw9/r6dvna0LGzRADMVOjFLSEAXoRazHqiBMDEbkCAmARAAGCRFP/a4a9x7chZvgRAugTAi1CLWU+kANgQAgFiEQABgJv07fqLQQCkSwC8CLWY9UQMgA0hECAGARAAmKU956+MHX1zCYB0CYAXoRaznsgBsGE+IEDZBEAAYLIU/9o3+BAAg6tqsXNUfFfgUIvZTtQgaDcgQLkEQADgqqG7+wqAwVW12DkEQMZFDYBJmu/69enp/LkQCFAOARAAGDQU/hoCYHBVLXYOAZBxkQNg0tzkKYVAERCgDAIgAPBJE/6en5/v7u8fBn+eABhcVYudQwBkXA0BsPn737FggDIIgADAByn+pfDXaAJgzNjXRwC8qGqxS1T0eybUYrYTPQC2NTFQCATImwAIAJy1d/012rv/BMAp3w2mqsUuUemOwDALWV+NAfB8LPiP//v61XxAgBwJgABQue6cv9PpR++xXwFwyneDqWqxSwiAfFRTAGw0AbCRQqAICJAPARAAKtWEv9fXt8vXmsHufQTAKd8NpqrFLiEA8lGNATA5/fi4brsBAfIhAAJAhVL8a4e/Rl8ArCf8NQTAi6oWu4QAyEcC4LvzfMAn8wEBjiYAAkBFLrv+3j7Hv0rfr05wGvlRcFUtdgkBkI8EwHftf4kkBAIcRwAEgAqMhr+GVwQDBECuEQD5qNYA+MnAZUghUAQE2JcACACBTQp/Da8IBgiAXCMA8pEA+MvIZbAbEGBfAiAABHWe8zcl/DW8IhggAHKNAMhHAuAvEy6DEAiwDwEQAIKZteuvzSuCAQIg1wiAfCQA/jLjMgiBANsSAAEgiCb8vby+nj/OvnuvVwQDKr4rcOjFrUkA5CMB8JcbLoP5gADbEAABIIAU/5rw1xAA1yIAco0AyLCqY+ANSz+dTndfvz6dPxcCAdYjAAJAwbq7/toEwLUIgFwjADJMAJz5S06ny8fff/96/lwIBFhOAASAAo2Fv4YAuBYBkGsEQIYJgDN/yen06fMUAkVAgGUEQAAoSBP+np+f7+4fHgZ/3uz4l3hFMEAA5BoBkGEC4A2/7PT5FzoWDLCMAAgAhUjxL4W/RjcA3hT9xniFMMBdgblGEOSdAHjDL+sJgA0hEOA2AiAAZK6966/Rjn+rh7+GVwgDBECuEQB5V3UA7Jp4KYYCYHq+a74nBALMIwACQKa6c/5OP370HvsVAPcmAHKNAMg7AbBlxqXoi4DtANhIIVAEBLhOAASAzDTh7/Xt7fK1seNQAuDeBECumX6hQl3SUItZjwDYssKlMB8Q4DYCIABkJMW/dvhrDO2E2JRXCAMEQK4RAHknALasdCm6z4nN8+HT0+P5oxAI8JkACAAZ6Nv1dzivEAa4KzDXCIC8EwBbNg6ADSEQ4DMBEAAOlGX4a3iFMEAA5BoBkHcC4C8HXIYUAkVAgJ8EQAA4QNbhr+EVwgABkGsEQN4JgL8cdBnsBgT4SQAEgJ0NzfnLjlcIAwRArhEAeScA/nLQZWiOC7tRCFA7ARAAdtLs+nt5fd3+Bh5r8AphgADINQIg7wTAXw4OgA0hEKiVAAgAG2uHv4YAWLKKA2BXVYud4/YLU/QlLfrB76faIJhJAGykECgCAjURAAFgQyn+PT8/390/PHz4ugBYMgHwoqrFziEAMkwA3PkfOxAAE7sBgZoIgACwgb5df40i4l/iFcIAAfCiqsXOIQAyTAA84B/dEwHTc7H5gEBNBEAAWNFY+GsIgKUTAC+qWuwcAiDDBMB89M0HFAGBqARAAFhBE/7ad/cdOnYkAEZzGvlRcFUtdg4BkGECYD76nqftBgSiEgABYKEU//ru7Nt+Y1FM9GvzCmEiAZCuSgNgV6jFrEcAzIf5gEBNBEAAuFHfrr9QvEKYSACkSwA8C7WY9QiAeRmLgOl7v//+9fy5EAiUTgAEgJma8Pf29v38MeybuaDLWp8ASJcAeBZqMesJ+5xxTUHLbkfB5vMUAkVAoGQCIABM1A1/jbBv5oIua30CIF0C4Fmoxawn7HPGNQUte2hXoGPBQMkEQACYIMW/bvhrVPNmrpJlzueuwBdVLXaOSoNg0Q9+O9U8Z3QVtmzzAYFoBEAAGHGZ8/f6Nngjj2rezFWyzPkEwIuqFjuHAMi7ap4zrsn8MgwFwPZrgaenx/NHIRAogQAIAD2a8Pf8/HL38PBw/lwAPPoB5EoAvKhqsXMIgLyr5jnjmgIuQ18E7HstkEKgCAjkTgAEgJZ2+Eua+JcIgEc/gFwJgBdVLXYOAZB31TxnXBPoMqRQ6FgwkDsBEAB+SfEvHfX98ePHh/DXEACPfgC5EgAvqlrsHAIg76p5zrgm0GVo7xQUAoFcCYAAVK8952/MUADsCvvmLuiylhMAL6pa7ByVBsCuUIu5XdjniLkCXYbuUeH0499//yoCAlkRAAGoVjf8pcA3dtc/AfDoB5ArAfCiqsXOIQCehVrMesI+Z1wTbNl9rx/sBgRyIgACUKXmuG/bUACcGv4aYd/MBV3WcgLgRVWLnUMAPAu1mPWEfc64Jtiyx/4FohAI5EAABKAqQ8d950a+MWHfzAVd1nIC4EVVi51DADwLtZj1hH3OuCbYsscCYPP9dCw4EQKBIwiAAFShCX9vb9/PH7sv1AXACYIuazkB8KKqxc4hAJ6FWsx6wj5nXBN42UMxsPm6+YDAEQRAAELrhr+GALiCSpY5X8VBMPTilhAAz0ItZj3VPGd0VbLsoRjoWDCwNwEQgLBS/OuGvz1U82aukmXOJwDSJQCehVrMeqp5zrgm8GUwHxDIgQAIQDhDu/72Us2buUqWOZ8ASNuyixLqkoZazHqqec64JvBlGAqAP08f/Pze05MQCGxLAAQgjKPDX6OaN3OVLHM+AZA2AfAi1GLWU81zxjXBL0NfBGwHwEYKgSIgsAUBEIDi5RL+GtW8matkmfMJgLQJgBehFrOOap4vpqj2UnxeuN2AwBYEQACKdtScvznCvsELuqzl5l2YsJcx7MKWqvj3R6jFbCPs88UU1S59eOFCILAmARCAIjW7/l5f31a9g+8Wwr6hC7qs5SoOPG1hF7ZUxb8/Qi1mG2GfL6aodunXd41/FQKBFQiAABSlHf4aAuBBgi5ruYoDT1vYhS1V6e+PMAvZVtjniymqXfr0sRFfzQcEFhAAAShGin/Pzy93Dw8PH74uAB4k6LKWqzTwdIVd2FKV/v4Is5BthX2+mKLapc+bG2s3IHArARCA7PXt+mvkHv+SsG/ogi5ruUoDT1fYhS1V6e+PMAvZVtjni2sqXfZPw4vv+05zN+Hfv349fxQCgakEQACyNRb+GgLggYIua7lKA09X2IUt5a7AZ2EWsq6wzxfXVLrsn24LgI0UAkVAYAoBEIDsdMNfinzdF7wNAfBAQZe1nAB4FnZhSwmAZ2EWsq6wzxfXVLrsfqeezzo/oycCJkIgMEYABCArKf51d/x1A2AJ0a8t7Bu6oMtaTgA8C7uwpQTAszALWVfY54trKl12v/kBsCEEAmMEQACyMHTct7TY1yfsG7qgy1pOADwLu7ClBMCzMAtZV9jni2sqXfZnp5Eftb4+EAAbQiDQRwAE4FBN+Ht7+37+2H1RKwBmLOiy1jfvDo9hhF3Y2ioNxmEWsq6wzxfXVLrsd/0XYM5l6YuC5gMCbQIgAIfohr+GAFiQoMtanwDIGAGQd2GfL+YKfxmmLXDuZRiKgIkQCAiAAOwuxb9u+Iss7Bu6oMtanwDIGAGQd2GfL+YKfRmmL26NANgQAgEBEIDdDO36iy7sG7qgy1qfAMgYAZB3YZ8v5gp9GfYPgO3TFF+fns4fhUCojwAIwOZqDX+NsG/ogi5rfQIgYwRA3oV9vpgr9GXYLgB++vW/gmDfOJUUAkVAqIsACMBmag9/jWre0FWyzOUEQdoqvStwsQ98W9U8X1wT+jLsFwCvsRsQ6iIAArCJ2ub8janmDV0ly1xOAKRNAGRYNc8fXWGXneeOXyEQ6iAAArCqZtff69vb3f1d+XfwXUM1b+AqWeZyAiBtAiDDqnn+6Aq77Lz/vAuBEJsACMAqmvD3/PJy9/DwcP5cAPypmjdwlSxzOQGQtryDwGaKfeD7qub5oyvsssv4824+IMQkAAKwWIp/KfwlTfxLBMCfqnkDV8kylxMAaSsjCKyu2Ae+r2qeP7rCLrucP+92A0I8AiAAN2sf9+0633HOM0yvsG/ogi5rfQIgbeUEgU2FWci6wj5fXBN22WX9eRcBIZY/Hf0AACjPWPgDAKBPOhmRf91swt9///e/7/71r38e/GiAtQiAAEzWN+cPAICp2uNR5sXA7mCVtVNiO/wB8QiAAEzSnvN3zfn4LwAARUjxT/iD2ARAAEa1d/01PtzoQ+wDACiSXX9QDwEQgF7dOX8/fvxw7BdWsfUhrkxVuuzrXBhgf8If1EcABOCDJvy9ff9++drpdBL/AIB96OKbctwX6iQAAnCR4l87/I1x9BcAoBx2/UHdBEAAenf9tYl9AABlEv6ARAAEqNi18AezOLIFANkQ/oA2ARCgQsLfse47peyklAE38DdHfJ4vGHLtd4I5f0CXAAhQmTlz/gAA2Mr6W+ft+gOGCIAAlbDrDwAgJuEPuEYABAiuCX+vb2/HPhAA4GaO/9JH+AOmEgABAkvxT/jjMG4KcpP2ZXPJajT9D06oP2KhFgP7MOcPmEMABAhoaNff/X33HdbGvKEDAJbw2uGTJ7v+gBsIgACBOO4LABCT8AcsIQACBCD8AQDEJPwBaxAAAQo3NOdv9+O+AACs6smcP2AlAiBAocZ2/Yl/QPbMCF2dSwpx2PUHrE0ABCiM474AUJ/7TuI91ZJ4Kyvbwh+wFQEQoBBN+Hv7/v3ytdMp+KtgAIAqnBz3BTYlAAIUIMW/dvjrcuQXAKBMT0+P54/iH7AlARAgY327/tqEPwCAMgl/wJ4EQIAMhZ3zV9kcn6mqnevEL8N/MO7v/DGh/fvD7waIQPgDjiAAAmQkbPgDAOAc/4Q/4AgCIEAmUvwT/gAA4rHrDziaAAhwMLv+AABiEv6AXAiAAAeZGv7c6AOAqhh1SADCH5AbARDgANeO+4p+hOQmMMAU/q6gcOb8ATkSAAF2NLbrT/QDACiXXX9AzgRAgB2Y8wcAEJPwB5RAAATYUBP+3r5/v3ztdHKWCQCgdMIfUBIBEGAjKf61w1+XI7/AFO2/KfzrA+YwSg+2Y84fUBoBEGBlza6/79//8+Hrp19vvYQ/AGCp+07iPUm8u7DrDyiVAAiwkqHwBwDASg7a2ir8AaUTAAEWEv4AAOJy3BeIQAAEWCDFP+EPACAeu/6ASARAgBtc7u77NnyTD7iVuU5UyR0rJqj0IlW6bI4j/AERCYAAMwh/K/OmDgDIhPAHRCYAAkyU4t/Ly+vdw8PD0Q8FAIAVmfMHRCcAAlwxtuvv/r67hQ0AgFLY9QfUQgAEGOC4LwBATMIfUBsBEKCjG/7SLr/TyXA6WJ0ZkAOGL4xLBrCM8AfUSgAEaEnx79qOv1uP/bqzKwCwlfbrjGpeY8xcpjl/QM0EQIC768d9zfoDACiTXX8AAiBQuSb8ff/+H8d8c5A6q/8ZAIAVCH8A7wRAoErt8DfGzj8AgPI47gvwkQAIVCfFv7HwJ/oBZMAdT1bnklIDu/4A+gmAQDWu7foT/gAACtJ66fb0KPwBjBEAgfCmHvcFAKAswh/ANAIgEJbwBwAQV4p/wh/ANAIgENK1OX9AhgwoG9C+MKfB73z+LkBMdv0BzCcAAqHY9ReAovHJfeeinFwUoGaeJ6ol/AHcTgAEQmjC39vb92MfCAAAqxL+AJYTAIHipfgn/AHAdDbNUQpz/gDWIQACxbLrDwAgJrv+ANYlAALFEf4AKjR8L5SKGYZHPMIfwDYEQKAY7fB3f//zTc/p9PnNTvO93LmxAwDAT8IfwLYEQKAI7Tl/fYGvlOgHAMBH5vwBbE8ABLLW7Pr7/v0/54/dHX/CHwBAmez6A9iPAAhkqRv+GoIfAEDZhD+A/QmAQFaGwh/wzvzImo3f9MEtIZgq1O8VN4gpiuO+AMcQAIFspPgn/AEALJPjvyiy6w/gWAIgcLj23X0BAIhD+APIgwAIHKYJfy8vr3cPDw/HPhgAAFYj/AHkRQAEdtcOf4n4BwAQhzl/APkRAIFdpfj39v1775Bud/ilV6hJ9czif3uAotj1B5AvARDYxWXO3/dfc/68sQcACEH4A8ifAAhs6lP4AwAgBOEPoBwCILCZFP9eXqfd4MPxXwCAcpjzB1AWARBY3bVdf72xzxFgAKYyRgIOY9cfQJkEQGA1U4772uk38S4PJgAAHrZJREFU7L7zjvbkHS0AkAnhD6BsAiCwWDv8NYHvdBKvAABKJ/wBxCAAAouk+Nfs+Bva3WfXHwBAecz5A4hDAARu0uz6+/6f/5w/dnf8iX4AAGWy6w8gHgEQmKUb/hqCHxynmvmRbvwAV9z+h8QfLxLhDyAuARCYZCj8AQBkQ8m8meO+ALEJgMBVKf4JfwAA8dj1B1AHARAY1L67LwAAcQh/AHURAIFPuuHPfD8AgBiEP4A6CYDAByn+2fFH1sx3gpbxPxDV/HGpZqGwjDl/APUSAIEzx33zU82dXQHYgOcM3tn1B4AACJUT/gAAYnp8/HL+KPwBIABCpZrw17677+lktwAAQOmEPwC6BECoUDPnb+jmHm76AQBQphT/hD8AugRAqEjfrr824Q9iMD8SWHpnFPdVKY9dfwCMEQChAtfCXxa80wAAmE34A2AKARACKyL8MVna1WUnFwCQCH8AzCEAQlAp/gl/AADxmPMHwFwCIARj1x9AzcxTgMjs+gPgVgIgBCH8AQB0BGniwh8ASwmAEMzf/uu/REAAgCAc9wVgDQIgBPLvf//P+WOKgIkQCABQJrv+AFiTAAgBtUOgCAgAUA7hD4AtCIAQWAqBdgMCYQWZ7QX7mP8Hxh+pfQl/AGxJAITgHAuO5b7zBu7k7ZkIBLASf30ex5w/ALYmAEIliguBog4A7MbT7DHs+gNgLwIgVMZ8QACAYwl/AOxNAIRKmQ8IALAv4Q+AowiAULHijgXDFI6PA/4emM0l2545fwAcSQAEhMCCuSkIAOTNrj8AciAAAhfmAwIArEP4AyAnAiDwifmAAEA4O26Sd9wXgNwIgEAvx4IBIrjv/Gi8gBgiAMvY9QdArgRAYJRjwVA+syIB7ja904nwB0DuBEBgksOPBbs9IQCQGeEPgFIIgMBkjgUDAPxkzh8AJREAgdmEQACgVnb9AVAiARC4mfmAAFAqszXmEv4AKJkACCx2+HxAAGBV7TxYexoU/gCIQAAEVrH7seD0zqT2dyQAwKbM+QMgCgEQWJX5gABA6ez6AyAaARDYhPmAAEBphD8AohIAgU2ZDwjsxj0NGOL3BlcIfwBEJwACm3MsmEN54w/ACHP+AKiBAAjsZvVjwcIOAHAju/4AqIkACOzOsWAA4CiPX4Q/AOojAAKHcCwYANhbin/CHwA1EgCBQwmBsL/7zvn5k/PzQHB2/QFQOwEQyMLq8wErJewAwDvhDwB+EgCBrJgPCAAsJfwBwEcCIJAdx4IBgFuZ8wcAnwmAQLaEQGCR+86PnYi/yiWjZHb9AcAwARDInvmArErhAJgl9782hT8AuE4ABIphPiAAi+VWr7iZ8AcA0wmAQFEcCwYAzPkDgHkEQKBIQiAA1MeuPwC4jQAIFO3DfMDvIiDc4r4z4evkjCSR5T7Q7jDtC5PfRRH+AGAZARAI4Twf8G+/dgMKgRfCDgAlE/4AYB0CIBDGZTegEAgAxTPnDwDWIwAC4bRDoAgIAGWx6w8A1icAAmE5FgwA5RD+AGA7AiAQmmPBwIWbP9x9vghdHy9KFZesikXOtf9FcdwXALYlAAJVEAIBID92/QHAPgRAoCrmAwLA8YQ/ANiXAAhUyXxAANif8AcAxxAAgWo5FgwA+zHnDwCOIwAC1RMC4aP7zg0ATlHvitBeZtAlwhbm3iLErj8AOJ4ACPCL+YAAsB7hDwDyIQACdJgPCAC3E/4AID8CIEAPx4IBYD5z/gAgTwIgwAghEKjL+HQ3YxMZYtcfAORNAASYIMp8wGpu7jDH3Gn2AFx8Ef4AoAgCIMAM5gMCgPAHAKURAAFmciwYgJp9MecPAIojAALcKMqxYACYwq4/ACiXAAiwkGPBRGd2JFUxF/QT4Q8AyicAAqzAsWAAIvry5TfhDwACEAABViQEAhBBCn+J+AcAMQiAABswHxCAEgl/ABCTAAiwIfMBASiB8AcAsQmAABtzLBgK4MYPVMycPwCITwAE2IkQCEBO7PoDgHoIgAA7Mx8QgCMJfwBQHwEQ4CDmAwKwJ+EPAOolAAIcyLFgIG/DwxGNTSyLOX8AUDcBECADR4XA+85b+JO38KoGEIpdfwBAIgACZMR8QADWIPwBAG0CIECGzAcE4FaO+wIAXQIgQKbMBwRgDrv+AIAhAiBA5hwLJjdmR1KVAuaCCn8AwDUCIEAhHAsGoE34AwCmEgABCuJYMACJOX8AwBwCIECBhECAOtn1BwDcQgAEKJj5gAB1EP4AgCUEQIAAzAeElRVw44djtC/MafA7n7/LrYQ/AGANAiBAEI4FA8Rizh8AsBYBECAYIRCgbHb9AQBrEwABgjIfEKAswh8AsBUBECA48wEB8ib8AQBbEwABKjD1WPB9Z4z/yRh/dzYANmXOHwCwBwEQoCKOBQPkwa4/AGBPAiBAhRwLBjiG8AcAHEEABKiUuwUD7MtxXwDgKAIgQOWEQOA2lQ7IbC974pLt+gMAjiYAAnBmPiDAuoQ/ACAXAiAAH7TnA759/37wowEoj/AHAORGAATgk2Y34N//9rfzRyEQYBpz/gCAHAmAAAwSAgGmsesPAMiZAAjAVe0QWH0ErPS+B2PuOxfl5KJQEeEPACiBAAjAZCkE2g0IcHf35TfhDwAohwAIwCyOBQO1S/FP+AMASiIAAnATIRCojV1/AECpBEAAFjEfEIhO+AMASicAArAK8wGBaIQ/ACAKARCA1TgWDERhzh8AEIkACMDqHAsGSmXXHwAQkQAIwGYcCwZKIfwBAJEJgABsyrFgQrjv/Ph0yKMoSkmXzHFfACA6ARCAXQiBQG7s+gMAaiEAArAr8wGBowl/AEBtBEAADmE+ILA34Q8AqJUACMBhHAsG9mLOHwBQMwEQgMMJgcBW7PoDABAAAciI+YDAWoQ/AIB3AiAA2TEfELiV8AcA8JkACECWHAsG5jLnDwCgnwAIQNaEQOAau/4AAMYJgAAUwXxAyN1958enzf+Jwh8AwDQCIABFMR8QEP4AAOYRAAEojmPBUC9z/gAA5hMAASiWY8FQD7v+AABuJwACUDzHgvNy35kFd9phFhxxCX8AAMsJgACEcNix4P3vewDVcNwXAGAdAiAAoZgPCOWz6w8AYF0CIAAhmQ8I5RH+AAC2IQACEJr5gJA/4Q8AYFsCIADhORbM6sx+nG3okpnzBwCwPQEQgGoIgZAPu/4AAPYjAAJQHfMB4Ti/CX8AALsTAAGolvmAsB/hDwDgOAIgAFVzLBi295s5fwAAhxIAAeBuxWPBbg7xyX3nopxclGrY9QcAkAcBEABaHAuG5X777e/nj8IfAEAeBEAA6HAsGG6X4p/wBwCQFwEQAAYIgTCdXX8AAPkSAAHgitXmA0JAwh8AQP4EQACYyHxAeCf8AQCUQwAEgBkcCwZz/gAASiMAAsANhEBqZNcfAECZBEAAWMB8QGog/AEAlE0ABIAVmA9YufvOj0+HPIrVCX8AADEIgACwEseCicScPwCAOARAAFjZpxD4JgRSDrv+AADiEQABYCOXEPj3v4mAZE/4AwCISwAEgI2d5wP+3W5A8iT8AQDEJwACwA7auwGTmkPgfeeOGacod8wokDl/AAB1EAABYEeOBZMDu/4AAOoiAALAARwL5gjCHwBAnQRAADiIY8HsyXFfAIB6CYAAcDAhkC3Z9QcAgAAIAJkwH5A1CX8AADQEQADIjPmALCH8AQDQJQACQIYcC+YW5vwBANBHAASAjAmBTGHXHwAAYwRAACiA+YCFue/8+LTNP0b4AwBgCgEQAApiPiCJ8AcAwBwCIAAUxrHgupnzBwDAXAIgABRKCKyLXX8AANxKAASAwpkPGJvwBwDAUgIgAARhPmAswh8AAGsRAAEgEMeCYzDnDwCANQmAABCQY8FlsusPAIAtCIAAEJhjwWUQ/gAA2JIACADBORacN8d9AQDYmgAIAJUQAvNi1x8AAHsRAAGgMuYDHkv4AwBgbwIgAFTKfMB9CX8AABxFAASAijkWvA9z/gAAOJIACAAcGgLv//hP2+mP/0Tx29/t+gMA4HgCIABwYT7gOoQ/AAByIgACAJ+YD3gb4Q8AgBwJgABAL/MB50nxT/gDACBHAiAAMEoIHGfXHwAAuRMAAYBJzAf8SPgDAKAUAiAAMIv5gI77AgBQFgEQAJit1mPBdv0BAFAiARAAuFktx4KFPwAASiYAAgCLRT0WLPwBABCBAAgArCLasWBz/gAAiEIABABWVXoItOsPAIBoBEAAYBOlzQcU/gAAiEoABAA2lft8QOEPAIDoBEAAYHNzjgXf//GfttMf/9mKOX8AANRAAAQAdpPLfEC7/gAAqIkACADs7qj5gMIfAAA1EgABgMPsNR9Q+AMAoGYCIABwqK2PBZvzBwBA7QRAACALax8LtusPAAB+EgABgKwsPRYs/AEAwEcCIACQne6x4Ne3t0m/znFfAAD4TAAEALLVhMBmV99QCLTrDwAAhgmAAED22iGwHQGFPwAAuE4ABACKkUJgE/0S4Q8AAK57OPoBAADM0ewGFP8AAGAaARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAAAAhMAAQAAACAwARAAAAD44F//+ufRDwFY0Z+OfgAAAABAHprw9+e//PXYBwKsSgAEAAAAzvFP+IOYBEAAAAComF1/EJ8ACAAAABUS/qAeAiAAAABURPiD+giAAAAAUAlz/qBOAiAAAAAEZ9cf1E0ABAAAgKCEPyARAAEAACAY4Q9oEwABAAAgEHP+gC4BEAAAAAKw6w8YIgACAABAwYQ/4BoBEAAAAArluC8whQAIAAAAhbHrD5hDAAQAAIBCCH/ALQRAAAAAyJzwBywhAAIAAEDGzPkDlhIAAQAAIEN2/QFrEQABAAAgI8IfsDYBEAAAADIg/AFbEQABAADgYOb8AVsSAAEAAOAgdv0BexAAAQAAYGfCH7AnARAAAAB25LgvsDcBEAAAAHZg1x9wFAEQAAAANiT8AUcTAAEAAGADwh+QCwEQAAAAVmbOH5ATARAAAABWYtcfkCMBEAAAABYS/oCcCYAAAABwI+EPKIEACAAAADcw5w8ohQAIAAAAM9j1B5RGAAQAAIAJhD+gVAIgAAAAjBD+gNIJgAAAADDAnD8gAgEQAAAAOuz6AyIRAAEAAOAX4Q+ISAAEAACAO8d9gbgEQAAAAKpm1x8QnQAIAABAlYQ/oBYCIAAAAFUR/oDaCIAAAABUw5w/oEYCIAAAAOHZ9QfUTAAEAAAgLOEPQAAEAAAgIOEP4J0ACAAAQCjm/AF8JAACAAAQgl1/AP0EQAAAAIom/AGMEwABAAAokvAHMI0ACAAAQHHM+QOYTgAEAACgGHb9AcwnAAIAAJA94Q/gdgIgAAAAWXPcF2AZARAAAIAs2fUHsA4BEAAAgKwIfwDrEgABAADIgvAHsA0BEAAAgMOZ8wewHQEQAACAw9j1B7A9ARAAAIDdCX8A+xEAAQAA2I3wB7A/ARAAAIBdmPMHcAwBEAAAgE3Z9QdwLAEQAACATQh/AHkQAAEAAFid474A+RAAAQAAWI1dfwD5EQABAABYTPgDyJcACAAAwM2EP4D8CYAAAADcxJw/gDIIgAAAAMxi1x9AWQRAAAAAJhH+AMokAAIAADBK+AMomwAIAADAIHP+AMonAAIAAPCJXX8AcQiAAAAAXAh/APEIgAAAAAh/AIEJgAAAAJUz5w8gNgEQAACgUnb9AdRBAAQAAKiM8AdQFwEQAACgIo77AtRHAAQAAKiAXX8A9RIAAQAAAhP+ABAAAQAAAhL+AGgIgAAAAMGY8wdAmwAIAAAQhF1/APQRAAEAAAon/AEwRgAEAAAolPAHwBQCIAAAQIHM+QNgKgEQAACgIHb9ATCXAAgAAFAA4Q+AWwmAAAAAGRP+AFhKAIQg0gvCf/7zf50///e//+fgRwMAwBrM+QNgDQIgBNK8OEwhUAQEACiXXX8ArEkAhIDsBgQAKJPwB8AWBEAIqr0bMBECAQDy5rgvAFsRACE4IRAAIG92/QGwNQEQKmE+IABAXoQ//n87d5LdShVEURSY/6AYAC0mBHwM/pZtSZnKV0Sxd0vNbGqd9eICrCIAQjP2AQEA9hL+AFhNAISGnAUDAOxh5w+AHQRAaEwIBABYw6s/AHYSAAH7gAAAkwh/AEQgAALv7AMCAIwh/AEQiQAI3HAWDABwjZ0/AKIRAIFvCYEAAOd49QdAVAIg8JB9QACAx4Q/AKITAIFD7AMCANwS/gDIQgAEDnMWDADwxs4fAJkIgMBpzoIBgK68+gMgIwEQeJmzYACgC+EPgMwEQOASZ8EAQHXOfQHITgAEhhACAYBqvPoDoAoBEBjKPiAAkJ3wB0A1AiAwhX1AACAb4Q+AqgRAYBpnwQBAFnb+AKhMAASmEwIBgKi8+gOgAwEQWMY+IAAQhfAHQCcCILCcfUAAYBfhD4COBEBgC2fBAMBqdv4A6EoABLYSAgGA2bz6A6A7ARAIwT4gADCa8AcAbwRAIBT7gADACM59AeAnARAIx1kwAPAqr/4A4CsBEAjLWTAAcJTwBwD3CYBAeM6CAYB7hD8AeE4ABFJwFgwAfGbnDwCOEQCBVIRAAMCrPwA4RwAEUrIPCAD9CH8A8BoBEEjNPiAA1Cf8AcA1AiCQnrNgAKjLzh8AXCcAAmUIgQBQh1d/ADCOAAiUYx8QAPIS/gBgPAEQKMs+IADkIfwBwDwCIFCas2AAiM/OHwDMJQACLTgLBoB4vPoDgDUEQKAVZ8EAsJ/wBwBrCYBAO86CAWAf574AsJ4ACLQlBALAOl79AcA+AiDQnn1AAJhH+AOA/QRAgP/YBwSAcYQ/AIhDAAT4wFkwAFxn5w8AYhEAAb4hBALAeV79AUBMAiDAA/YBAeA54Q8AYhMAAQ6wDwgAXwl/AJCDAAhwkLNgAPjJzh8A5CEAApwkBALQmVd/AJCPAAjwIvuAAHQi/AFAXgIgwEX2AQGoTPgDgPwEQIABnAUDUJGdPwCoQQAEGMhZMAAVePUHALUIgAATOAsGICPhDwBqEgABJnEWDEAmzn0BoC4BEGAyIRCAyLz6A4D6BECARewDAhCJ8AcAfQiAAIvZBwRgJ+EPAPoRAAE2cBYMwA52/gCgJwEQYCMhEIAVvPoDgN4EQIAA7AMCMIPwBwD8IAACBGIfEIARhD8A4CMBECAYZ8EAXGHnDwD4TAAECEoIBOAMr/4AgHsEQIDg7AMC8IjwBwA8IwACJGEfEICPhD8A4CgBECARZ8EA/GDnDwA4QwAESMhZMEBPXv0BAK8QAAEScxYM0IPwBwBcIQACJOcsGKA2574AwFUCIEARQiBALV79AQCjCIAAxdgHBMhN+AMARhMAAYqyDwiQi/AHAMwiAAIU5iwYIAc7fwDATAIgQANCIEBMXv0BACsIgACN2AcEiEH4AwBWEgABGrIPCLCH8AcA7CAAAjTlLBhgLTt/AMAuAiBAc86CAeby6g8A2E0ABOBfzoIBxhL+AIAoBEAA3jkLBhjDuS8AEIkACMAXQiDAa7z6AwAiEgABuMs+IMAxwh8AEJkACMBT9gEBvif8AQAZCIAAHOIsGOCWnT8AIAsBEIBThECgO6/+AIBsBEAAXmIfEOhG+AMAshIAAbjEPiBQnfAHAGQnAAJwmbNgoCo7fwBABQIgAMMIgUAVXv0BAJUIgAAMZx8QyEr4AwAqEgABmMY+IJCF8AcAVCYAAjCVs2AgOjt/AEB1AiAASzgLBqLx6g8A6EIABGApZ8HAbsIfANCNAAjAcs6CgV2c+wIAHQmAAGwjBAKrePUHAHQmAAKwnX1AYBbhDwBAAAQgEPuAwCjCHwDATwIgAKE4CwausvMHAHBLAAQgJCEQOMurPwCA7wmAAIRmHxB4RvgDAHhMAAQgBfuAwGfCHwDAMQIgAGk4Cwb+Z+cPAOA4ARCAdIRA6MurPwCA8wRAANKyDwh9CH8AAK8TAAFIzz4g1CX8AQBcJwACUIKzYKjHzh8AwBgCIAClOAuG/Lz6AwAYSwAEoCRnwZCP8AcAMIcACEBZzoIhD+e+AADzCIAAlCcEQlxe/QEAzCcAAtCGfUCIQ/gDAFhHAASgHfuAsI/wBwCwngAIQEvOgmE9O38AAHsIgAC0JgTCfF79AQDsJQACwC/2AWEG4Q8AIAYBEAA+sA8I1wl/AACxCIAA8ImzYHidnT8AgHgEQAC4QwiE47z6AwCISwAEgCfsA8J9wh8AQHwCIAAcZB8Qbjn3BQDIQQAEgBOcBYNXfwAA2QiAAPACZ8F0JPwBAOQkAALABc6C6UD4AwDITQAEgIucBVOZnT8AgPwEQAAYRAikEq/+AADqEAABYDD7gGQm/AEA1CMAAsAk9gHJRPgDAKhLAASAiZwFk4GdPwCA2gRAAFhACCQir/4AAHoQAAFgIfuARCD8AQD0IgACwAb2AdlB+AMA6EkABIBNnAWzkp0/AIC+BEAA2MxZMDN59QcAgAAIAEE4C2Yk4Q8AgP8JgAAQiLNgRnDuCwDARwIgAAQkBPIKr/4AAPiOAAgAgdkH5AjhDwCARwRAAEjAPiDfEf4AADhCAASAJJwF85GdPwAAjhIAASAZIbA3r/4AADhLAASApOwD9iL8AQDwKgEQAJKzD1ib8AcAwFUCIAAU4Cy4Jjt/AACMIAACQCFCYA1e/QEAMJIACAAF2QfMSfgDAGAGARAACrMPmIPwBwDATAIgABTnLDg2O38AAMwmAAJAE86CY/HqDwCAVQRAAGjGWfBewh8AAKsJgADQkLPgPZz7AgCwgwAIAI0JgWt49QcAwE4CIABgH3AS4Q8AgAgEQADgnX3AMYQ/AAAiEQABgBvOgq+x8wcAQDQCIADwLSHwHK/+AACISgAEAB6yD/iY8AcAQHQCIABwiH3AW8IfAABZCIAAwGHOgt/Y+QMAIBMBEAA4rWsI9OoPAICMBEAA4GVd9gGFPwAAMhMAAYDLqu4DCn8AAFQgAAIAQ1Q7C7bzBwBAFQIgADBU9rNgr/4AAKhGAAQApsh2Fiz8AQBQlQAIAEyT5SzYuS8AAJUJgADAdFFDoFd/AAB0IAACAMtE2QcU/gAA6EQABACW27UPKPwBANCRAAgAbLH6LNjOHwAAXQmAAMBWs0OgV38AAHQnAAIAIYzeBxT+AADgjQAIAIRydR9Q+AMAgFsCIAAQzqtnwXb+AADgKwEQAAjraAj06g8AAO4TAAGA8O7tAwp/AADw3K///GH+a/dHAAAc9ecfv7//Fv4AAOA5LwABgFREPwAAOOe33R8AAAAAAMwjAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABQmAAIAAABAYQIgAAAAABT2N+WVY+uF4zKyAAAAAElFTkSuQmCC", + "bytes": 16170, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 1, + "openDocumentCount": 2, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 1854, + "error": "", + "fullBytes": 16170, + "fullPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "fullPathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "localFullExists": true, + "localFullPath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "localSafeExists": true, + "localSafePath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "narrative": "Captured and auto-pulled ONE PNG to /home/adom/project/screenshots/adom-bridge/window/ (already within the safe size cap, so no separate resized copy was made \u2014 localFullPath == localSafePath). Read it directly.", + "output": "Modeling script ran successfully.", + "safeBytes": 16170, + "safePath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "safePathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "savedTo": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.png", + "schemaVersion": 1, + "screenshots": [ + { + "fullPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "fullPathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "label": "data.result.path", + "localBytes": 16170, + "localPath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png", + "localSafePath": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png", + "parent": "01-ordinary-c7248642", + "safePath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "safePathHost": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "savedTo": "/home/adom/project/screenshots/adom-bridge/window/01-ordinary-c7248642.popup-01.png" + } + ], + "shell": "rust", + "source": "fusion_run_modeling_script", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0050-fusion_mechanical.json b/docs/mechanical-verification/cp8/ordinary/calls/0050-fusion_mechanical.json new file mode 100644 index 0000000..a67fc6f --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0050-fusion_mechanical.json @@ -0,0 +1,59 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mechanical", + "args": { + "op": "export", + "format": "f3d", + "outputPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb" + }, + "requestJson": "{\"op\": \"export\", \"format\": \"f3d\", \"outputPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\", \"target\": {\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"}, \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\", \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234245.4335713, + "mutating": true, + "stdout": "{\n \"_timeoutHint\": \"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"data\": {\n \"externalEffect\": \"file_published\",\n \"fileSize\": 73647,\n \"format\": \"f3d\",\n \"modelRollbackApplies\": false,\n \"outputPath\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\",\n \"overwrite\": false,\n \"published\": true,\n \"sha256\": \"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\",\n \"target\": {\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"revision\": \"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"\n }\n },\n \"durability\": {\n \"phase\": \"succeeded\",\n \"recordedSessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"storageVersion\": 1,\n \"terminalRecorded\": true\n },\n \"durationMs\": 1131,\n \"error\": \"\",\n \"operation\": \"export\",\n \"operationId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb\",\n \"output\": \"{\\\"_timeoutHint\\\":\\\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\\\",\\\"data\\\":{\\\"externalEffect\\\":\\\"file_published\\\",\\\"fileSize\\\":73647,\\\"format\\\":\\\"f3d\\\",\\\"modelRollbackApplies\\\":false,\\\"outputPath\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\adom-fusion-ralph\\\\\\\\20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\\\\\\01-ordinary-c7248642.f3d\\\",\\\"overwrite\\\":false,\\\"published\\\":true,\\\"sha256\\\":\\\"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\\\",\\\"target\\\":{\\\"documentId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\",\\\"revision\\\":\\\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\\\"}},\\\"durability\\\":{\\\"phase\\\":\\\"succeeded\\\",\\\"recordedSessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"storageVersion\\\":1,\\\"terminalRecorded\\\":true},\\\"operation\\\":\\\"export\\\",\\\"operationId\\\":\\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb\\\",\\\"sessionId\\\":\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\",\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60}\",\n \"schemaVersion\": 1,\n \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234246.570912, + "raw": { + "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "data": { + "externalEffect": "file_published", + "fileSize": 73647, + "format": "f3d", + "modelRollbackApplies": false, + "outputPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "overwrite": false, + "published": true, + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "target": { + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "revision": "b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb" + } + }, + "durability": { + "phase": "succeeded", + "recordedSessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "storageVersion": 1, + "terminalRecorded": true + }, + "durationMs": 1131, + "error": "", + "operation": "export", + "operationId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb", + "output": "{\"_timeoutHint\":\"ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\"data\":{\"externalEffect\":\"file_published\",\"fileSize\":73647,\"format\":\"f3d\",\"modelRollbackApplies\":false,\"outputPath\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Temp\\\\adom-fusion-ralph\\\\20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\\01-ordinary-c7248642.f3d\",\"overwrite\":false,\"published\":true,\"sha256\":\"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\",\"target\":{\"documentId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\"revision\":\"b56ad55520965ab48cb5d803aa9dc486ef4e9d65a6f81b3fa3d3e28d131f81eb\"}},\"durability\":{\"phase\":\"succeeded\",\"recordedSessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"storageVersion\":1,\"terminalRecorded\":true},\"operation\":\"export\",\"operationId\":\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac-f4c7fcc7aafb\",\"sessionId\":\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\",\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":60}", + "schemaVersion": 1, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0051-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0051-fusion_run_modeling_script.json new file mode 100644 index 0000000..4cb61f6 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0051-fusion_run_modeling_script.json @@ -0,0 +1,243 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\", \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\", \"action\": \"checkpoint\", \"runId\": \"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\", \"host\": \"ADOM_DREW2\", \"sessionId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d\"}')\n\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\n\ndef require(condition, message):\n if not condition:\n raise RuntimeError(message)\n\ndef same(a, b):\n if isinstance(a, bool) or isinstance(b, bool):\n return type(a) is type(b) and a == b\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\n if isinstance(a, dict) and isinstance(b, dict):\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\n if isinstance(a, list) and isinstance(b, list):\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\n return a == b\n\ndef vector(p):\n return [p.x * 10, p.y * 10, p.z * 10]\n\ndef body_measure(body):\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n box = body.boundingBox\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\n 'material': body.material.name if body.material else None}\n\ndef witness(document):\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n require(design is not None, 'Owned document is no longer a design')\n root = design.rootComponent\n components, occurrences = [], []\n all_bodies = [body_measure(b) for b in root.bRepBodies]\n for comp in design.allComponents:\n components.append({'name': '' if comp == root else comp.name,\n 'partNumber': comp.partNumber, 'description': comp.description,\n 'material': comp.material.name if comp.material else None,\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\n for occurrence in root.allOccurrences:\n matrix = list(occurrence.transform2.asArray())\n for index in (3, 7, 11): matrix[index] *= 10\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\n all_bodies.extend(bodies)\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\n 'transform': matrix, 'bodies': bodies})\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\n return {'parameters': {p.name: p.expression for p in design.allParameters},\n 'timelineCount': design.timeline.count,\n 'components': sorted(components, key=lambda c: c['name']),\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\n 'centerOfMass': vector(props.centerOfMass)},\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\n 'instanceCount': len(all_bodies)}\n\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\nmodules = [m for n, m in list(sys.modules.items())\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\ncore = modules[0]\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\nif registries is None:\n registries = {}\n builtins._adom_mechanical_ralph_runs = registries\naction = REQUEST['action']\nrun = registries.get(REQUEST['runId'])\n\ndef documents():\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\n for d in app.documents]\n\ndef idle():\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\n\ndef fingerprint(document):\n return {'creationId': document.creationId, 'name': document.name,\n 'modified': document.isModified, 'saved': document.isSaved}\n\ndef owned(document_id, allow_closed=False):\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\n row = run['documents'][document_id]\n if row.get('closed'):\n require(allow_closed, 'Owned document is already closed')\n return row\n document = row['object']\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\n require(marker and marker.value == document_id, 'Runtime document marker changed')\n return row\n\ndef path_in_scratch(path):\n root = os.path.realpath(run['scratch'])\n path = os.path.abspath(path)\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\n 'Artifact is not inside the owned scratch directory')\n require(not os.path.islink(path), 'Artifact is a symlink')\n return path\n\ndef file_info(path):\n path = path_in_scratch(path)\n require(os.path.isfile(path), 'Checkpoint file is absent')\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\n with open(path, 'rb') as stream: data = stream.read()\n return {'path': path.replace('\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\n\ndef register(document, document_id, role):\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\n require(document_id not in run['documents'], 'Runtime ID is already registered')\n # Retain exact object first, including if marker creation later fails.\n row = {'object': document, 'documentId': document_id, 'role': role,\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\n run['documents'][document_id] = row\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\n return row\n\ndef public_row(row):\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\n\nif action == 'begin':\n idle()\n require(run is None, 'Native run registry already exists; use recover')\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\n baseline = documents()\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\n require(not os.path.exists(scratch), 'Run scratch already exists')\n parent = os.path.dirname(scratch)\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\n os.makedirs(scratch)\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\n 'baselineObjects': list(app.documents), 'baseline': baseline,\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\n registries[REQUEST['runId']] = run\n result = {'success': True, 'scratch': scratch.replace('\\\\', '/'), 'documents': baseline}\nelse:\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\n if action == 'inventory':\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\n 'scratch': run['scratch'].replace('\\\\', '/')}\n elif action == 'register':\n idle()\n document, design, document_id = core.active(app)\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\n row = register(document, document_id, REQUEST['role'])\n result = {'success': True, **public_row(row)}\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\n document = row['object']\n if action == 'verify':\n if not row.get('closed'):\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\n elif action == 'witness':\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\n elif action == 'activate':\n idle()\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing activation')\n if app.activeDocument != document:\n require(document.activate(), 'Owned document activation failed')\n result = {'success': True, 'documentId': row['documentId']}\n elif action == 'close':\n idle()\n if not row['closed']:\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\n 'User selected an external document; refusing lifecycle changes')\n checkpoint = row['checkpoint']\n require(checkpoint is not None, 'No verified native checkpoint')\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\n require(document.close(False), 'Owned document close returned false')\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\n row['closed'] = True\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\n elif action == 'capture':\n require(app.activeDocument == document, 'Active document changed before capture')\n path = path_in_scratch(REQUEST['path'])\n require(not os.path.exists(path), 'Capture destination already exists')\n viewport = app.activeViewport\n viewport.fit()\n viewport.refresh()\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\n result = {'success': True, **file_info(path)}\n else:\n idle()\n require(app.activeDocument == document, 'Active document changed before roundtrip')\n path = path_in_scratch(REQUEST['path'])\n archive = file_info(path)\n before = witness(document)\n options = app.importManager.createFusionArchiveImportOptions(path)\n imported = app.importManager.importToNewDocument(options)\n # Keep the actual returned API object before any fragile getter or\n # identity lookup. A provisional object can only be retained/reported.\n provisional = {'object': imported}\n run.setdefault('provisionalImports', []).append(provisional)\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\n reopened_doc, reopened_design, reopened_id = core.active(app)\n require(reopened_doc == imported, 'Imported document identity mismatch')\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\n run['provisionalImports'].remove(provisional)\n after = witness(imported)\n require(same(before, after), 'Native archive roundtrip changed measured model state')\n # Mark both sides only after independent semantic comparison.\n for item in (row, reopened):\n item['checkpoint'] = archive\n item['witness'] = before\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\n 'reopened': public_row(reopened), 'source': public_row(row)}\n elif action == 'file':\n info = file_info(REQUEST['path'])\n with open(info['path'], 'rb') as stream: data = stream.read()\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\n if REQUEST.get('csv'):\n with open(info['path'], encoding='utf-8', newline='') as stream:\n result['rows'] = list(csv.DictReader(stream))\n elif action == 'restore':\n idle()\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\n require(len(list(app.documents)) == len(run['baselineObjects']) and\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\n 'Document set changed; refusing to change active document')\n require(documents() == run['baseline'], 'Original document flags changed')\n original = run['activeObject']\n if app.activeDocument != original:\n require(original.activate(), 'Original document activation failed')\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\n else:\n raise RuntimeError('Unknown native action')\n" + }, + "requestJson": "{\"script\": \"import json\\nREQUEST = json.loads('{\\\"documentId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\\\", \\\"path\\\": \\\"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\\\", \\\"action\\\": \\\"checkpoint\\\", \\\"runId\\\": \\\"20261005T210310Z-568fe7869d0b41d5a83014811fe170ac\\\", \\\"host\\\": \\\"ADOM_DREW2\\\", \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\"}')\\n\\nimport base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile\\n\\ndef require(condition, message):\\n if not condition:\\n raise RuntimeError(message)\\n\\ndef same(a, b):\\n if isinstance(a, bool) or isinstance(b, bool):\\n return type(a) is type(b) and a == b\\n if isinstance(a, (int, float)) and isinstance(b, (int, float)):\\n return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7)\\n if isinstance(a, dict) and isinstance(b, dict):\\n return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a)\\n if isinstance(a, list) and isinstance(b, list):\\n return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b))\\n return a == b\\n\\ndef vector(p):\\n return [p.x * 10, p.y * 10, p.z * 10]\\n\\ndef body_measure(body):\\n properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n box = body.boundingBox\\n return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass,\\n 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count,\\n 'bounds': [vector(box.minPoint), vector(box.maxPoint)],\\n 'material': body.material.name if body.material else None}\\n\\ndef witness(document):\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n require(design is not None, 'Owned document is no longer a design')\\n root = design.rootComponent\\n components, occurrences = [], []\\n all_bodies = [body_measure(b) for b in root.bRepBodies]\\n for comp in design.allComponents:\\n components.append({'name': '' if comp == root else comp.name,\\n 'partNumber': comp.partNumber, 'description': comp.description,\\n 'material': comp.material.name if comp.material else None,\\n 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'},\\n 'bodies': [body_measure(b) for b in comp.bRepBodies],\\n 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained,\\n 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]})\\n for occurrence in root.allOccurrences:\\n matrix = list(occurrence.transform2.asArray())\\n for index in (3, 7, 11): matrix[index] *= 10\\n bodies = [body_measure(b) for b in occurrence.bRepBodies]\\n all_bodies.extend(bodies)\\n occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name,\\n 'transform': matrix, 'bodies': bodies})\\n props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)\\n return {'parameters': {p.name: p.expression for p in design.allParameters},\\n 'timelineCount': design.timeline.count,\\n 'components': sorted(components, key=lambda c: c['name']),\\n 'occurrences': sorted(occurrences, key=lambda o: o['path']),\\n 'physical': {'volume': props.volume * 1000, 'mass': props.mass,\\n 'centerOfMass': vector(props.centerOfMass)},\\n 'instanceVolume': sum(b['volume'] for b in all_bodies),\\n 'instanceCount': len(all_bodies)}\\n\\nrequire(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host')\\nrequire(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID')\\nmodules = [m for n, m in list(sys.modules.items())\\n if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']]\\nrequire(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference')\\ncore = modules[0]\\nregistries = getattr(builtins, '_adom_mechanical_ralph_runs', None)\\nif registries is None:\\n registries = {}\\n builtins._adom_mechanical_ralph_runs = registries\\naction = REQUEST['action']\\nrun = registries.get(REQUEST['runId'])\\n\\ndef documents():\\n return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved}\\n for d in app.documents]\\n\\ndef idle():\\n require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action')\\n\\ndef fingerprint(document):\\n return {'creationId': document.creationId, 'name': document.name,\\n 'modified': document.isModified, 'saved': document.isSaved}\\n\\ndef owned(document_id, allow_closed=False):\\n require(document_id in run['documents'], 'Document has no exact native ownership entry')\\n row = run['documents'][document_id]\\n if row.get('closed'):\\n require(allow_closed, 'Owned document is already closed')\\n return row\\n document = row['object']\\n require(any(d == document for d in app.documents), 'Exact owned document is no longer open')\\n require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document')\\n require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner')\\n require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed')\\n marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId')\\n require(marker and marker.value == document_id, 'Runtime document marker changed')\\n return row\\n\\ndef path_in_scratch(path):\\n root = os.path.realpath(run['scratch'])\\n path = os.path.abspath(path)\\n require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root,\\n 'Artifact is not inside the owned scratch directory')\\n require(not os.path.islink(path), 'Artifact is a symlink')\\n return path\\n\\ndef file_info(path):\\n path = path_in_scratch(path)\\n require(os.path.isfile(path), 'Checkpoint file is absent')\\n require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget')\\n with open(path, 'rb') as stream: data = stream.read()\\n return {'path': path.replace('\\\\\\\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)}\\n\\ndef register(document, document_id, role):\\n require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document')\\n require(document_id not in run['documents'], 'Runtime ID is already registered')\\n # Retain exact object first, including if marker creation later fails.\\n row = {'object': document, 'documentId': document_id, 'role': role,\\n 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None}\\n run['documents'][document_id] = row\\n require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned')\\n design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType'))\\n design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId'])\\n design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id)\\n return row\\n\\ndef public_row(row):\\n return {k: v for k, v in row.items() if k not in ('object', 'witness')}\\n\\nif action == 'begin':\\n idle()\\n require(run is None, 'Native run registry already exists; use recover')\\n require(app.documents.count > 0, 'An existing active design is required for a read-only baseline')\\n baseline = documents()\\n require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start')\\n scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId'])\\n require(not os.path.exists(scratch), 'Run scratch already exists')\\n parent = os.path.dirname(scratch)\\n require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link')\\n os.makedirs(scratch)\\n run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch,\\n 'baselineObjects': list(app.documents), 'baseline': baseline,\\n 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)}\\n registries[REQUEST['runId']] = run\\n result = {'success': True, 'scratch': scratch.replace('\\\\\\\\', '/'), 'documents': baseline}\\nelse:\\n require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted')\\n if action == 'inventory':\\n result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()],\\n 'provisionalImportCount': len(run.get('provisionalImports', [])),\\n 'scratch': run['scratch'].replace('\\\\\\\\', '/')}\\n elif action == 'register':\\n idle()\\n document, design, document_id = core.active(app)\\n require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result')\\n row = register(document, document_id, REQUEST['role'])\\n result = {'success': True, **public_row(row)}\\n elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'):\\n row = owned(REQUEST['documentId'], action in ('close', 'verify'))\\n document = row['object']\\n if action == 'verify':\\n if not row.get('closed'):\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']}\\n elif action == 'witness':\\n require(app.activeDocument == document, 'Active document changed; no implicit activation')\\n result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)}\\n elif action == 'activate':\\n idle()\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing activation')\\n if app.activeDocument != document:\\n require(document.activate(), 'Owned document activation failed')\\n result = {'success': True, 'documentId': row['documentId']}\\n elif action == 'close':\\n idle()\\n if not row['closed']:\\n require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']),\\n 'User selected an external document; refusing lifecycle changes')\\n checkpoint = row['checkpoint']\\n require(checkpoint is not None, 'No verified native checkpoint')\\n require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed')\\n require(same(witness(document), row['witness']), 'Model changed since checkpoint')\\n require(document.close(False), 'Owned document close returned false')\\n require(not any(d == document for d in app.documents), 'Owned document still appears in open documents')\\n row['closed'] = True\\n result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True}\\n elif action == 'capture':\\n require(app.activeDocument == document, 'Active document changed before capture')\\n path = path_in_scratch(REQUEST['path'])\\n require(not os.path.exists(path), 'Capture destination already exists')\\n viewport = app.activeViewport\\n viewport.fit()\\n viewport.refresh()\\n require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed')\\n result = {'success': True, **file_info(path)}\\n else:\\n idle()\\n require(app.activeDocument == document, 'Active document changed before roundtrip')\\n path = path_in_scratch(REQUEST['path'])\\n archive = file_info(path)\\n before = witness(document)\\n options = app.importManager.createFusionArchiveImportOptions(path)\\n imported = app.importManager.importToNewDocument(options)\\n # Keep the actual returned API object before any fragile getter or\\n # identity lookup. A provisional object can only be retained/reported.\\n provisional = {'object': imported}\\n run.setdefault('provisionalImports', []).append(provisional)\\n require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document')\\n reopened_doc, reopened_design, reopened_id = core.active(app)\\n require(reopened_doc == imported, 'Imported document identity mismatch')\\n reopened = register(imported, reopened_id, row['role'] + '-reopened')\\n run['provisionalImports'].remove(provisional)\\n after = witness(imported)\\n require(same(before, after), 'Native archive roundtrip changed measured model state')\\n # Mark both sides only after independent semantic comparison.\\n for item in (row, reopened):\\n item['checkpoint'] = archive\\n item['witness'] = before\\n result = {'success': True, 'archive': archive, 'before': before, 'after': after,\\n 'reopened': public_row(reopened), 'source': public_row(row)}\\n elif action == 'file':\\n info = file_info(REQUEST['path'])\\n with open(info['path'], 'rb') as stream: data = stream.read()\\n result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')}\\n if REQUEST.get('csv'):\\n with open(info['path'], encoding='utf-8', newline='') as stream:\\n result['rows'] = list(csv.DictReader(stream))\\n elif action == 'restore':\\n idle()\\n require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused')\\n require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open')\\n require(len(list(app.documents)) == len(run['baselineObjects']) and\\n all(any(d == original for d in app.documents) for original in run['baselineObjects']),\\n 'Document set changed; refusing to change active document')\\n require(documents() == run['baseline'], 'Original document flags changed')\\n original = run['activeObject']\\n if app.activeDocument != original:\\n require(original.activate(), 'Original document activation failed')\\n require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed')\\n result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId}\\n else:\\n raise RuntimeError('Unknown native action')\\n\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234246.5715759, + "mutating": true, + "stdout": "{\n \"_hint\": \"Document checkpoint: 3 open, 2 need saving (Untitled, Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\\\"foreground\\\": true, \\\"foregroundReason\\\": \\\"\\\"}.\",\n \"_hintDocumentHygiene\": \"Document checkpoint: 3 open, 2 need saving (Untitled, Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.\",\n \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.\",\n \"_timing\": {\n \"addinSec\": 0.44,\n \"dialogsSec\": 0.61,\n \"postSec\": 0.97,\n \"preSec\": 0.02,\n \"scope\": \"one exe pass-through of this verb only: excludes the relay hop, ab's queue, and any earlier pass-through a composite verb (routing, tour) made before this one, so the caller's wall clock can be longer\",\n \"totalSec\": 2.04\n },\n \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"after\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n },\n \"archive\": {\n \"bytes\": 73647,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\",\n \"sha256\": \"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\"\n },\n \"before\": {\n \"components\": [\n {\n \"attributes\": {\n \"requestedName\": \"Untitled\"\n },\n \"bodies\": [\n {\n \"bounds\": [\n [\n 0.0,\n 0.0,\n 0.0\n ],\n [\n 20.0,\n 30.0,\n 20.0\n ]\n ],\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"faces\": 6,\n \"mass\": 0.0324,\n \"material\": \"Aluminum\",\n \"name\": \"Block\",\n \"volume\": 12000.0\n }\n ],\n \"description\": \"\",\n \"material\": \"Aluminum\",\n \"name\": \"\",\n \"partNumber\": \"2026-10-05-14-03-22-047\",\n \"sketches\": [\n {\n \"curves\": 4,\n \"fullyConstrained\": false,\n \"name\": \"Base rectangle\",\n \"profiles\": 1\n }\n ]\n }\n ],\n \"instanceCount\": 1,\n \"instanceVolume\": 12000.0,\n \"occurrences\": [],\n \"parameters\": {\n \"d5\": \"width\",\n \"d6\": \"height\",\n \"d7\": \"depth\",\n \"d8\": \"0.0 deg\",\n \"depth\": \"20 mm\",\n \"height\": \"30.0 mm\",\n \"width\": \"20.0 mm\"\n },\n \"physical\": {\n \"centerOfMass\": [\n 10.0,\n 15.0,\n 10.0\n ],\n \"mass\": 0.0324,\n \"volume\": 12000.0\n },\n \"timelineCount\": 2\n },\n \"reopened\": {\n \"checkpoint\": {\n \"bytes\": 73647,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\",\n \"sha256\": \"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\"\n },\n \"closed\": false,\n \"creationId\": \"0b49e8af-f3ee-4bb8-86a0-57acd542eedd\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary-reopened\"\n },\n \"source\": {\n \"checkpoint\": {\n \"bytes\": 73647,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\",\n \"sha256\": \"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\"\n },\n \"closed\": false,\n \"creationId\": \"94431d29-0acf-4799-b677-3f564085aa9d\",\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"name\": \"Untitled\",\n \"role\": \"01-ordinary\"\n },\n \"success\": true\n }\n },\n \"documentHygiene\": {\n \"documents\": [\n {\n \"isModified\": false,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": false,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n },\n {\n \"isModified\": true,\n \"isSaved\": false,\n \"name\": \"Untitled\",\n \"needsSave\": true,\n \"saveStateKnown\": true\n }\n ],\n \"inspectionComplete\": true,\n \"needsSaveCount\": 2,\n \"openDocumentCount\": 3,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 2138,\n \"error\": \"\",\n \"output\": \"Workspace Deactivated event received\\nToolbar State: event: workspaceDeactivated, tabId: AdomTab, isActive: False, isVisible: True, isValid: True, name: Adom, productType: DesignProductType\\nWorkspace Activated: Design\\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: True, isValid: True, name: Adom, productType: DesignProductType\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 180,\n \"windowEtiquette\": \"background\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234248.7168012, + "raw": { + "_hint": "Document checkpoint: 3 open, 2 need saving (Untitled, Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud. Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"\"}.", + "_hintDocumentHygiene": "Document checkpoint: 3 open, 2 need saving (Untitled, Untitled). Save edited work at milestones and before ending the task. A source export or Document.CopyToDesktop is a separate checkpoint and may leave Fusion isSaved=false/isModified=true; verify the artifact and re-read save state. Close only this task's completed scratch documents by exact identity with fusion_close_document after verifying a current native checkpoint; never bulk-discard other work. If Fusion reports recovery-file failure, checkpoint immediately, then save or close that document; do not just dismiss recovery. Use a task subfolder when saving to cloud.", + "_timeoutHint": "ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.", + "_timing": { + "addinSec": 0.44, + "dialogsSec": 0.61, + "postSec": 0.97, + "preSec": 0.02, + "scope": "one exe pass-through of this verb only: excludes the relay hop, ab's queue, and any earlier pass-through a composite verb (routing, tour) made before this one, so the caller's wall clock can be longer", + "totalSec": 2.04 + }, + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "after": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + }, + "archive": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + }, + "before": { + "components": [ + { + "attributes": { + "requestedName": "Untitled" + }, + "bodies": [ + { + "bounds": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 20.0, + 30.0, + 20.0 + ] + ], + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "faces": 6, + "mass": 0.0324, + "material": "Aluminum", + "name": "Block", + "volume": 12000.0 + } + ], + "description": "", + "material": "Aluminum", + "name": "", + "partNumber": "2026-10-05-14-03-22-047", + "sketches": [ + { + "curves": 4, + "fullyConstrained": false, + "name": "Base rectangle", + "profiles": 1 + } + ] + } + ], + "instanceCount": 1, + "instanceVolume": 12000.0, + "occurrences": [], + "parameters": { + "d5": "width", + "d6": "height", + "d7": "depth", + "d8": "0.0 deg", + "depth": "20 mm", + "height": "30.0 mm", + "width": "20.0 mm" + }, + "physical": { + "centerOfMass": [ + 10.0, + 15.0, + 10.0 + ], + "mass": 0.0324, + "volume": 12000.0 + }, + "timelineCount": 2 + }, + "reopened": { + "checkpoint": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + }, + "closed": false, + "creationId": "0b49e8af-f3ee-4bb8-86a0-57acd542eedd", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "name": "Untitled", + "role": "01-ordinary-reopened" + }, + "source": { + "checkpoint": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + }, + "closed": false, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + }, + "success": true + } + }, + "documentHygiene": { + "documents": [ + { + "isModified": false, + "isSaved": false, + "name": "Untitled", + "needsSave": false, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + }, + { + "isModified": true, + "isSaved": false, + "name": "Untitled", + "needsSave": true, + "saveStateKnown": true + } + ], + "inspectionComplete": true, + "needsSaveCount": 2, + "openDocumentCount": 3, + "ownership": "notInferred", + "recoveryHealth": "notInspected" + }, + "durationMs": 2138, + "error": "", + "output": "Workspace Deactivated event received\nToolbar State: event: workspaceDeactivated, tabId: AdomTab, isActive: False, isVisible: True, isValid: True, name: Adom, productType: DesignProductType\nWorkspace Activated: Design\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: True, isValid: True, name: Adom, productType: DesignProductType", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 180, + "windowEtiquette": "background" + } +} \ No newline at end of file