diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0052-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0052-fusion_run_modeling_script.json new file mode 100644 index 0000000..dead547 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0052-fusion_run_modeling_script.json @@ -0,0 +1,72 @@ +{ + "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.f3d\", \"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.f3d\\\", \\\"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": 1791234248.7240531, + "mutating": false, + "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 \"data\": {\n \"createdDocument\": null,\n \"documentName\": \"Untitled\",\n \"result\": {\n \"base64\": \"UEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAYAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAwAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUHJvdGVpbkFzc2V0cy5CbG9iUGFydHMvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAoAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vQnJlcHMuQmxvYlBhcnRzL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAOwAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Rlc2lnbkNvbmZpZ3VyYXRpb25UYWJsZS5CbG9iUGFydHMvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAApAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vSW1hZ2VzLkJsb2JQYXJ0cy9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAACcAAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9PR1MuQmxvYkZvbGRlci9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAADIAAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25Ccm93c2VyU2VnbWVudFR5cGUxL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAMQAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAAC4AAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25BQ1RTZWdtZW50VHlwZTEvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAhAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUHJldmlld3MvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAArAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAOAAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL09HUy5CbG9iRm9sZGVyL09HUy9EZWZhdWx0U2NlbmUvUEsDBBQAAABdAIKo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ZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9QSwECLgMKAAAAAACCqEVdAAAAAAAAAAAAAAAALgAAAAAAAAAAABAA/UFOAgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uQUNUU2VnbWVudFR5cGUxL1BLAQIuAwoAAAAAAIKoRV0AAAAAAAAAAAAAAAAhAAAAAAAAAAAAEAD9QZoCAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9QcmV2aWV3cy9QSwECLgMKAAAAAACCqEVdAAAAAAAAAAAAAAAAKwAAAAAAAAAAABAA/UHZAgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL1BLAQIuAwoAAAAAAIKoRV0AAAAAAAAAAAAAAAA4AAAAAAAAAAAAEAD9QSIDAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9PR1MuQmxvYkZvbGRlci9PR1MvRGVmYXVsdFNjZW5lL1BLAQIuAxQAAABdAIKoRV1ZI29LZgEAADsCAAAMAAAAAAAAAAAAAAC0gXgDAABNYW5pZmVzdC5kYXRQSwECLgMUAAAAAACCqEVdHN9EIQQAAAAEAAAADgAAAAAAAAAAAAAAtIEIBQAAUHJvcGVydGllcy5kYXRQSwECLgMUAAAAXQCCqEVdm2NguE4BAABNAgAAJAAAAAAAAAAAAAAAtIE4BQAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vTWFuaWZlc3QuZGF0UEsBAi4DFAAAAF0AgqhFXQ8IUQ6tMQAAlj8AAGkAAAAAAAAAAAAAALSByAYAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL1Byb3RlaW5Bc3NldHMuQmxvYlBhcnRzL1Byb3RlaW5Bc3NldC5mNGFiNmYxOS1mODdmLTQwZWItYTM1NC1lNGJlZWU5NTFhY2YucHJvdGVpblBLAQIuAxQAAABdAIKoRV1+2tXxigYAABAkAABWAAAAAAAAAAAAAAC0gfw4AABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9CcmVwcy5CbG9iUGFydHMvQlJFUC45NGJiMzA1ZC1lMjY1LTQ2MjItYWFlOC02MGQyMDQ5YTg2Yzcuc21iaFBLAQIuAxQAAABdAIKoRV008U2c/QYAANQuAABVAAAAAAAAAAAAAAC0gfo/AABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9CcmVwcy5CbG9iUGFydHMvQlJFUC42ZDI0NzE4Mi1mZjk2LTRkNDUtYmJjMy04Yjk0ZjAxM2Q3YzAuc21iUEsBAi4DFAAAAAAAgqhFXUO/pqMCAAAAAgAAAIIAAAAAAAAAAAAAALSBakcAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Rlc2lnbkNvbmZpZ3VyYXRpb25UYWJsZS5CbG9iUGFydHMvRGVzaWduQ29uZmlndXJhdGlvblJ1bGUuY2EyNGVkNjItZWY0ZC00ZWM2LTk4NDctNzE1ZmZjNWM3NmIxLmRzZ2NmZ3J1bGVQSwECLgMUAAAAAACCqEVdQ7+mowIAAAACAAAAfwAAAAAAAAAAAAAAtIEMSAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRGVzaWduQ29uZmlndXJhdGlvblRhYmxlLkJsb2JQYXJ0cy9EZXNpZ25Db25maWd1cmF0aW9uVGFibGUuN2ExNzJiZjYtYTVjZi00MTIzLTlkYzgtYWE1NGUyNmJiOTczLmRzZ2NmZ1BLAQIuAxQAAABdAIKoRV3ebhJrPQMAAEUVAABAAAAAAAAAAAAAAAC0gatIAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25Ccm93c2VyU2VnbWVudFR5cGUxL0J1bGtTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXc18oBYaBgAA2hUAAEAAAAAAAAAAAAAAALSBRkwAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkJyb3dzZXJTZWdtZW50VHlwZTEvTWV0YVN0cmVhbS5kYXRQSwECLgMUAAAAXQCCqEVdrdYVeusbAACGkQAAPwAAAAAAAAAAAAAAtIG+UgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uRGVzaWduU2VnbWVudFR5cGUxL0J1bGtTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXeCfFfMhHgAABWEAAD8AAAAAAAAAAAAAALSBBm8AAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9NZXRhU3RyZWFtLmRhdFBLAQIuAxQAAABdAIKoRV24lCTWGgQAAJgMAAA8AAAAAAAAAAAAAAC0gYSNAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25BQ1RTZWdtZW50VHlwZTEvQnVsa1N0cmVhbS5kYXRQSwECLgMUAAAAXQCCqEVdqYVgSq8CAAAhBwAAPAAAAAAAAAAAAAAAtIH4kQAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uQUNUU2VnbWVudFR5cGUxL01ldGFTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXYW23SqdEgAAkBIAACoAAAAAAAAAAAAAALSBAZUAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL1ByZXZpZXdzL3NtYWxsLnBuZ1BLAQIuAxQAAABdAIKoRV0zgE/xxlgAAJteAAAoAAAAAAAAAAAAAAC0geanAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9QcmV2aWV3cy9iaWcucG5nUEsBAi4DFAAAAF0AgqhFXVblmYrODgAAY5gAAD0AAAAAAAAAAAAAALSB8gABAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL09HUy5CbG9iRm9sZGVyL09HUy9EZWZhdWx0U2NlbmUvd29ybGRQSwECLgMUAAAAXQCCqEVd5UCvKSUBAAAMBQAARwAAAAAAAAAAAAAAtIEbEAEARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL0RlZmF1bHRTY2VuZS9zdHJlYW1fbWVzaF8wMDBQSwECLgMUAAAAXQCCqEVdSGHDqAcBAADQBQAARwAAAAAAAAAAAAAAtIGlEQEARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL0RlZmF1bHRTY2VuZS9GdXNpb25fbWVzaF8wMDBQSwUGAAAAAB8AHwCIDAAAERMBAAAA\",\n \"bytes\": 73647,\n \"path\": \"C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d\",\n \"sha256\": \"8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac\",\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\": 1823,\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": 1791234250.5559015, + "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.", + "data": { + "createdDocument": null, + "documentName": "Untitled", + "result": { + "base64": "UEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAYAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAwAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUHJvdGVpbkFzc2V0cy5CbG9iUGFydHMvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAoAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vQnJlcHMuQmxvYlBhcnRzL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAOwAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Rlc2lnbkNvbmZpZ3VyYXRpb25UYWJsZS5CbG9iUGFydHMvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAApAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vSW1hZ2VzLkJsb2JQYXJ0cy9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAACcAAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9PR1MuQmxvYkZvbGRlci9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAADIAAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25Ccm93c2VyU2VnbWVudFR5cGUxL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAMQAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9QSwMECgAAAAAAgqhFXQAAAAAAAAAAAAAAAC4AAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25BQ1RTZWdtZW50VHlwZTEvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAAhAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vUHJldmlld3MvUEsDBAoAAAAAAIKoRV0AAAAAAAAAAAAAAAArAAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL1BLAwQKAAAAAACCqEVdAAAAAAAAAAAAAAAAOAAAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL09HUy5CbG9iRm9sZGVyL09HUy9EZWZhdWx0U2NlbmUvUEsDBBQAAABdAIKo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ZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9QSwECLgMKAAAAAACCqEVdAAAAAAAAAAAAAAAALgAAAAAAAAAAABAA/UFOAgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uQUNUU2VnbWVudFR5cGUxL1BLAQIuAwoAAAAAAIKoRV0AAAAAAAAAAAAAAAAhAAAAAAAAAAAAEAD9QZoCAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9QcmV2aWV3cy9QSwECLgMKAAAAAACCqEVdAAAAAAAAAAAAAAAAKwAAAAAAAAAAABAA/UHZAgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL1BLAQIuAwoAAAAAAIKoRV0AAAAAAAAAAAAAAAA4AAAAAAAAAAAAEAD9QSIDAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9PR1MuQmxvYkZvbGRlci9PR1MvRGVmYXVsdFNjZW5lL1BLAQIuAxQAAABdAIKoRV1ZI29LZgEAADsCAAAMAAAAAAAAAAAAAAC0gXgDAABNYW5pZmVzdC5kYXRQSwECLgMUAAAAAACCqEVdHN9EIQQAAAAEAAAADgAAAAAAAAAAAAAAtIEIBQAAUHJvcGVydGllcy5kYXRQSwECLgMUAAAAXQCCqEVdm2NguE4BAABNAgAAJAAAAAAAAAAAAAAAtIE4BQAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vTWFuaWZlc3QuZGF0UEsBAi4DFAAAAF0AgqhFXQ8IUQ6tMQAAlj8AAGkAAAAAAAAAAAAAALSByAYAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL1Byb3RlaW5Bc3NldHMuQmxvYlBhcnRzL1Byb3RlaW5Bc3NldC5mNGFiNmYxOS1mODdmLTQwZWItYTM1NC1lNGJlZWU5NTFhY2YucHJvdGVpblBLAQIuAxQAAABdAIKoRV1+2tXxigYAABAkAABWAAAAAAAAAAAAAAC0gfw4AABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9CcmVwcy5CbG9iUGFydHMvQlJFUC45NGJiMzA1ZC1lMjY1LTQ2MjItYWFlOC02MGQyMDQ5YTg2Yzcuc21iaFBLAQIuAxQAAABdAIKoRV008U2c/QYAANQuAABVAAAAAAAAAAAAAAC0gfo/AABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9CcmVwcy5CbG9iUGFydHMvQlJFUC42ZDI0NzE4Mi1mZjk2LTRkNDUtYmJjMy04Yjk0ZjAxM2Q3YzAuc21iUEsBAi4DFAAAAAAAgqhFXUO/pqMCAAAAAgAAAIIAAAAAAAAAAAAAALSBakcAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Rlc2lnbkNvbmZpZ3VyYXRpb25UYWJsZS5CbG9iUGFydHMvRGVzaWduQ29uZmlndXJhdGlvblJ1bGUuY2EyNGVkNjItZWY0ZC00ZWM2LTk4NDctNzE1ZmZjNWM3NmIxLmRzZ2NmZ3J1bGVQSwECLgMUAAAAAACCqEVdQ7+mowIAAAACAAAAfwAAAAAAAAAAAAAAtIEMSAAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRGVzaWduQ29uZmlndXJhdGlvblRhYmxlLkJsb2JQYXJ0cy9EZXNpZ25Db25maWd1cmF0aW9uVGFibGUuN2ExNzJiZjYtYTVjZi00MTIzLTlkYzgtYWE1NGUyNmJiOTczLmRzZ2NmZ1BLAQIuAxQAAABdAIKoRV3ebhJrPQMAAEUVAABAAAAAAAAAAAAAAAC0gatIAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25Ccm93c2VyU2VnbWVudFR5cGUxL0J1bGtTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXc18oBYaBgAA2hUAAEAAAAAAAAAAAAAAALSBRkwAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkJyb3dzZXJTZWdtZW50VHlwZTEvTWV0YVN0cmVhbS5kYXRQSwECLgMUAAAAXQCCqEVdrdYVeusbAACGkQAAPwAAAAAAAAAAAAAAtIG+UgAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uRGVzaWduU2VnbWVudFR5cGUxL0J1bGtTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXeCfFfMhHgAABWEAAD8AAAAAAAAAAAAAALSBBm8AAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL0Z1c2lvbkRlc2lnblNlZ21lbnRUeXBlMS9NZXRhU3RyZWFtLmRhdFBLAQIuAxQAAABdAIKoRV24lCTWGgQAAJgMAAA8AAAAAAAAAAAAAAC0gYSNAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9GdXNpb25BQ1RTZWdtZW50VHlwZTEvQnVsa1N0cmVhbS5kYXRQSwECLgMUAAAAXQCCqEVdqYVgSq8CAAAhBwAAPAAAAAAAAAAAAAAAtIH4kQAARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vRnVzaW9uQUNUU2VnbWVudFR5cGUxL01ldGFTdHJlYW0uZGF0UEsBAi4DFAAAAF0AgqhFXYW23SqdEgAAkBIAACoAAAAAAAAAAAAAALSBAZUAAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL1ByZXZpZXdzL3NtYWxsLnBuZ1BLAQIuAxQAAABdAIKoRV0zgE/xxlgAAJteAAAoAAAAAAAAAAAAAAC0geanAABGdXNpb25Bc3NldE5hbWVbQWN0aXZlXS9QcmV2aWV3cy9iaWcucG5nUEsBAi4DFAAAAF0AgqhFXVblmYrODgAAY5gAAD0AAAAAAAAAAAAAALSB8gABAEZ1c2lvbkFzc2V0TmFtZVtBY3RpdmVdL09HUy5CbG9iRm9sZGVyL09HUy9EZWZhdWx0U2NlbmUvd29ybGRQSwECLgMUAAAAXQCCqEVd5UCvKSUBAAAMBQAARwAAAAAAAAAAAAAAtIEbEAEARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL0RlZmF1bHRTY2VuZS9zdHJlYW1fbWVzaF8wMDBQSwECLgMUAAAAXQCCqEVdSGHDqAcBAADQBQAARwAAAAAAAAAAAAAAtIGlEQEARnVzaW9uQXNzZXROYW1lW0FjdGl2ZV0vT0dTLkJsb2JGb2xkZXIvT0dTL0RlZmF1bHRTY2VuZS9GdXNpb25fbWVzaF8wMDBQSwUGAAAAAB8AHwCIDAAAERMBAAAA", + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "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": 1823, + "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/0053-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0053-fusion_run_modeling_script.json new file mode 100644 index 0000000..9c23cb9 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0053-fusion_run_modeling_script.json @@ -0,0 +1,63 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\", \"action\": \"close\", \"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:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\\\", \\\"action\\\": \\\"close\\\", \\\"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": 1791234250.5615926, + "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 \"closed\": true,\n \"closedDocumentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\",\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\": 2027,\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": 1791234252.595862, + "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": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "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": 2027, + "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 diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0054-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0054-fusion_run_modeling_script.json new file mode 100644 index 0000000..306cc89 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0054-fusion_run_modeling_script.json @@ -0,0 +1,62 @@ +{ + "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\": \"activate\", \"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\\\": \\\"activate\\\", \\\"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": 1791234252.5966272, + "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 \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\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\": 1735,\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": 1791234254.3401418, + "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 + } + }, + "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": 1735, + "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/0055-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0055-fusion_run_modeling_script.json new file mode 100644 index 0000000..c623175 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0055-fusion_run_modeling_script.json @@ -0,0 +1,55 @@ +{ + "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\": \"close\", \"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\\\": \\\"close\\\", \\\"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": 1791234254.3411875, + "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 \"closed\": true,\n \"closedDocumentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\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\": 2072,\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": 1791234256.4211736, + "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": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "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": 2072, + "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 diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0056-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0056-fusion_run_modeling_script.json new file mode 100644 index 0000000..e657dc2 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0056-fusion_run_modeling_script.json @@ -0,0 +1,81 @@ +{ + "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" + }, + "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\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234256.421793, + "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 {\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\": true,\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 \"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\": true,\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 ],\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\": 1767,\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": 1791234258.195773, + "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": [ + { + "checkpoint": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + }, + "closed": true, + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "name": "Untitled", + "role": "01-ordinary" + }, + { + "checkpoint": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + }, + "closed": true, + "creationId": "0b49e8af-f3ee-4bb8-86a0-57acd542eedd", + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "name": "Untitled", + "role": "01-ordinary-reopened" + } + ], + "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": 1767, + "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/0057-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0057-fusion_run_modeling_script.json new file mode 100644 index 0000000..6a49777 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0057-fusion_run_modeling_script.json @@ -0,0 +1,56 @@ +{ + "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\": \"verify\", \"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\\\": \\\"verify\\\", \\\"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": 1791234258.2008164, + "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 \"closed\": true,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\n \"ownerRunId\": \"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\": 1751,\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": 1791234259.9592354, + "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": { + "closed": true, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "ownerRunId": "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": 1751, + "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/0058-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0058-fusion_run_modeling_script.json new file mode 100644 index 0000000..958d300 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0058-fusion_run_modeling_script.json @@ -0,0 +1,55 @@ +{ + "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\": \"close\", \"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\\\": \\\"close\\\", \\\"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": 1791234259.9599874, + "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 \"closed\": true,\n \"closedDocumentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38\",\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\": 1795,\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": 1791234261.7633312, + "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": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "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": 1795, + "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/0059-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0059-fusion_run_modeling_script.json new file mode 100644 index 0000000..7c72def --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0059-fusion_run_modeling_script.json @@ -0,0 +1,56 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\", \"action\": \"verify\", \"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:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\\\", \\\"action\\\": \\\"verify\\\", \\\"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": 1791234261.7653625, + "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 \"closed\": true,\n \"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\",\n \"ownerRunId\": \"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\": 1726,\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": 1791234263.500277, + "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": { + "closed": true, + "documentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "ownerRunId": "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": 1726, + "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/0060-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0060-fusion_run_modeling_script.json new file mode 100644 index 0000000..b084b8d --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0060-fusion_run_modeling_script.json @@ -0,0 +1,55 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"documentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\", \"action\": \"close\", \"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:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\\\", \\\"action\\\": \\\"close\\\", \\\"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": 1791234263.500854, + "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 \"closed\": true,\n \"closedDocumentId\": \"3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f\",\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\": 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": 1791234265.247031, + "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": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "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": 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/0061-fusion_run_modeling_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0061-fusion_run_modeling_script.json new file mode 100644 index 0000000..ed3e733 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0061-fusion_run_modeling_script.json @@ -0,0 +1,62 @@ +{ + "target": "adom_drew2", + "verb": "fusion_run_modeling_script", + "args": { + "script": "import json\nREQUEST = json.loads('{\"action\": \"restore\", \"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('{\\\"action\\\": \\\"restore\\\", \\\"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": 1791234265.2495081, + "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 \"activeCreationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"documents\": [\n {\n \"creationId\": \"70b2c575-f830-4751-9f88-2f1f3ab91fb1\",\n \"modified\": false,\n \"name\": \"Untitled\",\n \"saved\": false\n }\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 \"inspectionComplete\": true,\n \"needsSaveCount\": 0,\n \"openDocumentCount\": 1,\n \"ownership\": \"notInferred\",\n \"recoveryHealth\": \"notInspected\"\n },\n \"durationMs\": 1782,\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": 1791234267.0388124, + "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": { + "activeCreationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "documents": [ + { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "modified": false, + "name": "Untitled", + "saved": false + } + ], + "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": 1782, + "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/0062-fusion_get_preferences.json b/docs/mechanical-verification/cp8/ordinary/calls/0062-fusion_get_preferences.json new file mode 100644 index 0000000..222c103 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0062-fusion_get_preferences.json @@ -0,0 +1,38 @@ +{ + "target": "adom_drew2", + "verb": "fusion_get_preferences", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234267.0394173, + "mutating": false, + "stdout": "{\n \"_hint\": \"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\n \"_timeoutHint\": \"ab waits up to 25s 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 \"applied\": {},\n \"current\": {\n \"activeTheme\": \"darkblue\",\n \"cameraPivot\": true,\n \"gestureNav\": true,\n \"invertScrollZoom\": true,\n \"lengthUnit\": \"mm\",\n \"modelingOrientation\": \"zup\",\n \"orbitScheme\": \"fusion360\",\n \"theme\": \"device\"\n },\n \"durationMs\": 88,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 25s 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.\\\",\\\"applied\\\":{},\\\"current\\\":{\\\"activeTheme\\\":\\\"darkblue\\\",\\\"cameraPivot\\\":true,\\\"gestureNav\\\":true,\\\"invertScrollZoom\\\":true,\\\"lengthUnit\\\":\\\"mm\\\",\\\"modelingOrientation\\\":\\\"zup\\\",\\\"orbitScheme\\\":\\\"fusion360\\\",\\\"theme\\\":\\\"device\\\"},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":25}\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 25\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234267.1341872, + "raw": { + "_hint": "Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).", + "_timeoutHint": "ab waits up to 25s 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.", + "applied": {}, + "current": { + "activeTheme": "darkblue", + "cameraPivot": true, + "gestureNav": true, + "invertScrollZoom": true, + "lengthUnit": "mm", + "modelingOrientation": "zup", + "orbitScheme": "fusion360", + "theme": "device" + }, + "durationMs": 88, + "error": "", + "output": "{\"_hint\":\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\"_timeoutHint\":\"ab waits up to 25s 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.\",\"applied\":{},\"current\":{\"activeTheme\":\"darkblue\",\"cameraPivot\":true,\"gestureNav\":true,\"invertScrollZoom\":true,\"lengthUnit\":\"mm\",\"modelingOrientation\":\"zup\",\"orbitScheme\":\"fusion360\",\"theme\":\"device\"},\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":25}", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 25 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0063-fusion_state.json b/docs/mechanical-verification/cp8/ordinary/calls/0063-fusion_state.json new file mode 100644 index 0000000..01370a1 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0063-fusion_state.json @@ -0,0 +1,439 @@ +{ + "target": "adom_drew2", + "verb": "fusion_state", + "args": { + "screenshot": false, + "nativeViewport": false + }, + "requestJson": "{\"screenshot\": false, \"nativeViewport\": false}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234267.1348078, + "mutating": false, + "stdout": "{\n \"_hint\": \"Fusion is clear. The screenshot shows the current surface - this is the verb to render any fusion_show_* result (they open in the background by design).\",\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 \"activeDocument\": \"Untitled\",\n \"addinResponding\": true,\n \"blockingDialogs\": [],\n \"dialogs\": [],\n \"drivingBadge\": {\n \"active\": true,\n \"enabled\": true,\n \"idleShedSeconds\": 300,\n \"lastDrivingVerbAt\": 1791234265.3772285,\n \"lastError\": null\n },\n \"durationMs\": 118,\n \"error\": \"\",\n \"focusEvents\": [],\n \"hwnd\": 29757446,\n \"mainThreadBusy\": null,\n \"output\": \"{\\\"running\\\":true,\\\"activeDocument\\\":\\\"Untitled\\\",\\\"mainThreadBusy\\\":null,\\\"blockingDialogs\\\":[],\\\"screenshot\\\":null}\",\n \"rect\": {\n \"bottom\": 1549,\n \"height\": 1549,\n \"left\": -11,\n \"right\": 2572,\n \"top\": 0,\n \"width\": 2583\n },\n \"running\": true,\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"timings\": {\n \"launch\": {\n \"cold\": {\n \"count\": 10,\n \"lastAt\": 1791234147,\n \"p50\": 41.1,\n \"p90\": 216.2\n },\n \"warm\": {\n \"count\": 2,\n \"lastAt\": 1791230617,\n \"p50\": 0.0,\n \"p90\": 1.0\n }\n },\n \"verb:activate_document\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1789145672,\n \"p50\": 3.1,\n \"p90\": 5.6\n }\n },\n \"verb:addin_status\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1788899767,\n \"p50\": 2.0,\n \"p90\": 2.0\n }\n },\n \"verb:aps_browse\": {\n \"any\": {\n \"count\": 4,\n \"lastAt\": 1789143968,\n \"p50\": 1.9,\n \"p90\": 2.3\n }\n },\n \"verb:aps_file_info\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1789144745,\n \"p50\": 34.8,\n \"p90\": 36.2\n }\n },\n \"verb:aps_get_browser\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1787944552,\n \"p50\": 0.0,\n \"p90\": 0.0\n }\n },\n \"verb:aps_open\": {\n \"any\": {\n \"count\": 5,\n \"lastAt\": 1788196241,\n \"p50\": 0.2,\n \"p90\": 37.2\n }\n },\n \"verb:aps_search\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1789684900,\n \"p50\": 35.7,\n \"p90\": 65.6\n }\n },\n \"verb:aps_signin\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1787949063,\n \"p50\": 0.4,\n \"p90\": 1.1\n }\n },\n \"verb:aps_status\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1788899782,\n \"p50\": 0.0,\n \"p90\": 0.0\n }\n },\n \"verb:assembly_bom\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1790955710,\n \"p50\": 0.1,\n \"p90\": 0.6\n }\n },\n \"verb:check_dialogs\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1788195388,\n \"p50\": 1.4,\n \"p90\": 1.4\n }\n },\n \"verb:close_document\": {\n \"any\": {\n \"count\": 9,\n \"lastAt\": 1789145809,\n \"p50\": 6.7,\n \"p90\": 46.1\n }\n },\n \"verb:describe\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1789144008,\n \"p50\": 0.0,\n \"p90\": 0.0\n }\n },\n \"verb:document_info\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234195,\n \"p50\": 0.2,\n \"p90\": 0.2\n }\n },\n \"verb:eagle_import_status\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1790978404,\n \"p50\": 1.8,\n \"p90\": 1.8\n }\n },\n \"verb:electron_run\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1788456727,\n \"p50\": 6.3,\n \"p90\": 13.3\n }\n },\n \"verb:export_cloud_file\": {\n \"any\": {\n \"count\": 4,\n \"lastAt\": 1789685179,\n \"p50\": 223.4,\n \"p90\": 290.3\n }\n },\n \"verb:export_eagle_source\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1788456713,\n \"p50\": 1.7,\n \"p90\": 2.2\n }\n },\n \"verb:export_f3d\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1790955227,\n \"p50\": 3.7,\n \"p90\": 4.4\n }\n },\n \"verb:export_obj\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1787944913,\n \"p50\": 0.7,\n \"p90\": 0.7\n }\n },\n \"verb:export_step\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1788456783,\n \"p50\": 5.5,\n \"p90\": 7.9\n }\n },\n \"verb:get_app_state\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234147,\n \"p50\": 1.3,\n \"p90\": 3.6\n }\n },\n \"verb:get_design_info\": {\n \"any\": {\n \"count\": 5,\n \"lastAt\": 1788900070,\n \"p50\": 5.2,\n \"p90\": 10.8\n }\n },\n \"verb:help\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1788194522,\n \"p50\": 1.0,\n \"p90\": 1.0\n }\n },\n \"verb:kill\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1787833443,\n \"p50\": 66.9,\n \"p90\": 66.9\n }\n },\n \"verb:list_cloud_files\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1787832975,\n \"p50\": 15.8,\n \"p90\": 15.8\n }\n },\n \"verb:mcp_call\": {\n \"any\": {\n \"count\": 5,\n \"lastAt\": 1788455586,\n \"p50\": 0.0,\n \"p90\": 1.8\n }\n },\n \"verb:mech_capabilities\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234199,\n \"p50\": 0.1,\n \"p90\": 0.1\n }\n },\n \"verb:mech_operation_status\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791229196,\n \"p50\": 0.1,\n \"p90\": 0.1\n }\n },\n \"verb:mechanical\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234246,\n \"p50\": 0.7,\n \"p90\": 1.9\n }\n },\n \"verb:open_by_urn\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1789144985,\n \"p50\": 43.4,\n \"p90\": 59.1\n }\n },\n \"verb:open_cloud_file\": {\n \"any\": {\n \"count\": 8,\n \"lastAt\": 1789666231,\n \"p50\": 24.2,\n \"p90\": 87.5\n }\n },\n \"verb:open_design\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1790955721,\n \"p50\": 5.9,\n \"p90\": 6.1\n }\n },\n \"verb:open_lbr\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1788195396,\n \"p50\": 2.7,\n \"p90\": 5.0\n }\n },\n \"verb:physical_properties\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1790955710,\n \"p50\": 0.1,\n \"p90\": 0.2\n }\n },\n \"verb:readiness\": {\n \"any\": {\n \"count\": 5,\n \"lastAt\": 1788900108,\n \"p50\": 14.9,\n \"p90\": 56.9\n }\n },\n \"verb:restart_for_addin\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234174,\n \"p50\": 0.0,\n \"p90\": 125.2\n }\n },\n \"verb:run_modeling_script\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1791234267,\n \"p50\": 1.7,\n \"p90\": 1.9\n }\n },\n \"verb:search_cloud_files\": {\n \"any\": {\n \"count\": 3,\n \"lastAt\": 1789143642,\n \"p50\": 0.0,\n \"p90\": 0.4\n }\n },\n \"verb:show_2d_board\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1788456656,\n \"p50\": 26.6,\n \"p90\": 34.9\n }\n },\n \"verb:show_3d_board\": {\n \"any\": {\n \"count\": 6,\n \"lastAt\": 1788456760,\n \"p50\": 10.2,\n \"p90\": 19.6\n }\n },\n \"verb:signin\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1788899909,\n \"p50\": 56.1,\n \"p90\": 56.1\n }\n },\n \"verb:start\": {\n \"any\": {\n \"count\": 7,\n \"lastAt\": 1791230617,\n \"p50\": 57.4,\n \"p90\": 64.9\n }\n },\n \"verb:status\": {\n \"any\": {\n \"count\": 2,\n \"lastAt\": 1788194217,\n \"p50\": 0.8,\n \"p90\": 1.0\n }\n },\n \"verb:stop\": {\n \"any\": {\n \"count\": 1,\n \"lastAt\": 1787831926,\n \"p50\": 19.7,\n \"p90\": 19.7\n }\n },\n \"verb:window_info\": {\n \"any\": {\n \"count\": 10,\n \"lastAt\": 1788899841,\n \"p50\": 7.2,\n \"p90\": 10.9\n }\n }\n },\n \"timingsSentence\": \"on this machine Fusion starts in cold 41s, warm 0s (measured)\",\n \"title\": \"Untitled - Autodesk Fusion \"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234267.2598517, + "raw": { + "_hint": "Fusion is clear. The screenshot shows the current surface - this is the verb to render any fusion_show_* result (they open in the background by design).", + "_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.", + "activeDocument": "Untitled", + "addinResponding": true, + "blockingDialogs": [], + "dialogs": [], + "drivingBadge": { + "active": true, + "enabled": true, + "idleShedSeconds": 300, + "lastDrivingVerbAt": 1791234265.3772285, + "lastError": null + }, + "durationMs": 118, + "error": "", + "focusEvents": [], + "hwnd": 29757446, + "mainThreadBusy": null, + "output": "{\"running\":true,\"activeDocument\":\"Untitled\",\"mainThreadBusy\":null,\"blockingDialogs\":[],\"screenshot\":null}", + "rect": { + "bottom": 1549, + "height": 1549, + "left": -11, + "right": 2572, + "top": 0, + "width": 2583 + }, + "running": true, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60, + "timings": { + "launch": { + "cold": { + "count": 10, + "lastAt": 1791234147, + "p50": 41.1, + "p90": 216.2 + }, + "warm": { + "count": 2, + "lastAt": 1791230617, + "p50": 0.0, + "p90": 1.0 + } + }, + "verb:activate_document": { + "any": { + "count": 3, + "lastAt": 1789145672, + "p50": 3.1, + "p90": 5.6 + } + }, + "verb:addin_status": { + "any": { + "count": 3, + "lastAt": 1788899767, + "p50": 2.0, + "p90": 2.0 + } + }, + "verb:aps_browse": { + "any": { + "count": 4, + "lastAt": 1789143968, + "p50": 1.9, + "p90": 2.3 + } + }, + "verb:aps_file_info": { + "any": { + "count": 10, + "lastAt": 1789144745, + "p50": 34.8, + "p90": 36.2 + } + }, + "verb:aps_get_browser": { + "any": { + "count": 1, + "lastAt": 1787944552, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:aps_open": { + "any": { + "count": 5, + "lastAt": 1788196241, + "p50": 0.2, + "p90": 37.2 + } + }, + "verb:aps_search": { + "any": { + "count": 10, + "lastAt": 1789684900, + "p50": 35.7, + "p90": 65.6 + } + }, + "verb:aps_signin": { + "any": { + "count": 2, + "lastAt": 1787949063, + "p50": 0.4, + "p90": 1.1 + } + }, + "verb:aps_status": { + "any": { + "count": 10, + "lastAt": 1788899782, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:assembly_bom": { + "any": { + "count": 3, + "lastAt": 1790955710, + "p50": 0.1, + "p90": 0.6 + } + }, + "verb:check_dialogs": { + "any": { + "count": 1, + "lastAt": 1788195388, + "p50": 1.4, + "p90": 1.4 + } + }, + "verb:close_document": { + "any": { + "count": 9, + "lastAt": 1789145809, + "p50": 6.7, + "p90": 46.1 + } + }, + "verb:describe": { + "any": { + "count": 3, + "lastAt": 1789144008, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:document_info": { + "any": { + "count": 10, + "lastAt": 1791234195, + "p50": 0.2, + "p90": 0.2 + } + }, + "verb:eagle_import_status": { + "any": { + "count": 1, + "lastAt": 1790978404, + "p50": 1.8, + "p90": 1.8 + } + }, + "verb:electron_run": { + "any": { + "count": 10, + "lastAt": 1788456727, + "p50": 6.3, + "p90": 13.3 + } + }, + "verb:export_cloud_file": { + "any": { + "count": 4, + "lastAt": 1789685179, + "p50": 223.4, + "p90": 290.3 + } + }, + "verb:export_eagle_source": { + "any": { + "count": 10, + "lastAt": 1788456713, + "p50": 1.7, + "p90": 2.2 + } + }, + "verb:export_f3d": { + "any": { + "count": 2, + "lastAt": 1790955227, + "p50": 3.7, + "p90": 4.4 + } + }, + "verb:export_obj": { + "any": { + "count": 2, + "lastAt": 1787944913, + "p50": 0.7, + "p90": 0.7 + } + }, + "verb:export_step": { + "any": { + "count": 10, + "lastAt": 1788456783, + "p50": 5.5, + "p90": 7.9 + } + }, + "verb:get_app_state": { + "any": { + "count": 10, + "lastAt": 1791234147, + "p50": 1.3, + "p90": 3.6 + } + }, + "verb:get_design_info": { + "any": { + "count": 5, + "lastAt": 1788900070, + "p50": 5.2, + "p90": 10.8 + } + }, + "verb:help": { + "any": { + "count": 1, + "lastAt": 1788194522, + "p50": 1.0, + "p90": 1.0 + } + }, + "verb:kill": { + "any": { + "count": 1, + "lastAt": 1787833443, + "p50": 66.9, + "p90": 66.9 + } + }, + "verb:list_cloud_files": { + "any": { + "count": 1, + "lastAt": 1787832975, + "p50": 15.8, + "p90": 15.8 + } + }, + "verb:mcp_call": { + "any": { + "count": 5, + "lastAt": 1788455586, + "p50": 0.0, + "p90": 1.8 + } + }, + "verb:mech_capabilities": { + "any": { + "count": 10, + "lastAt": 1791234199, + "p50": 0.1, + "p90": 0.1 + } + }, + "verb:mech_operation_status": { + "any": { + "count": 10, + "lastAt": 1791229196, + "p50": 0.1, + "p90": 0.1 + } + }, + "verb:mechanical": { + "any": { + "count": 10, + "lastAt": 1791234246, + "p50": 0.7, + "p90": 1.9 + } + }, + "verb:open_by_urn": { + "any": { + "count": 10, + "lastAt": 1789144985, + "p50": 43.4, + "p90": 59.1 + } + }, + "verb:open_cloud_file": { + "any": { + "count": 8, + "lastAt": 1789666231, + "p50": 24.2, + "p90": 87.5 + } + }, + "verb:open_design": { + "any": { + "count": 3, + "lastAt": 1790955721, + "p50": 5.9, + "p90": 6.1 + } + }, + "verb:open_lbr": { + "any": { + "count": 2, + "lastAt": 1788195396, + "p50": 2.7, + "p90": 5.0 + } + }, + "verb:physical_properties": { + "any": { + "count": 3, + "lastAt": 1790955710, + "p50": 0.1, + "p90": 0.2 + } + }, + "verb:readiness": { + "any": { + "count": 5, + "lastAt": 1788900108, + "p50": 14.9, + "p90": 56.9 + } + }, + "verb:restart_for_addin": { + "any": { + "count": 10, + "lastAt": 1791234174, + "p50": 0.0, + "p90": 125.2 + } + }, + "verb:run_modeling_script": { + "any": { + "count": 10, + "lastAt": 1791234267, + "p50": 1.7, + "p90": 1.9 + } + }, + "verb:search_cloud_files": { + "any": { + "count": 3, + "lastAt": 1789143642, + "p50": 0.0, + "p90": 0.4 + } + }, + "verb:show_2d_board": { + "any": { + "count": 2, + "lastAt": 1788456656, + "p50": 26.6, + "p90": 34.9 + } + }, + "verb:show_3d_board": { + "any": { + "count": 6, + "lastAt": 1788456760, + "p50": 10.2, + "p90": 19.6 + } + }, + "verb:signin": { + "any": { + "count": 1, + "lastAt": 1788899909, + "p50": 56.1, + "p90": 56.1 + } + }, + "verb:start": { + "any": { + "count": 7, + "lastAt": 1791230617, + "p50": 57.4, + "p90": 64.9 + } + }, + "verb:status": { + "any": { + "count": 2, + "lastAt": 1788194217, + "p50": 0.8, + "p90": 1.0 + } + }, + "verb:stop": { + "any": { + "count": 1, + "lastAt": 1787831926, + "p50": 19.7, + "p90": 19.7 + } + }, + "verb:window_info": { + "any": { + "count": 10, + "lastAt": 1788899841, + "p50": 7.2, + "p90": 10.9 + } + } + }, + "timingsSentence": "on this machine Fusion starts in cold 41s, warm 0s (measured)", + "title": "Untitled - Autodesk Fusion " + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0064-fusion_addin_status.json b/docs/mechanical-verification/cp8/ordinary/calls/0064-fusion_addin_status.json new file mode 100644 index 0000000..12eaa48 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0064-fusion_addin_status.json @@ -0,0 +1,32 @@ +{ + "target": "adom_drew2", + "verb": "fusion_addin_status", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234267.2606626, + "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 \"addinStale\": false,\n \"addinVersion\": \"1.12.0-dev.8\",\n \"busy\": false,\n \"durationMs\": 59,\n \"error\": \"\",\n \"expectedAddinVersion\": \"1.12.0-dev.8\",\n \"output\": \"{\\\"busy\\\":false,\\\"version\\\":\\\"1.12.0-dev.8\\\",\\\"pyThreads\\\":4,\\\"addinVersion\\\":\\\"1.12.0-dev.8\\\",\\\"expectedAddinVersion\\\":\\\"1.12.0-dev.8\\\",\\\"addinStale\\\":false}\",\n \"pyThreads\": 4,\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"version\": \"1.12.0-dev.8\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234267.3255215, + "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.", + "addinStale": false, + "addinVersion": "1.12.0-dev.8", + "busy": false, + "durationMs": 59, + "error": "", + "expectedAddinVersion": "1.12.0-dev.8", + "output": "{\"busy\":false,\"version\":\"1.12.0-dev.8\",\"pyThreads\":4,\"addinVersion\":\"1.12.0-dev.8\",\"expectedAddinVersion\":\"1.12.0-dev.8\",\"addinStale\":false}", + "pyThreads": 4, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60, + "version": "1.12.0-dev.8" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0065-bridge_list.json b/docs/mechanical-verification/cp8/ordinary/calls/0065-bridge_list.json new file mode 100644 index 0000000..501ff9c --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0065-bridge_list.json @@ -0,0 +1,1455 @@ +{ + "target": "adom_drew2", + "verb": "bridge_list", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234267.325979, + "mutating": false, + "stdout": "{\n \"_hint\": \"Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.\",\n \"_skillsHint\": \"For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).\",\n \"bridges\": [\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"CAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.\",\n \"devPinned\": true,\n \"displayName\": \"Autodesk Fusion 360\",\n \"docs\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe\",\n \"expectedImage\": \"adom-fusion-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"installSkill\": \"adom-wiki pkg install adom/fusion-bridge\",\n \"installedVersion\": \"1.12.0-dev.8\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791234267283,\n \"latest\": null,\n \"livePids\": [\n 42780\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/fusion360.log\",\n \"manifestSource\": null,\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"fusion360\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.\",\n \"supported\": true\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 50618,\n \"prewarm\": {\n \"assets\": [\n \"AdomBridge add-in sync\",\n \"PCB design-rules catalog cache\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:57Z\",\n \"elapsedMs\": 2344,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"fusion_prewarm\",\n \"version\": \"1.12.0-dev.5\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"fusion_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T06:00:00Z\",\n \"runningImage\": \"adom-fusion-bridge.exe\",\n \"runningVersion\": \"1.12.0-dev.5\",\n \"skillPkg\": \"adom/fusion-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"spawn\": {\n \"entrypoint\": \"adom-fusion-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 50618\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/fusion360\",\n \"status\": \"running\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"tags\": [\n \"fusion360\",\n \"autodesk\",\n \"cad\",\n \"exports\",\n \"aps\",\n \"modeling\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"open\",\n \"seconds\": 150\n }\n ],\n \"verbs\": {\n \"aps_open\": 150,\n \"aps_recent\": 120,\n \"aps_search\": 120,\n \"build_library_3d\": 1800,\n \"capture_library_views\": 600,\n \"close_all_documents\": 90,\n \"demo\": 300,\n \"export_3mf\": 360,\n \"export_board_image\": 90,\n \"export_bom\": 90,\n \"export_cpl\": 90,\n \"export_dwg\": 150,\n \"export_dxf\": 150,\n \"export_f3d\": 360,\n \"export_fbx\": 360,\n \"export_gerbers\": 210,\n \"export_iges\": 360,\n \"export_obj\": 360,\n \"export_sat\": 360,\n \"export_skp\": 360,\n \"export_step\": 360,\n \"export_stl\": 360,\n \"export_usdz\": 360,\n \"generate_package\": 120,\n \"get_preferences\": 25,\n \"install_fusion\": 90,\n \"make_3d_package\": 200,\n \"prewarm\": 120,\n \"run_modeling_script\": 180,\n \"search_cloud_files\": 200,\n \"set_preference\": 40,\n \"signin\": 150,\n \"start\": 90,\n \"walk_cloud_tree\": 620\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 21196.07288627712,\n \"verbCount\": 167,\n \"verbPrefixes\": [\n \"fusion_\"\n ],\n \"verbs\": [\n \"fusion_account\",\n \"fusion_action_ledger\",\n \"fusion_activate_document\",\n \"fusion_addin_status\",\n \"fusion_alerts\",\n \"fusion_apply_fusion_update\",\n \"fusion_aps_browse\",\n \"fusion_aps_create_folder\",\n \"fusion_aps_download\",\n \"fusion_aps_file_info\",\n \"fusion_aps_forget_browser\",\n \"fusion_aps_get\",\n \"fusion_aps_get_browser\",\n \"fusion_aps_open\",\n \"fusion_aps_recent\",\n \"fusion_aps_search\",\n \"fusion_aps_set_browser\",\n \"fusion_aps_set_client_id\",\n \"fusion_aps_signin\",\n \"fusion_aps_status\",\n \"fusion_aps_upload\",\n \"fusion_aps_versions\",\n \"fusion_assembly_bom\",\n \"fusion_attach_3d_package\",\n \"fusion_bind_library_3d\",\n \"fusion_board_info\",\n \"fusion_board_stackup\",\n \"fusion_build_library_3d\",\n \"fusion_cancel_run\",\n \"fusion_capture_library_views\",\n \"fusion_check_recovery\",\n \"fusion_claim_seat\",\n \"fusion_cleanup_cloud_files\",\n \"fusion_close_all_documents\",\n \"fusion_close_document\",\n \"fusion_close_window\",\n \"fusion_create_cloud_folder\",\n \"fusion_create_library\",\n \"fusion_delete_cloud_file\",\n \"fusion_demo\",\n \"fusion_demo_progress\",\n \"fusion_describe\",\n \"fusion_detect_layers\",\n \"fusion_dismiss_blocking_dialogs\",\n \"fusion_document_info\",\n \"fusion_eagle_import_status\",\n \"fusion_electron_pan\",\n \"fusion_electron_run\",\n \"fusion_electron_select\",\n \"fusion_electron_zoom\",\n \"fusion_electronics_query\",\n \"fusion_execute_text_command\",\n \"fusion_export_3mf\",\n \"fusion_export_board_image\",\n \"fusion_export_bom\",\n \"fusion_export_cloud_file\",\n \"fusion_export_cpl\",\n \"fusion_export_dwg\",\n \"fusion_export_dxf\",\n \"fusion_export_eagle_source\",\n \"fusion_export_f3d\",\n \"fusion_export_fbx\",\n \"fusion_export_gerbers\",\n \"fusion_export_iges\",\n \"fusion_export_lbr\",\n \"fusion_export_obj\",\n \"fusion_export_optimized_glb\",\n \"fusion_export_sat\",\n \"fusion_export_skp\",\n \"fusion_export_source\",\n \"fusion_export_step\",\n \"fusion_export_stl\",\n \"fusion_export_usdz\",\n \"fusion_fetch_optimized_glb\",\n \"fusion_generate_package\",\n \"fusion_get_app_state\",\n \"fusion_get_design_info\",\n \"fusion_get_parameters\",\n \"fusion_get_preferences\",\n \"fusion_import_electronics\",\n \"fusion_import_step\",\n \"fusion_inspect_bodies\",\n \"fusion_install_fusion\",\n \"fusion_install_library_bundle\",\n \"fusion_interactive\",\n \"fusion_kill\",\n \"fusion_library_manager\",\n \"fusion_library_parts\",\n \"fusion_list_cloud_files\",\n \"fusion_list_cloud_projects\",\n \"fusion_list_text_commands\",\n \"fusion_live_feed\",\n \"fusion_make_3d_package\",\n \"fusion_make_showcase_project\",\n \"fusion_make_test_project\",\n \"fusion_managed_library_create\",\n \"fusion_managed_library_link\",\n \"fusion_managed_library_pull\",\n \"fusion_managed_library_push\",\n \"fusion_managed_library_unlink\",\n \"fusion_mcp_call\",\n \"fusion_mcp_enable\",\n \"fusion_mcp_resources\",\n \"fusion_mcp_status\",\n \"fusion_mcp_tools\",\n \"fusion_mech_capabilities\",\n \"fusion_mech_operation_status\",\n \"fusion_mechanical\",\n \"fusion_narrate\",\n \"fusion_new_electronics_from_eagle\",\n \"fusion_notify_owner\",\n \"fusion_open_board\",\n \"fusion_open_by_urn\",\n \"fusion_open_by_urn_note\",\n \"fusion_open_cloud_file\",\n \"fusion_open_design\",\n \"fusion_open_electronics\",\n \"fusion_open_lbr\",\n \"fusion_open_schematic\",\n \"fusion_physical_properties\",\n \"fusion_plan_library_import\",\n \"fusion_plan_route\",\n \"fusion_preflight_lbr\",\n \"fusion_prefs_close\",\n \"fusion_prefs_open\",\n \"fusion_prewarm\",\n \"fusion_prove_result\",\n \"fusion_readiness\",\n \"fusion_release_seat\",\n \"fusion_reset_workspace\",\n \"fusion_resolve_seat_dialog\",\n \"fusion_restart_for_addin\",\n \"fusion_route_net\",\n \"fusion_routing_drc\",\n \"fusion_routing_state\",\n \"fusion_run_modeling_script\",\n \"fusion_save_to_cloud\",\n \"fusion_schematic\",\n \"fusion_screenshot_fusion\",\n \"fusion_search_cloud_files\",\n \"fusion_set_auto_update\",\n \"fusion_set_design_rules\",\n \"fusion_set_driving_badge\",\n \"fusion_set_parameter\",\n \"fusion_set_preference\",\n \"fusion_set_seat_takeover\",\n \"fusion_set_window_sizing\",\n \"fusion_show_2d_board\",\n \"fusion_show_3d_board\",\n \"fusion_show_3d_package\",\n \"fusion_show_attributes\",\n \"fusion_show_footprint\",\n \"fusion_show_library\",\n \"fusion_show_project\",\n \"fusion_show_schematic\",\n \"fusion_show_symbol\",\n \"fusion_signin\",\n \"fusion_signin_2fa\",\n \"fusion_start\",\n \"fusion_state\",\n \"fusion_stop\",\n \"fusion_take_screenshot\",\n \"fusion_uninstall\",\n \"fusion_verb_times\",\n \"fusion_view\",\n \"fusion_walk_cloud_tree\",\n \"fusion_web_signin\"\n ],\n \"version\": \"1.12.0-dev.8\",\n \"versionDrift\": true,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"developer-tools\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.\",\n \"devPinned\": false,\n \"displayName\": \"Hydrogen Desktop\",\n \"docs\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"entryMismatch\": false,\n \"entrypoint\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/\",\n \"expectedImage\": null,\n \"heroAvailable\": false,\n \"heroDocs\": \"https://wiki.adom.inc/adom/hydrogen-desktop\",\n \"homepage\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"installPath\": \"\\\\\\\\?\\\\C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Adom Bridge\\\\bridges\\\\hd\",\n \"installSkill\": \"adom-wiki pkg install adom/adom-desktop\",\n \"installedVersion\": \"1.0.0\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": null,\n \"languages\": [],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 0,\n \"latest\": null,\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/hd.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": null,\n \"manifestUrlFollowed\": null,\n \"name\": \"hd\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"HD currently ships Windows-only; Linux variant in scope for HD's future releases.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"HD currently ships Windows-only.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": null,\n \"prewarm\": null,\n \"releasedAt\": \"2026-06-30T13:13:22Z\",\n \"runningImage\": null,\n \"runningVersion\": null,\n \"skillPkg\": \"adom/adom-desktop\",\n \"source\": \"bundled\",\n \"sourceDir\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd\",\n \"spawn\": {\n \"entrypoint\": \"\",\n \"instanceCount\": null,\n \"kind\": \"external-http\",\n \"manifestPort\": 47084,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": null\n },\n \"spawnKind\": \"external-http\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/hd\",\n \"status\": \"stopped\",\n \"statusVerb\": null,\n \"tags\": [\n \"hydrogen-desktop\",\n \"control-api\",\n \"http\",\n \"lifecycle\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 0.0,\n \"verbCount\": 11,\n \"verbPrefixes\": [],\n \"verbs\": [\n \"hd_api\",\n \"hd_status\",\n \"hd_launch\",\n \"hd_stop\",\n \"hd_restart\",\n \"hd_log\",\n \"hd_screenshot\",\n \"hd_shot\",\n \"hd_open_url\",\n \"hd_browser_profiles\",\n \"hd_ship\"\n ],\n \"version\": \"1.0.0\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"EDA\",\n \"depsInstallingSec\": null,\n \"description\": \"Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.\",\n \"devPinned\": false,\n \"displayName\": \"KiCad EDA\",\n \"docs\": \"https://wiki.adom.inc/adom/kicad-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe\",\n \"expectedImage\": \"kicad-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"installSkill\": \"adom-wiki pkg install adom/kicad-bridge\",\n \"installedVersion\": \"1.0.55\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\",\n \"PowerShell\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790956354547,\n \"latest\": \"1.0.55\",\n \"livePids\": [\n 36872\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/kicad.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"kicad\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 60896,\n \"prewarm\": {\n \"assets\": [\n \"kicad-cli warm (detection)\",\n \"KiCad first-run config + setup wizard marked done\",\n \"KiCad's own taskbar shortcut identity\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:58Z\",\n \"elapsedMs\": 273,\n \"error\": null,\n \"ok\": false,\n \"verb\": \"kicad_prewarm\",\n \"version\": \"1.0.55\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"kicad_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T16:00:00Z\",\n \"runningImage\": \"kicad-bridge.exe\",\n \"runningVersion\": \"1.0.55\",\n \"skillPkg\": \"adom/kicad-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"spawn\": {\n \"entrypoint\": \"kicad-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 60896\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/kicad\",\n \"status\": \"running\",\n \"statusVerb\": \"kicad_status\",\n \"tags\": [\n \"pcb\",\n \"schematic\",\n \"open-source\",\n \"kicad-10\",\n \"kicad-11-ready\"\n ],\n \"timeouts\": {\n \"default\": 130,\n \"prefixes\": [],\n \"verbs\": {\n \"autoroute\": 900,\n \"demo\": 600,\n \"enable_software_opengl\": 240,\n \"export_gerber\": 210,\n \"export_molecule\": 420,\n \"export_pdf\": 180,\n \"export_step\": 300,\n \"export_svg\": 180,\n \"format_upgrade\": 180,\n \"freerouting\": 900,\n \"open_3d_viewer\": 300,\n \"prewarm\": 120,\n \"run_drc\": 300,\n \"run_erc\": 300,\n \"upgrade\": 900\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 1039.2883594890675,\n \"verbCount\": 119,\n \"verbPrefixes\": [\n \"kicad_\"\n ],\n \"verbs\": [\n \"kicad_describe\",\n \"kicad_status\",\n \"kicad_readiness\",\n \"kicad_list_versions\",\n \"kicad_diagnostics\",\n \"kicad_run_drc\",\n \"kicad_run_erc\",\n \"kicad_export_gerber\",\n \"kicad_export_pdf\",\n \"kicad_export_svg\",\n \"kicad_export_step\",\n \"kicad_export_bom_csv\",\n \"kicad_uninstall\",\n \"kicad_extract_netlist\",\n \"kicad_trace_net\",\n \"kicad_find_connections\",\n \"kicad_analyze_connections\",\n \"kicad_lint_board\",\n \"kicad_lint_schematic\",\n \"kicad_lint_library\",\n \"kicad_format_upgrade\",\n \"kicad_list_symbols\",\n \"kicad_list_footprints\",\n \"kicad_adom_library_status\",\n \"kicad_get_settings\",\n \"kicad_set_settings\",\n \"kicad_list_design_rules\",\n \"kicad_set_design_rules\",\n \"kicad_3d_viewer_settings\",\n \"kicad_taskbar_repair\",\n \"kicad_prewarm\",\n \"kicad_model_check\",\n \"kicad_pcm_list\",\n \"kicad_pcm_install\",\n \"kicad_pcm_uninstall\",\n \"kicad_pcm_add_repository\",\n \"kicad_pcm_remove_repository\",\n \"kicad_check_for_updates\",\n \"kicad_upgrade\",\n \"kicad_sch_place_symbol\",\n \"kicad_sch_wire\",\n \"kicad_sch_label\",\n \"kicad_sch_move\",\n \"kicad_sch_delete\",\n \"kicad_sch_set_property\",\n \"kicad_ipc_api\",\n \"kicad_export_molecule\",\n \"kicad_errors\",\n \"kicad_log_tail\",\n \"kicad_bridge_status\",\n \"kicad_bridge_call\",\n \"kicad_install_plugin\",\n \"kicad_plugin_diagnose\",\n \"kicad_install_library\",\n \"kicad_uninstall_library\",\n \"kicad_install_symbol\",\n \"kicad_install_footprint\",\n \"kicad_install_library_bundle\",\n \"kicad_adom_library_heal\",\n \"kicad_make_part_project\",\n \"kicad_export_part\",\n \"kicad_silk_fields_batch\",\n \"kicad_silk_graphics_batch\",\n \"kicad_text_bounds\",\n \"kicad_silk_text_batch\",\n \"kicad_routing_state\",\n \"kicad_route_net\",\n \"kicad_remove_route\",\n \"kicad_add_zone\",\n \"kicad_apply_zone_plan\",\n \"kicad_zone_state\",\n \"kicad_select_net\",\n \"kicad_select_clear\",\n \"kicad_remove_zone\",\n \"kicad_routing_validate\",\n \"kicad_board_pads\",\n \"kicad_add_track\",\n \"kicad_add_via\",\n \"kicad_route\",\n \"kicad_autoroute\",\n \"kicad_freerouting\",\n \"kicad_placement_state\",\n \"kicad_move_footprint\",\n \"kicad_placement_validate\",\n \"kicad_refresh_board_views\",\n \"kicad_launch\",\n \"kicad_open_board\",\n \"kicad_open_schematic\",\n \"kicad_open_symbol_editor\",\n \"kicad_open_footprint_editor\",\n \"kicad_menu_items\",\n \"kicad_3d_view\",\n \"kicad_open_3d_viewer\",\n \"kicad_open_editors\",\n \"kicad_close\",\n \"kicad_close_symbol_editor\",\n \"kicad_close_footprint_editor\",\n \"kicad_close_3d_viewer\",\n \"kicad_dismiss_dialogs\",\n \"kicad_window_info\",\n \"kicad_state\",\n \"kicad_screenshot_all\",\n \"kicad_send_key\",\n \"kicad_click\",\n \"kicad_fix_keyboard\",\n \"kicad_place_footprint\",\n \"kicad_enable_software_opengl\",\n \"kicad_rescan_libraries\",\n \"kicad_show_project\",\n \"kicad_show_symbol\",\n \"kicad_show_footprint\",\n \"kicad_show_3d_chip\",\n \"kicad_show_schematic\",\n \"kicad_show_2d_board\",\n \"kicad_show_3d_board\",\n \"kicad_show_library\",\n \"kicad_progress\",\n \"kicad_verb_times\",\n \"kicad_demo\"\n ],\n \"version\": \"1.0.55\",\n \"versionDrift\": false,\n \"watcher\": {\n \"configKey\": \"project_watch\",\n \"defaultGlobs\": [\n \"*.kicad_pcb\",\n \"*.kicad_sch\",\n \"*.kicad_pro\"\n ],\n \"description\": \"Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).\",\n \"displayName\": \"Project Watch\",\n \"supports\": true\n }\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.\",\n \"devPinned\": false,\n \"displayName\": \"Adom Native Browser\",\n \"docs\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js\",\n \"expectedImage\": \"node.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"installSkill\": \"adom-wiki pkg install adom/nb-bridge\",\n \"installedVersion\": \"0.16.33\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Node/JS\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791220671752,\n \"latest\": \"0.16.33\",\n \"livePids\": [\n 32228\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/native-browser.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"native-browser\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 51703,\n \"prewarm\": {\n \"assets\": [],\n \"lastRun\": {\n \"at\": \"2026-09-22T19:44:55Z\",\n \"elapsedMs\": 41,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"nbrowser_prewarm\",\n \"version\": \"0.16.33\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": null,\n \"verb\": \"nbrowser_prewarm\"\n },\n \"releasedAt\": \"2026-09-22T15:18:44Z\",\n \"runningImage\": \"node.exe\",\n \"runningVersion\": \"0.16.33\",\n \"skillPkg\": \"adom/nb-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"spawn\": {\n \"entrypoint\": \"server.js\",\n \"instanceCount\": 1,\n \"kind\": \"node\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 51703\n },\n \"spawnKind\": \"node\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/native-browser\",\n \"status\": \"running\",\n \"statusVerb\": \"nbrowser_status\",\n \"tags\": [\n \"nb\",\n \"nbe\",\n \"native-browser\",\n \"chrome\",\n \"edge\",\n \"nbrowser\",\n \"pup-parity\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"screenshot\",\n \"seconds\": 120\n },\n {\n \"prefix\": \"record\",\n \"seconds\": 120\n }\n ],\n \"verbs\": {\n \"fetch_url\": 120,\n \"input_dispatch\": 120,\n \"select\": 30,\n \"wait\": 125\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 918.3855333409408,\n \"verbCount\": 88,\n \"verbPrefixes\": [\n \"nbrowser_\"\n ],\n \"verbs\": [\n \"nbrowser_status\",\n \"nbrowser_readiness\",\n \"nbrowser_install_chrome\",\n \"nbrowser_prewarm\",\n \"nbrowser_chrome_status\",\n \"nbrowser_ping\",\n \"nbrowser_progress\",\n \"nbrowser_activity\",\n \"nbrowser_open_window\",\n \"nbrowser_close_window\",\n \"nbrowser_owned\",\n \"nbrowser_cleanup\",\n \"nbrowser_force_close\",\n \"nbrowser_switch_window\",\n \"nbrowser_list_windows\",\n \"nbrowser_window_state\",\n \"nbrowser_fullscreen\",\n \"nbrowser_login_state\",\n \"nbrowser_credentials\",\n \"nbrowser_profiles\",\n \"nbrowser_use_profile\",\n \"nbrowser_pin_session\",\n \"nbrowser_open_os_window\",\n \"nbrowser_os_windows\",\n \"nbrowser_wake_profile\",\n \"nbrowser_resolve_profiles\",\n \"nbrowser_whoami\",\n \"nbrowser_profile_block\",\n \"nbrowser_profile_unblock\",\n \"nbrowser_rescan\",\n \"nbrowser_resync_sessions\",\n \"nbrowser_open_tab\",\n \"nbrowser_close_tab\",\n \"nbrowser_switch_tab\",\n \"nbrowser_list_tabs\",\n \"nbrowser_navigate\",\n \"nbrowser_reload\",\n \"nbrowser_back\",\n \"nbrowser_forward\",\n \"nbrowser_wait\",\n \"nbrowser_wait_for\",\n \"nbrowser_keepalive\",\n \"nbrowser_screenshot\",\n \"nbrowser_screenshot_full_res\",\n \"nbrowser_eval\",\n \"nbrowser_evaluate\",\n \"nbrowser_input_dispatch\",\n \"nbrowser_scroll\",\n \"nbrowser_click\",\n \"nbrowser_select\",\n \"nbrowser_set_file_input\",\n \"nbrowser_set_date\",\n \"nbrowser_totp\",\n \"nbrowser_register_totp\",\n \"nbrowser_add_extension_origin\",\n \"nbrowser_type\",\n \"nbrowser_press_key\",\n \"nbrowser_fetch_url\",\n \"nbrowser_download_wait\",\n \"nbrowser_errors\",\n \"nbrowser_close\",\n \"nbrowser_record_start\",\n \"nbrowser_record_stop\",\n \"nbrowser_record_status\",\n \"nbrowser_record_list\",\n \"nbrowser_flash\",\n \"nbrowser_flash_stop\",\n \"nbrowser_apply_settings\",\n \"nbrowser_settings\",\n \"nbrowser_flash_mode\",\n \"nbrowser_taskbar\",\n \"nbrowser_describe\",\n \"nbrowser_handle_dialog\",\n \"nbrowser_state\",\n \"nbrowser_demo\",\n \"nbrowser_uninstall\",\n \"nbrowser_dev_reload\",\n \"nbrowser_clear_cookies\",\n \"nbrowser_caption\",\n \"nbrowser_focus\",\n \"nbrowser_hover\",\n \"nbrowser_double_click\",\n \"nbrowser_right_click\",\n \"nbrowser_login_form\",\n \"nbrowser_autologin\",\n \"nbrowser_cursor\",\n \"nbrowser_events\",\n \"nbrowser_download\"\n ],\n \"version\": \"0.16.33\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Manufacturing\",\n \"depsInstallingSec\": null,\n \"description\": \"The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.\",\n \"devPinned\": false,\n \"displayName\": \"Puma Bridge (Essemtec ePlace)\",\n \"docs\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe\",\n \"expectedImage\": \"puma-bridge-host.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"installSkill\": \"adom-wiki pkg install adom/puma-bridge\",\n \"installedVersion\": \"0.2.7\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790623763822,\n \"latest\": \"0.2.6\",\n \"livePids\": [\n 32008\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puma-bridge.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puma-bridge\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": true\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 64764,\n \"prewarm\": null,\n \"releasedAt\": \"2026-09-23T15:54:11Z\",\n \"runningImage\": \"puma-bridge-host.exe\",\n \"runningVersion\": \"0.2.7\",\n \"skillPkg\": \"adom/puma-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"spawn\": {\n \"entrypoint\": \"puma-bridge-host.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 64764\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puma-bridge\",\n \"status\": \"running\",\n \"statusVerb\": \"puma_write_status\",\n \"tags\": [\n \"smt\",\n \"essemtec\",\n \"puma\",\n \"eplace\",\n \"pick-and-place\",\n \"manufacturing\",\n \"factoryos\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 2.6949605519525632,\n \"verbCount\": 9,\n \"verbPrefixes\": [\n \"puma_\"\n ],\n \"verbs\": [\n \"puma_ping\",\n \"puma_state\",\n \"puma_get\",\n \"puma_feeders\",\n \"puma_dryrun\",\n \"puma_write\",\n \"puma_revert\",\n \"puma_write_status\",\n \"puma_describe\"\n ],\n \"version\": \"0.2.7\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.\",\n \"devPinned\": false,\n \"displayName\": \"Puppeteer (Chrome for Testing + Native)\",\n \"docs\": \"https://wiki.adom.inc/adom/pup-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe\",\n \"expectedImage\": \"adom-pup-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"installSkill\": \"adom-wiki pkg install adom/pup-bridge\",\n \"installedVersion\": \"2.0.697\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791212202067,\n \"latest\": \"2.0.697\",\n \"livePids\": [\n 68812\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puppeteer.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puppeteer\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"not yet\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 57134,\n \"prewarm\": {\n \"assets\": [\n \"chrome-for-testing\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T14:55:58Z\",\n \"elapsedMs\": 1409,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"pup_prewarm\",\n \"version\": \"2.0.697\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": 900,\n \"verb\": \"pup_prewarm\"\n },\n \"releasedAt\": \"2026-10-05T14:55:48Z\",\n \"runningImage\": \"adom-pup-bridge.exe\",\n \"runningVersion\": \"2.0.697\",\n \"skillPkg\": \"adom/pup-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"spawn\": {\n \"entrypoint\": \"adom-pup-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 8851,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 57134\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puppeteer\",\n \"status\": \"running\",\n \"statusVerb\": \"pup_readiness\",\n \"tags\": [\n \"puppeteer\",\n \"chrome\",\n \"headful\",\n \"recording\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"record\",\n \"seconds\": 90\n }\n ],\n \"verbs\": {\n \"credential_reveal\": 150,\n \"fill_card\": 150,\n \"open_window\": 150,\n \"prewarm\": 240,\n \"use\": 240\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 580.8665204932171,\n \"verbCount\": 97,\n \"verbPrefixes\": [\n \"pup_\",\n \"browser_\"\n ],\n \"verbs\": [\n \"pup_describe\",\n \"pup_readiness\",\n \"pup_prewarm\",\n \"pup_status\",\n \"pup_list_windows\",\n \"pup_my_windows\",\n \"pup_list_sessions\",\n \"pup_open_window\",\n \"pup_navigate\",\n \"pup_eval\",\n \"pup_evaluate\",\n \"pup_screenshot\",\n \"pup_close_window\",\n \"pup_close\",\n \"pup_close_all_windows\",\n \"pup_window_info\",\n \"pup_open_tab\",\n \"pup_list_tabs\",\n \"pup_switch_tab\",\n \"pup_close_tab\",\n \"pup_switch_window\",\n \"pup_click\",\n \"pup_select\",\n \"pup_hover\",\n \"pup_type\",\n \"pup_press_key\",\n \"pup_scroll\",\n \"pup_fill\",\n \"pup_wait\",\n \"pup_reload\",\n \"pup_back\",\n \"pup_forward\",\n \"pup_set_viewport\",\n \"pup_errors\",\n \"pup_dialog\",\n \"pup_input_dispatch\",\n \"pup_render_html\",\n \"pup_fetch_url\",\n \"pup_maximize\",\n \"pup_raise_os_window\",\n \"pup_focus_window\",\n \"pup_lower_os_window\",\n \"pup_alert_window\",\n \"pup_progress\",\n \"pup_configure\",\n \"pup_use\",\n \"pup_clear_cookies\",\n \"pup_clear_site_data\",\n \"pup_quit_idle_browsers\",\n \"pup_rescan\",\n \"pup_restart_browser\",\n \"pup_set_identity\",\n \"pup_audit_icons\",\n \"pup_dashboard\",\n \"pup_credentials\",\n \"credential_list\",\n \"credential_set\",\n \"credential_delete\",\n \"pup_login\",\n \"pup_google_accounts\",\n \"pup_google_signin\",\n \"pup_credential_reveal\",\n \"pup_card_set\",\n \"pup_cards\",\n \"pup_card_delete\",\n \"pup_fill_card\",\n \"pup_wiki_set_view\",\n \"pup_annotate\",\n \"pup_floaty_click\",\n \"pup_record_start\",\n \"pup_record_stop\",\n \"pup_record_status\",\n \"pup_record_list\",\n \"pup_recorder_open\",\n \"pup_recorder_close\",\n \"pup_screen_record_start\",\n \"pup_screen_record_stop\",\n \"pup_screen_record_status\",\n \"pup_screen_record_list\",\n \"pup_highfps_extend\",\n \"pup_screenshot_element\",\n \"pup_screenshot_full_res\",\n \"pup_download\",\n \"pup_launch\",\n \"pup_deps\",\n \"pup_install_toolbar\",\n \"pup_reap_profiles\",\n \"pup_cache_prune\",\n \"pup_sweep_identities\",\n \"pup_uninstall\",\n \"pup_move_to_workspace\",\n \"pup_assisted_click\",\n \"pup_import_scan\",\n \"pup_import_browser_logins\",\n \"pup_vault_sync\",\n \"pup_vault_export\",\n \"pup_vault_import\"\n ],\n \"version\": \"2.0.697\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"MCAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.\",\n \"devPinned\": false,\n \"displayName\": \"SOLIDWORKS\",\n \"docs\": \"https://wiki.adom.inc/adom/solidworks-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe\",\n \"expectedImage\": \"swx-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"installSkill\": \"adom-wiki pkg install adom/solidworks-bridge\",\n \"installedVersion\": \"0.9.21\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 0,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791224978746,\n \"latest\": \"0.9.19\",\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/solidworks.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"solidworks\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 49861,\n \"prewarm\": null,\n \"releasedAt\": \"2026-10-05T18:49:46Z\",\n \"runningImage\": null,\n \"runningVersion\": \"0.9.19\",\n \"skillPkg\": \"adom/solidworks-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"spawn\": {\n \"entrypoint\": \"swx-bridge.exe\",\n \"instanceCount\": 0,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 49861\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/solidworks\",\n \"status\": \"running\",\n \"statusVerb\": \"swx_status\",\n \"tags\": [\n \"solidworks\",\n \"mcad\",\n \"cad\",\n \"bom\",\n \"step\",\n \"mass-properties\",\n \"modeling\",\n \"fusion-parity\"\n ],\n \"timeouts\": {\n \"default\": 120,\n \"prefixes\": [],\n \"verbs\": {\n \"action_ledger\": 20,\n \"activate_document\": 180,\n \"bom\": 300,\n \"check_recovery\": 180,\n \"close_all_documents\": 240,\n \"close_all_safely\": 600,\n \"close_doc\": 180,\n \"close_import_temps\": 600,\n \"close_window\": 120,\n \"cloud_status\": 90,\n \"design_info\": 180,\n \"dismiss_blocking_dialogs\": 180,\n \"document_info\": 120,\n \"export\": 300,\n \"export_3mf\": 300,\n \"export_dwg\": 300,\n \"export_dxf\": 300,\n \"export_glb\": 300,\n \"export_iges\": 300,\n \"export_parasolid\": 300,\n \"export_pdf\": 300,\n \"export_sat\": 300,\n \"export_step\": 300,\n \"export_stl\": 300,\n \"find_files\": 180,\n \"get_app_state\": 90,\n \"get_parameters\": 240,\n \"get_preferences\": 90,\n \"import\": 420,\n \"inspect_bodies\": 180,\n \"interference\": 600,\n \"kill\": 240,\n \"new_document\": 180,\n \"open\": 300,\n \"pack_and_go\": 600,\n \"rebuild_check\": 300,\n \"render_image\": 600,\n \"reset_workspace\": 600,\n \"run_script\": 420,\n \"save_as\": 420,\n \"set_driving_badge\": 120,\n \"set_parameter\": 420,\n \"set_preference\": 90,\n \"show_assembly\": 600,\n \"show_drawing\": 600,\n \"show_part\": 600,\n \"shutdown\": 900,\n \"sign_in\": 240,\n \"start\": 300,\n \"state\": 180,\n \"stop\": 420,\n \"verb_times\": 20,\n \"window_info\": 120\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 562.1051882523461,\n \"verbCount\": 69,\n \"verbPrefixes\": [\n \"swx_\"\n ],\n \"verbs\": [\n \"swx_action_ledger\",\n \"swx_activate_document\",\n \"swx_add_component\",\n \"swx_bom\",\n \"swx_check_recovery\",\n \"swx_close_all_documents\",\n \"swx_close_all_safely\",\n \"swx_close_doc\",\n \"swx_close_import_temps\",\n \"swx_close_window\",\n \"swx_cloud_status\",\n \"swx_com_eval\",\n \"swx_describe\",\n \"swx_design_info\",\n \"swx_dismiss_blocking_dialogs\",\n \"swx_docs\",\n \"swx_document_info\",\n \"swx_export\",\n \"swx_export_3mf\",\n \"swx_export_dwg\",\n \"swx_export_dxf\",\n \"swx_export_glb\",\n \"swx_export_iges\",\n \"swx_export_parasolid\",\n \"swx_export_pdf\",\n \"swx_export_sat\",\n \"swx_export_step\",\n \"swx_export_stl\",\n \"swx_find_files\",\n \"swx_get_app_state\",\n \"swx_get_parameters\",\n \"swx_get_preferences\",\n \"swx_import\",\n \"swx_inspect_bodies\",\n \"swx_interference\",\n \"swx_kill\",\n \"swx_mass_properties\",\n \"swx_new_document\",\n \"swx_open\",\n \"swx_pack_and_go\",\n \"swx_progress\",\n \"swx_props_get\",\n \"swx_props_set\",\n \"swx_readiness\",\n \"swx_rebuild_check\",\n \"swx_recover_list\",\n \"swx_render_image\",\n \"swx_reset_workspace\",\n \"swx_run_macro\",\n \"swx_run_script\",\n \"swx_save\",\n \"swx_save_as\",\n \"swx_screenshot\",\n \"swx_set_driving_badge\",\n \"swx_set_parameter\",\n \"swx_set_preference\",\n \"swx_show_assembly\",\n \"swx_show_drawing\",\n \"swx_show_part\",\n \"swx_shutdown\",\n \"swx_sign_in\",\n \"swx_start\",\n \"swx_state\",\n \"swx_status\",\n \"swx_stop\",\n \"swx_uninstall\",\n \"swx_user_presence\",\n \"swx_verb_times\",\n \"swx_window_info\"\n ],\n \"version\": \"0.9.21\",\n \"versionDrift\": true,\n \"watcher\": null\n }\n ],\n \"current_os\": \"windows\",\n \"durationMs\": 15,\n \"error\": \"\",\n \"invalidCount\": 0,\n \"ok\": true,\n \"output\": \"\",\n \"schemaVersion\": 1,\n \"staleCheckedAt\": 1791215191,\n \"status\": \"ok\",\n \"success\": true,\n \"summary\": {\n \"bundled\": 1,\n \"cache\": 6,\n \"invalid\": 0,\n \"paused\": 0,\n \"third_party\": 0,\n \"total\": 7\n },\n \"timeoutSeconds\": 10\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234267.3489633, + "raw": { + "_hint": "Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.", + "_skillsHint": "For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).", + "bridges": [ + { + "author": "Adom Inc.", + "category": "CAD", + "depsInstallingSec": null, + "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", + "devPinned": true, + "displayName": "Autodesk Fusion 360", + "docs": "https://wiki.adom.inc/adom/fusion-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe", + "expectedImage": "adom-fusion-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/fusion-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "installSkill": "adom-wiki pkg install adom/fusion-bridge", + "installedVersion": "1.12.0-dev.8", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python" + ], + "lastSpawnError": null, + "lastUsedMs": 1791234267283, + "latest": null, + "livePids": [ + 42780 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/fusion360.log", + "manifestSource": null, + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json", + "manifestUrlFollowed": null, + "name": "fusion360", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.", + "supported": false + }, + "macos": { + "reason": "Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.", + "supported": true + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 50618, + "prewarm": { + "assets": [ + "AdomBridge add-in sync", + "PCB design-rules catalog cache" + ], + "lastRun": { + "at": "2026-10-05T15:41:57Z", + "elapsedMs": 2344, + "error": null, + "ok": true, + "verb": "fusion_prewarm", + "version": "1.12.0-dev.5" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "fusion_prewarm" + }, + "releasedAt": "2026-06-26T06:00:00Z", + "runningImage": "adom-fusion-bridge.exe", + "runningVersion": "1.12.0-dev.5", + "skillPkg": "adom/fusion-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "spawn": { + "entrypoint": "adom-fusion-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 50618 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/fusion360", + "status": "running", + "statusVerb": "fusion_get_app_state", + "tags": [ + "fusion360", + "autodesk", + "cad", + "exports", + "aps", + "modeling" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "open", + "seconds": 150 + } + ], + "verbs": { + "aps_open": 150, + "aps_recent": 120, + "aps_search": 120, + "build_library_3d": 1800, + "capture_library_views": 600, + "close_all_documents": 90, + "demo": 300, + "export_3mf": 360, + "export_board_image": 90, + "export_bom": 90, + "export_cpl": 90, + "export_dwg": 150, + "export_dxf": 150, + "export_f3d": 360, + "export_fbx": 360, + "export_gerbers": 210, + "export_iges": 360, + "export_obj": 360, + "export_sat": 360, + "export_skp": 360, + "export_step": 360, + "export_stl": 360, + "export_usdz": 360, + "generate_package": 120, + "get_preferences": 25, + "install_fusion": 90, + "make_3d_package": 200, + "prewarm": 120, + "run_modeling_script": 180, + "search_cloud_files": 200, + "set_preference": 40, + "signin": 150, + "start": 90, + "walk_cloud_tree": 620 + } + }, + "updateAvailable": false, + "usageScore": 21196.07288627712, + "verbCount": 167, + "verbPrefixes": [ + "fusion_" + ], + "verbs": [ + "fusion_account", + "fusion_action_ledger", + "fusion_activate_document", + "fusion_addin_status", + "fusion_alerts", + "fusion_apply_fusion_update", + "fusion_aps_browse", + "fusion_aps_create_folder", + "fusion_aps_download", + "fusion_aps_file_info", + "fusion_aps_forget_browser", + "fusion_aps_get", + "fusion_aps_get_browser", + "fusion_aps_open", + "fusion_aps_recent", + "fusion_aps_search", + "fusion_aps_set_browser", + "fusion_aps_set_client_id", + "fusion_aps_signin", + "fusion_aps_status", + "fusion_aps_upload", + "fusion_aps_versions", + "fusion_assembly_bom", + "fusion_attach_3d_package", + "fusion_bind_library_3d", + "fusion_board_info", + "fusion_board_stackup", + "fusion_build_library_3d", + "fusion_cancel_run", + "fusion_capture_library_views", + "fusion_check_recovery", + "fusion_claim_seat", + "fusion_cleanup_cloud_files", + "fusion_close_all_documents", + "fusion_close_document", + "fusion_close_window", + "fusion_create_cloud_folder", + "fusion_create_library", + "fusion_delete_cloud_file", + "fusion_demo", + "fusion_demo_progress", + "fusion_describe", + "fusion_detect_layers", + "fusion_dismiss_blocking_dialogs", + "fusion_document_info", + "fusion_eagle_import_status", + "fusion_electron_pan", + "fusion_electron_run", + "fusion_electron_select", + "fusion_electron_zoom", + "fusion_electronics_query", + "fusion_execute_text_command", + "fusion_export_3mf", + "fusion_export_board_image", + "fusion_export_bom", + "fusion_export_cloud_file", + "fusion_export_cpl", + "fusion_export_dwg", + "fusion_export_dxf", + "fusion_export_eagle_source", + "fusion_export_f3d", + "fusion_export_fbx", + "fusion_export_gerbers", + "fusion_export_iges", + "fusion_export_lbr", + "fusion_export_obj", + "fusion_export_optimized_glb", + "fusion_export_sat", + "fusion_export_skp", + "fusion_export_source", + "fusion_export_step", + "fusion_export_stl", + "fusion_export_usdz", + "fusion_fetch_optimized_glb", + "fusion_generate_package", + "fusion_get_app_state", + "fusion_get_design_info", + "fusion_get_parameters", + "fusion_get_preferences", + "fusion_import_electronics", + "fusion_import_step", + "fusion_inspect_bodies", + "fusion_install_fusion", + "fusion_install_library_bundle", + "fusion_interactive", + "fusion_kill", + "fusion_library_manager", + "fusion_library_parts", + "fusion_list_cloud_files", + "fusion_list_cloud_projects", + "fusion_list_text_commands", + "fusion_live_feed", + "fusion_make_3d_package", + "fusion_make_showcase_project", + "fusion_make_test_project", + "fusion_managed_library_create", + "fusion_managed_library_link", + "fusion_managed_library_pull", + "fusion_managed_library_push", + "fusion_managed_library_unlink", + "fusion_mcp_call", + "fusion_mcp_enable", + "fusion_mcp_resources", + "fusion_mcp_status", + "fusion_mcp_tools", + "fusion_mech_capabilities", + "fusion_mech_operation_status", + "fusion_mechanical", + "fusion_narrate", + "fusion_new_electronics_from_eagle", + "fusion_notify_owner", + "fusion_open_board", + "fusion_open_by_urn", + "fusion_open_by_urn_note", + "fusion_open_cloud_file", + "fusion_open_design", + "fusion_open_electronics", + "fusion_open_lbr", + "fusion_open_schematic", + "fusion_physical_properties", + "fusion_plan_library_import", + "fusion_plan_route", + "fusion_preflight_lbr", + "fusion_prefs_close", + "fusion_prefs_open", + "fusion_prewarm", + "fusion_prove_result", + "fusion_readiness", + "fusion_release_seat", + "fusion_reset_workspace", + "fusion_resolve_seat_dialog", + "fusion_restart_for_addin", + "fusion_route_net", + "fusion_routing_drc", + "fusion_routing_state", + "fusion_run_modeling_script", + "fusion_save_to_cloud", + "fusion_schematic", + "fusion_screenshot_fusion", + "fusion_search_cloud_files", + "fusion_set_auto_update", + "fusion_set_design_rules", + "fusion_set_driving_badge", + "fusion_set_parameter", + "fusion_set_preference", + "fusion_set_seat_takeover", + "fusion_set_window_sizing", + "fusion_show_2d_board", + "fusion_show_3d_board", + "fusion_show_3d_package", + "fusion_show_attributes", + "fusion_show_footprint", + "fusion_show_library", + "fusion_show_project", + "fusion_show_schematic", + "fusion_show_symbol", + "fusion_signin", + "fusion_signin_2fa", + "fusion_start", + "fusion_state", + "fusion_stop", + "fusion_take_screenshot", + "fusion_uninstall", + "fusion_verb_times", + "fusion_view", + "fusion_walk_cloud_tree", + "fusion_web_signin" + ], + "version": "1.12.0-dev.8", + "versionDrift": true, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "developer-tools", + "depsInstallingSec": null, + "description": "Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.", + "devPinned": false, + "displayName": "Hydrogen Desktop", + "docs": "https://wiki.adom.inc/adom/adom-desktop", + "entryMismatch": false, + "entrypoint": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/", + "expectedImage": null, + "heroAvailable": false, + "heroDocs": "https://wiki.adom.inc/adom/hydrogen-desktop", + "homepage": "https://wiki.adom.inc/adom/adom-desktop", + "installPath": "\\\\?\\C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges\\hd", + "installSkill": "adom-wiki pkg install adom/adom-desktop", + "installedVersion": "1.0.0", + "installedVersionSource": "cache", + "instanceCount": null, + "languages": [], + "lastSpawnError": null, + "lastUsedMs": 0, + "latest": null, + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/hd.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": null, + "manifestUrlFollowed": null, + "name": "hd", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "HD currently ships Windows-only; Linux variant in scope for HD's future releases.", + "supported": false + }, + "macos": { + "reason": "HD currently ships Windows-only.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": null, + "prewarm": null, + "releasedAt": "2026-06-30T13:13:22Z", + "runningImage": null, + "runningVersion": null, + "skillPkg": "adom/adom-desktop", + "source": "bundled", + "sourceDir": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd", + "spawn": { + "entrypoint": "", + "instanceCount": null, + "kind": "external-http", + "manifestPort": 47084, + "persistent": false, + "portBlocked": null, + "runtimePort": null + }, + "spawnKind": "external-http", + "stableUrl": "http://127.0.0.1:24680/open/hd", + "status": "stopped", + "statusVerb": null, + "tags": [ + "hydrogen-desktop", + "control-api", + "http", + "lifecycle" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 0.0, + "verbCount": 11, + "verbPrefixes": [], + "verbs": [ + "hd_api", + "hd_status", + "hd_launch", + "hd_stop", + "hd_restart", + "hd_log", + "hd_screenshot", + "hd_shot", + "hd_open_url", + "hd_browser_profiles", + "hd_ship" + ], + "version": "1.0.0", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "EDA", + "depsInstallingSec": null, + "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", + "devPinned": false, + "displayName": "KiCad EDA", + "docs": "https://wiki.adom.inc/adom/kicad-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe", + "expectedImage": "kicad-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "installSkill": "adom-wiki pkg install adom/kicad-bridge", + "installedVersion": "1.0.55", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python", + "PowerShell" + ], + "lastSpawnError": null, + "lastUsedMs": 1790956354547, + "latest": "1.0.55", + "livePids": [ + 36872 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/kicad.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json", + "manifestUrlFollowed": null, + "name": "kicad", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "", + "supported": false + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 60896, + "prewarm": { + "assets": [ + "kicad-cli warm (detection)", + "KiCad first-run config + setup wizard marked done", + "KiCad's own taskbar shortcut identity" + ], + "lastRun": { + "at": "2026-10-05T15:41:58Z", + "elapsedMs": 273, + "error": null, + "ok": false, + "verb": "kicad_prewarm", + "version": "1.0.55" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "kicad_prewarm" + }, + "releasedAt": "2026-06-26T16:00:00Z", + "runningImage": "kicad-bridge.exe", + "runningVersion": "1.0.55", + "skillPkg": "adom/kicad-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "spawn": { + "entrypoint": "kicad-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 60896 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/kicad", + "status": "running", + "statusVerb": "kicad_status", + "tags": [ + "pcb", + "schematic", + "open-source", + "kicad-10", + "kicad-11-ready" + ], + "timeouts": { + "default": 130, + "prefixes": [], + "verbs": { + "autoroute": 900, + "demo": 600, + "enable_software_opengl": 240, + "export_gerber": 210, + "export_molecule": 420, + "export_pdf": 180, + "export_step": 300, + "export_svg": 180, + "format_upgrade": 180, + "freerouting": 900, + "open_3d_viewer": 300, + "prewarm": 120, + "run_drc": 300, + "run_erc": 300, + "upgrade": 900 + } + }, + "updateAvailable": false, + "usageScore": 1039.2883594890675, + "verbCount": 119, + "verbPrefixes": [ + "kicad_" + ], + "verbs": [ + "kicad_describe", + "kicad_status", + "kicad_readiness", + "kicad_list_versions", + "kicad_diagnostics", + "kicad_run_drc", + "kicad_run_erc", + "kicad_export_gerber", + "kicad_export_pdf", + "kicad_export_svg", + "kicad_export_step", + "kicad_export_bom_csv", + "kicad_uninstall", + "kicad_extract_netlist", + "kicad_trace_net", + "kicad_find_connections", + "kicad_analyze_connections", + "kicad_lint_board", + "kicad_lint_schematic", + "kicad_lint_library", + "kicad_format_upgrade", + "kicad_list_symbols", + "kicad_list_footprints", + "kicad_adom_library_status", + "kicad_get_settings", + "kicad_set_settings", + "kicad_list_design_rules", + "kicad_set_design_rules", + "kicad_3d_viewer_settings", + "kicad_taskbar_repair", + "kicad_prewarm", + "kicad_model_check", + "kicad_pcm_list", + "kicad_pcm_install", + "kicad_pcm_uninstall", + "kicad_pcm_add_repository", + "kicad_pcm_remove_repository", + "kicad_check_for_updates", + "kicad_upgrade", + "kicad_sch_place_symbol", + "kicad_sch_wire", + "kicad_sch_label", + "kicad_sch_move", + "kicad_sch_delete", + "kicad_sch_set_property", + "kicad_ipc_api", + "kicad_export_molecule", + "kicad_errors", + "kicad_log_tail", + "kicad_bridge_status", + "kicad_bridge_call", + "kicad_install_plugin", + "kicad_plugin_diagnose", + "kicad_install_library", + "kicad_uninstall_library", + "kicad_install_symbol", + "kicad_install_footprint", + "kicad_install_library_bundle", + "kicad_adom_library_heal", + "kicad_make_part_project", + "kicad_export_part", + "kicad_silk_fields_batch", + "kicad_silk_graphics_batch", + "kicad_text_bounds", + "kicad_silk_text_batch", + "kicad_routing_state", + "kicad_route_net", + "kicad_remove_route", + "kicad_add_zone", + "kicad_apply_zone_plan", + "kicad_zone_state", + "kicad_select_net", + "kicad_select_clear", + "kicad_remove_zone", + "kicad_routing_validate", + "kicad_board_pads", + "kicad_add_track", + "kicad_add_via", + "kicad_route", + "kicad_autoroute", + "kicad_freerouting", + "kicad_placement_state", + "kicad_move_footprint", + "kicad_placement_validate", + "kicad_refresh_board_views", + "kicad_launch", + "kicad_open_board", + "kicad_open_schematic", + "kicad_open_symbol_editor", + "kicad_open_footprint_editor", + "kicad_menu_items", + "kicad_3d_view", + "kicad_open_3d_viewer", + "kicad_open_editors", + "kicad_close", + "kicad_close_symbol_editor", + "kicad_close_footprint_editor", + "kicad_close_3d_viewer", + "kicad_dismiss_dialogs", + "kicad_window_info", + "kicad_state", + "kicad_screenshot_all", + "kicad_send_key", + "kicad_click", + "kicad_fix_keyboard", + "kicad_place_footprint", + "kicad_enable_software_opengl", + "kicad_rescan_libraries", + "kicad_show_project", + "kicad_show_symbol", + "kicad_show_footprint", + "kicad_show_3d_chip", + "kicad_show_schematic", + "kicad_show_2d_board", + "kicad_show_3d_board", + "kicad_show_library", + "kicad_progress", + "kicad_verb_times", + "kicad_demo" + ], + "version": "1.0.55", + "versionDrift": false, + "watcher": { + "configKey": "project_watch", + "defaultGlobs": [ + "*.kicad_pcb", + "*.kicad_sch", + "*.kicad_pro" + ], + "description": "Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).", + "displayName": "Project Watch", + "supports": true + } + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.", + "devPinned": false, + "displayName": "Adom Native Browser", + "docs": "https://wiki.adom.inc/adom/nb-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js", + "expectedImage": "node.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/nb-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "installSkill": "adom-wiki pkg install adom/nb-bridge", + "installedVersion": "0.16.33", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Node/JS" + ], + "lastSpawnError": null, + "lastUsedMs": 1791220671752, + "latest": "0.16.33", + "livePids": [ + 32228 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/native-browser.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json", + "manifestUrlFollowed": null, + "name": "native-browser", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.", + "supported": false + }, + "macos": { + "reason": "Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 51703, + "prewarm": { + "assets": [], + "lastRun": { + "at": "2026-09-22T19:44:55Z", + "elapsedMs": 41, + "error": null, + "ok": true, + "verb": "nbrowser_prewarm", + "version": "0.16.33" + }, + "requiresHostApp": false, + "timeoutSeconds": null, + "verb": "nbrowser_prewarm" + }, + "releasedAt": "2026-09-22T15:18:44Z", + "runningImage": "node.exe", + "runningVersion": "0.16.33", + "skillPkg": "adom/nb-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "spawn": { + "entrypoint": "server.js", + "instanceCount": 1, + "kind": "node", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 51703 + }, + "spawnKind": "node", + "stableUrl": "http://127.0.0.1:24680/open/native-browser", + "status": "running", + "statusVerb": "nbrowser_status", + "tags": [ + "nb", + "nbe", + "native-browser", + "chrome", + "edge", + "nbrowser", + "pup-parity" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "screenshot", + "seconds": 120 + }, + { + "prefix": "record", + "seconds": 120 + } + ], + "verbs": { + "fetch_url": 120, + "input_dispatch": 120, + "select": 30, + "wait": 125 + } + }, + "updateAvailable": false, + "usageScore": 918.3855333409408, + "verbCount": 88, + "verbPrefixes": [ + "nbrowser_" + ], + "verbs": [ + "nbrowser_status", + "nbrowser_readiness", + "nbrowser_install_chrome", + "nbrowser_prewarm", + "nbrowser_chrome_status", + "nbrowser_ping", + "nbrowser_progress", + "nbrowser_activity", + "nbrowser_open_window", + "nbrowser_close_window", + "nbrowser_owned", + "nbrowser_cleanup", + "nbrowser_force_close", + "nbrowser_switch_window", + "nbrowser_list_windows", + "nbrowser_window_state", + "nbrowser_fullscreen", + "nbrowser_login_state", + "nbrowser_credentials", + "nbrowser_profiles", + "nbrowser_use_profile", + "nbrowser_pin_session", + "nbrowser_open_os_window", + "nbrowser_os_windows", + "nbrowser_wake_profile", + "nbrowser_resolve_profiles", + "nbrowser_whoami", + "nbrowser_profile_block", + "nbrowser_profile_unblock", + "nbrowser_rescan", + "nbrowser_resync_sessions", + "nbrowser_open_tab", + "nbrowser_close_tab", + "nbrowser_switch_tab", + "nbrowser_list_tabs", + "nbrowser_navigate", + "nbrowser_reload", + "nbrowser_back", + "nbrowser_forward", + "nbrowser_wait", + "nbrowser_wait_for", + "nbrowser_keepalive", + "nbrowser_screenshot", + "nbrowser_screenshot_full_res", + "nbrowser_eval", + "nbrowser_evaluate", + "nbrowser_input_dispatch", + "nbrowser_scroll", + "nbrowser_click", + "nbrowser_select", + "nbrowser_set_file_input", + "nbrowser_set_date", + "nbrowser_totp", + "nbrowser_register_totp", + "nbrowser_add_extension_origin", + "nbrowser_type", + "nbrowser_press_key", + "nbrowser_fetch_url", + "nbrowser_download_wait", + "nbrowser_errors", + "nbrowser_close", + "nbrowser_record_start", + "nbrowser_record_stop", + "nbrowser_record_status", + "nbrowser_record_list", + "nbrowser_flash", + "nbrowser_flash_stop", + "nbrowser_apply_settings", + "nbrowser_settings", + "nbrowser_flash_mode", + "nbrowser_taskbar", + "nbrowser_describe", + "nbrowser_handle_dialog", + "nbrowser_state", + "nbrowser_demo", + "nbrowser_uninstall", + "nbrowser_dev_reload", + "nbrowser_clear_cookies", + "nbrowser_caption", + "nbrowser_focus", + "nbrowser_hover", + "nbrowser_double_click", + "nbrowser_right_click", + "nbrowser_login_form", + "nbrowser_autologin", + "nbrowser_cursor", + "nbrowser_events", + "nbrowser_download" + ], + "version": "0.16.33", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Manufacturing", + "depsInstallingSec": null, + "description": "The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.", + "devPinned": false, + "displayName": "Puma Bridge (Essemtec ePlace)", + "docs": "https://wiki.adom.inc/adom/puma-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe", + "expectedImage": "puma-bridge-host.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/puma-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "installSkill": "adom-wiki pkg install adom/puma-bridge", + "installedVersion": "0.2.7", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1790623763822, + "latest": "0.2.6", + "livePids": [ + 32008 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puma-bridge.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json", + "manifestUrlFollowed": null, + "name": "puma-bridge", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "", + "supported": true + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 64764, + "prewarm": null, + "releasedAt": "2026-09-23T15:54:11Z", + "runningImage": "puma-bridge-host.exe", + "runningVersion": "0.2.7", + "skillPkg": "adom/puma-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "spawn": { + "entrypoint": "puma-bridge-host.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 64764 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puma-bridge", + "status": "running", + "statusVerb": "puma_write_status", + "tags": [ + "smt", + "essemtec", + "puma", + "eplace", + "pick-and-place", + "manufacturing", + "factoryos" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 2.6949605519525632, + "verbCount": 9, + "verbPrefixes": [ + "puma_" + ], + "verbs": [ + "puma_ping", + "puma_state", + "puma_get", + "puma_feeders", + "puma_dryrun", + "puma_write", + "puma_revert", + "puma_write_status", + "puma_describe" + ], + "version": "0.2.7", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.", + "devPinned": false, + "displayName": "Puppeteer (Chrome for Testing + Native)", + "docs": "https://wiki.adom.inc/adom/pup-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe", + "expectedImage": "adom-pup-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "installSkill": "adom-wiki pkg install adom/pup-bridge", + "installedVersion": "2.0.697", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791212202067, + "latest": "2.0.697", + "livePids": [ + 68812 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puppeteer.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json", + "manifestUrlFollowed": null, + "name": "puppeteer", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "not yet", + "supported": false + }, + "macos": { + "reason": "The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 57134, + "prewarm": { + "assets": [ + "chrome-for-testing" + ], + "lastRun": { + "at": "2026-10-05T14:55:58Z", + "elapsedMs": 1409, + "error": null, + "ok": true, + "verb": "pup_prewarm", + "version": "2.0.697" + }, + "requiresHostApp": false, + "timeoutSeconds": 900, + "verb": "pup_prewarm" + }, + "releasedAt": "2026-10-05T14:55:48Z", + "runningImage": "adom-pup-bridge.exe", + "runningVersion": "2.0.697", + "skillPkg": "adom/pup-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "spawn": { + "entrypoint": "adom-pup-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 8851, + "persistent": true, + "portBlocked": null, + "runtimePort": 57134 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puppeteer", + "status": "running", + "statusVerb": "pup_readiness", + "tags": [ + "puppeteer", + "chrome", + "headful", + "recording" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "record", + "seconds": 90 + } + ], + "verbs": { + "credential_reveal": 150, + "fill_card": 150, + "open_window": 150, + "prewarm": 240, + "use": 240 + } + }, + "updateAvailable": false, + "usageScore": 580.8665204932171, + "verbCount": 97, + "verbPrefixes": [ + "pup_", + "browser_" + ], + "verbs": [ + "pup_describe", + "pup_readiness", + "pup_prewarm", + "pup_status", + "pup_list_windows", + "pup_my_windows", + "pup_list_sessions", + "pup_open_window", + "pup_navigate", + "pup_eval", + "pup_evaluate", + "pup_screenshot", + "pup_close_window", + "pup_close", + "pup_close_all_windows", + "pup_window_info", + "pup_open_tab", + "pup_list_tabs", + "pup_switch_tab", + "pup_close_tab", + "pup_switch_window", + "pup_click", + "pup_select", + "pup_hover", + "pup_type", + "pup_press_key", + "pup_scroll", + "pup_fill", + "pup_wait", + "pup_reload", + "pup_back", + "pup_forward", + "pup_set_viewport", + "pup_errors", + "pup_dialog", + "pup_input_dispatch", + "pup_render_html", + "pup_fetch_url", + "pup_maximize", + "pup_raise_os_window", + "pup_focus_window", + "pup_lower_os_window", + "pup_alert_window", + "pup_progress", + "pup_configure", + "pup_use", + "pup_clear_cookies", + "pup_clear_site_data", + "pup_quit_idle_browsers", + "pup_rescan", + "pup_restart_browser", + "pup_set_identity", + "pup_audit_icons", + "pup_dashboard", + "pup_credentials", + "credential_list", + "credential_set", + "credential_delete", + "pup_login", + "pup_google_accounts", + "pup_google_signin", + "pup_credential_reveal", + "pup_card_set", + "pup_cards", + "pup_card_delete", + "pup_fill_card", + "pup_wiki_set_view", + "pup_annotate", + "pup_floaty_click", + "pup_record_start", + "pup_record_stop", + "pup_record_status", + "pup_record_list", + "pup_recorder_open", + "pup_recorder_close", + "pup_screen_record_start", + "pup_screen_record_stop", + "pup_screen_record_status", + "pup_screen_record_list", + "pup_highfps_extend", + "pup_screenshot_element", + "pup_screenshot_full_res", + "pup_download", + "pup_launch", + "pup_deps", + "pup_install_toolbar", + "pup_reap_profiles", + "pup_cache_prune", + "pup_sweep_identities", + "pup_uninstall", + "pup_move_to_workspace", + "pup_assisted_click", + "pup_import_scan", + "pup_import_browser_logins", + "pup_vault_sync", + "pup_vault_export", + "pup_vault_import" + ], + "version": "2.0.697", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "MCAD", + "depsInstallingSec": null, + "description": "Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.", + "devPinned": false, + "displayName": "SOLIDWORKS", + "docs": "https://wiki.adom.inc/adom/solidworks-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe", + "expectedImage": "swx-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "installSkill": "adom-wiki pkg install adom/solidworks-bridge", + "installedVersion": "0.9.21", + "installedVersionSource": "cache", + "instanceCount": 0, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791224978746, + "latest": "0.9.19", + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/solidworks.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json", + "manifestUrlFollowed": null, + "name": "solidworks", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "macos": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 49861, + "prewarm": null, + "releasedAt": "2026-10-05T18:49:46Z", + "runningImage": null, + "runningVersion": "0.9.19", + "skillPkg": "adom/solidworks-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "spawn": { + "entrypoint": "swx-bridge.exe", + "instanceCount": 0, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 49861 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/solidworks", + "status": "running", + "statusVerb": "swx_status", + "tags": [ + "solidworks", + "mcad", + "cad", + "bom", + "step", + "mass-properties", + "modeling", + "fusion-parity" + ], + "timeouts": { + "default": 120, + "prefixes": [], + "verbs": { + "action_ledger": 20, + "activate_document": 180, + "bom": 300, + "check_recovery": 180, + "close_all_documents": 240, + "close_all_safely": 600, + "close_doc": 180, + "close_import_temps": 600, + "close_window": 120, + "cloud_status": 90, + "design_info": 180, + "dismiss_blocking_dialogs": 180, + "document_info": 120, + "export": 300, + "export_3mf": 300, + "export_dwg": 300, + "export_dxf": 300, + "export_glb": 300, + "export_iges": 300, + "export_parasolid": 300, + "export_pdf": 300, + "export_sat": 300, + "export_step": 300, + "export_stl": 300, + "find_files": 180, + "get_app_state": 90, + "get_parameters": 240, + "get_preferences": 90, + "import": 420, + "inspect_bodies": 180, + "interference": 600, + "kill": 240, + "new_document": 180, + "open": 300, + "pack_and_go": 600, + "rebuild_check": 300, + "render_image": 600, + "reset_workspace": 600, + "run_script": 420, + "save_as": 420, + "set_driving_badge": 120, + "set_parameter": 420, + "set_preference": 90, + "show_assembly": 600, + "show_drawing": 600, + "show_part": 600, + "shutdown": 900, + "sign_in": 240, + "start": 300, + "state": 180, + "stop": 420, + "verb_times": 20, + "window_info": 120 + } + }, + "updateAvailable": false, + "usageScore": 562.1051882523461, + "verbCount": 69, + "verbPrefixes": [ + "swx_" + ], + "verbs": [ + "swx_action_ledger", + "swx_activate_document", + "swx_add_component", + "swx_bom", + "swx_check_recovery", + "swx_close_all_documents", + "swx_close_all_safely", + "swx_close_doc", + "swx_close_import_temps", + "swx_close_window", + "swx_cloud_status", + "swx_com_eval", + "swx_describe", + "swx_design_info", + "swx_dismiss_blocking_dialogs", + "swx_docs", + "swx_document_info", + "swx_export", + "swx_export_3mf", + "swx_export_dwg", + "swx_export_dxf", + "swx_export_glb", + "swx_export_iges", + "swx_export_parasolid", + "swx_export_pdf", + "swx_export_sat", + "swx_export_step", + "swx_export_stl", + "swx_find_files", + "swx_get_app_state", + "swx_get_parameters", + "swx_get_preferences", + "swx_import", + "swx_inspect_bodies", + "swx_interference", + "swx_kill", + "swx_mass_properties", + "swx_new_document", + "swx_open", + "swx_pack_and_go", + "swx_progress", + "swx_props_get", + "swx_props_set", + "swx_readiness", + "swx_rebuild_check", + "swx_recover_list", + "swx_render_image", + "swx_reset_workspace", + "swx_run_macro", + "swx_run_script", + "swx_save", + "swx_save_as", + "swx_screenshot", + "swx_set_driving_badge", + "swx_set_parameter", + "swx_set_preference", + "swx_show_assembly", + "swx_show_drawing", + "swx_show_part", + "swx_shutdown", + "swx_sign_in", + "swx_start", + "swx_state", + "swx_status", + "swx_stop", + "swx_uninstall", + "swx_user_presence", + "swx_verb_times", + "swx_window_info" + ], + "version": "0.9.21", + "versionDrift": true, + "watcher": null + } + ], + "current_os": "windows", + "durationMs": 15, + "error": "", + "invalidCount": 0, + "ok": true, + "output": "", + "schemaVersion": 1, + "staleCheckedAt": 1791215191, + "status": "ok", + "success": true, + "summary": { + "bundled": 1, + "cache": 6, + "invalid": 0, + "paused": 0, + "third_party": 0, + "total": 7 + }, + "timeoutSeconds": 10 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/calls/0066-run_script.json b/docs/mechanical-verification/cp8/ordinary/calls/0066-run_script.json new file mode 100644 index 0000000..03ca89e --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/calls/0066-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKdHJ5IHsKICAkcmFscGhFeHBlY3RlZCA9IFtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRTdHJpbmcoW0NvbnZlcnRdOjpGcm9tQmFzZTY0U3RyaW5nKCdleUpvYjNOMElqb2dJa0ZFVDAxZlJGSkZWeklpTENBaWNHbGtJam9nTkRJM09EQXNJQ0p3YjNKMElqb2dOVEEyTVRnc0lDSmxlR1ZqZFhSaFlteGxVR0YwYUNJNklDSkRPbHhjVlhObGNuTmNYR1J5WlhkY1hFRndjRVJoZEdGY1hFeHZZMkZzWEZ4QlpHOXRJRUp5YVdSblpWeGNZbkpwWkdkbGN5MWpZV05vWlZ4Y1puVnphVzl1TXpZd1hGeGhaRzl0TFdaMWMybHZiaTFpY21sa1oyVXVaWGhsSWl3Z0ltbHRZV2RsSWpvZ0ltRmtiMjB0Wm5WemFXOXVMV0p5YVdSblpTNWxlR1VpZlE9PScpKSB8IENvbnZlcnRGcm9tLUpzb24KICAkcmFscGhQb3J0ID0gW2ludF0kcmFscGhFeHBlY3RlZC5wb3J0CiAgJHJhbHBoT3duZXIgPSBbaW50XSRyYWxwaEV4cGVjdGVkLnBpZAogIGlmIChbRW52aXJvbm1lbnRdOjpNYWNoaW5lTmFtZSAtaW5lIFtzdHJpbmddJHJhbHBoRXhwZWN0ZWQuaG9zdCkgeyB0aHJvdyAnTmF0aXZlIGhvc3QgaWRlbnRpdHkgZGlmZmVycycgfQogICRyYWxwaFByb2Nlc3MgPSBHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICgnUHJvY2Vzc0lkPScgKyAkcmFscGhPd25lcikKICBpZiAoLW5vdCAkcmFscGhQcm9jZXNzIC1vciAkcmFscGhQcm9jZXNzLk5hbWUgLWluZSBbc3RyaW5nXSRyYWxwaEV4cGVjdGVkLmltYWdlKSB7IHRocm93ICdJbnZlbnRvcnkgUElEL2ltYWdlIGlzIG5vdCB0aGUgbmF0aXZlIGJyaWRnZScgfQogIGlmIChbSU8uUGF0aF06OkdldEZ1bGxQYXRoKCRyYWxwaFByb2Nlc3MuRXhlY3V0YWJsZVBhdGgpIC1pbmUgW0lPLlBhdGhdOjpHZXRGdWxsUGF0aChbc3RyaW5nXSRyYWxwaEV4cGVjdGVkLmV4ZWN1dGFibGVQYXRoKSkgeyB0aHJvdyAnTmF0aXZlIGV4ZWN1dGFibGUgcGF0aCBkaWZmZXJzIGZyb20gaW52ZW50b3J5JyB9CiAgJHJhbHBoTGlzdGVuZXJzID0gQChHZXQtTmV0VENQQ29ubmVjdGlvbiAtU3RhdGUgTGlzdGVuIC1Mb2NhbFBvcnQgJHJhbHBoUG9ydCkKICBpZiAoJHJhbHBoTGlzdGVuZXJzLkNvdW50IC1lcSAwKSB7IHRocm93ICdEaXNjb3ZlcmVkIHBvcnQgaGFzIG5vIGxpc3RlbmVyJyB9CiAgZm9yZWFjaCAoJHJhbHBoTGlzdGVuZXIgaW4gJHJhbHBoTGlzdGVuZXJzKSB7CiAgICBpZiAoJHJhbHBoTGlzdGVuZXIuT3duaW5nUHJvY2VzcyAtbmUgJHJhbHBoT3duZXIgLW9yICRyYWxwaExpc3RlbmVyLkxvY2FsQWRkcmVzcyAtbm90aW4gQCgnMTI3LjAuMC4xJywnOjoxJykpIHsgdGhyb3cgJ0xpc3RlbmVyIGlzIG5vdCBvd25lZCBieSB0aGUgZXhwZWN0ZWQgbG9vcGJhY2sgYnJpZGdlJyB9CiAgfQogICRyYWxwaEhlYWx0aCA9IEludm9rZS1SZXN0TWV0aG9kIC1VcmkgKCdodHRwOi8vMTI3LjAuMC4xOicgKyAkcmFscGhQb3J0ICsgJy9oZWFsdGgnKSAtTWV0aG9kIEdldCAtVGltZW91dFNlYyA4CiAgJHJhbHBoQWdhaW4gPSBHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICgnUHJvY2Vzc0lkPScgKyAkcmFscGhPd25lcikKICBpZiAoLW5vdCAkcmFscGhBZ2FpbiAtb3IgJHJhbHBoQWdhaW4uQ3JlYXRpb25EYXRlIC1uZSAkcmFscGhQcm9jZXNzLkNyZWF0aW9uRGF0ZSAtb3IgJHJhbHBoQWdhaW4uRXhlY3V0YWJsZVBhdGggLWluZSAkcmFscGhQcm9jZXNzLkV4ZWN1dGFibGVQYXRoKSB7IHRocm93ICdOYXRpdmUgcHJvY2VzcyBjaGFuZ2VkIGR1cmluZyBoZWFsdGggb2JzZXJ2YXRpb24nIH0KICAkcmFscGhMaXN0ZW5lcnNBZnRlciA9IEAoR2V0LU5ldFRDUENvbm5lY3Rpb24gLVN0YXRlIExpc3RlbiAtTG9jYWxQb3J0ICRyYWxwaFBvcnQpCiAgaWYgKCRyYWxwaExpc3RlbmVyc0FmdGVyLkNvdW50IC1lcSAwKSB7IHRocm93ICdMaXN0ZW5lciBkaXNhcHBlYXJlZCBkdXJpbmcgaGVhbHRoIG9ic2VydmF0aW9uJyB9CiAgZm9yZWFjaCAoJHJhbHBoTGlzdGVuZXIgaW4gJHJhbHBoTGlzdGVuZXJzQWZ0ZXIpIHsKICAgIGlmICgkcmFscGhMaXN0ZW5lci5Pd25pbmdQcm9jZXNzIC1uZSAkcmFscGhPd25lciAtb3IgJHJhbHBoTGlzdGVuZXIuTG9jYWxBZGRyZXNzIC1ub3RpbiBAKCcxMjcuMC4wLjEnLCc6OjEnKSkgeyB0aHJvdyAnTGlzdGVuZXIgY2hhbmdlZCBkdXJpbmcgaGVhbHRoIG9ic2VydmF0aW9uJyB9CiAgfQogIEB7IGhvc3Q9W0Vudmlyb25tZW50XTo6TWFjaGluZU5hbWU7IHBpZD0kcmFscGhPd25lcjsgcG9ydD0kcmFscGhQb3J0OyBleGVjdXRhYmxlUGF0aD0kcmFscGhQcm9jZXNzLkV4ZWN1dGFibGVQYXRoOwogICAgIGltYWdlPSRyYWxwaFByb2Nlc3MuTmFtZTsgcHJvY2Vzc0NyZWF0ZWRVdGM9JHJhbHBoUHJvY2Vzcy5DcmVhdGlvbkRhdGUuVG9Vbml2ZXJzYWxUaW1lKCkuVG9TdHJpbmcoJ28nKTsKICAgICBsaXN0ZW5lckFkZHJlc3Nlcz1AKCRyYWxwaExpc3RlbmVyc0FmdGVyIHwgRm9yRWFjaC1PYmplY3QgeyAkXy5Mb2NhbEFkZHJlc3MgfSk7CiAgICAgc3RhYmxlPSR0cnVlOyBoZWFsdGg9JHJhbHBoSGVhbHRoIH0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggMTIgLUNvbXByZXNzCiAgZXhpdCAwCn0gY2F0Y2ggewogIFtDb25zb2xlXTo6RXJyb3IuV3JpdGVMaW5lKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKQogIGV4aXQgMQp9Cg==", + "timeoutSeconds": 30, + "reason": "Read the discovered Fusion bridge process and its loopback health version without changing runtime state" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKdHJ5IHsKICAkcmFscGhFeHBlY3RlZCA9IFtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRTdHJpbmcoW0NvbnZlcnRdOjpGcm9tQmFzZTY0U3RyaW5nKCdleUpvYjNOMElqb2dJa0ZFVDAxZlJGSkZWeklpTENBaWNHbGtJam9nTkRJM09EQXNJQ0p3YjNKMElqb2dOVEEyTVRnc0lDSmxlR1ZqZFhSaFlteGxVR0YwYUNJNklDSkRPbHhjVlhObGNuTmNYR1J5WlhkY1hFRndjRVJoZEdGY1hFeHZZMkZzWEZ4QlpHOXRJRUp5YVdSblpWeGNZbkpwWkdkbGN5MWpZV05vWlZ4Y1puVnphVzl1TXpZd1hGeGhaRzl0TFdaMWMybHZiaTFpY21sa1oyVXVaWGhsSWl3Z0ltbHRZV2RsSWpvZ0ltRmtiMjB0Wm5WemFXOXVMV0p5YVdSblpTNWxlR1VpZlE9PScpKSB8IENvbnZlcnRGcm9tLUpzb24KICAkcmFscGhQb3J0ID0gW2ludF0kcmFscGhFeHBlY3RlZC5wb3J0CiAgJHJhbHBoT3duZXIgPSBbaW50XSRyYWxwaEV4cGVjdGVkLnBpZAogIGlmIChbRW52aXJvbm1lbnRdOjpNYWNoaW5lTmFtZSAtaW5lIFtzdHJpbmddJHJhbHBoRXhwZWN0ZWQuaG9zdCkgeyB0aHJvdyAnTmF0aXZlIGhvc3QgaWRlbnRpdHkgZGlmZmVycycgfQogICRyYWxwaFByb2Nlc3MgPSBHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICgnUHJvY2Vzc0lkPScgKyAkcmFscGhPd25lcikKICBpZiAoLW5vdCAkcmFscGhQcm9jZXNzIC1vciAkcmFscGhQcm9jZXNzLk5hbWUgLWluZSBbc3RyaW5nXSRyYWxwaEV4cGVjdGVkLmltYWdlKSB7IHRocm93ICdJbnZlbnRvcnkgUElEL2ltYWdlIGlzIG5vdCB0aGUgbmF0aXZlIGJyaWRnZScgfQogIGlmIChbSU8uUGF0aF06OkdldEZ1bGxQYXRoKCRyYWxwaFByb2Nlc3MuRXhlY3V0YWJsZVBhdGgpIC1pbmUgW0lPLlBhdGhdOjpHZXRGdWxsUGF0aChbc3RyaW5nXSRyYWxwaEV4cGVjdGVkLmV4ZWN1dGFibGVQYXRoKSkgeyB0aHJvdyAnTmF0aXZlIGV4ZWN1dGFibGUgcGF0aCBkaWZmZXJzIGZyb20gaW52ZW50b3J5JyB9CiAgJHJhbHBoTGlzdGVuZXJzID0gQChHZXQtTmV0VENQQ29ubmVjdGlvbiAtU3RhdGUgTGlzdGVuIC1Mb2NhbFBvcnQgJHJhbHBoUG9ydCkKICBpZiAoJHJhbHBoTGlzdGVuZXJzLkNvdW50IC1lcSAwKSB7IHRocm93ICdEaXNjb3ZlcmVkIHBvcnQgaGFzIG5vIGxpc3RlbmVyJyB9CiAgZm9yZWFjaCAoJHJhbHBoTGlzdGVuZXIgaW4gJHJhbHBoTGlzdGVuZXJzKSB7CiAgICBpZiAoJHJhbHBoTGlzdGVuZXIuT3duaW5nUHJvY2VzcyAtbmUgJHJhbHBoT3duZXIgLW9yICRyYWxwaExpc3RlbmVyLkxvY2FsQWRkcmVzcyAtbm90aW4gQCgnMTI3LjAuMC4xJywnOjoxJykpIHsgdGhyb3cgJ0xpc3RlbmVyIGlzIG5vdCBvd25lZCBieSB0aGUgZXhwZWN0ZWQgbG9vcGJhY2sgYnJpZGdlJyB9CiAgfQogICRyYWxwaEhlYWx0aCA9IEludm9rZS1SZXN0TWV0aG9kIC1VcmkgKCdodHRwOi8vMTI3LjAuMC4xOicgKyAkcmFscGhQb3J0ICsgJy9oZWFsdGgnKSAtTWV0aG9kIEdldCAtVGltZW91dFNlYyA4CiAgJHJhbHBoQWdhaW4gPSBHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICgnUHJvY2Vzc0lkPScgKyAkcmFscGhPd25lcikKICBpZiAoLW5vdCAkcmFscGhBZ2FpbiAtb3IgJHJhbHBoQWdhaW4uQ3JlYXRpb25EYXRlIC1uZSAkcmFscGhQcm9jZXNzLkNyZWF0aW9uRGF0ZSAtb3IgJHJhbHBoQWdhaW4uRXhlY3V0YWJsZVBhdGggLWluZSAkcmFscGhQcm9jZXNzLkV4ZWN1dGFibGVQYXRoKSB7IHRocm93ICdOYXRpdmUgcHJvY2VzcyBjaGFuZ2VkIGR1cmluZyBoZWFsdGggb2JzZXJ2YXRpb24nIH0KICAkcmFscGhMaXN0ZW5lcnNBZnRlciA9IEAoR2V0LU5ldFRDUENvbm5lY3Rpb24gLVN0YXRlIExpc3RlbiAtTG9jYWxQb3J0ICRyYWxwaFBvcnQpCiAgaWYgKCRyYWxwaExpc3RlbmVyc0FmdGVyLkNvdW50IC1lcSAwKSB7IHRocm93ICdMaXN0ZW5lciBkaXNhcHBlYXJlZCBkdXJpbmcgaGVhbHRoIG9ic2VydmF0aW9uJyB9CiAgZm9yZWFjaCAoJHJhbHBoTGlzdGVuZXIgaW4gJHJhbHBoTGlzdGVuZXJzQWZ0ZXIpIHsKICAgIGlmICgkcmFscGhMaXN0ZW5lci5Pd25pbmdQcm9jZXNzIC1uZSAkcmFscGhPd25lciAtb3IgJHJhbHBoTGlzdGVuZXIuTG9jYWxBZGRyZXNzIC1ub3RpbiBAKCcxMjcuMC4wLjEnLCc6OjEnKSkgeyB0aHJvdyAnTGlzdGVuZXIgY2hhbmdlZCBkdXJpbmcgaGVhbHRoIG9ic2VydmF0aW9uJyB9CiAgfQogIEB7IGhvc3Q9W0Vudmlyb25tZW50XTo6TWFjaGluZU5hbWU7IHBpZD0kcmFscGhPd25lcjsgcG9ydD0kcmFscGhQb3J0OyBleGVjdXRhYmxlUGF0aD0kcmFscGhQcm9jZXNzLkV4ZWN1dGFibGVQYXRoOwogICAgIGltYWdlPSRyYWxwaFByb2Nlc3MuTmFtZTsgcHJvY2Vzc0NyZWF0ZWRVdGM9JHJhbHBoUHJvY2Vzcy5DcmVhdGlvbkRhdGUuVG9Vbml2ZXJzYWxUaW1lKCkuVG9TdHJpbmcoJ28nKTsKICAgICBsaXN0ZW5lckFkZHJlc3Nlcz1AKCRyYWxwaExpc3RlbmVyc0FmdGVyIHwgRm9yRWFjaC1PYmplY3QgeyAkXy5Mb2NhbEFkZHJlc3MgfSk7CiAgICAgc3RhYmxlPSR0cnVlOyBoZWFsdGg9JHJhbHBoSGVhbHRoIH0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggMTIgLUNvbXByZXNzCiAgZXhpdCAwCn0gY2F0Y2ggewogIFtDb25zb2xlXTo6RXJyb3IuV3JpdGVMaW5lKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKQogIGV4aXQgMQp9Cg==\", \"timeoutSeconds\": 30, \"reason\": \"Read the discovered Fusion bridge process and its loopback health version without changing runtime state\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion mechanical Ralph", + "startedAt": 1791234267.3508859, + "mutating": false, + "stdout": "{\n \"durationMs\": 6772,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"image\\\":\\\"adom-fusion-bridge.exe\\\",\\\"listenerAddresses\\\":[\\\"127.0.0.1\\\"],\\\"executablePath\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Adom Bridge\\\\\\\\bridges-cache\\\\\\\\fusion360\\\\\\\\adom-fusion-bridge.exe\\\",\\\"stable\\\":true,\\\"processCreatedUtc\\\":\\\"2026-10-05T21:01:31.6721740Z\\\",\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"health\\\":{\\\"status\\\":\\\"ok\\\",\\\"busy\\\":false,\\\"longOp\\\":null,\\\"led\\\":\\\"green\\\",\\\"summary\\\":\\\"Fusion ready\\\",\\\"tooltip\\\":\\\"Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.\\\",\\\"bridgeVersion\\\":\\\"1.12.0-dev.8\\\",\\\"fusion\\\":{\\\"installed\\\":true,\\\"exe_path\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Autodesk\\\\\\\\webdeploy\\\\\\\\production\\\\\\\\6a0c9611291d45bb9226980209917c3d\\\\\\\\FusionLauncher.exe\\\",\\\"addins_dir\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Roaming\\\\\\\\Autodesk\\\\\\\\FusionAddins\\\",\\\"addin_installed\\\":true,\\\"running\\\":true},\\\"addin\\\":{\\\"busy\\\":false,\\\"version\\\":\\\"1.12.0-dev.8\\\",\\\"pyThreads\\\":4},\\\"shell\\\":\\\"rust\\\",\\\"needsSignin\\\":false,\\\"licensingDialog\\\":false,\\\"windowTitle\\\":\\\"Untitled - Autodesk Fusion \\\",\\\"windowFactsDegraded\\\":false,\\\"windowFactsError\\\":null,\\\"exePort\\\":50618},\\\"pid\\\":42780,\\\"port\\\":50618}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 45\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791234274.1404119, + "raw": { + "durationMs": 6772, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"image\":\"adom-fusion-bridge.exe\",\"listenerAddresses\":[\"127.0.0.1\"],\"executablePath\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Adom Bridge\\\\bridges-cache\\\\fusion360\\\\adom-fusion-bridge.exe\",\"stable\":true,\"processCreatedUtc\":\"2026-10-05T21:01:31.6721740Z\",\"host\":\"ADOM_DREW2\",\"health\":{\"status\":\"ok\",\"busy\":false,\"longOp\":null,\"led\":\"green\",\"summary\":\"Fusion ready\",\"tooltip\":\"Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.\",\"bridgeVersion\":\"1.12.0-dev.8\",\"fusion\":{\"installed\":true,\"exe_path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Autodesk\\\\webdeploy\\\\production\\\\6a0c9611291d45bb9226980209917c3d\\\\FusionLauncher.exe\",\"addins_dir\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Roaming\\\\Autodesk\\\\FusionAddins\",\"addin_installed\":true,\"running\":true},\"addin\":{\"busy\":false,\"version\":\"1.12.0-dev.8\",\"pyThreads\":4},\"shell\":\"rust\",\"needsSignin\":false,\"licensingDialog\":false,\"windowTitle\":\"Untitled - Autodesk Fusion \",\"windowFactsDegraded\":false,\"windowFactsError\":null,\"exePort\":50618},\"pid\":42780,\"port\":50618}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 45 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/fusion_harness.py b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/fusion_harness.py new file mode 100644 index 0000000..8b898af --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/fusion_harness.py @@ -0,0 +1,472 @@ +"""Evidence, single-dispatch transport and owned-resource lifecycle for live tests. + +This module never starts Fusion, chooses a document by display name, or retries a +mutation. Campaigns supply their own exact-identity native cleanup adapters. +""" +from dataclasses import dataclass, field +import datetime +import hashlib +import json +from pathlib import Path, PureWindowsPath +import re +import subprocess +import time +import uuid + +ENVELOPES = ("output", "data", "result", "response", "structuredContent", "content") +# Transport metadata does not make an output summary into a native result. A +# native reply has its own data/result/content, or explicit success plus domain +# fields (for example bridges or addinResponding). Keep those replies intact. +TRANSPORT_FIELDS = set(ENVELOPES) | { + "success", "ok", "status", "isError", "error", "errorCode", "cause", "message", + "durationMs", "timeoutSeconds", "schemaVersion", "requestId", "command", "verb", + "target", "caller", "runId", "_hint", "_timeoutHint", "_skillsHint", +} + + +def native_payload(value): + return (any(key in value for key in ("data", "result", "content")) + or isinstance(value.get("success"), bool) and bool(set(value) - TRANSPORT_FIELDS)) + + +def transport_wrapper(value): + return any(key in value for key in ("output", "response", "structuredContent")) and not native_payload(value) +INFRASTRUCTURE = {"bridge_unavailable", "target_not_found", "bridge_restarting", + "main_thread_busy", "fusion_addin_busy", "addin_command_timeout", + "addin_main_thread_blocked", "fusion_not_running", "connection_error", "timeout", "runner_error"} + + +def infrastructure_failure(failure): + return failure.get("code") in INFRASTRUCTURE or any(word in str(failure.get("error", "")).lower() for word in + ("bridge disconnected", "connection refused", "connection reset", "bridge unavailable", "target_not_found", + "addin_command_timeout", "addin_main_thread_blocked", "main_thread_busy", "bridge_restarting", "timed out")) + + +def unresolved_operation(observation): + """Lifecycle evidence is not a terminal refusal, even with success:false.""" + return any(value.get("outcome") in ("pending", "unknown") + or value.get("reconciliationRequired") is True + or value.get("errorCode") in ("operation_in_progress", "operation_reconciliation_required") + for _, value in observation.envelopes) + + +def mechanical_request_digest(request): + """Independent digest of the public user payload, excluding relay metadata.""" + payload = {key:value for key,value in request.items() if key not in ("caller", "_callerBudgetMs")} + return hashlib.sha256(json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False).encode("utf-8")).hexdigest() + + +def run_id(): + return datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%dT%H%M%SZ") + "-" + uuid.uuid4().hex + + +@dataclass +class Observation: + payload: dict + failures: list = field(default_factory=list) + positive: bool = False + envelopes: list = field(default_factory=list) + + +def observe(raw): + """Preserve the semantic envelope; errors anywhere outrank outer success. + + Only explicit status markers are errors (isValid:false and ordinary domain + booleans are data). JSON in documented envelope/text slots is decoded without + overwriting an enclosing status, error or code. + """ + failures, envelopes = [], [] + positive = False + visited = 0 + + def walk(value, path="$", depth=0, envelope=True): + nonlocal positive, visited + # Domain objects (catalog schemas, geometry, file metadata) are not + # response envelopes. Their keys may themselves document error fields; + # traversing them adds no semantic check and can exhaust the budget on + # a legitimate duplicated describe response before reaching its status. + if not envelope: + return + visited += 1 + if visited > 20000 or depth > 40: + raise ValueError("response inspection budget exceeded") + if isinstance(value, str) and envelope and value.lstrip().startswith(("{", "[")): + value = json.loads(value) + if isinstance(value, dict): + if envelope: + envelopes.append((path, value)) + error = value.get("error") + failed = value.get("success") is False or value.get("ok") is False or value.get("isError") is True + status = value.get("status") + failed = failed or isinstance(status, str) and status.lower() in {"error", "failed", "failure", "cancelled", "canceled", "timeout"} + failed = failed or error not in (None, "", False, {}, []) or bool(value.get("errorCode")) + if envelope and failed: + failures.append({"path": path, "error": error, "code": value.get("errorCode"), + "cause": value.get("cause"), "status": status}) + positive = positive or envelope and not transport_wrapper(value) and (value.get("success") is True or value.get("ok") is True or status == "ok") + for key, child in value.items(): + if isinstance(child, (dict, list)) or key in ENVELOPES or key == "text": + script_stdout = key == "output" and isinstance(child, str) and isinstance(value.get("success"), bool) and isinstance(value.get("data"), dict) and "result" in value["data"] + summary_text = key == "output" and isinstance(child, str) and native_payload(value) and not child.lstrip().startswith(("{", "[")) + if envelope and key == "output" and transport_wrapper(value): + decoded = json.loads(child) if isinstance(child, str) else child + if not isinstance(decoded, dict): raise ValueError("Transport output must contain a JSON object") + walk(child, path + "." + key, depth + 1, not (script_stdout or summary_text) and (envelope and key in ENVELOPES or key == "text" and ".content[" in path)) + elif isinstance(value, list): + for index, child in enumerate(value): + walk(child, path + "[%d]" % index, depth + 1, envelope) + + try: + walk(raw) + except (ValueError, TypeError, RecursionError) as exc: + failures.append({"path": "$", "code": "malformed_response", "error": str(exc)}) + payload = raw if isinstance(raw, dict) else {} + # Output/response are transport wrappers; data and native result stay nested so callers + # retain native success/error beside it. Never merge dictionaries together. + for _ in range(40): + if not isinstance(payload, dict): break + if native_payload(payload): break + child = next((payload[k] for k in ("output", "response", "structuredContent") + if isinstance(payload.get(k), dict) or isinstance(payload.get(k), str) and payload[k].lstrip().startswith("{")), None) + if isinstance(child, str): + try: child = json.loads(child) + except ValueError: break + if not isinstance(child, dict): + break + payload = child + if not isinstance(raw, dict): + failures.append({"path": "$", "code": "malformed_response", "error": "Expected an object response."}) + return Observation(payload, failures, positive, envelopes) + + +def data_payload(observation): + value = observation.payload + while isinstance(value.get("data"), dict): + value = value["data"] + return value + + +def evaluate(raw, spec): + observation = observe(raw) + data = data_payload(observation) + errors = [] + if spec.get("pred") not in (None, "count_gt_0", "must_refuse", "verbs_match_plan", "ok_or_budget"): + return ["unknown expectation predicate: " + str(spec["pred"])] + failures = observation.failures + infrastructure = [f for f in failures if infrastructure_failure(f)] + if infrastructure or isinstance(raw, dict) and raw.get("_testTimeout"): + return ["infrastructure failure; this does not prove an expected refusal"] + expected = spec.get("errorCode") + refusal = spec.get("refusal", {}) + expected = refusal.get("code", expected) + if spec.get("pred") == "must_refuse" and not expected: + return ["negative case lacks an explicit refusal code/cause contract"] + alternative = spec.get("okOrCode") + if expected or alternative and failures: + code = expected or alternative + matching = [f for f in failures if f.get("code") == code] + if not matching: + errors.append("expected refusal code %s; observed %s" % (code, [f.get("code") for f in failures])) + if refusal.get("cause") is not None and not any(f.get("cause") == refusal["cause"] for f in matching): + errors.append("expected refusal cause %s" % refusal["cause"]) + # Wrapping success:false without a code is normal. A competing coded + # failure means the intended guard was not the sole observed outcome. + if any(f.get("code") not in (None, code) for f in failures): + errors.append("unexpected additional failure code") + else: + if failures: + errors.append("semantic failure: " + json.dumps(failures, default=str)) + if not observation.positive: + errors.append("no explicit successful response") + for name in spec.get("fields", []): + if name not in data and name not in observation.payload: + errors.append("missing field %r" % name) + if spec.get("pred") == "count_gt_0" and not (isinstance(data.get("count"), (int, float)) and data["count"] > 0 or isinstance(data.get("results"), list) and data["results"]): + errors.append("expected >0 results") + if spec.get("pred") == "ok_or_budget": + errors.append("BOM success and budget refusal need separate explicit fixture cases") + if spec.get("pred") == "verbs_match_plan" and not (isinstance(data.get("verbs"), list) and data["verbs"]): + errors.append("runtime catalog must be a nonempty list") + return errors + + +@dataclass +class CallResult: + raw: dict + observation: Observation + attempts: list + timed_out: bool + elapsed: float + mutating: bool = False + + @property + def ambiguous(self): + first = self.attempts[0] if self.attempts else {} + try: request = json.loads(first.get("requestJson", "{}")) + except (ValueError, TypeError): request = {} + excluded = set() + for path, value in self.observation.envelopes: + durability = value.get("durability") + if (first.get("verb") == "fusion_mechanical" and isinstance(request, dict) + and isinstance(durability, dict) and durability.get("terminalRecorded") is True + and durability.get("phase") == "not_executed" + and value.get("success") is False and value.get("nativeExecutionStarted") is False + and request.get("sessionId") and request.get("operationId") + and value.get("sessionId") == request["sessionId"] + and value.get("operationId") == request["operationId"] + and durability.get("recordedSessionId") == request["sessionId"]): + # A persisted skip proves no native execution for this exact + # request. Its timeout wording is not an unknown outcome. + excluded.add(path) + uncertain = any((infrastructure_failure(f) and f["path"] not in excluded) + or f.get("code") == "malformed_response" for f in self.observation.failures) + absent = not self.observation.positive and not self.observation.failures + return self.mutating and (self.timed_out or uncertain or absent or unresolved_operation(self.observation)) + + +class BridgeClient: + def __init__(self, target, run_id, ai_thread="Fusion harness", evidence_dir=None, runner=subprocess.run): + self.target, self.run_id, self.ai_thread = target, run_id, ai_thread + self.evidence_dir = Path(evidence_dir) if evidence_dir else None + if self.evidence_dir: self.evidence_dir.mkdir(parents=True, exist_ok=True) + self.runner, self.calls = runner, [] + + def call(self, verb, args=None, timeout=90, mutating=False): + started = time.time() + request_json = json.dumps(args or {}, allow_nan=False) + attempt = {"target": self.target, "verb": verb, "args": json.loads(request_json), "requestJson": request_json, "runId": self.run_id, + "caller": self.ai_thread, "startedAt": started, "mutating": mutating} + timed_out = False + try: + process = self.runner(["adom-bridge", "--target", self.target, "--ai-thread", self.ai_thread, + verb, request_json], capture_output=True, text=True, timeout=timeout) + attempt.update(stdout=process.stdout, stderr=process.stderr, returncode=process.returncode) + output = process.stdout.strip() + try: raw = json.loads(output) + except ValueError: + raw = {"success": False, "errorCode": "runner_error", "error": "CLI did not return a JSON response"} + if not isinstance(raw, dict): + raw = {"success": False, "errorCode": "runner_error", "error": "CLI returned a non-object response", "response": raw} + if process.returncode: + raw = {"success": False, "errorCode": "runner_error", "error": "CLI exited with code %s" % process.returncode, "output": raw} + except subprocess.TimeoutExpired as exc: + timed_out = True + attempt.update(stdout=exc.stdout.decode(errors="replace") if isinstance(exc.stdout, bytes) else exc.stdout, + stderr=exc.stderr.decode(errors="replace") if isinstance(exc.stderr, bytes) else exc.stderr) + raw = {"success": False, "errorCode": "timeout", "error": "CLI timeout; operation outcome is unknown", "_testTimeout": True} + except Exception as exc: + raw = {"success": False, "errorCode": "runner_error", "error": str(exc)} + attempt.update(finishedAt=time.time(), raw=json.loads(json.dumps(raw))) + result = CallResult(raw, observe(raw), [attempt], timed_out, time.time()-started, mutating) + self.calls.append(result) + if self.evidence_dir: + path = self.evidence_dir / ("%04d-%s.json" % (len(self.calls), re.sub(r"[^A-Za-z0-9_-]", "_", verb))) + path.write_text(json.dumps(attempt, indent=2, default=str)) + return result + + def reconcile_mechanical(self, original, session_id, operation_id, polls=3, interval=1): + """Status-only reconciliation; an unknown/running entry never means retry.""" + evidence = [] + first = original.attempts[0] if original.attempts else {} + try: args = json.loads(first.get("requestJson", "{}")) + except ValueError: args = {} + if not isinstance(args, dict) or first.get("verb") != "fusion_mechanical" or args.get("sessionId") != session_id or args.get("operationId") != operation_id or not original.mutating: + return {"state": "ambiguous", "original": original.attempts, "reconciliation": [], + "reason": "Reconciliation IDs must match the original typed mutation."} + for index in range(polls): + result = self.call("fusion_mech_operation_status", {"sessionId": session_id, "operationId": operation_id}) + evidence.append(result.attempts[0]) + data = data_payload(result.observation) + unrelated_failure = any(".result" not in f["path"] for f in result.observation.failures) + if not unrelated_failure and data.get("success") is True and data.get("sessionId") == session_id and data.get("operationId") == operation_id and data.get("state") in ("succeeded", "failed") and isinstance(data.get("result"), dict): + stored = observe(data["result"]) + terminal = data["result"] + durability = terminal.get("durability", {}) + identity_matches = (terminal.get("sessionId") == session_id + and terminal.get("operationId") == operation_id + and isinstance(durability, dict) + and durability.get("recordedSessionId", session_id) == session_id) + history = data.get("history", {}) + digest_matches = (isinstance(history, dict) and + ("requestDigest" not in history or history["requestDigest"] == mechanical_request_digest(args))) + phases = ("succeeded",) if data["state"] == "succeeded" else ("failed", "not_executed") + durability_matches = (isinstance(durability, dict) + and ("terminalRecorded" not in durability or durability["terminalRecorded"] is True) + and ("phase" not in data or data["phase"] in phases) + and ("phase" not in durability or durability["phase"] in phases) + and ("phase" not in data or "phase" not in durability or data["phase"] == durability["phase"])) + phase = data.get("phase", durability.get("phase") if isinstance(durability, dict) else None) + execution = (data.get("nativeExecutionStarted"), terminal.get("nativeExecutionStarted")) + execution_matches = all(value is None or isinstance(value, bool) for value in execution) + if phase == "not_executed": + execution_matches = execution_matches and terminal.get("nativeExecutionStarted") is False and data.get("nativeExecutionStarted") is not True + elif phase in ("succeeded", "failed"): + execution_matches = execution_matches and all(value is not False for value in execution) + coherent = identity_matches and digest_matches and durability_matches and execution_matches and not unresolved_operation(result.observation) and ( + data["state"] == "succeeded" and data["result"].get("success") is True and not stored.failures + or data["state"] == "failed" and data["result"].get("success") is False and bool(stored.failures)) + if coherent: + return {"state": data["state"], "result": data["result"], "original": original.attempts, "reconciliation": evidence} + if index + 1 < polls: time.sleep(interval) + return {"state": "ambiguous", "original": original.attempts, "reconciliation": evidence, + "reason": "No terminal ledger result; mutation was not replayed."} + + +class OwnedRun: + """Persist ownership before effects; cleanup always requires exact adapters. + + Document IDs are live session identities, never names or creationId alone. + A native checkpoint must be verified before the document closer is invoked. + verify_owner returns the exact documentId and ownerRunId observed in Fusion. + Cleanup callbacks return {success:true}; errors stay in the manifest/report. + """ + def __init__(self, manifest_path, target, run_id=None, host_scratch=None): + self.path = Path(manifest_path) + if self.path.exists(): raise ValueError("Ownership manifest already exists; never overwrite a prior run") + self.run_id = run_id or globals()["run_id"]() + if not re.fullmatch(r"[A-Za-z0-9_-]{12,100}", self.run_id): raise ValueError("Invalid run ID") + self.manifest = {"runId": self.run_id, "target": target, "state": "running", "documents": {}, "files": {}, "preferences": {}, "customCleanup": [], "cleanup": []} + self.callbacks = [] + self.documents = {} + self.file_adapters = {} + self.preference_adapters = {} + self.set_host_scratch(host_scratch or "C:/tmp/fusion-verb-tests/" + self.run_id) + + def persist(self): + self.path.parent.mkdir(parents=True, exist_ok=True) + temporary = self.path.with_suffix(self.path.suffix + ".tmp") + temporary.write_text(json.dumps(self.manifest, indent=2, default=str)) + temporary.replace(self.path) + + def set_host_scratch(self, path): + root = PureWindowsPath(path) + if not root.is_absolute() or ".." in root.parts or root.name != self.run_id: raise ValueError("Scratch root must be an absolute directory ending in the unique run ID") + if self.manifest["files"]: raise ValueError("Scratch root cannot change after file registration") + self.manifest["hostScratch"] = root.as_posix() + self.persist() + + @classmethod + def resume(cls, manifest_path, target, run_id=None): + manifest = json.loads(Path(manifest_path).read_text()) + rid = manifest.get("runId", "");root = PureWindowsPath(manifest.get("hostScratch", "")) + if manifest.get("target") != target or not re.fullmatch(r"[A-Za-z0-9_-]{12,100}", rid) or run_id is not None and run_id != rid: raise ValueError("Manifest target/run identity mismatch") + if not root.is_absolute() or ".." in root.parts or root.name != rid: raise ValueError("Invalid saved scratch ownership") + for name in manifest.get("files", {}): + path = PureWindowsPath(name) + if ".." in path.parts or root not in path.parents: raise ValueError("Saved file escapes owned scratch") + result = cls.__new__(cls) + result.path, result.run_id, result.manifest = Path(manifest_path), rid, manifest + result.callbacks, result.documents, result.file_adapters, result.preference_adapters = [], {}, {}, {} + return result + + def register_document(self, document_id, role, metadata=None, cleanup=None, verify_owner=None): + if not isinstance(document_id, str) or not document_id or document_id in self.manifest["documents"]: raise ValueError("A unique exact runtime document ID is required") + self.manifest["documents"][document_id] = {"role": role, "metadata": metadata or {}, "checkpoint": None} + self.documents[document_id] = (cleanup, verify_owner) + self.persist() + + def bind_document_cleanup(self, document_id, cleanup, verify_owner): + if document_id not in self.manifest["documents"]: raise ValueError("Document is not registered") + self.documents[document_id] = (cleanup, verify_owner) + + def register_file(self, path, sha256=None, cleanup=None, verify_owner=None, retain=False): + file = PureWindowsPath(path);root = PureWindowsPath(self.manifest["hostScratch"]) + if not file.is_absolute() or ".." in file.parts or file == root or root not in file.parents: raise ValueError("File must be below this run's scratch root") + if sha256 is not None and not re.fullmatch(r"[0-9a-fA-F]{64}", sha256): raise ValueError("Invalid file hash") + self.manifest["files"][file.as_posix()] = {"sha256": sha256, "retain": retain} + self.file_adapters[file.as_posix()] = (cleanup, verify_owner) + self.persist() + + def mark_checkpoint(self, document_id, path, sha256, verified=False): + if document_id not in self.manifest["documents"]: raise ValueError("Document is not owned") + self.register_file(path, sha256, retain=True) + self.manifest["documents"][document_id]["checkpoint"] = {"path": path, "sha256": sha256, "verified": verified is True} + self.persist() + + def add_cleanup(self, label, callback): + if label not in self.manifest["customCleanup"]: self.manifest["customCleanup"].append(label) + self.callbacks = [(name, action) for name, action in self.callbacks if name != label] + [(label, callback)] + self.persist() + + def preserve_preference(self, name, read, write): + original = read() + if name in self.manifest["preferences"]: raise ValueError("Preference already tracked; rebind its adapter on resume") + self.manifest["preferences"][name] = {"original": original, "restoreRequired": False} + self.preference_adapters[name] = (read, write) + self.persist() + def set_value(value): + self.manifest["preferences"][name].update(requested=value, restoreRequired=True) + self.persist() + write(value) + return set_value + + def bind_preference_restore(self, name, read, write): + if name not in self.manifest["preferences"]: raise ValueError("Preference is not tracked") + self.preference_adapters[name] = (read, write) + + def cleanup(self): + entries = [] + for document_id, record in self.manifest["documents"].items(): + close, verify = self.documents.get(document_id, (None, None)) + def finish(document_id=document_id, record=record, close=close, verify=verify): + if not (record.get("checkpoint") or {}).get("verified"): + raise ValueError("No verified native checkpoint; owned document retained") + if not close or not verify: raise ValueError("Exact-identity cleanup adapter unavailable; document retained") + owner = verify(document_id) + if observe(owner).failures: raise ValueError("Document ownership verification failed; refusing close") + if owner.get("documentId") != document_id or owner.get("ownerRunId") != self.run_id: + raise ValueError("Document ownership changed; refusing close") + result = close(document_id) + data = data_payload(observe(result)) + if data.get("closedDocumentId") != document_id or data.get("closed") is not True: + raise ValueError("Closer did not verify the exact document was closed") + return result + entries.append(("close owned document " + document_id, finish)) + for path, record in self.manifest["files"].items(): + if record.get("retain"): continue + remove, verify = self.file_adapters.get(path, (None, None)) + def finish_file(path=path, record=record, remove=remove, verify=verify): + if not remove or not verify: raise ValueError("Owned file cleanup adapter unavailable; file retained") + owner = verify(path) + if observe(owner).failures: raise ValueError("File ownership verification failed; refusing deletion") + if owner.get("ownerRunId") != self.run_id or PureWindowsPath(owner.get("path", "")) != PureWindowsPath(path) or owner.get("isSymlink") is not False: + raise ValueError("File ownership changed; refusing deletion") + if record.get("sha256") and owner.get("sha256") != record["sha256"]: raise ValueError("Owned file changed; refusing deletion") + return remove(path) + entries.append(("remove owned file " + path, finish_file)) + for name, record in self.manifest["preferences"].items(): + if not record.get("restoreRequired"): continue + def restore(name=name, record=record): + if name not in self.preference_adapters: raise ValueError("Preference restoration adapter unavailable; recovery remains unresolved") + read, write = self.preference_adapters[name] + current = read() + if current != record["original"]: + if current != record.get("requested"): raise ValueError("Preference changed concurrently; refusing overwrite") + write(record["original"]) + restored = read() == record["original"] + if restored: + record["restoreRequired"] = False + self.persist() + return {"success": restored, "preference": name} + entries.append(("restore preference " + name, restore)) + custom = dict(self.callbacks) + for label in reversed(self.manifest["customCleanup"]): + entries.append((label, custom.get(label, lambda: {"success": False, "error": "Cleanup adapter unavailable after interruption"}))) + for label, callback in entries: + if any(row["label"] == label and row["status"] == "PASS" for row in self.manifest["cleanup"]): continue + try: + raw = callback() + errors = evaluate(raw, {"ok": True}) + row = {"label": label, "status": "FAIL" if errors else "PASS", "errors": errors, "raw": raw} + except BaseException as exc: + row = {"label": label, "status": "FAIL", "error": str(exc)} + self.manifest["cleanup"].append(row) + self.persist() + latest = {row["label"]: row for row in self.manifest["cleanup"]} + self.manifest["cleanupLatest"] = latest + self.manifest["state"] = "cleanup_failed" if any(row["status"] != "PASS" for row in latest.values()) else "complete" + self.persist() + return self.manifest["cleanup"] + + def __enter__(self): return self + def __exit__(self, *_): self.cleanup() diff --git a/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_jobs.py b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_jobs.py new file mode 100644 index 0000000..6479fe2 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_jobs.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python3 +"""CP8 ordinary durable-operation acceptance. Default plan makes no host calls. + +No restart, crash, storage fault, native busy hold or rendering campaign runs here. +Use exact-owned Ralph registration, checkpoint/reopen, recovery and visual review. +""" +import argparse +import copy +import hashlib +import json +import math +from pathlib import Path +import signal +import sys + +from fusion_harness import evaluate, mechanical_request_digest +from ralph_mechanical import Campaign, recover as shared_recover +from ralph_support import equivalent, native_script + + +EXCLUDED = ("restart_history", "interrupted_native_execution", "disk_or_commit_faults", "busy_native_queue") + +# Explicit outer annotations from the CLI envelope and Rust pass_through / +# etiquette. Native result fields (including errors, targets and durability) +# remain exact. Unknown additions fail comparison instead of being discarded. +BRIDGE_ANNOTATIONS = frozenset(("durationMs", "status", "schemaVersion", "shell", "_contribute", + "_hint", "_hintDocumentHygiene", "_timeoutHint", "documentHygiene", "statusVerb", "timeoutSeconds", + "windowEtiquette", "_timing")) + + +def native_envelope(response, expected=None): + """Validate every envelope before comparing its native semantic fields.""" + if expected is None and response.get('success') is False: + expected = response.get('errorCode') + errors = evaluate(response, {'errorCode':expected} if expected else {'ok':True}) + if errors: raise ValueError('Invalid public result envelope: ' + '; '.join(errors)) + def project(value): + result = {key:item for key,item in value.items() + if key not in BRIDGE_ANNOTATIONS and key not in ('replayed', 'output')} + # Actual CLI replies duplicate the native response in output. Validate + # that duplicate too: a conflicting data value is not just decoration. + if value.get('output') not in (None, ''): + nested = value['output'] + if isinstance(nested, str): nested = json.loads(nested) + # The CLI adds error:"" to successful outer replies even when + # the native duplicate has no error field. Only that proven + # envelope addition is removable; native errors remain exact. + if (isinstance(nested, dict) and value.get('success') is True + and nested.get('success') is True and result.get('error') == '' + and 'error' not in nested): + result.pop('error') + if (not isinstance(nested, dict) or + json.dumps(project(nested), sort_keys=True, allow_nan=False) != + json.dumps(result, sort_keys=True, allow_nan=False)): + raise ValueError('CLI output conflicts with the native response') + return result + return project(response) + + +def native_signature(response, expected=None): + # Python dictionary equality treats True, 1 and 1.0 as equal. Persisted + # result comparison retains the exact JSON types instead. + return json.dumps(native_envelope(response, expected), sort_keys=True, separators=(',', ':'), allow_nan=False) + + +def box_depth_parameter(inspection): + # The owned new_design box creates a named user parameter plus a model + # parameter driven by it; both can have the same numerical value. + matches = [p for p in inspection['parameters'] if p.get('name') == 'depth'] + if len(matches) != 1 or matches[0].get('unit') != 'mm' or not equivalent(matches[0].get('value'), 10): + raise ValueError('Owned box depth parameter identity, units or value differ') + return matches[0] + + +def terminal_contract(request, response, status, source_version, observed_document): + """Independent public-history assertions; no production module imports.""" + errors = [] + def need(condition, message): + if not condition: errors.append(message) + sid, oid = request['sessionId'], request['operationId'] + phase = 'succeeded' if response.get('success') is True else 'failed' + need(status.get('success') is True and status.get('sessionId') == sid and status.get('operationId') == oid, + 'Status identity does not match the submitted operation') + need(status.get('currentSessionId') == sid and status.get('historical') is False, + 'Ordinary status unexpectedly changed session') + need(status.get('state') == phase and status.get('phase') == phase and status.get('outcome') == 'recorded' + and status.get('reconciliationRequired') is False, 'Status is not the requested terminal outcome') + history = status.get('history') or {} + need(history.get('sessionId') == sid and history.get('operationId') == oid + and history.get('operation') == request['op'] and history.get('sourceVersion') == source_version + and history.get('storageVersion') == 1 and history.get('phase') == phase, 'History source/identity/phase differs') + need(history.get('requestDigest') == mechanical_request_digest(request), 'Canonical request digest differs') + need(history.get('requestedTarget') == request.get('target'), 'Recorded requested target differs') + observed = history.get('observedDocument') or {} + need(observed.get('documentId') == observed_document, 'Observed native document differs') + need('creationId' in observed and 'dataFileId' in observed, 'Observed native identity provenance is incomplete') + events = history.get('events') or [] + need([row.get('phase') for row in events] == ['admitted', 'dispatched', 'executing', phase], + 'Durable phase sequence differs') + times = [history.get('createdAt')] + [row.get('at') for row in events] + [history.get('updatedAt')] + need(all(type(t) in (int, float) and math.isfinite(t) and t > 0 for t in times), 'Invalid phase timestamps') + if all(type(t) in (int, float) and math.isfinite(t) for t in times): + need(times == sorted(times), 'Phase timestamps are not ordered') + for label, value in (('initial', response), ('recorded', status.get('result') or {})): + durability = value.get('durability') or {} + need(value.get('sessionId') == sid and value.get('operationId') == oid, + label + ' result identity differs') + need(durability.get('terminalRecorded') is True and durability.get('recordedSessionId') == sid + and durability.get('storageVersion') == 1 and durability.get('phase') == phase, + label + ' result is not durably terminal') + for label, value in (('initial', response), ('recorded', status.get('result') or {}), ('status', status)): + started = value.get('nativeExecutionStarted') + need(started is None or started is True, label + ' claims this ordinary executed operation did not execute') + try: + need(native_signature(response) == native_signature(status.get('result') or {}), + 'Recorded terminal result differs from acknowledged result') + except (ValueError, TypeError) as error: + errors.append(str(error)) + return errors + + +class DurableOperations(Campaign): + def __init__(self, args, client=None): + super().__init__(args, client) + snapshots = self.directory / ('harness-' + self.id) + snapshots.mkdir(parents=True, exist_ok=False) + self.report['harnessSources'] = [] + for name in ('ralph_jobs.py', 'ralph_mechanical.py', 'ralph_support.py', 'fusion_harness.py'): + data = Path(__file__).with_name(name).read_bytes() + copied = snapshots / name; copied.write_bytes(data) + self.report['harnessSources'].append({'name':name, 'path':str(copied), 'sha256':hashlib.sha256(data).hexdigest()}) + self.report['acceptanceScope'] = {'ordinary':'REQUESTED', **{name:'NOT_RUN' for name in EXCLUDED}} + self.report['limitations'] = ['Ordinary synchronous durable writes only; no native restart/crash/fault inference.', + 'Native, archive/cleanup and hash-bound visual review remain separate.'] + + def native(self, action, **values): + if action != 'document_set': return super().native(action, **values) + if self.ambiguous: raise RuntimeError('Unresolved operation prevents native lifecycle observations') + script = native_script('inventory', run_id=self.id, host=self.args.host_name, session_id=self.session) + script += ''' +labels = [] +for document in app.documents: + matches = ['baseline:' + str(i) for i, original in enumerate(run['baselineObjects']) if document == original] + matches += ['owned:' + row['documentId'] for row in run['documents'].values() if not row['closed'] and document == row['object']] + require(len(matches) <= 1, 'Native document ownership is ambiguous') + labels.append(matches[0] if matches else 'unowned:' + document.creationId) +result['openDocuments'] = sorted(labels) +''' + response = self.call('fusion_run_modeling_script', {'script':script}) + result = response['data']['result'] + if result.get('success') is not True: raise RuntimeError('Native document-set observation failed') + return result + + def dispatch(self, request, expected=None): + if self.ambiguous: raise RuntimeError('Previous operation is unresolved; no additional dispatch') + request = copy.deepcopy(request) + self.last_operation = request['operationId'] + self.owned.manifest['lastDispatch'] = copy.deepcopy(request) + self.owned.persist() + return self.call('fusion_mechanical', request, mutating=True, expected=expected) + + def request(self, label, op, **values): + result = dict(op=op, sessionId=self.session, operationId=self.id + '-' + label, **values) + if op != 'new_design': result.setdefault('target', copy.deepcopy(self.target)) + return result + + def history(self, request, response, observed_document): + expected = response.get('errorCode') if response.get('success') is False else None + status = self.call('fusion_mech_operation_status', + {'sessionId':self.session, 'operationId':request['operationId']}, expected=expected) + errors = terminal_contract(request, response, status, self.args.expect_addin, observed_document) + self.check(request['op'] + ' exact durable terminal contract', not errors, {'errors':errors, 'status':status}) + return native_signature(status, expected) + + def ordinary(self): + caps = self.call('fusion_mech_capabilities') + durable = caps.get('idempotency', {}) + self.check('Durable history capability is explicit', caps.get('sessionId') == self.session + and durable.get('storageVersion') == 1 and durable.get('capacity') == 10000 + and durable.get('databaseByteLimit') == 64 * 1024 * 1024 + and durable.get('recordByteLimit') == 4 * 1024 * 1024 + and durable.get('admission') == 'FULL SQLite commit before native dispatch', durable) + prior = self.call('fusion_mechanical', {'op':'inspect'})['data']['target']['documentId'] + before_documents = self.native('document_set')['openDocuments'] + creation = self.request('create', 'new_design', name='Untitled', box={'width':20,'height':30,'depth':10}) + result = self.dispatch(creation) + data = result['data']; self.document_id = data['target']['documentId']; self.target = data['target'] + # Register exact returned native identity before fragile acceptance checks. + self.owned.manifest.setdefault('pendingRegistrations', {})[self.document_id] = data + self.owned.persist() + self.bind_document(self.native('register', documentId=self.document_id, role=self.fixture)) + del self.owned.manifest['pendingRegistrations'][self.document_id]; self.owned.persist() + self.inspect() + if self.args.inject_failure == 'after-new': raise RuntimeError('Requested owned registration diagnostic') + created = self.measured('Created box', 6000) + self.check('Creation source and result are distinct exact documents', prior != self.document_id) + self.check('Exactly one document created', self.native('document_set')['openDocuments'] == sorted(before_documents + ['owned:' + self.document_id])) + original_status = self.history(creation, result, prior) + documents = self.native('document_set')['openDocuments'] + replay = self.dispatch(creation) + self.check('Creation replay is byte-equivalent semantic result', replay.get('replayed') is True and native_signature(replay) == native_signature(result), replay) + self.check('Creation replay creates no document or geometry', documents == self.native('document_set')['openDocuments'] and equivalent(created, self.witness())) + changed = copy.deepcopy(creation); changed['box']['depth'] = 11 + conflict = self.dispatch(changed, expected='operation_conflict') + self.check('Changed digest refuses without model/document effects', conflict.get('errorCode') == 'operation_conflict' + and documents == self.native('document_set')['openDocuments'] and equivalent(created, self.witness())) + self.check('Conflict preserves original durable record', self.history(creation, result, prior) == original_status) + + inspection = self.inspect() + parameter = box_depth_parameter(inspection) + self.check('Owned box depth identity, units and initial value match', True, parameter) + depth = parameter['name'] + edit = self.request('depth', 'parameter_set', name=depth, expression='20 mm') + edited = self.dispatch(edit) + self.inspect(); after = self.measured('Edited box', 12000) + edited_status = self.history(edit, edited, self.document_id) + transport_changed = {**edit, 'caller':{'sessionId':'ralph-envelope-only'}, '_callerBudgetMs':60000} + repeated = self.dispatch(transport_changed) + self.check('Transport metadata preserves canonical identity', repeated.get('replayed') is True + and native_signature(repeated) == native_signature(edited), repeated) + self.check('Parameter replay preserves exact geometry and terminal history', equivalent(after, self.witness()) + and self.history(edit, edited, self.document_id) == edited_status) + + self.inspect() + failing = self.request('abort', 'parameter_batch', changes=[ + {'action':'set','name':depth,'expression':'15 mm'}, + {'action':'set','name':depth,'expression':'MissingDurableDepth + 1 mm'}]) + failure = self.dispatch(failing, expected='mutation_failed') + self.check('Intended atomic failure verifies recovery', failure.get('causeCode') == 'invalid_expression' + and failure.get('recovery', {}).get('verified') is True, failure) + self.check('Independent native geometry/parameter witness restored', equivalent(after, self.witness())) + failed_status = self.history(failing, failure, self.document_id) + replay_failure = self.dispatch(failing, expected='mutation_failed') + self.check('Failed operation replay remains the original failure', replay_failure.get('replayed') is True + and native_signature(replay_failure) == native_signature(failure)) + self.check('Failed replay preserves witness and immutable terminal record', equivalent(after, self.witness()) + and self.history(failing, failure, self.document_id) == failed_status) + self.inspect() + self.report['acceptanceScope']['ordinary'] = 'PASS' + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('mode', choices=('plan','run','recover'), nargs='?', default='plan') + for name in ('target','host-name','evidence','expect-bridge','expect-addin','shotlog-channel'): + parser.add_argument('--' + name) + parser.add_argument('--inject-failure', choices=('after-new','after-model')) + args = parser.parse_args(argv) + if args.mode == 'plan': + print(json.dumps({'hostCalls':False, 'campaign':'ordinary', 'notRun':list(EXCLUDED), + 'checks':['public durable admission/status','exact creation and parameter replay','changed-payload conflict', + 'failed atomic update and immutable failure replay','native geometry and F3D roundtrip','exact owned cleanup'], + 'visualReview':'Use ralph_mechanical.py review with hash-bound annotations after native completion.'}, indent=2)) + return 0 + if not all((args.target,args.host_name,args.evidence)): parser.error('Explicit target, host and evidence are required') + if args.mode == 'recover': return shared_recover(args, campaign_type=DurableOperations) + if not all((args.expect_bridge,args.expect_addin)): parser.error('Explicit expected versions are required') + directory = Path(args.evidence) + if directory.exists(): parser.error('Evidence directory must be new') + directory.mkdir(parents=True) + args.fixtures, args.iterations = ['ordinary'], 1 + campaign = DurableOperations(args) + def interrupt(signum, _): raise KeyboardInterrupt('Signal ' + str(signum)) + signal.signal(signal.SIGTERM, interrupt); signal.signal(signal.SIGINT, interrupt) + code = campaign.run() + print(json.dumps({'overall':campaign.report['overall'], 'report':str(directory / 'report.json')}, indent=2)) + return code + + +if __name__ == '__main__': sys.exit(main()) diff --git a/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_mechanical.py b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_mechanical.py new file mode 100644 index 0000000..1c2b14f --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_mechanical.py @@ -0,0 +1,614 @@ +#!/usr/bin/env python3 +"""Bounded background Fusion mechanical campaign using the public bridge CLI. + +Examples (no host calls are made by plan or review): + python3 tests/ralph_mechanical.py plan + python3 tests/ralph_mechanical.py baseline --target MACHINE --host-name MACHINE --evidence DIR + python3 tests/ralph_mechanical.py run --target MACHINE --host-name MACHINE --evidence NEW_DIR \ + --expect-bridge VERSION --expect-addin VERSION --iterations 1 + python3 tests/ralph_mechanical.py recover --evidence EXISTING_DIR --target MACHINE --host-name MACHINE + python3 tests/ralph_mechanical.py review --evidence DIR --reviewer NAME --annotations review.json + +review.json is a list of {sha256, verdict: PASS|FAIL, notes}. A successful native +run exits 0 but remains VISUAL_PENDING until every image is explicitly reviewed. +The runner sends no runtime lifecycle commands or foreground input, and requires +a running baseline. The underlying transport may still autoheal between calls; +session and ownership guards refuse continuation if that changes the runtime. +""" +import argparse +import base64 +import copy +import hashlib +import json +import math +from pathlib import Path +import signal +import subprocess +import sys +import time +import uuid + +from fusion_harness import BridgeClient, CallResult, OwnedRun, data_payload, evaluate, observe, run_id +from ralph_support import (BASELINE_SCRIPT, artifact, equivalent, health_identity_request, + health_probe_script, native_script, validate_live_identity, visual_review, write_json) + + +PLAN = { + "fixtures": { + "bracket": "Constrained plate with through hole; parameter changes, failed atomic batch, F3D reopen and viewport.", + "assembly": "Two shared blocks and one independent copy; source edit, placement, native mass, BOM/CSV and F3D.", + "supplier": "Optional explicit local supplier CAD and SHA/provenance; repeated instances, BOM and F3D."}, + "requiredVerbs": ["fusion_state", "fusion_addin_status", "bridge_list", "run_script", "fusion_document_info", "fusion_get_preferences", + "fusion_mech_capabilities", "fusion_mechanical", "fusion_mech_operation_status", "fusion_run_modeling_script"], + "constraints": ["Explicit target, native host name, and expected versions; runtime must already be ready.", + "Requires an existing active Design; refuses a zero-document baseline to avoid implicit creation.", + "Every typed mutation dispatched once; ambiguous results reconcile by operation status only.", + "Exact live document IDs plus native object/marker/checkpoint guards; creationId is evidence only.", + "Preferences and pins are observed and compared; no preference setters or runtime lifecycle calls.", + "One to five iterations. Native viewport evidence requires separate SHA-bound review.", + "Interrupted or changed-session cleanup retains documents rather than inferring ownership."], + "scope": "Representative maintained fixtures, not exhaustive feature/options or application UI coverage."} + + +class Campaign: + def __init__(self, args, client=None): + self.args = args + self.directory = Path(args.evidence).resolve() + self.id = run_id() + self.client = client or BridgeClient(args.target, self.id, ai_thread="Fusion mechanical Ralph", evidence_dir=self.directory / "calls") + self.report = {"runId": self.id, "target": args.target, "host": args.host_name, + "native": "RUNNING", "cleanup": "NOT_STARTED", "visual": {"status": "PENDING"}, + "overall": "RUNNING", "checks": [], "artifacts": [], "fixtures": [], + "requestedFixtures": ["%02d-%s" % (i, f) + for i in range(1, getattr(args, "iterations", 0) + 1) + for f in getattr(args, "fixtures", [])], + "limitations": PLAN["scope"]} + self.session = None + self.target = None + self.owned = None + self.document_id = None + self.fixture = None + self.ambiguous = False + self.last_operation = None + + def persist(self): + write_json(self.directory / "report.json", self.report) + + def check(self, label, condition, evidence=None): + row = {"label": label, "status": "PASS" if condition else "FAIL", "evidence": evidence} + self.report["checks"].append(row) + self.persist() + if not condition: + raise RuntimeError(label) + + def call(self, verb, args=None, *, mutating=False, expected=None, timeout=190): + result = self.client.call(verb, args, timeout=timeout, mutating=mutating) + if result.ambiguous: + self.ambiguous = True + if verb == "fusion_mechanical" and args and args.get("operationId"): + reconciled = self.client.reconcile_mechanical(result, self.session, args["operationId"], polls=8, interval=1) + write_json(self.directory / ("reconcile-" + args["operationId"] + ".json"), reconciled) + if reconciled["state"] in ("succeeded", "failed"): + self.ambiguous = False + raw = reconciled["result"] + else: + raise RuntimeError("Unresolved mutation; no replay and no dependent cleanup") + else: + raise RuntimeError("Uncertain native lifecycle action; use recover to inspect its registry") + else: + raw = result.raw + errors = evaluate(raw, {"errorCode": expected} if expected else {"ok": True}) + if errors: + raise RuntimeError(verb + ": " + "; ".join(errors)) + payload = observe(raw).payload + return payload + + def native(self, action, **values): + if self.ambiguous: + raise RuntimeError("Unresolved operation prevents native lifecycle actions") + script = native_script(action, run_id=self.id, host=self.args.host_name, session_id=self.session, **values) + response = self.call("fusion_run_modeling_script", {"script": script}, + mutating=action in {"begin", "register", "activate", "close", "checkpoint", "capture", "restore"}) + result = response["data"]["result"] + if result.get("success") is not True: + raise RuntimeError("Native adapter returned no explicit success") + return result + + def runtime_observation(self, require_versions=False): + state = self.call("fusion_state", {"screenshot": False, "nativeViewport": False}) + addin = self.call("fusion_addin_status") + bridges = self.call("bridge_list") + runtime = next((x for x in bridges.get("bridges", []) if x.get("name") == "fusion360"), None) + if not runtime: + raise RuntimeError("Fusion runtime is absent from target bridge inventory") + # Guard before pass-through queries: the transport can launch Fusion + # for a cold application, and raw scripts create an implicit document. + if not (state.get("running") is True and state.get("addinResponding") is True and + not state.get("mainThreadBusy") and not state.get("blockingDialogs") and + runtime.get("paused") is False and not runtime.get("entryMismatch")): + raise RuntimeError("Fusion must already be running, responsive, idle and free of blocking dialogs") + if require_versions and not (addin.get("addinStale") is False and addin.get("version") == self.args.expect_addin): + raise RuntimeError("Expected runtime versions differ; no native pass-through permitted") + request = health_identity_request(runtime, self.args.host_name) + response = self.call("run_script", {"interpreter": "powershell", + "scriptB64": base64.b64encode(health_probe_script(request).encode()).decode(), "timeoutSeconds": 30, + "reason": "Read the discovered Fusion bridge process and its loopback health version without changing runtime state"}, timeout=40) + if response.get("exitCode") != 0 or response.get("timedOut") is True: + raise RuntimeError("Read-only native bridge identity probe failed: " + str(response.get("stderr", ""))) + identity = validate_live_identity(request, json.loads(response["stdout"]), + self.args.expect_bridge if require_versions else None, self.args.expect_addin if require_versions else None) + runtime = {**runtime, "liveIdentity": identity} + write_json(self.directory / "live-runtime-identity.json", {"reportedRunningVersion": runtime.get("runningVersion"), + "installedVersion": runtime.get("installedVersion"), "expectedIdentity": request, "observed": identity}) + return state, addin, runtime + + def baseline(self, require_versions=False): + state, addin, runtime = self.runtime_observation(require_versions) + document_info = self.call("fusion_document_info") + # This verb's raw script path auto-creates a design when no docs exist. + # Confirm a nonempty document inventory before using even a read script. + payload = data_payload(observe(document_info)) + docs = payload.get("openDocuments", payload.get("documents")) + if not isinstance(docs, list) or not docs: + raise RuntimeError("No open document inventory; native baseline cannot remain read-only") + native = self.call("fusion_run_modeling_script", {"script": BASELINE_SCRIPT})["data"]["result"] + if native["host"].lower() != self.args.host_name.lower(): + raise RuntimeError("Native host differs from --host-name") + if native.get("activeProductType") != "DesignProductType": + raise RuntimeError("Baseline requires an existing active Design product") + preferences = self.call("fusion_get_preferences").get("current") + baseline = {"state": state, "addin": addin, "runtime": {k: runtime.get(k) for k in + ("name", "devPinned", "paused", "runningVersion", "installedVersion", "entryMismatch", "instanceCount")}, + "liveIdentity": runtime["liveIdentity"], "preferences": preferences, "native": native} + write_json(self.directory / "baseline.json", baseline) + if require_versions: + if not (state.get("running") is True and state.get("addinResponding") is True and + not state.get("mainThreadBusy") and not state.get("blockingDialogs") and + addin.get("addinStale") is False and addin.get("version") == self.args.expect_addin): + raise RuntimeError("Readiness or expected runtime version differs; no mutation permitted") + if runtime["liveIdentity"]["health"]["bridgeVersion"] != self.args.expect_bridge: + raise RuntimeError("Actual native bridge does not match the requested version") + return baseline + + def mechanical(self, op, *, write=False, expected=None, **values): + if self.ambiguous: + raise RuntimeError("Previous operation is unresolved") + args = {"op": op, **values} + if op not in ("new_design", "inspect"): + args.setdefault("target", self.target) + if write: + args.update(sessionId=self.session, operationId=self.id + "-" + uuid.uuid4().hex[:12]) + self.last_operation = args["operationId"] + if self.owned: + self.owned.manifest["lastDispatch"] = copy.deepcopy(args) + self.owned.persist() + result = self.call("fusion_mechanical", args, mutating=write, expected=expected) + if result.get("sessionId") != self.session: + raise RuntimeError("Mechanical session changed") + fresh = result.get("data", {}).get("target", result.get("target")) + if fresh: + if self.document_id and op != "new_design" and fresh["documentId"] != self.document_id: + raise RuntimeError("Unexpected runtime document identity") + self.target = fresh + return result if expected else result["data"] + + def inspect(self): + data = self.mechanical("inspect") + if not data.get("complete"): + raise RuntimeError("Mechanical inspection is incomplete") + return data + + def entity(self, ref): + return self.mechanical("inspect_entity", entity=ref)["entity"] + + def sketch(self, name): + row = next(x for x in self.inspect()["sketches"] if x["name"] == name) + return self.entity(row["ref"]) + + def component(self, name): + return next(x for x in self.inspect()["components"] if x["name"] == name) + + def witness(self): + return self.native("witness", documentId=self.document_id)["witness"] + + def bind_document(self, row): + doc_id = row["documentId"] + if doc_id not in self.owned.manifest["documents"]: + self.owned.register_document(doc_id, row["role"], metadata={k: row.get(k) for k in ("creationId", "name", "closed")}) + else: + self.owned.manifest["documents"][doc_id]["metadata"]["closed"] = row.get("closed") + self.owned.persist() + self.owned.bind_document_cleanup(doc_id, lambda identity: self.native("close", documentId=identity), + lambda identity: self.native("verify", documentId=identity)) + if row.get("checkpoint"): + cp = row["checkpoint"] + self.owned.mark_checkpoint(doc_id, cp["path"], cp["sha256"], verified=True) + + def new(self, fixture): + self.fixture = fixture + self.document_id = None + data = self.mechanical("new_design", write=True, name="Ralph " + self.id + " " + fixture) + self.document_id = data["target"]["documentId"] + # Persist the public creation result before native registration, so an + # interrupted register remains visible instead of an untracked doc. + self.owned.manifest.setdefault("pendingRegistrations", {})[self.document_id] = data + self.owned.persist() + row = self.native("register", documentId=self.document_id, role=fixture) + self.bind_document(row) + del self.owned.manifest["pendingRegistrations"][self.document_id] + self.owned.persist() + self.inspect() # Ownership attributes conservatively change revision. + if self.args.inject_failure == "after-new": + raise RuntimeError("Requested cleanup diagnostic after owned document creation") + + def measured(self, label, volume, instances=1): + native = self.witness() + inspection = self.inspect() + self.check(label + " complete healthy timeline", inspection["health"]["healthy"] is True and inspection["health"]["complete"] is True, inspection["health"]) + public = self.mechanical("assembly_properties") + self.check(label + " native volume", equivalent(native["physical"]["volume"], volume, 2e-5), native) + self.check(label + " independent instance volume", equivalent(native["instanceVolume"], volume, 2e-5), native["instanceVolume"]) + self.check(label + " native instance count", native["instanceCount"] == instances, native["instanceCount"]) + self.check(label + " public and native physical properties", all(equivalent(public[k], native["physical"][k]) for k in ("volume", "mass", "centerOfMass")), public) + return native + + def create_sketch(self, name, items, plane="xy", component=None): + self.inspect() + values = {"name": name, "plane": plane} + if component: values["component"] = component + sk = self.mechanical("sketch_create", write=True, **values)["sketch"] + return self.mechanical("sketch_geometry", write=True, sketch=sk["ref"], items=items)["sketch"] + + def bracket(self): + self.new(self.fixture) + self.mechanical("parameter_batch", write=True, changes=[{"action": "create", "name": n, "expression": v, "unit": "mm"} + for n, v in (("Width", "40 mm"), ("Height", "20 mm"), ("Thickness", "8 mm"))]) + self.create_sketch("Bracket outline", [{"type": "rectangle", "start": [0, 0], "end": [40, 20]}]) + for index in range(4): + sk = self.sketch("Bracket outline") + line = sk["curves"][index] + a, b = line["startSketchPoint"]["position"], line["endSketchPoint"]["position"] + kind = "horizontal" if abs(a[1] - b[1]) < 1e-7 else "vertical" + self.mechanical("sketch_constraint", write=True, sketch=sk["ref"], type=kind, entities=[line["ref"]]) + sk = self.sketch("Bracket outline") + self.mechanical("sketch_constraint", write=True, sketch=sk["ref"], type="fix", entities=[sk["curves"][0]["startSketchPoint"]["ref"]]) + for kind, expression, axis, position in (("horizontal", "Width", 1, [20, -5]), ("vertical", "Height", 0, [45, 10])): + sk = self.sketch("Bracket outline") + line = next(c for c in sk["curves"] if abs(c["startSketchPoint"]["position"][axis] - c["endSketchPoint"]["position"][axis]) < 1e-7) + self.mechanical("sketch_dimension", write=True, sketch=sk["ref"], type=kind, + entities=[line["startSketchPoint"]["ref"], line["endSketchPoint"]["ref"]], expression=expression, position=position) + sk = self.sketch("Bracket outline") + self.check("Bracket sketch is fully constrained", sk["fullyConstrained"] is True) + self.mechanical("feature_create", write=True, type="extrude", name="Bracket solid", profiles=[sk["profiles"][0]["ref"]], distance="Thickness") + self.measured("Bracket before hole", 6400) + plane = self.mechanical("plane_create", write=True, type="offset", plane="xy", offset="Thickness", name="Hole plane")["plane"]["ref"] + self.create_sketch("Hole point", [{"type": "point", "position": [20, 10]}], plane=plane) + data = self.inspect() + sk = self.sketch("Hole point") + point = next(p for p in sk["points"] if equivalent(p["position"][:2], [20, 10])) + self.mechanical("feature_create", write=True, type="hole", name="Mounting hole", points=[point["ref"]], diameter=6, depth="Thickness", bodies=[{**data["bodies"][0]["ref"], **self.target}]) + self.measured("Bracket with mounting hole", 6400 - math.pi * 9 * 8) + self.mechanical("parameter_batch", write=True, changes=[{"action": "set", "name": "Width", "expression": "50 mm"}, {"action": "set", "name": "Thickness", "expression": "10 mm"}]) + before = self.measured("Bracket after parameter edit", 10000 - math.pi * 9 * 10) + self.inspect() + failure = self.mechanical("parameter_batch", write=True, expected="mutation_failed", changes=[ + {"action": "set", "name": "Width", "expression": "60 mm"}, + {"action": "set", "name": "Thickness", "expression": "NoSuchParameter + 1 mm"}]) + self.check("Failed parameter batch confirms recovery", failure.get("recovery", {}).get("verified") is True, failure) + self.check("Failed parameter batch has the intended cause", failure.get("causeCode") == "invalid_expression", failure) + self.check("Failed parameter batch restores native geometry", equivalent(before, self.witness())) + self.inspect() + status = self.call("fusion_mech_operation_status", {"sessionId": self.session, "operationId": self.last_operation}, expected="mutation_failed") + self.check("Failed operation has a terminal ledger result", status.get("state") == "failed", status) + + def assembly(self): + self.new(self.fixture) + self.mechanical("component_create", write=True, name="Shared", transform={"position": [0, 0, 0]}) + component = self.component("Shared") + self.create_sketch("Block section", [{"type": "rectangle", "start": [0, 0], "end": [10, 10]}], component=component["ref"]) + before = {p["name"] for p in self.inspect()["parameters"]} + sk = self.sketch("Block section") + component = self.component("Shared") + self.mechanical("feature_create", write=True, type="extrude", name="Block depth", component=component["ref"], profiles=[{**sk["profiles"][0]["ref"], **self.target}], distance=10) + parameters = [p for p in self.inspect()["parameters"] if p["name"] not in before and p["unit"] == "mm" and equivalent(p["value"], 10)] + self.check("Assembly driving depth is unambiguous", len(parameters) == 1, parameters) + component = self.component("Shared") + self.mechanical("occurrence_insert", write=True, component=component["ref"], transform={"position": [30, 0, 0]}) + component = self.component("Shared") + copy_data = self.mechanical("occurrence_insert", write=True, component=component["ref"], independentCopy=True, transform={"position": [60, 0, 0]})["occurrence"] + self.check("Independent copy has a separate definition", copy_data["component"]["id"] != component["id"]) + self.mechanical("component_metadata", write=True, component=copy_data["component"]["ref"], changes={"name": "Independent", "partNumber": "RALPH-COPY"}) + component = self.component("Shared") + self.mechanical("component_metadata", write=True, component=component["ref"], changes={"partNumber": "RALPH-SHARED", "description": "Repeated block fixture"}) + self.inspect() + self.mechanical("parameter_set", write=True, name=parameters[0]["name"], expression="20 mm") + native = self.measured("Repeated assembly", 5000, 3) + self.check("Shared edit leaves independent copy unchanged", equivalent(sorted(sum(b["volume"] for b in c["bodies"]) for c in native["components"] if c["name"] != ""), [1000, 2000]), native["components"]) + self.check("All occurrence placements persist after recompute", equivalent(sorted([o["transform"][i] for i in (3, 7, 11)] for o in native["occurrences"]), [[0, 0, 0], [30, 0, 0], [60, 0, 0]]), native["occurrences"]) + self.verify_bom(5000, {"RALPH-SHARED": 2, "RALPH-COPY": 1}) + + def supplier(self): + self.new(self.fixture) + provenance = {"supplier": self.args.supplier_name, "supplierPartNumber": self.args.supplier_part, "sourceUrl": self.args.supplier_url} + self.mechanical("cad_import", write=True, filename=self.args.supplier_file, sha256=self.args.supplier_sha256, + name="Purchased", provenance=provenance) + comp = self.component("Purchased") + self.mechanical("component_metadata", write=True, component=comp["ref"], changes={"asPurchased": True, "partNumber": self.args.supplier_part}) + comp = self.component("Purchased") + self.mechanical("occurrence_insert", write=True, component=comp["ref"], transform={"position": [50, 0, 0]}) + native = self.witness() + self.check("Supplier import contains positive native volume", native["physical"]["volume"] > 0, native) + bom = self.verify_bom(native["physical"]["volume"], {self.args.supplier_part: 2}) + part = next(p for p in bom["parts"] if p["partNumber"] == self.args.supplier_part) + self.check("Supplier BOM preserves checksum and provenance", all(part.get(k) == v for k, v in {**provenance, "sha256": self.args.supplier_sha256.lower()}.items()), part) + + def verify_bom(self, volume, quantities): + self.inspect() + bom = self.mechanical("bom") + self.check("BOM has one row per expected definition", len(bom["parts"]) == len(quantities) and len({p["partNumber"] for p in bom["parts"]}) == len(quantities), bom["parts"]) + self.check("BOM quantities match actual instances", {p["partNumber"]: p["quantity"] for p in bom["parts"]} == quantities, bom) + self.check("BOM physical total agrees with native instances", equivalent(bom["physical"]["volume"], volume), bom["physical"]) + for mode, expected in (("flat", bom["parts"]), ("structured", bom["instances"])): + self.inspect() + path = self.owned.manifest["hostScratch"] + "/" + self.fixture + "-" + mode + ".csv" + self.mechanical("bom_export", write=True, filename=path, mode=mode) + out = self.native("file", path=path, csv=True) + rows = out["rows"] + self.check(mode + " CSV row count", len(rows) == len(expected), rows) + if mode == "flat": + self.check("Flat CSV definitions are unique", len(rows) == len(quantities) and len({x["partNumber"] for x in rows}) == len(quantities), rows) + self.check("Flat CSV quantities", {x["partNumber"]: int(x["quantity"]) for x in rows} == quantities, rows) + else: + self.check("Structured CSV hierarchy", [(x["path"], x["parentPath"], int(x["depth"])) for x in rows] == [(x["path"], x["parentPath"] or "", x["depth"]) for x in expected], rows) + self.save_artifact(out, "bom") + return bom + + def save_artifact(self, out, kind): + data = base64.b64decode(out["base64"], validate=True) + if hashlib.sha256(data).hexdigest() != out["sha256"]: + raise RuntimeError("Transferred artifact hash differs from host") + path = self.directory / "artifacts" / Path(out["path"].replace("\\", "/")).name + path.parent.mkdir(parents=True, exist_ok=True) + if path.exists(): + raise RuntimeError("Local artifact destination already exists") + path.write_bytes(data) + item = {**artifact(path, out["sha256"]), "kind": kind, "hostPath": out["path"], "fixture": self.fixture} + self.owned.register_file(out["path"], out["sha256"], retain=True) + self.report["artifacts"].append(item) + if kind == "viewport" and self.args.shotlog_channel: + process = subprocess.run(["shotlog", "inject", "--channel", self.args.shotlog_channel, "--native", "--desc", self.fixture, + "--source", "Fusion native viewport", str(path)], capture_output=True, text=True, timeout=30) + item["shotlog"] = {"returncode": process.returncode, "stdout": process.stdout, "stderr": process.stderr} + if process.returncode: + raise RuntimeError("Requested shotlog injection failed") + self.persist() + + def checkpoint(self, capture=True): + self.inspect() + stem = self.fixture + "-" + uuid.uuid4().hex[:8] + path = self.owned.manifest["hostScratch"] + "/" + stem + ".f3d" + if capture: + image_path = self.owned.manifest["hostScratch"] + "/" + stem + ".png" + self.native("capture", documentId=self.document_id, path=image_path) + self.save_artifact(self.native("file", path=image_path), "viewport") + self.mechanical("export", write=True, format="f3d", outputPath=path) + result = self.native("checkpoint", documentId=self.document_id, path=path) + self.check(self.fixture + " archive preserves native witness", equivalent(result["before"], result["after"]), result["archive"]) + for row in (result["source"], result["reopened"]): + self.bind_document(row) + self.save_artifact(self.native("file", path=path), "native-archive") + # Imported object is exact, registered and checkpointed before closing. + self.native("close", documentId=result["reopened"]["documentId"]) + self.native("activate", documentId=self.document_id) + + def cleanup(self): + if self.owned is None: + self.report["cleanup"] = "NOT_NEEDED" + return + try: + if self.ambiguous: + raise RuntimeError("Unknown operation still outstanding; owned documents retained") + inventory = self.native("inventory") + if inventory.get("provisionalImportCount"): + raise RuntimeError("An imported native object lacks public identity; retained in native registry") + for row in inventory["documents"]: + self.bind_document(row) + # If fixture assertions failed, checkpoint only the exact currently + # active owned object. Other uncheckpointed docs remain retained. + if self.document_id in self.owned.manifest["documents"]: + record = self.owned.manifest["documents"][self.document_id] + if not (record.get("checkpoint") or {}).get("verified"): + self.checkpoint(capture=False) + results = self.owned.cleanup() + self.report["cleanupEvidence"] = results + latest = self.owned.manifest.get("cleanupLatest", {}) + self.report["cleanupLatest"] = latest + if self.owned.manifest.get("pendingRegistrations"): + raise RuntimeError("An owned creation was not reconciled into native registry") + if any(x["status"] != "PASS" for x in (latest.values() if latest else results)): + raise RuntimeError("Exact guarded cleanup retained one or more documents") + restored = self.native("restore") + prefs = self.call("fusion_get_preferences")["current"] + _, _, current = self.runtime_observation(require_versions=True) + self.check("Original documents restored", restored["documents"] == self.report["baseline"]["native"]["documents"], restored) + self.check("Preferences preserved", prefs == self.report["baseline"]["preferences"], prefs) + original = self.report["baseline"]["runtime"] + stable_fields = set(original) - {"runningVersion"} + self.check("Runtime configuration and development pin preserved", all(current.get(k) == original[k] for k in stable_fields), {k: current.get(k) for k in original}) + live_before = self.report["baseline"]["liveIdentity"] + live_after = current["liveIdentity"] + self.check("Actual native runtime identity preserved", all(live_after.get(k) == live_before.get(k) for k in + ("host", "pid", "port", "executablePath", "processCreatedUtc")), live_after) + self.report["finalRuntimeIdentity"] = live_after + self.report["finalHost"] = restored + self.report["cleanup"] = "PASS" + except BaseException as exc: + self.report["cleanup"] = "FAIL" + self.report["cleanupError"] = str(exc) + self.persist() + + def run(self): + try: + baseline = self.baseline(require_versions=True) + self.report["baseline"] = baseline + capabilities = self.call("fusion_mech_capabilities") + self.session = capabilities["sessionId"] + self.report["sessionId"] = self.session + begin = self.native("begin", baseline=baseline["native"]["documents"]) + self.owned = OwnedRun(self.directory / "ownership.json", self.args.target, self.id, host_scratch=begin["scratch"]) + self.owned.manifest["sessionId"] = self.session + self.owned.manifest["host"] = self.args.host_name + self.owned.persist() + for iteration in range(1, self.args.iterations + 1): + for fixture in self.args.fixtures: + self.fixture = "%02d-%s" % (iteration, fixture) + start = len(self.report["checks"]) + getattr(self, fixture)() + if self.args.inject_failure == "after-model": + raise RuntimeError("Requested cleanup diagnostic after model creation") + self.checkpoint() + self.native("close", documentId=self.document_id) + self.report["fixtures"].append({"name": self.fixture, "status": "PASS", "checks": len(self.report["checks"]) - start}) + self.document_id = None + self.report["native"] = "PASS" + except BaseException as exc: + self.report["native"] = "FAIL" + self.report["failure"] = {"type": type(exc).__name__, "message": str(exc), "fixture": self.fixture} + finally: + self.cleanup() + completed = {row["name"] for row in self.report["fixtures"]} + for name in self.report["requestedFixtures"]: + if name not in completed: + self.report["fixtures"].append({"name": name, "status": "FAIL" if name == self.report.get("failure", {}).get("fixture") else "NOT_RUN"}) + self.report["overall"] = "VISUAL_PENDING" if self.report["native"] == "PASS" and self.report["cleanup"] == "PASS" else "FAIL" + self.report["counts"] = {status: sum(x["status"] == status for x in self.report["checks"]) for status in ("PASS", "FAIL")} + self.persist() + return 0 if self.report["overall"] == "VISUAL_PENDING" else 1 + + +def parser(): + command = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + sub = command.add_subparsers(dest="mode", required=True) + sub.add_parser("plan", help="Print offline fixture/ownership contract; no host calls") + for mode in ("baseline", "run", "recover"): + p = sub.add_parser(mode) + p.add_argument("--target", required=True) + p.add_argument("--host-name", required=True, help="Expected native platform.node(), independent of routing alias") + p.add_argument("--evidence", required=True) + if mode == "run": + p.add_argument("--expect-bridge", required=True) + p.add_argument("--expect-addin", required=True) + p.add_argument("--iterations", type=int, choices=range(1, 6), default=1) + p.add_argument("--fixtures", nargs="+", choices=PLAN["fixtures"], default=["bracket", "assembly"]) + p.add_argument("--inject-failure", choices=("after-new", "after-model"), help="Owned-fixture cleanup diagnostic; expected nonzero run") + p.add_argument("--shotlog-channel", help="Inject every captured viewport into this explicitly selected channel") + p.add_argument("--supplier-file", help="Explicit existing host STEP/SAT path; never downloaded automatically") + p.add_argument("--supplier-sha256") + p.add_argument("--supplier-name") + p.add_argument("--supplier-part") + p.add_argument("--supplier-url") + review = sub.add_parser("review", help="Record independent visual annotations bound to exact PNG hashes") + review.add_argument("--evidence", required=True) + review.add_argument("--reviewer", required=True) + review.add_argument("--annotations", required=True) + return command + + +def recover(args, campaign_type=Campaign): + directory = Path(args.evidence).resolve() + report = json.loads((directory / "report.json").read_text()) + ownership = json.loads((directory / "ownership.json").read_text()) + if ownership["target"] != args.target or ownership.get("host") != args.host_name: + raise ValueError("Recovery target/host differs from recorded ownership") + args.shotlog_channel = None + runner = campaign_type(args) + runner.id, runner.report, runner.session = ownership["runId"], report, ownership["sessionId"] + runner.client = BridgeClient(args.target, runner.id, ai_thread="Fusion mechanical Ralph recovery", evidence_dir=directory / ("recovery-calls-" + uuid.uuid4().hex[:8])) + args.expect_bridge = report["baseline"]["liveIdentity"]["health"]["bridgeVersion"] + args.expect_addin = report["baseline"]["addin"]["version"] + runner.runtime_observation(require_versions=True) + caps = runner.call("fusion_mech_capabilities") + if caps["sessionId"] != runner.session: + raise RuntimeError("Runtime session changed; cannot prove native object identity. Documents retained.") + last = ownership.get("lastDispatch") + if last: + original = CallResult({"outcome": "unknown_after_interruption"}, observe({}), + [{"verb": "fusion_mechanical", "args": last, "requestJson": json.dumps(last), + "source": "persisted lastDispatch"}], False, 0, True) + reconciled = runner.client.reconcile_mechanical(original, runner.session, last["operationId"], polls=1) + write_json(directory / ("recovery-ledger-" + uuid.uuid4().hex[:8] + ".json"), reconciled) + if reconciled["state"] not in ("succeeded", "failed"): + raise RuntimeError("Last operation lacks a terminal status; no recovery mutation") + runner.owned = OwnedRun.resume(directory / "ownership.json", args.target, runner.id) + inventory = runner.native("inventory") + for row in inventory["documents"]: + runner.bind_document(row) + runner.owned.manifest.get("pendingRegistrations", {}).pop(row["documentId"], None) + runner.owned.persist() + # Recovery only closes already verified checkpoints. It never exports an + # unknown current model or guesses ownership from a document-list delta. + runner.cleanup() + report["overall"] = "VISUAL_PENDING" if report["native"] == "PASS" and report["cleanup"] == "PASS" else "FAIL" + report["counts"] = {status: sum(row["status"] == status for row in report["checks"]) + for status in ("PASS", "FAIL")} + runner.persist() + return 0 if report["cleanup"] == "PASS" else 1 + + +def main(argv=None): + args = parser().parse_args(argv) + if args.mode == "plan": + print(json.dumps(PLAN, indent=2)) + return 0 + if args.mode == "review": + path = Path(args.evidence) / "report.json" + report = json.loads(path.read_text()) + annotations = json.loads(Path(args.annotations).read_text()) + report["visual"] = visual_review(report, annotations, args.reviewer) + report["overall"] = "PASS" if report["native"] == "PASS" and report["cleanup"] == "PASS" and report["visual"]["status"] == "PASS" else "FAIL" + write_json(path, report) + print(json.dumps({"overall": report["overall"], "visual": report["visual"]}, indent=2)) + return 0 if report["overall"] == "PASS" else 1 + if args.mode == "recover": + return recover(args) + directory = Path(args.evidence) + if directory.exists(): + raise ValueError("Evidence directory must be new; use recover for an interrupted run") + if args.mode == "run" and "supplier" in args.fixtures: + if not all((args.supplier_file, args.supplier_sha256, args.supplier_name, args.supplier_part, args.supplier_url)): + raise ValueError("Supplier fixture requires explicit path, SHA-256, supplier, part and HTTPS source URL") + if len(args.supplier_sha256) != 64 or any(c not in "0123456789abcdefABCDEF" for c in args.supplier_sha256): + raise ValueError("Invalid supplier SHA-256") + if args.mode == "run" and len(set(args.fixtures)) != len(args.fixtures): + raise ValueError("Each fixture can appear once; use bounded --iterations for repetition") + directory.mkdir(parents=True) + runner = Campaign(args) + runner.persist() + if args.mode == "baseline": + runner.report.update(native="NOT_RUN", cleanup="NOT_NEEDED") + try: + runner.report["baseline"] = runner.baseline() + runner.report["overall"] = "BASELINE_RECORDED" + code = 0 + except BaseException as exc: + runner.report["overall"] = "BASELINE_REFUSED" + runner.report["failure"] = {"type": type(exc).__name__, "message": str(exc)} + code = 1 + runner.persist() + print(json.dumps({"overall": runner.report["overall"], "report": str(directory / "report.json")}, indent=2)) + return code + def interrupted(signum, _frame): + raise KeyboardInterrupt("Signal " + str(signum)) + signal.signal(signal.SIGTERM, interrupted) + signal.signal(signal.SIGINT, interrupted) + result = runner.run() + print(json.dumps({"overall": runner.report["overall"], "counts": runner.report.get("counts"), "report": str(directory / "report.json")}, indent=2)) + return result + + +if __name__ == "__main__": + try: + sys.exit(main()) + except (RuntimeError, ValueError, OSError) as exc: + print(str(exc), file=sys.stderr) + sys.exit(1) diff --git a/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_support.py b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_support.py new file mode 100644 index 0000000..4bea870 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_support.py @@ -0,0 +1,423 @@ +"""Small, stdlib-only support for the background mechanical Ralph campaign. + +The native adapter uses mechanical.core only to obtain the public session-bound +document identity. Geometry measurements use independent Autodesk API calls. +No document is selected by name or creationId, and no preference is written. +""" +import hashlib +import json +import math +import base64 +from pathlib import Path, PureWindowsPath +import struct + + +def write_json(path, value): + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text(json.dumps(value, indent=2, allow_nan=False) + "\n") + temporary.replace(path) + + +def equivalent(a, b, tolerance=1e-7): + if isinstance(a, bool) or isinstance(b, bool): + return type(a) is type(b) and a == b + if isinstance(a, (float, int)) and isinstance(b, (float, int)): + return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=tolerance, abs_tol=tolerance) + if isinstance(a, dict) and isinstance(b, dict): + return a.keys() == b.keys() and all(equivalent(a[k], b[k], tolerance) for k in a) + if isinstance(a, list) and isinstance(b, list): + return len(a) == len(b) and all(equivalent(x, y, tolerance) for x, y in zip(a, b)) + return a == b + + +def health_identity_request(runtime, host): + """Accept only a single discovered native process and a concrete TCP port.""" + pids = runtime.get("livePids") + port = runtime.get("spawn", {}).get("runtimePort") + if not isinstance(pids, list) or len(pids) != 1 or type(pids[0]) is not int or pids[0] <= 0: + raise ValueError("Live bridge inventory must identify exactly one process") + if type(port) is not int or not 1 <= port <= 65535 or runtime.get("port") != port: + raise ValueError("Discovered bridge runtime port is absent or inconsistent") + path = PureWindowsPath(runtime.get("entrypoint", "")) + expected_image = runtime.get("expectedImage") + if not path.is_absolute() or ".." in path.parts or not isinstance(expected_image, str) or path.name.lower() != expected_image.lower(): + raise ValueError("Discovered executable identity is incomplete") + if runtime.get("spawn", {}).get("kind") != "exe" or runtime.get("instanceCount") != 1: + raise ValueError("A single native executable bridge is required") + return {"host": host, "pid": pids[0], "port": port, "executablePath": str(path), "image": expected_image} + + +def health_probe_script(request): + """Read process/listener identity and GET only its discovered loopback health.""" + encoded = base64.b64encode(json.dumps(request).encode()).decode() + return r''' +$ErrorActionPreference = 'Stop' +try { + $ralphExpected = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('__REQUEST_B64__')) | ConvertFrom-Json + $ralphPort = [int]$ralphExpected.port + $ralphOwner = [int]$ralphExpected.pid + if ([Environment]::MachineName -ine [string]$ralphExpected.host) { throw 'Native host identity differs' } + $ralphProcess = Get-CimInstance Win32_Process -Filter ('ProcessId=' + $ralphOwner) + if (-not $ralphProcess -or $ralphProcess.Name -ine [string]$ralphExpected.image) { throw 'Inventory PID/image is not the native bridge' } + if ([IO.Path]::GetFullPath($ralphProcess.ExecutablePath) -ine [IO.Path]::GetFullPath([string]$ralphExpected.executablePath)) { throw 'Native executable path differs from inventory' } + $ralphListeners = @(Get-NetTCPConnection -State Listen -LocalPort $ralphPort) + if ($ralphListeners.Count -eq 0) { throw 'Discovered port has no listener' } + foreach ($ralphListener in $ralphListeners) { + if ($ralphListener.OwningProcess -ne $ralphOwner -or $ralphListener.LocalAddress -notin @('127.0.0.1','::1')) { throw 'Listener is not owned by the expected loopback bridge' } + } + $ralphHealth = Invoke-RestMethod -Uri ('http://127.0.0.1:' + $ralphPort + '/health') -Method Get -TimeoutSec 8 + $ralphAgain = Get-CimInstance Win32_Process -Filter ('ProcessId=' + $ralphOwner) + if (-not $ralphAgain -or $ralphAgain.CreationDate -ne $ralphProcess.CreationDate -or $ralphAgain.ExecutablePath -ine $ralphProcess.ExecutablePath) { throw 'Native process changed during health observation' } + $ralphListenersAfter = @(Get-NetTCPConnection -State Listen -LocalPort $ralphPort) + if ($ralphListenersAfter.Count -eq 0) { throw 'Listener disappeared during health observation' } + foreach ($ralphListener in $ralphListenersAfter) { + if ($ralphListener.OwningProcess -ne $ralphOwner -or $ralphListener.LocalAddress -notin @('127.0.0.1','::1')) { throw 'Listener changed during health observation' } + } + @{ host=[Environment]::MachineName; pid=$ralphOwner; port=$ralphPort; executablePath=$ralphProcess.ExecutablePath; + image=$ralphProcess.Name; processCreatedUtc=$ralphProcess.CreationDate.ToUniversalTime().ToString('o'); + listenerAddresses=@($ralphListenersAfter | ForEach-Object { $_.LocalAddress }); + stable=$true; health=$ralphHealth } | ConvertTo-Json -Depth 12 -Compress + exit 0 +} catch { + [Console]::Error.WriteLine($_.Exception.Message) + exit 1 +} +'''.replace('__REQUEST_B64__', encoded) + + +def validate_live_identity(request, evidence, bridge_version=None, addin_version=None): + """An inventory version is descriptive; live identity/version is decisive.""" + if not (evidence.get("host", "").lower() == request["host"].lower() and + evidence.get("pid") == request["pid"] and evidence.get("port") == request["port"] and + evidence.get("image", "").lower() == request["image"].lower() and + PureWindowsPath(evidence.get("executablePath", "")) == PureWindowsPath(request["executablePath"]) and + evidence.get("stable") is True and evidence.get("processCreatedUtc")): + raise ValueError("Observed native process identity differs from inventory or host") + addresses = evidence.get("listenerAddresses") + if not isinstance(addresses, list) or not addresses or any(x not in ("127.0.0.1", "::1") for x in addresses): + raise ValueError("Native health was not bound to an owned loopback listener") + health = evidence.get("health", {}) + if "sidecarPort" in health: + raise ValueError("Sidecar health cannot attest the native executable version") + if not (health.get("status") == "ok" and health.get("exePort") == request["port"] and + health.get("fusion", {}).get("running") is True and health.get("busy") is False and + health.get("addin", {}).get("busy") is False): + raise ValueError("Native loopback health is not idle and ready on the discovered port") + if bridge_version is not None and health.get("bridgeVersion") != bridge_version: + raise ValueError("Actual native bridge version differs from expected version") + if addin_version is not None and health.get("addin", {}).get("version") != addin_version: + raise ValueError("Actual native add-in version differs from expected version") + return evidence + + +def artifact(path, expected_sha=None): + path = Path(path) + data = path.read_bytes() + digest = hashlib.sha256(data).hexdigest() + if expected_sha is not None and digest != expected_sha: + raise ValueError("Artifact bytes differ from the recorded SHA-256: " + str(path)) + result = {"path": str(path.resolve()), "sha256": digest, "bytes": len(data)} + if path.suffix.lower() == ".png": + if data[:8] != b"\x89PNG\r\n\x1a\n" or data[12:16] != b"IHDR" or len(data) < 24: + raise ValueError("Invalid PNG header") + width, height = struct.unpack(">II", data[16:24]) + if width < 640 or height < 480: + raise ValueError("Viewport capture is too small for review") + result.update(width=width, height=height) + return result + + +def visual_review(report, annotations, reviewer): + """Bind explicit human/independent-agent review to every captured byte set.""" + if not reviewer.strip(): + raise ValueError("An identified reviewer is required") + images = [x for x in report.get("artifacts", []) if x.get("kind") == "viewport"] + if not images: + raise ValueError("No viewport evidence exists") + by_sha = {row.get("sha256"): row for row in annotations} + if len(by_sha) != len(annotations) or set(by_sha) != {x["sha256"] for x in images}: + raise ValueError("Review must identify every current viewport SHA exactly once") + for image in images: + artifact(image["path"], image["sha256"]) + row = by_sha[image["sha256"]] + if row.get("verdict") not in ("PASS", "FAIL") or not isinstance(row.get("notes"), str) or not row["notes"].strip(): + raise ValueError("Each image needs a PASS/FAIL verdict and concrete visual notes") + return {"status": "PASS" if all(x["verdict"] == "PASS" for x in annotations) else "FAIL", + "reviewer": reviewer, "annotations": annotations, + "scope": "Native model viewport appearance; does not prove application chrome or picker UI."} + + +BASELINE_SCRIPT = r''' +import platform, tempfile +result = {'host': platform.node(), 'platform': platform.system(), 'fusionVersion': app.version, + 'temporaryDirectory': tempfile.gettempdir(), + 'activeCreationId': app.activeDocument.creationId if app.activeDocument else None, + 'activeProductType': app.activeProduct.productType if app.activeProduct else None, + 'activeCommand': ui.activeCommand, + 'documents': [{'creationId': d.creationId, 'name': d.name, + 'modified': d.isModified, 'saved': d.isSaved} for d in app.documents]} +''' + + +# This program executes inside Fusion through the public modeling-script verb. +# All actions are bounded and use a session-local registry of actual API objects. +# Import records the returned object before any readback that could fail. A +# timed-out adapter is reconciled by inventory, never re-dispatched blindly. +NATIVE_PROGRAM = r''' +import base64, builtins, csv, hashlib, json, math, os, platform, re, sys, tempfile + +def require(condition, message): + if not condition: + raise RuntimeError(message) + +def same(a, b): + if isinstance(a, bool) or isinstance(b, bool): + return type(a) is type(b) and a == b + if isinstance(a, (int, float)) and isinstance(b, (int, float)): + return math.isfinite(a) and math.isfinite(b) and math.isclose(a, b, rel_tol=1e-7, abs_tol=1e-7) + if isinstance(a, dict) and isinstance(b, dict): + return a.keys() == b.keys() and all(same(a[k], b[k]) for k in a) + if isinstance(a, list) and isinstance(b, list): + return len(a) == len(b) and all(same(x, y) for x, y in zip(a, b)) + return a == b + +def vector(p): + return [p.x * 10, p.y * 10, p.z * 10] + +def body_measure(body): + properties = body.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy) + box = body.boundingBox + return {'name': body.name, 'volume': properties.volume * 1000, 'mass': properties.mass, + 'centerOfMass': vector(properties.centerOfMass), 'faces': body.faces.count, + 'bounds': [vector(box.minPoint), vector(box.maxPoint)], + 'material': body.material.name if body.material else None} + +def witness(document): + design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType')) + require(design is not None, 'Owned document is no longer a design') + root = design.rootComponent + components, occurrences = [], [] + all_bodies = [body_measure(b) for b in root.bRepBodies] + for comp in design.allComponents: + components.append({'name': '' if comp == root else comp.name, + 'partNumber': comp.partNumber, 'description': comp.description, + 'material': comp.material.name if comp.material else None, + 'attributes': {a.name: a.value for a in comp.attributes if a.groupName == 'AdomMechanical'}, + 'bodies': [body_measure(b) for b in comp.bRepBodies], + 'sketches': [{'name': s.name, 'fullyConstrained': s.isFullyConstrained, + 'curves': s.sketchCurves.count, 'profiles': s.profiles.count} for s in comp.sketches]}) + for occurrence in root.allOccurrences: + matrix = list(occurrence.transform2.asArray()) + for index in (3, 7, 11): matrix[index] *= 10 + bodies = [body_measure(b) for b in occurrence.bRepBodies] + all_bodies.extend(bodies) + occurrences.append({'path': occurrence.fullPathName, 'component': occurrence.component.name, + 'transform': matrix, 'bodies': bodies}) + props = root.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy) + return {'parameters': {p.name: p.expression for p in design.allParameters}, + 'timelineCount': design.timeline.count, + 'components': sorted(components, key=lambda c: c['name']), + 'occurrences': sorted(occurrences, key=lambda o: o['path']), + 'physical': {'volume': props.volume * 1000, 'mass': props.mass, + 'centerOfMass': vector(props.centerOfMass)}, + 'instanceVolume': sum(b['volume'] for b in all_bodies), + 'instanceCount': len(all_bodies)} + +require(platform.node().lower() == REQUEST['host'].lower(), 'Host identity differs from expected host') +require(re.fullmatch(r'[A-Za-z0-9_-]{12,100}', REQUEST['runId']) is not None, 'Invalid run ID') +modules = [m for n, m in list(sys.modules.items()) + if n.endswith('.mechanical.core') and getattr(m, 'SESSION_ID', None) == REQUEST['sessionId']] +require(len(modules) == 1, 'Exact serving mechanical session is unavailable; no ownership inference') +core = modules[0] +registries = getattr(builtins, '_adom_mechanical_ralph_runs', None) +if registries is None: + registries = {} + builtins._adom_mechanical_ralph_runs = registries +action = REQUEST['action'] +run = registries.get(REQUEST['runId']) + +def documents(): + return [{'creationId': d.creationId, 'name': d.name, 'modified': d.isModified, 'saved': d.isSaved} + for d in app.documents] + +def idle(): + require(ui.activeCommand in ('', 'SelectCommand', 'Select'), 'Interactive command active; refusing document lifecycle action') + +def fingerprint(document): + return {'creationId': document.creationId, 'name': document.name, + 'modified': document.isModified, 'saved': document.isSaved} + +def owned(document_id, allow_closed=False): + require(document_id in run['documents'], 'Document has no exact native ownership entry') + row = run['documents'][document_id] + if row.get('closed'): + require(allow_closed, 'Owned document is already closed') + return row + document = row['object'] + require(any(d == document for d in app.documents), 'Exact owned document is no longer open') + require(not any(d == document for d in run['baselineObjects']), 'Refusing a baseline document') + require(document.name == row['name'] and not document.isSaved, 'Owned document was renamed or saved externally') + design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType')) + marker = design.rootComponent.attributes.itemByName('AdomRalph', 'owner') + require(marker and marker.value == REQUEST['runId'], 'Run ownership marker changed') + marker = design.rootComponent.attributes.itemByName('AdomRalph', 'documentId') + require(marker and marker.value == document_id, 'Runtime document marker changed') + return row + +def path_in_scratch(path): + root = os.path.realpath(run['scratch']) + path = os.path.abspath(path) + require(os.path.commonpath([root, os.path.realpath(path)]) == root and os.path.realpath(path) != root, + 'Artifact is not inside the owned scratch directory') + require(not os.path.islink(path), 'Artifact is a symlink') + return path + +def file_info(path): + path = path_in_scratch(path) + require(os.path.isfile(path), 'Checkpoint file is absent') + require(os.path.getsize(path) <= 32 * 1024 * 1024, 'Fixture artifact exceeds 32 MiB budget') + with open(path, 'rb') as stream: data = stream.read() + return {'path': path.replace('\\', '/'), 'sha256': hashlib.sha256(data).hexdigest(), 'bytes': len(data)} + +def register(document, document_id, role): + require(not any(d == document for d in run['baselineObjects']), 'Creation returned a baseline document') + require(document_id not in run['documents'], 'Runtime ID is already registered') + # Retain exact object first, including if marker creation later fails. + row = {'object': document, 'documentId': document_id, 'role': role, + 'creationId': document.creationId, 'name': document.name, 'closed': False, 'checkpoint': None} + run['documents'][document_id] = row + require(not document.isSaved and document.name.startswith('Untitled'), 'Only new unnamed designs are owned') + design = adsk.fusion.Design.cast(document.products.itemByProductType('DesignProductType')) + design.rootComponent.attributes.add('AdomRalph', 'owner', REQUEST['runId']) + design.rootComponent.attributes.add('AdomRalph', 'documentId', document_id) + return row + +def public_row(row): + return {k: v for k, v in row.items() if k not in ('object', 'witness')} + +if action == 'begin': + idle() + require(run is None, 'Native run registry already exists; use recover') + require(app.documents.count > 0, 'An existing active design is required for a read-only baseline') + baseline = documents() + require(baseline == REQUEST['baseline'], 'Documents changed after baseline; refusing to start') + scratch = os.path.join(tempfile.gettempdir(), 'adom-fusion-ralph', REQUEST['runId']) + require(not os.path.exists(scratch), 'Run scratch already exists') + parent = os.path.dirname(scratch) + require(os.path.realpath(parent) == os.path.abspath(parent), 'Scratch parent resolves through a link') + os.makedirs(scratch) + run = {'sessionId': REQUEST['sessionId'], 'documents': {}, 'scratch': scratch, + 'baselineObjects': list(app.documents), 'baseline': baseline, + 'activeObject': app.activeDocument, 'activeFingerprint': fingerprint(app.activeDocument)} + registries[REQUEST['runId']] = run + result = {'success': True, 'scratch': scratch.replace('\\', '/'), 'documents': baseline} +else: + require(run is not None and run['sessionId'] == REQUEST['sessionId'], 'Native registry/session missing; no close attempted') + if action == 'inventory': + result = {'success': True, 'documents': [public_row(r) for r in run['documents'].values()], + 'provisionalImportCount': len(run.get('provisionalImports', [])), + 'scratch': run['scratch'].replace('\\', '/')} + elif action == 'register': + idle() + document, design, document_id = core.active(app) + require(document_id == REQUEST['documentId'], 'Active runtime document differs from typed creation result') + row = register(document, document_id, REQUEST['role']) + result = {'success': True, **public_row(row)} + elif action in ('witness', 'verify', 'activate', 'close', 'checkpoint', 'capture'): + row = owned(REQUEST['documentId'], action in ('close', 'verify')) + document = row['object'] + if action == 'verify': + if not row.get('closed'): + checkpoint = row['checkpoint'] + require(checkpoint is not None, 'No verified native checkpoint') + require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed') + require(same(witness(document), row['witness']), 'Model changed since checkpoint') + result = {'success': True, 'documentId': row['documentId'], 'ownerRunId': REQUEST['runId'], 'closed': row['closed']} + elif action == 'witness': + require(app.activeDocument == document, 'Active document changed; no implicit activation') + result = {'success': True, 'documentId': row['documentId'], 'witness': witness(document)} + elif action == 'activate': + idle() + require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']), + 'User selected an external document; refusing activation') + if app.activeDocument != document: + require(document.activate(), 'Owned document activation failed') + result = {'success': True, 'documentId': row['documentId']} + elif action == 'close': + idle() + if not row['closed']: + require(any(app.activeDocument == r['object'] for r in run['documents'].values() if not r['closed']), + 'User selected an external document; refusing lifecycle changes') + checkpoint = row['checkpoint'] + require(checkpoint is not None, 'No verified native checkpoint') + require(file_info(checkpoint['path'])['sha256'] == checkpoint['sha256'], 'Checkpoint bytes changed') + require(same(witness(document), row['witness']), 'Model changed since checkpoint') + require(document.close(False), 'Owned document close returned false') + require(not any(d == document for d in app.documents), 'Owned document still appears in open documents') + row['closed'] = True + result = {'success': True, 'closedDocumentId': row['documentId'], 'closed': True} + elif action == 'capture': + require(app.activeDocument == document, 'Active document changed before capture') + path = path_in_scratch(REQUEST['path']) + require(not os.path.exists(path), 'Capture destination already exists') + viewport = app.activeViewport + viewport.fit() + viewport.refresh() + require(viewport.saveAsImageFile(path, 1280, 900), 'Viewport capture failed') + result = {'success': True, **file_info(path)} + else: + idle() + require(app.activeDocument == document, 'Active document changed before roundtrip') + path = path_in_scratch(REQUEST['path']) + archive = file_info(path) + before = witness(document) + options = app.importManager.createFusionArchiveImportOptions(path) + imported = app.importManager.importToNewDocument(options) + # Keep the actual returned API object before any fragile getter or + # identity lookup. A provisional object can only be retained/reported. + provisional = {'object': imported} + run.setdefault('provisionalImports', []).append(provisional) + require(imported is not None and app.activeDocument == imported, 'Archive import returned no active document') + reopened_doc, reopened_design, reopened_id = core.active(app) + require(reopened_doc == imported, 'Imported document identity mismatch') + reopened = register(imported, reopened_id, row['role'] + '-reopened') + run['provisionalImports'].remove(provisional) + after = witness(imported) + require(same(before, after), 'Native archive roundtrip changed measured model state') + # Mark both sides only after independent semantic comparison. + for item in (row, reopened): + item['checkpoint'] = archive + item['witness'] = before + result = {'success': True, 'archive': archive, 'before': before, 'after': after, + 'reopened': public_row(reopened), 'source': public_row(row)} + elif action == 'file': + info = file_info(REQUEST['path']) + with open(info['path'], 'rb') as stream: data = stream.read() + result = {'success': True, **info, 'base64': base64.b64encode(data).decode('ascii')} + if REQUEST.get('csv'): + with open(info['path'], encoding='utf-8', newline='') as stream: + result['rows'] = list(csv.DictReader(stream)) + elif action == 'restore': + idle() + require(not run.get('provisionalImports'), 'Unresolved imported object remains; restoration refused') + require(all(row['closed'] for row in run['documents'].values()), 'Owned documents remain open') + require(len(list(app.documents)) == len(run['baselineObjects']) and + all(any(d == original for d in app.documents) for original in run['baselineObjects']), + 'Document set changed; refusing to change active document') + require(documents() == run['baseline'], 'Original document flags changed') + original = run['activeObject'] + if app.activeDocument != original: + require(original.activate(), 'Original document activation failed') + require(fingerprint(original) == run['activeFingerprint'], 'Original active document changed') + result = {'success': True, 'documents': documents(), 'activeCreationId': original.creationId} + else: + raise RuntimeError('Unknown native action') +''' + + +def native_script(action, *, run_id, host, session_id, **values): + request = dict(values, action=action, runId=run_id, host=host, sessionId=session_id) + # repr around JSON prevents input being interpreted as Python source. + return "import json\nREQUEST = json.loads(" + repr(json.dumps(request)) + ")\n" + NATIVE_PROGRAM diff --git a/docs/mechanical-verification/cp8/ordinary/live-runtime-identity.json b/docs/mechanical-verification/cp8/ordinary/live-runtime-identity.json new file mode 100644 index 0000000..94b3fb6 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/live-runtime-identity.json @@ -0,0 +1,51 @@ +{ + "reportedRunningVersion": "1.12.0-dev.5", + "installedVersion": "1.12.0-dev.8", + "expectedIdentity": { + "host": "ADOM_DREW2", + "pid": 42780, + "port": 50618, + "executablePath": "C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges-cache\\fusion360\\adom-fusion-bridge.exe", + "image": "adom-fusion-bridge.exe" + }, + "observed": { + "image": "adom-fusion-bridge.exe", + "listenerAddresses": [ + "127.0.0.1" + ], + "executablePath": "C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges-cache\\fusion360\\adom-fusion-bridge.exe", + "stable": true, + "processCreatedUtc": "2026-10-05T21:01:31.6721740Z", + "host": "ADOM_DREW2", + "health": { + "status": "ok", + "busy": false, + "longOp": null, + "led": "green", + "summary": "Fusion ready", + "tooltip": "Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.", + "bridgeVersion": "1.12.0-dev.8", + "fusion": { + "installed": true, + "exe_path": "C:\\Users\\drew\\AppData\\Local\\Autodesk\\webdeploy\\production\\6a0c9611291d45bb9226980209917c3d\\FusionLauncher.exe", + "addins_dir": "C:\\Users\\drew\\AppData\\Roaming\\Autodesk\\FusionAddins", + "addin_installed": true, + "running": true + }, + "addin": { + "busy": false, + "version": "1.12.0-dev.8", + "pyThreads": 4 + }, + "shell": "rust", + "needsSignin": false, + "licensingDialog": false, + "windowTitle": "Untitled - Autodesk Fusion ", + "windowFactsDegraded": false, + "windowFactsError": null, + "exePort": 50618 + }, + "pid": 42780, + "port": 50618 + } +} diff --git a/docs/mechanical-verification/cp8/ordinary/ownership.json b/docs/mechanical-verification/cp8/ordinary/ownership.json new file mode 100644 index 0000000..9183818 --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/ownership.json @@ -0,0 +1,104 @@ +{ + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "target": "adom_drew2", + "state": "complete", + "documents": { + "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38": { + "role": "01-ordinary", + "metadata": { + "creationId": "94431d29-0acf-4799-b677-3f564085aa9d", + "name": "Untitled", + "closed": true + }, + "checkpoint": { + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "verified": true + } + }, + "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f": { + "role": "01-ordinary-reopened", + "metadata": { + "creationId": "0b49e8af-f3ee-4bb8-86a0-57acd542eedd", + "name": "Untitled", + "closed": true + }, + "checkpoint": { + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "verified": true + } + } + }, + "files": { + "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png": { + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "retain": true + }, + "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d": { + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "retain": true + } + }, + "preferences": {}, + "customCleanup": [], + "cleanup": [ + { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true + } + }, + { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "success": true + } + } + ], + "hostScratch": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "host": "ADOM_DREW2", + "lastDispatch": { + "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" + }, + "pendingRegistrations": {}, + "cleanupLatest": { + "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38": { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true + } + }, + "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f": { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "success": true + } + } + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/ordinary/report.json b/docs/mechanical-verification/cp8/ordinary/report.json new file mode 100644 index 0000000..b69cfec --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/report.json @@ -0,0 +1,2396 @@ +{ + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "target": "adom_drew2", + "host": "ADOM_DREW2", + "native": "PASS", + "cleanup": "PASS", + "visual": { + "status": "PASS", + "reviewer": "Codex root visual review", + "annotations": [ + { + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "verdict": "PASS", + "notes": "One complete rectangular solid is centered in an isometric native viewport. Three shaded faces and their edges are visible; the model is not clipped or obscured. Dimensions and rollback correctness are established by the separate native measurements, not this image." + } + ], + "scope": "Native model viewport appearance; does not prove application chrome or picker UI." + }, + "overall": "PASS", + "checks": [ + { + "label": "Durable history capability is explicit", + "status": "PASS", + "evidence": { + "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 + } + }, + { + "label": "Created box complete healthy timeline", + "status": "PASS", + "evidence": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + } + }, + { + "label": "Created box native volume", + "status": "PASS", + "evidence": { + "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 + } + }, + { + "label": "Created box independent instance volume", + "status": "PASS", + "evidence": 6000.0 + }, + { + "label": "Created box native instance count", + "status": "PASS", + "evidence": 1 + }, + { + "label": "Created box public and native physical properties", + "status": "PASS", + "evidence": { + "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 + } + }, + { + "label": "Creation source and result are distinct exact documents", + "status": "PASS", + "evidence": null + }, + { + "label": "Exactly one document created", + "status": "PASS", + "evidence": null + }, + { + "label": "new_design exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Creation replay is byte-equivalent semantic result", + "status": "PASS", + "evidence": { + "_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 + } + }, + { + "label": "Creation replay creates no document or geometry", + "status": "PASS", + "evidence": null + }, + { + "label": "Changed digest refuses without model/document effects", + "status": "PASS", + "evidence": null + }, + { + "label": "new_design exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Conflict preserves original durable record", + "status": "PASS", + "evidence": null + }, + { + "label": "Owned box depth identity, units and initial value match", + "status": "PASS", + "evidence": { + "displayUnit": "mm", + "expression": "10.0 mm", + "name": "depth", + "unit": "mm", + "value": 10.0 + } + }, + { + "label": "Edited box complete healthy timeline", + "status": "PASS", + "evidence": { + "complete": true, + "computeSucceeded": null, + "faults": [], + "healthy": true, + "suppressed": [], + "timelineCount": 2, + "unknown": [] + } + }, + { + "label": "Edited box native volume", + "status": "PASS", + "evidence": { + "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 + } + }, + { + "label": "Edited box independent instance volume", + "status": "PASS", + "evidence": 12000.0 + }, + { + "label": "Edited box native instance count", + "status": "PASS", + "evidence": 1 + }, + { + "label": "Edited box public and native physical properties", + "status": "PASS", + "evidence": { + "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 + } + }, + { + "label": "parameter_set exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Transport metadata preserves canonical identity", + "status": "PASS", + "evidence": { + "_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 + } + }, + { + "label": "parameter_set exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Parameter replay preserves exact geometry and terminal history", + "status": "PASS", + "evidence": null + }, + { + "label": "Intended atomic failure verifies recovery", + "status": "PASS", + "evidence": { + "_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 + } + }, + { + "label": "Independent native geometry/parameter witness restored", + "status": "PASS", + "evidence": null + }, + { + "label": "parameter_batch exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Failed operation replay remains the original failure", + "status": "PASS", + "evidence": null + }, + { + "label": "parameter_batch exact durable terminal contract", + "status": "PASS", + "evidence": { + "errors": [], + "status": { + "_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 + } + } + }, + { + "label": "Failed replay preserves witness and immutable terminal record", + "status": "PASS", + "evidence": null + }, + { + "label": "01-ordinary archive preserves native witness", + "status": "PASS", + "evidence": { + "bytes": 73647, + "path": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac" + } + }, + { + "label": "Original documents restored", + "status": "PASS", + "evidence": { + "activeCreationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "documents": [ + { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "modified": false, + "name": "Untitled", + "saved": false + } + ], + "success": true + } + }, + { + "label": "Preferences preserved", + "status": "PASS", + "evidence": { + "activeTheme": "darkblue", + "cameraPivot": true, + "gestureNav": true, + "invertScrollZoom": true, + "lengthUnit": "mm", + "modelingOrientation": "zup", + "orbitScheme": "fusion360", + "theme": "device" + } + }, + { + "label": "Runtime configuration and development pin preserved", + "status": "PASS", + "evidence": { + "name": "fusion360", + "devPinned": true, + "paused": false, + "runningVersion": "1.12.0-dev.5", + "installedVersion": "1.12.0-dev.8", + "entryMismatch": false, + "instanceCount": 1 + } + }, + { + "label": "Actual native runtime identity preserved", + "status": "PASS", + "evidence": { + "image": "adom-fusion-bridge.exe", + "listenerAddresses": [ + "127.0.0.1" + ], + "executablePath": "C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges-cache\\fusion360\\adom-fusion-bridge.exe", + "stable": true, + "processCreatedUtc": "2026-10-05T21:01:31.6721740Z", + "host": "ADOM_DREW2", + "health": { + "status": "ok", + "busy": false, + "longOp": null, + "led": "green", + "summary": "Fusion ready", + "tooltip": "Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.", + "bridgeVersion": "1.12.0-dev.8", + "fusion": { + "installed": true, + "exe_path": "C:\\Users\\drew\\AppData\\Local\\Autodesk\\webdeploy\\production\\6a0c9611291d45bb9226980209917c3d\\FusionLauncher.exe", + "addins_dir": "C:\\Users\\drew\\AppData\\Roaming\\Autodesk\\FusionAddins", + "addin_installed": true, + "running": true + }, + "addin": { + "busy": false, + "version": "1.12.0-dev.8", + "pyThreads": 4 + }, + "shell": "rust", + "needsSignin": false, + "licensingDialog": false, + "windowTitle": "Untitled - Autodesk Fusion ", + "windowFactsDegraded": false, + "windowFactsError": null, + "exePort": 50618 + }, + "pid": 42780, + "port": 50618 + } + } + ], + "artifacts": [ + { + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/artifacts/01-ordinary-c7248642.png", + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "bytes": 16170, + "width": 1280, + "height": 900, + "kind": "viewport", + "hostPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.png", + "fixture": "01-ordinary" + }, + { + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/artifacts/01-ordinary-c7248642.f3d", + "sha256": "8865a5beed1a39889ac445aa061a358c66e076cc04ca8c26414a9051d9d23aac", + "bytes": 73647, + "kind": "native-archive", + "hostPath": "C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/01-ordinary-c7248642.f3d", + "fixture": "01-ordinary" + } + ], + "fixtures": [ + { + "name": "01-ordinary", + "status": "PASS", + "checks": 31 + } + ], + "requestedFixtures": [ + "01-ordinary" + ], + "limitations": [ + "Ordinary synchronous durable writes only; no native restart/crash/fault inference.", + "Native, archive/cleanup and hash-bound visual review remain separate." + ], + "harnessSources": [ + { + "name": "ralph_jobs.py", + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_jobs.py", + "sha256": "4322d735104fb82f722fe03a1a806f6cc64fb264541ef22968111df14150a56f" + }, + { + "name": "ralph_mechanical.py", + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_mechanical.py", + "sha256": "ab7451dbc3dda32442128a6262aebf3b9b53884571c6174e9bc2151e5f912d2e" + }, + { + "name": "ralph_support.py", + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/ralph_support.py", + "sha256": "a152fed6766ba0e86f89a84b52ce9090bcabcbc3bf888ae1b7f7b08836895e27" + }, + { + "name": "fusion_harness.py", + "path": "/home/adom/project/research/fusion-mechanical-verification-2026-10-02/cp8-r6-ordinary-1/harness-20261005T210310Z-568fe7869d0b41d5a83014811fe170ac/fusion_harness.py", + "sha256": "0ded009f2ad0b5d8919ac215b9366df2b44d9ef98416e5f4a076e36656f88ec2" + } + ], + "acceptanceScope": { + "ordinary": "PASS", + "restart_history": "NOT_RUN", + "interrupted_native_execution": "NOT_RUN", + "disk_or_commit_faults": "NOT_RUN", + "busy_native_queue": "NOT_RUN" + }, + "baseline": { + "state": { + "_hint": "Fusion is clear. The screenshot shows the current surface - this is the verb to render any fusion_show_* result (they open in the background by design).", + "_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.", + "activeDocument": "Untitled", + "addinResponding": true, + "blockingDialogs": [], + "dialogs": [], + "drivingBadge": { + "active": false, + "enabled": true, + "idleShedSeconds": 300, + "lastDrivingVerbAt": null, + "lastError": null + }, + "durationMs": 226, + "error": "", + "focusEvents": [], + "hwnd": 29757446, + "mainThreadBusy": null, + "output": "{\"running\":true,\"activeDocument\":\"Untitled\",\"mainThreadBusy\":null,\"blockingDialogs\":[],\"screenshot\":null}", + "rect": { + "bottom": 1549, + "height": 1549, + "left": -11, + "right": 2572, + "top": 0, + "width": 2583 + }, + "running": true, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60, + "timings": { + "launch": { + "cold": { + "count": 10, + "lastAt": 1791234147, + "p50": 41.1, + "p90": 216.2 + }, + "warm": { + "count": 2, + "lastAt": 1791230617, + "p50": 0.0, + "p90": 1.0 + } + }, + "verb:activate_document": { + "any": { + "count": 3, + "lastAt": 1789145672, + "p50": 3.1, + "p90": 5.6 + } + }, + "verb:addin_status": { + "any": { + "count": 3, + "lastAt": 1788899767, + "p50": 2.0, + "p90": 2.0 + } + }, + "verb:aps_browse": { + "any": { + "count": 4, + "lastAt": 1789143968, + "p50": 1.9, + "p90": 2.3 + } + }, + "verb:aps_file_info": { + "any": { + "count": 10, + "lastAt": 1789144745, + "p50": 34.8, + "p90": 36.2 + } + }, + "verb:aps_get_browser": { + "any": { + "count": 1, + "lastAt": 1787944552, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:aps_open": { + "any": { + "count": 5, + "lastAt": 1788196241, + "p50": 0.2, + "p90": 37.2 + } + }, + "verb:aps_search": { + "any": { + "count": 10, + "lastAt": 1789684900, + "p50": 35.7, + "p90": 65.6 + } + }, + "verb:aps_signin": { + "any": { + "count": 2, + "lastAt": 1787949063, + "p50": 0.4, + "p90": 1.1 + } + }, + "verb:aps_status": { + "any": { + "count": 10, + "lastAt": 1788899782, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:assembly_bom": { + "any": { + "count": 3, + "lastAt": 1790955710, + "p50": 0.1, + "p90": 0.6 + } + }, + "verb:check_dialogs": { + "any": { + "count": 1, + "lastAt": 1788195388, + "p50": 1.4, + "p90": 1.4 + } + }, + "verb:close_document": { + "any": { + "count": 9, + "lastAt": 1789145809, + "p50": 6.7, + "p90": 46.1 + } + }, + "verb:describe": { + "any": { + "count": 3, + "lastAt": 1789144008, + "p50": 0.0, + "p90": 0.0 + } + }, + "verb:document_info": { + "any": { + "count": 10, + "lastAt": 1791233607, + "p50": 0.2, + "p90": 0.2 + } + }, + "verb:eagle_import_status": { + "any": { + "count": 1, + "lastAt": 1790978404, + "p50": 1.8, + "p90": 1.8 + } + }, + "verb:electron_run": { + "any": { + "count": 10, + "lastAt": 1788456727, + "p50": 6.3, + "p90": 13.3 + } + }, + "verb:export_cloud_file": { + "any": { + "count": 4, + "lastAt": 1789685179, + "p50": 223.4, + "p90": 290.3 + } + }, + "verb:export_eagle_source": { + "any": { + "count": 10, + "lastAt": 1788456713, + "p50": 1.7, + "p90": 2.2 + } + }, + "verb:export_f3d": { + "any": { + "count": 2, + "lastAt": 1790955227, + "p50": 3.7, + "p90": 4.4 + } + }, + "verb:export_obj": { + "any": { + "count": 2, + "lastAt": 1787944913, + "p50": 0.7, + "p90": 0.7 + } + }, + "verb:export_step": { + "any": { + "count": 10, + "lastAt": 1788456783, + "p50": 5.5, + "p90": 7.9 + } + }, + "verb:get_app_state": { + "any": { + "count": 10, + "lastAt": 1791234147, + "p50": 1.3, + "p90": 3.6 + } + }, + "verb:get_design_info": { + "any": { + "count": 5, + "lastAt": 1788900070, + "p50": 5.2, + "p90": 10.8 + } + }, + "verb:help": { + "any": { + "count": 1, + "lastAt": 1788194522, + "p50": 1.0, + "p90": 1.0 + } + }, + "verb:kill": { + "any": { + "count": 1, + "lastAt": 1787833443, + "p50": 66.9, + "p90": 66.9 + } + }, + "verb:list_cloud_files": { + "any": { + "count": 1, + "lastAt": 1787832975, + "p50": 15.8, + "p90": 15.8 + } + }, + "verb:mcp_call": { + "any": { + "count": 5, + "lastAt": 1788455586, + "p50": 0.0, + "p90": 1.8 + } + }, + "verb:mech_capabilities": { + "any": { + "count": 10, + "lastAt": 1791233611, + "p50": 0.1, + "p90": 0.2 + } + }, + "verb:mech_operation_status": { + "any": { + "count": 10, + "lastAt": 1791229196, + "p50": 0.1, + "p90": 0.1 + } + }, + "verb:mechanical": { + "any": { + "count": 10, + "lastAt": 1791233999, + "p50": 0.8, + "p90": 1.4 + } + }, + "verb:open_by_urn": { + "any": { + "count": 10, + "lastAt": 1789144985, + "p50": 43.4, + "p90": 59.1 + } + }, + "verb:open_cloud_file": { + "any": { + "count": 8, + "lastAt": 1789666231, + "p50": 24.2, + "p90": 87.5 + } + }, + "verb:open_design": { + "any": { + "count": 3, + "lastAt": 1790955721, + "p50": 5.9, + "p90": 6.1 + } + }, + "verb:open_lbr": { + "any": { + "count": 2, + "lastAt": 1788195396, + "p50": 2.7, + "p90": 5.0 + } + }, + "verb:physical_properties": { + "any": { + "count": 3, + "lastAt": 1790955710, + "p50": 0.1, + "p90": 0.2 + } + }, + "verb:readiness": { + "any": { + "count": 5, + "lastAt": 1788900108, + "p50": 14.9, + "p90": 56.9 + } + }, + "verb:restart_for_addin": { + "any": { + "count": 10, + "lastAt": 1791234174, + "p50": 0.0, + "p90": 125.2 + } + }, + "verb:run_modeling_script": { + "any": { + "count": 10, + "lastAt": 1791234017, + "p50": 1.8, + "p90": 2.1 + } + }, + "verb:search_cloud_files": { + "any": { + "count": 3, + "lastAt": 1789143642, + "p50": 0.0, + "p90": 0.4 + } + }, + "verb:show_2d_board": { + "any": { + "count": 2, + "lastAt": 1788456656, + "p50": 26.6, + "p90": 34.9 + } + }, + "verb:show_3d_board": { + "any": { + "count": 6, + "lastAt": 1788456760, + "p50": 10.2, + "p90": 19.6 + } + }, + "verb:signin": { + "any": { + "count": 1, + "lastAt": 1788899909, + "p50": 56.1, + "p90": 56.1 + } + }, + "verb:start": { + "any": { + "count": 7, + "lastAt": 1791230617, + "p50": 57.4, + "p90": 64.9 + } + }, + "verb:status": { + "any": { + "count": 2, + "lastAt": 1788194217, + "p50": 0.8, + "p90": 1.0 + } + }, + "verb:stop": { + "any": { + "count": 1, + "lastAt": 1787831926, + "p50": 19.7, + "p90": 19.7 + } + }, + "verb:window_info": { + "any": { + "count": 10, + "lastAt": 1788899841, + "p50": 7.2, + "p90": 10.9 + } + } + }, + "timingsSentence": "on this machine Fusion starts in cold 41s, warm 0s (measured)", + "title": "Untitled - Autodesk Fusion " + }, + "addin": { + "_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.", + "addinStale": false, + "addinVersion": "1.12.0-dev.8", + "busy": false, + "durationMs": 57, + "error": "", + "expectedAddinVersion": "1.12.0-dev.8", + "output": "{\"busy\":false,\"version\":\"1.12.0-dev.8\",\"pyThreads\":4,\"addinVersion\":\"1.12.0-dev.8\",\"expectedAddinVersion\":\"1.12.0-dev.8\",\"addinStale\":false}", + "pyThreads": 4, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 60, + "version": "1.12.0-dev.8" + }, + "runtime": { + "name": "fusion360", + "devPinned": true, + "paused": false, + "runningVersion": "1.12.0-dev.5", + "installedVersion": "1.12.0-dev.8", + "entryMismatch": false, + "instanceCount": 1 + }, + "liveIdentity": { + "image": "adom-fusion-bridge.exe", + "listenerAddresses": [ + "127.0.0.1" + ], + "executablePath": "C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges-cache\\fusion360\\adom-fusion-bridge.exe", + "stable": true, + "processCreatedUtc": "2026-10-05T21:01:31.6721740Z", + "host": "ADOM_DREW2", + "health": { + "status": "ok", + "busy": false, + "longOp": null, + "led": "green", + "summary": "Fusion ready", + "tooltip": "Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.", + "bridgeVersion": "1.12.0-dev.8", + "fusion": { + "installed": true, + "exe_path": "C:\\Users\\drew\\AppData\\Local\\Autodesk\\webdeploy\\production\\6a0c9611291d45bb9226980209917c3d\\FusionLauncher.exe", + "addins_dir": "C:\\Users\\drew\\AppData\\Roaming\\Autodesk\\FusionAddins", + "addin_installed": true, + "running": true + }, + "addin": { + "busy": false, + "version": "1.12.0-dev.8", + "pyThreads": 4 + }, + "shell": "rust", + "needsSignin": false, + "licensingDialog": false, + "windowTitle": "Untitled - Autodesk Fusion ", + "windowFactsDegraded": false, + "windowFactsError": null, + "exePort": 50618 + }, + "pid": 42780, + "port": 50618 + }, + "preferences": { + "activeTheme": "darkblue", + "cameraPivot": true, + "gestureNav": true, + "invertScrollZoom": true, + "lengthUnit": "mm", + "modelingOrientation": "zup", + "orbitScheme": "fusion360", + "theme": "device" + }, + "native": { + "activeCommand": "SelectCommand", + "activeCreationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "activeProductType": "DesignProductType", + "documents": [ + { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "modified": false, + "name": "Untitled", + "saved": false + } + ], + "fusionVersion": "2705.1.30", + "host": "adom_drew2", + "platform": "Windows", + "temporaryDirectory": "C:/Users/drew/AppData/Local/Temp" + } + }, + "sessionId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d", + "cleanupEvidence": [ + { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true + } + }, + { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "success": true + } + } + ], + "cleanupLatest": { + "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38": { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:62ef982d-2751-4709-be62-b9da61c64a38", + "success": true + } + }, + "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f": { + "label": "close owned document 3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "status": "PASS", + "errors": [], + "raw": { + "closed": true, + "closedDocumentId": "3c5e6744-d1ac-4276-9264-b05a96c51e3d:bb8e2d0e-e1e5-4d0e-bf83-9a604ff0e73f", + "success": true + } + } + }, + "finalRuntimeIdentity": { + "image": "adom-fusion-bridge.exe", + "listenerAddresses": [ + "127.0.0.1" + ], + "executablePath": "C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges-cache\\fusion360\\adom-fusion-bridge.exe", + "stable": true, + "processCreatedUtc": "2026-10-05T21:01:31.6721740Z", + "host": "ADOM_DREW2", + "health": { + "status": "ok", + "busy": false, + "longOp": null, + "led": "green", + "summary": "Fusion ready", + "tooltip": "Fusion 360 running, AdomBridge add-in connected. All fusion_* verbs available.", + "bridgeVersion": "1.12.0-dev.8", + "fusion": { + "installed": true, + "exe_path": "C:\\Users\\drew\\AppData\\Local\\Autodesk\\webdeploy\\production\\6a0c9611291d45bb9226980209917c3d\\FusionLauncher.exe", + "addins_dir": "C:\\Users\\drew\\AppData\\Roaming\\Autodesk\\FusionAddins", + "addin_installed": true, + "running": true + }, + "addin": { + "busy": false, + "version": "1.12.0-dev.8", + "pyThreads": 4 + }, + "shell": "rust", + "needsSignin": false, + "licensingDialog": false, + "windowTitle": "Untitled - Autodesk Fusion ", + "windowFactsDegraded": false, + "windowFactsError": null, + "exePort": 50618 + }, + "pid": 42780, + "port": 50618 + }, + "finalHost": { + "activeCreationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "documents": [ + { + "creationId": "70b2c575-f830-4751-9f88-2f1f3ab91fb1", + "modified": false, + "name": "Untitled", + "saved": false + } + ], + "success": true + }, + "counts": { + "PASS": 35, + "FAIL": 0 + } +} diff --git a/docs/mechanical-verification/cp8/ordinary/visual-annotations.json b/docs/mechanical-verification/cp8/ordinary/visual-annotations.json new file mode 100644 index 0000000..be85cfe --- /dev/null +++ b/docs/mechanical-verification/cp8/ordinary/visual-annotations.json @@ -0,0 +1,7 @@ +[ + { + "sha256": "d28188ea14eef9bf1c57410f63ed5eb1fdca365adec4ca1342810ecc03850fc1", + "verdict": "PASS", + "notes": "One complete rectangular solid is centered in an isometric native viewport. Three shaded faces and their edges are visible; the model is not clipped or obscured. Dimensions and rollback correctness are established by the separate native measurements, not this image." + } +] diff --git a/docs/mechanical-verification/cp8/restart/after-native.py b/docs/mechanical-verification/cp8/restart/after-native.py new file mode 100644 index 0000000..4b75bc9 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/after-native.py @@ -0,0 +1,13 @@ +import threading +assert threading.current_thread() is threading.main_thread() +import adsk.core, adsk.fusion, os, platform, json +app=adsk.core.Application.get() +assert app.documents.count == 1 +doc=app.activeDocument +assert doc is not None and app.documents.item(0)==doc +assert not doc.isModified and not doc.isSaved and doc.dataFile is None +assert app.userInterface.activeCommand in ('', 'SelectCommand', 'Select') +design=adsk.fusion.Design.cast(doc.products.itemByProductType('DesignProductType')) +assert design is not None +assert design.rootComponent.bRepBodies.count == design.rootComponent.sketches.count == design.rootComponent.allOccurrences.count == design.timeline.count == 0 +result={'success':True,'pid':os.getpid(),'host':platform.node(),'fusionVersion':app.version,'creationId':doc.creationId,'modified':doc.isModified,'saved':doc.isSaved,'geometryEmpty':True} diff --git a/docs/mechanical-verification/cp8/restart/before-native.py b/docs/mechanical-verification/cp8/restart/before-native.py new file mode 100644 index 0000000..e495e4a --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/before-native.py @@ -0,0 +1,20 @@ +expected={'runId': '20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'sessionId': '3c5e6744-d1ac-4276-9264-b05a96c51e3d', 'host': 'ADOM_DREW2', 'pid': 41728, 'scratch': 'C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'nonce': '7575c5bb7b3b474ab621f55d649416a4', 'original': {'creationId': '70b2c575-f830-4751-9f88-2f1f3ab91fb1', 'modified': False, 'name': 'Untitled', 'saved': False}} + +assert os.getpid()==expected['pid'] and platform.node().lower()==expected['host'].lower() +registry=getattr(builtins,'_adom_mechanical_ralph_runs',None) +assert isinstance(registry,dict) and expected['runId'] in registry +owned_run=registry[expected['runId']] +assert not owned_run.get('provisionalImports') and not owned_run.get('retainRequired') +assert all(row.get('closed') is True and not row.get('retainRequired') for row in owned_run['documents'].values()) +assert app.documents.count==1 and len(owned_run['baselineObjects'])==1 +original=owned_run['activeObject'] +assert app.activeDocument==app.documents.item(0)==owned_run['baselineObjects'][0]==original +fingerprint={'creationId':original.creationId,'name':original.name,'modified':original.isModified,'saved':original.isSaved} +assert fingerprint==expected['original']==owned_run['activeFingerprint'] +assert not original.isModified and not original.isSaved and original.dataFile is None +assert app.userInterface.activeCommand in ('','SelectCommand','Select') +assert len([m for n,m in list(sys.modules.items()) if n.endswith('.mechanical.core') and getattr(m,'SESSION_ID',None)==expected['sessionId']])==1 +design=adsk.fusion.Design.cast(original.products.itemByProductType('DesignProductType')) +assert design is not None +assert design.rootComponent.bRepBodies.count==design.rootComponent.sketches.count==design.rootComponent.allOccurrences.count==design.timeline.count==0 +result={'success':True,'pid':os.getpid(),'sessionId':expected['sessionId'],'original':fingerprint} diff --git a/docs/mechanical-verification/cp8/restart/calls/0001-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0001-run_script.json new file mode 100644 index 0000000..01bd512 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0001-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwppZigkY3A4UHJvY2Vzc2VzLkNvdW50IC1uZSAxKXt0aHJvdyAnRXhwZWN0ZWQgZXhhY3RseSBvbmUgRnVzaW9uIHByb2Nlc3MnfTsKJGNwOFByb2Nlc3M9JGNwOFByb2Nlc3Nlc1swXTsKQHtob3N0PSRlbnY6Q09NUFVURVJOQU1FOyBwaWQ9W2ludF0kY3A4UHJvY2Vzcy5Qcm9jZXNzSWQ7IGNyZWF0ZWRVdGM9JGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJyk7IGV4ZWN1dGFibGU9JGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGh9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCg==", + "timeoutSeconds": 12, + "reason": "Read process identity for the controlled Fusion restart history test" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwppZigkY3A4UHJvY2Vzc2VzLkNvdW50IC1uZSAxKXt0aHJvdyAnRXhwZWN0ZWQgZXhhY3RseSBvbmUgRnVzaW9uIHByb2Nlc3MnfTsKJGNwOFByb2Nlc3M9JGNwOFByb2Nlc3Nlc1swXTsKQHtob3N0PSRlbnY6Q09NUFVURVJOQU1FOyBwaWQ9W2ludF0kY3A4UHJvY2Vzcy5Qcm9jZXNzSWQ7IGNyZWF0ZWRVdGM9JGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJyk7IGV4ZWN1dGFibGU9JGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGh9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCg==\", \"timeoutSeconds\": 12, \"reason\": \"Read process identity for the controlled Fusion restart history test\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235627.5949585, + "mutating": false, + "stdout": "{\n \"durationMs\": 795,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"pid\\\":41728,\\\"createdUtc\\\":\\\"2026-10-05T21:01:46.6536380Z\\\",\\\"executable\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Autodesk\\\\\\\\webdeploy\\\\\\\\production\\\\\\\\736d2b4c5e6b95e77c11721da222cf21c6a1fc1f\\\\\\\\Fusion360.exe\\\"}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235628.4617362, + "raw": { + "durationMs": 795, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"pid\":41728,\"createdUtc\":\"2026-10-05T21:01:46.6536380Z\",\"executable\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Autodesk\\\\webdeploy\\\\production\\\\736d2b4c5e6b95e77c11721da222cf21c6a1fc1f\\\\Fusion360.exe\"}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0002-bridge_list.json b/docs/mechanical-verification/cp8/restart/calls/0002-bridge_list.json new file mode 100644 index 0000000..81c78e6 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0002-bridge_list.json @@ -0,0 +1,1455 @@ +{ + "target": "adom_drew2", + "verb": "bridge_list", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235628.462289, + "mutating": false, + "stdout": "{\n \"_hint\": \"Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.\",\n \"_skillsHint\": \"For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).\",\n \"bridges\": [\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"CAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.\",\n \"devPinned\": true,\n \"displayName\": \"Autodesk Fusion 360\",\n \"docs\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe\",\n \"expectedImage\": \"adom-fusion-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"installSkill\": \"adom-wiki pkg install adom/fusion-bridge\",\n \"installedVersion\": \"1.12.0-dev.8\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791235281522,\n \"latest\": null,\n \"livePids\": [\n 42780\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/fusion360.log\",\n \"manifestSource\": null,\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"fusion360\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.\",\n \"supported\": true\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 50618,\n \"prewarm\": {\n \"assets\": [\n \"AdomBridge add-in sync\",\n \"PCB design-rules catalog cache\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:57Z\",\n \"elapsedMs\": 2344,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"fusion_prewarm\",\n \"version\": \"1.12.0-dev.5\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"fusion_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T06:00:00Z\",\n \"runningImage\": \"adom-fusion-bridge.exe\",\n \"runningVersion\": \"1.12.0-dev.5\",\n \"skillPkg\": \"adom/fusion-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"spawn\": {\n \"entrypoint\": \"adom-fusion-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 50618\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/fusion360\",\n \"status\": \"running\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"tags\": [\n \"fusion360\",\n \"autodesk\",\n \"cad\",\n \"exports\",\n \"aps\",\n \"modeling\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"open\",\n \"seconds\": 150\n }\n ],\n \"verbs\": {\n \"aps_open\": 150,\n \"aps_recent\": 120,\n \"aps_search\": 120,\n \"build_library_3d\": 1800,\n \"capture_library_views\": 600,\n \"close_all_documents\": 90,\n \"demo\": 300,\n \"export_3mf\": 360,\n \"export_board_image\": 90,\n \"export_bom\": 90,\n \"export_cpl\": 90,\n \"export_dwg\": 150,\n \"export_dxf\": 150,\n \"export_f3d\": 360,\n \"export_fbx\": 360,\n \"export_gerbers\": 210,\n \"export_iges\": 360,\n \"export_obj\": 360,\n \"export_sat\": 360,\n \"export_skp\": 360,\n \"export_step\": 360,\n \"export_stl\": 360,\n \"export_usdz\": 360,\n \"generate_package\": 120,\n \"get_preferences\": 25,\n \"install_fusion\": 90,\n \"make_3d_package\": 200,\n \"prewarm\": 120,\n \"run_modeling_script\": 180,\n \"search_cloud_files\": 200,\n \"set_preference\": 40,\n \"signin\": 150,\n \"start\": 90,\n \"walk_cloud_tree\": 620\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 21181.933709008805,\n \"verbCount\": 167,\n \"verbPrefixes\": [\n \"fusion_\"\n ],\n \"verbs\": [\n \"fusion_account\",\n \"fusion_action_ledger\",\n \"fusion_activate_document\",\n \"fusion_addin_status\",\n \"fusion_alerts\",\n \"fusion_apply_fusion_update\",\n \"fusion_aps_browse\",\n \"fusion_aps_create_folder\",\n \"fusion_aps_download\",\n \"fusion_aps_file_info\",\n \"fusion_aps_forget_browser\",\n \"fusion_aps_get\",\n \"fusion_aps_get_browser\",\n \"fusion_aps_open\",\n \"fusion_aps_recent\",\n \"fusion_aps_search\",\n \"fusion_aps_set_browser\",\n \"fusion_aps_set_client_id\",\n \"fusion_aps_signin\",\n \"fusion_aps_status\",\n \"fusion_aps_upload\",\n \"fusion_aps_versions\",\n \"fusion_assembly_bom\",\n \"fusion_attach_3d_package\",\n \"fusion_bind_library_3d\",\n \"fusion_board_info\",\n \"fusion_board_stackup\",\n \"fusion_build_library_3d\",\n \"fusion_cancel_run\",\n \"fusion_capture_library_views\",\n \"fusion_check_recovery\",\n \"fusion_claim_seat\",\n \"fusion_cleanup_cloud_files\",\n \"fusion_close_all_documents\",\n \"fusion_close_document\",\n \"fusion_close_window\",\n \"fusion_create_cloud_folder\",\n \"fusion_create_library\",\n \"fusion_delete_cloud_file\",\n \"fusion_demo\",\n \"fusion_demo_progress\",\n \"fusion_describe\",\n \"fusion_detect_layers\",\n \"fusion_dismiss_blocking_dialogs\",\n \"fusion_document_info\",\n \"fusion_eagle_import_status\",\n \"fusion_electron_pan\",\n \"fusion_electron_run\",\n \"fusion_electron_select\",\n \"fusion_electron_zoom\",\n \"fusion_electronics_query\",\n \"fusion_execute_text_command\",\n \"fusion_export_3mf\",\n \"fusion_export_board_image\",\n \"fusion_export_bom\",\n \"fusion_export_cloud_file\",\n \"fusion_export_cpl\",\n \"fusion_export_dwg\",\n \"fusion_export_dxf\",\n \"fusion_export_eagle_source\",\n \"fusion_export_f3d\",\n \"fusion_export_fbx\",\n \"fusion_export_gerbers\",\n \"fusion_export_iges\",\n \"fusion_export_lbr\",\n \"fusion_export_obj\",\n \"fusion_export_optimized_glb\",\n \"fusion_export_sat\",\n \"fusion_export_skp\",\n \"fusion_export_source\",\n \"fusion_export_step\",\n \"fusion_export_stl\",\n \"fusion_export_usdz\",\n \"fusion_fetch_optimized_glb\",\n \"fusion_generate_package\",\n \"fusion_get_app_state\",\n \"fusion_get_design_info\",\n \"fusion_get_parameters\",\n \"fusion_get_preferences\",\n \"fusion_import_electronics\",\n \"fusion_import_step\",\n \"fusion_inspect_bodies\",\n \"fusion_install_fusion\",\n \"fusion_install_library_bundle\",\n \"fusion_interactive\",\n \"fusion_kill\",\n \"fusion_library_manager\",\n \"fusion_library_parts\",\n \"fusion_list_cloud_files\",\n \"fusion_list_cloud_projects\",\n \"fusion_list_text_commands\",\n \"fusion_live_feed\",\n \"fusion_make_3d_package\",\n \"fusion_make_showcase_project\",\n \"fusion_make_test_project\",\n \"fusion_managed_library_create\",\n \"fusion_managed_library_link\",\n \"fusion_managed_library_pull\",\n \"fusion_managed_library_push\",\n \"fusion_managed_library_unlink\",\n \"fusion_mcp_call\",\n \"fusion_mcp_enable\",\n \"fusion_mcp_resources\",\n \"fusion_mcp_status\",\n \"fusion_mcp_tools\",\n \"fusion_mech_capabilities\",\n \"fusion_mech_operation_status\",\n \"fusion_mechanical\",\n \"fusion_narrate\",\n \"fusion_new_electronics_from_eagle\",\n \"fusion_notify_owner\",\n \"fusion_open_board\",\n \"fusion_open_by_urn\",\n \"fusion_open_by_urn_note\",\n \"fusion_open_cloud_file\",\n \"fusion_open_design\",\n \"fusion_open_electronics\",\n \"fusion_open_lbr\",\n \"fusion_open_schematic\",\n \"fusion_physical_properties\",\n \"fusion_plan_library_import\",\n \"fusion_plan_route\",\n \"fusion_preflight_lbr\",\n \"fusion_prefs_close\",\n \"fusion_prefs_open\",\n \"fusion_prewarm\",\n \"fusion_prove_result\",\n \"fusion_readiness\",\n \"fusion_release_seat\",\n \"fusion_reset_workspace\",\n \"fusion_resolve_seat_dialog\",\n \"fusion_restart_for_addin\",\n \"fusion_route_net\",\n \"fusion_routing_drc\",\n \"fusion_routing_state\",\n \"fusion_run_modeling_script\",\n \"fusion_save_to_cloud\",\n \"fusion_schematic\",\n \"fusion_screenshot_fusion\",\n \"fusion_search_cloud_files\",\n \"fusion_set_auto_update\",\n \"fusion_set_design_rules\",\n \"fusion_set_driving_badge\",\n \"fusion_set_parameter\",\n \"fusion_set_preference\",\n \"fusion_set_seat_takeover\",\n \"fusion_set_window_sizing\",\n \"fusion_show_2d_board\",\n \"fusion_show_3d_board\",\n \"fusion_show_3d_package\",\n \"fusion_show_attributes\",\n \"fusion_show_footprint\",\n \"fusion_show_library\",\n \"fusion_show_project\",\n \"fusion_show_schematic\",\n \"fusion_show_symbol\",\n \"fusion_signin\",\n \"fusion_signin_2fa\",\n \"fusion_start\",\n \"fusion_state\",\n \"fusion_stop\",\n \"fusion_take_screenshot\",\n \"fusion_uninstall\",\n \"fusion_verb_times\",\n \"fusion_view\",\n \"fusion_walk_cloud_tree\",\n \"fusion_web_signin\"\n ],\n \"version\": \"1.12.0-dev.8\",\n \"versionDrift\": true,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"developer-tools\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.\",\n \"devPinned\": false,\n \"displayName\": \"Hydrogen Desktop\",\n \"docs\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"entryMismatch\": false,\n \"entrypoint\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/\",\n \"expectedImage\": null,\n \"heroAvailable\": false,\n \"heroDocs\": \"https://wiki.adom.inc/adom/hydrogen-desktop\",\n \"homepage\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"installPath\": \"\\\\\\\\?\\\\C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Adom Bridge\\\\bridges\\\\hd\",\n \"installSkill\": \"adom-wiki pkg install adom/adom-desktop\",\n \"installedVersion\": \"1.0.0\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": null,\n \"languages\": [],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 0,\n \"latest\": null,\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/hd.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": null,\n \"manifestUrlFollowed\": null,\n \"name\": \"hd\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"HD currently ships Windows-only; Linux variant in scope for HD's future releases.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"HD currently ships Windows-only.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": null,\n \"prewarm\": null,\n \"releasedAt\": \"2026-06-30T13:13:22Z\",\n \"runningImage\": null,\n \"runningVersion\": null,\n \"skillPkg\": \"adom/adom-desktop\",\n \"source\": \"bundled\",\n \"sourceDir\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd\",\n \"spawn\": {\n \"entrypoint\": \"\",\n \"instanceCount\": null,\n \"kind\": \"external-http\",\n \"manifestPort\": 47084,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": null\n },\n \"spawnKind\": \"external-http\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/hd\",\n \"status\": \"stopped\",\n \"statusVerb\": null,\n \"tags\": [\n \"hydrogen-desktop\",\n \"control-api\",\n \"http\",\n \"lifecycle\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 0.0,\n \"verbCount\": 11,\n \"verbPrefixes\": [],\n \"verbs\": [\n \"hd_api\",\n \"hd_status\",\n \"hd_launch\",\n \"hd_stop\",\n \"hd_restart\",\n \"hd_log\",\n \"hd_screenshot\",\n \"hd_shot\",\n \"hd_open_url\",\n \"hd_browser_profiles\",\n \"hd_ship\"\n ],\n \"version\": \"1.0.0\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"EDA\",\n \"depsInstallingSec\": null,\n \"description\": \"Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.\",\n \"devPinned\": false,\n \"displayName\": \"KiCad EDA\",\n \"docs\": \"https://wiki.adom.inc/adom/kicad-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe\",\n \"expectedImage\": \"kicad-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"installSkill\": \"adom-wiki pkg install adom/kicad-bridge\",\n \"installedVersion\": \"1.0.55\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\",\n \"PowerShell\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790956354547,\n \"latest\": \"1.0.55\",\n \"livePids\": [\n 36872\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/kicad.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"kicad\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 60896,\n \"prewarm\": {\n \"assets\": [\n \"kicad-cli warm (detection)\",\n \"KiCad first-run config + setup wizard marked done\",\n \"KiCad's own taskbar shortcut identity\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:58Z\",\n \"elapsedMs\": 273,\n \"error\": null,\n \"ok\": false,\n \"verb\": \"kicad_prewarm\",\n \"version\": \"1.0.55\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"kicad_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T16:00:00Z\",\n \"runningImage\": \"kicad-bridge.exe\",\n \"runningVersion\": \"1.0.55\",\n \"skillPkg\": \"adom/kicad-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"spawn\": {\n \"entrypoint\": \"kicad-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 60896\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/kicad\",\n \"status\": \"running\",\n \"statusVerb\": \"kicad_status\",\n \"tags\": [\n \"pcb\",\n \"schematic\",\n \"open-source\",\n \"kicad-10\",\n \"kicad-11-ready\"\n ],\n \"timeouts\": {\n \"default\": 130,\n \"prefixes\": [],\n \"verbs\": {\n \"autoroute\": 900,\n \"demo\": 600,\n \"enable_software_opengl\": 240,\n \"export_gerber\": 210,\n \"export_molecule\": 420,\n \"export_pdf\": 180,\n \"export_step\": 300,\n \"export_svg\": 180,\n \"format_upgrade\": 180,\n \"freerouting\": 900,\n \"open_3d_viewer\": 300,\n \"prewarm\": 120,\n \"run_drc\": 300,\n \"run_erc\": 300,\n \"upgrade\": 900\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 1038.1541030656697,\n \"verbCount\": 119,\n \"verbPrefixes\": [\n \"kicad_\"\n ],\n \"verbs\": [\n \"kicad_describe\",\n \"kicad_status\",\n \"kicad_readiness\",\n \"kicad_list_versions\",\n \"kicad_diagnostics\",\n \"kicad_run_drc\",\n \"kicad_run_erc\",\n \"kicad_export_gerber\",\n \"kicad_export_pdf\",\n \"kicad_export_svg\",\n \"kicad_export_step\",\n \"kicad_export_bom_csv\",\n \"kicad_uninstall\",\n \"kicad_extract_netlist\",\n \"kicad_trace_net\",\n \"kicad_find_connections\",\n \"kicad_analyze_connections\",\n \"kicad_lint_board\",\n \"kicad_lint_schematic\",\n \"kicad_lint_library\",\n \"kicad_format_upgrade\",\n \"kicad_list_symbols\",\n \"kicad_list_footprints\",\n \"kicad_adom_library_status\",\n \"kicad_get_settings\",\n \"kicad_set_settings\",\n \"kicad_list_design_rules\",\n \"kicad_set_design_rules\",\n \"kicad_3d_viewer_settings\",\n \"kicad_taskbar_repair\",\n \"kicad_prewarm\",\n \"kicad_model_check\",\n \"kicad_pcm_list\",\n \"kicad_pcm_install\",\n \"kicad_pcm_uninstall\",\n \"kicad_pcm_add_repository\",\n \"kicad_pcm_remove_repository\",\n \"kicad_check_for_updates\",\n \"kicad_upgrade\",\n \"kicad_sch_place_symbol\",\n \"kicad_sch_wire\",\n \"kicad_sch_label\",\n \"kicad_sch_move\",\n \"kicad_sch_delete\",\n \"kicad_sch_set_property\",\n \"kicad_ipc_api\",\n \"kicad_export_molecule\",\n \"kicad_errors\",\n \"kicad_log_tail\",\n \"kicad_bridge_status\",\n \"kicad_bridge_call\",\n \"kicad_install_plugin\",\n \"kicad_plugin_diagnose\",\n \"kicad_install_library\",\n \"kicad_uninstall_library\",\n \"kicad_install_symbol\",\n \"kicad_install_footprint\",\n \"kicad_install_library_bundle\",\n \"kicad_adom_library_heal\",\n \"kicad_make_part_project\",\n \"kicad_export_part\",\n \"kicad_silk_fields_batch\",\n \"kicad_silk_graphics_batch\",\n \"kicad_text_bounds\",\n \"kicad_silk_text_batch\",\n \"kicad_routing_state\",\n \"kicad_route_net\",\n \"kicad_remove_route\",\n \"kicad_add_zone\",\n \"kicad_apply_zone_plan\",\n \"kicad_zone_state\",\n \"kicad_select_net\",\n \"kicad_select_clear\",\n \"kicad_remove_zone\",\n \"kicad_routing_validate\",\n \"kicad_board_pads\",\n \"kicad_add_track\",\n \"kicad_add_via\",\n \"kicad_route\",\n \"kicad_autoroute\",\n \"kicad_freerouting\",\n \"kicad_placement_state\",\n \"kicad_move_footprint\",\n \"kicad_placement_validate\",\n \"kicad_refresh_board_views\",\n \"kicad_launch\",\n \"kicad_open_board\",\n \"kicad_open_schematic\",\n \"kicad_open_symbol_editor\",\n \"kicad_open_footprint_editor\",\n \"kicad_menu_items\",\n \"kicad_3d_view\",\n \"kicad_open_3d_viewer\",\n \"kicad_open_editors\",\n \"kicad_close\",\n \"kicad_close_symbol_editor\",\n \"kicad_close_footprint_editor\",\n \"kicad_close_3d_viewer\",\n \"kicad_dismiss_dialogs\",\n \"kicad_window_info\",\n \"kicad_state\",\n \"kicad_screenshot_all\",\n \"kicad_send_key\",\n \"kicad_click\",\n \"kicad_fix_keyboard\",\n \"kicad_place_footprint\",\n \"kicad_enable_software_opengl\",\n \"kicad_rescan_libraries\",\n \"kicad_show_project\",\n \"kicad_show_symbol\",\n \"kicad_show_footprint\",\n \"kicad_show_3d_chip\",\n \"kicad_show_schematic\",\n \"kicad_show_2d_board\",\n \"kicad_show_3d_board\",\n \"kicad_show_library\",\n \"kicad_progress\",\n \"kicad_verb_times\",\n \"kicad_demo\"\n ],\n \"version\": \"1.0.55\",\n \"versionDrift\": false,\n \"watcher\": {\n \"configKey\": \"project_watch\",\n \"defaultGlobs\": [\n \"*.kicad_pcb\",\n \"*.kicad_sch\",\n \"*.kicad_pro\"\n ],\n \"description\": \"Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).\",\n \"displayName\": \"Project Watch\",\n \"supports\": true\n }\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.\",\n \"devPinned\": false,\n \"displayName\": \"Adom Native Browser\",\n \"docs\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js\",\n \"expectedImage\": \"node.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"installSkill\": \"adom-wiki pkg install adom/nb-bridge\",\n \"installedVersion\": \"0.16.33\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Node/JS\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791220671752,\n \"latest\": \"0.16.33\",\n \"livePids\": [\n 32228\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/native-browser.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"native-browser\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 51703,\n \"prewarm\": {\n \"assets\": [],\n \"lastRun\": {\n \"at\": \"2026-09-22T19:44:55Z\",\n \"elapsedMs\": 41,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"nbrowser_prewarm\",\n \"version\": \"0.16.33\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": null,\n \"verb\": \"nbrowser_prewarm\"\n },\n \"releasedAt\": \"2026-09-22T15:18:44Z\",\n \"runningImage\": \"node.exe\",\n \"runningVersion\": \"0.16.33\",\n \"skillPkg\": \"adom/nb-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"spawn\": {\n \"entrypoint\": \"server.js\",\n \"instanceCount\": 1,\n \"kind\": \"node\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 51703\n },\n \"spawnKind\": \"node\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/native-browser\",\n \"status\": \"running\",\n \"statusVerb\": \"nbrowser_status\",\n \"tags\": [\n \"nb\",\n \"nbe\",\n \"native-browser\",\n \"chrome\",\n \"edge\",\n \"nbrowser\",\n \"pup-parity\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"screenshot\",\n \"seconds\": 120\n },\n {\n \"prefix\": \"record\",\n \"seconds\": 120\n }\n ],\n \"verbs\": {\n \"fetch_url\": 120,\n \"input_dispatch\": 120,\n \"select\": 30,\n \"wait\": 125\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 917.3832275989035,\n \"verbCount\": 88,\n \"verbPrefixes\": [\n \"nbrowser_\"\n ],\n \"verbs\": [\n \"nbrowser_status\",\n \"nbrowser_readiness\",\n \"nbrowser_install_chrome\",\n \"nbrowser_prewarm\",\n \"nbrowser_chrome_status\",\n \"nbrowser_ping\",\n \"nbrowser_progress\",\n \"nbrowser_activity\",\n \"nbrowser_open_window\",\n \"nbrowser_close_window\",\n \"nbrowser_owned\",\n \"nbrowser_cleanup\",\n \"nbrowser_force_close\",\n \"nbrowser_switch_window\",\n \"nbrowser_list_windows\",\n \"nbrowser_window_state\",\n \"nbrowser_fullscreen\",\n \"nbrowser_login_state\",\n \"nbrowser_credentials\",\n \"nbrowser_profiles\",\n \"nbrowser_use_profile\",\n \"nbrowser_pin_session\",\n \"nbrowser_open_os_window\",\n \"nbrowser_os_windows\",\n \"nbrowser_wake_profile\",\n \"nbrowser_resolve_profiles\",\n \"nbrowser_whoami\",\n \"nbrowser_profile_block\",\n \"nbrowser_profile_unblock\",\n \"nbrowser_rescan\",\n \"nbrowser_resync_sessions\",\n \"nbrowser_open_tab\",\n \"nbrowser_close_tab\",\n \"nbrowser_switch_tab\",\n \"nbrowser_list_tabs\",\n \"nbrowser_navigate\",\n \"nbrowser_reload\",\n \"nbrowser_back\",\n \"nbrowser_forward\",\n \"nbrowser_wait\",\n \"nbrowser_wait_for\",\n \"nbrowser_keepalive\",\n \"nbrowser_screenshot\",\n \"nbrowser_screenshot_full_res\",\n \"nbrowser_eval\",\n \"nbrowser_evaluate\",\n \"nbrowser_input_dispatch\",\n \"nbrowser_scroll\",\n \"nbrowser_click\",\n \"nbrowser_select\",\n \"nbrowser_set_file_input\",\n \"nbrowser_set_date\",\n \"nbrowser_totp\",\n \"nbrowser_register_totp\",\n \"nbrowser_add_extension_origin\",\n \"nbrowser_type\",\n \"nbrowser_press_key\",\n \"nbrowser_fetch_url\",\n \"nbrowser_download_wait\",\n \"nbrowser_errors\",\n \"nbrowser_close\",\n \"nbrowser_record_start\",\n \"nbrowser_record_stop\",\n \"nbrowser_record_status\",\n \"nbrowser_record_list\",\n \"nbrowser_flash\",\n \"nbrowser_flash_stop\",\n \"nbrowser_apply_settings\",\n \"nbrowser_settings\",\n \"nbrowser_flash_mode\",\n \"nbrowser_taskbar\",\n \"nbrowser_describe\",\n \"nbrowser_handle_dialog\",\n \"nbrowser_state\",\n \"nbrowser_demo\",\n \"nbrowser_uninstall\",\n \"nbrowser_dev_reload\",\n \"nbrowser_clear_cookies\",\n \"nbrowser_caption\",\n \"nbrowser_focus\",\n \"nbrowser_hover\",\n \"nbrowser_double_click\",\n \"nbrowser_right_click\",\n \"nbrowser_login_form\",\n \"nbrowser_autologin\",\n \"nbrowser_cursor\",\n \"nbrowser_events\",\n \"nbrowser_download\"\n ],\n \"version\": \"0.16.33\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Manufacturing\",\n \"depsInstallingSec\": null,\n \"description\": \"The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.\",\n \"devPinned\": false,\n \"displayName\": \"Puma Bridge (Essemtec ePlace)\",\n \"docs\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe\",\n \"expectedImage\": \"puma-bridge-host.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"installSkill\": \"adom-wiki pkg install adom/puma-bridge\",\n \"installedVersion\": \"0.2.7\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790623763822,\n \"latest\": \"0.2.6\",\n \"livePids\": [\n 32008\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puma-bridge.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puma-bridge\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": true\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 64764,\n \"prewarm\": null,\n \"releasedAt\": \"2026-09-23T15:54:11Z\",\n \"runningImage\": \"puma-bridge-host.exe\",\n \"runningVersion\": \"0.2.7\",\n \"skillPkg\": \"adom/puma-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"spawn\": {\n \"entrypoint\": \"puma-bridge-host.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 64764\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puma-bridge\",\n \"status\": \"running\",\n \"statusVerb\": \"puma_write_status\",\n \"tags\": [\n \"smt\",\n \"essemtec\",\n \"puma\",\n \"eplace\",\n \"pick-and-place\",\n \"manufacturing\",\n \"factoryos\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 2.692019331367393,\n \"verbCount\": 9,\n \"verbPrefixes\": [\n \"puma_\"\n ],\n \"verbs\": [\n \"puma_ping\",\n \"puma_state\",\n \"puma_get\",\n \"puma_feeders\",\n \"puma_dryrun\",\n \"puma_write\",\n \"puma_revert\",\n \"puma_write_status\",\n \"puma_describe\"\n ],\n \"version\": \"0.2.7\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.\",\n \"devPinned\": false,\n \"displayName\": \"Puppeteer (Chrome for Testing + Native)\",\n \"docs\": \"https://wiki.adom.inc/adom/pup-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe\",\n \"expectedImage\": \"adom-pup-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"installSkill\": \"adom-wiki pkg install adom/pup-bridge\",\n \"installedVersion\": \"2.0.697\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791212202067,\n \"latest\": \"2.0.697\",\n \"livePids\": [\n 68812\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puppeteer.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puppeteer\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"not yet\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 57134,\n \"prewarm\": {\n \"assets\": [\n \"chrome-for-testing\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T14:55:58Z\",\n \"elapsedMs\": 1409,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"pup_prewarm\",\n \"version\": \"2.0.697\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": 900,\n \"verb\": \"pup_prewarm\"\n },\n \"releasedAt\": \"2026-10-05T14:55:48Z\",\n \"runningImage\": \"adom-pup-bridge.exe\",\n \"runningVersion\": \"2.0.697\",\n \"skillPkg\": \"adom/pup-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"spawn\": {\n \"entrypoint\": \"adom-pup-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 8851,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 57134\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puppeteer\",\n \"status\": \"running\",\n \"statusVerb\": \"pup_readiness\",\n \"tags\": [\n \"puppeteer\",\n \"chrome\",\n \"headful\",\n \"recording\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"record\",\n \"seconds\": 90\n }\n ],\n \"verbs\": {\n \"credential_reveal\": 150,\n \"fill_card\": 150,\n \"open_window\": 150,\n \"prewarm\": 240,\n \"use\": 240\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 580.2325755673542,\n \"verbCount\": 97,\n \"verbPrefixes\": [\n \"pup_\",\n \"browser_\"\n ],\n \"verbs\": [\n \"pup_describe\",\n \"pup_readiness\",\n \"pup_prewarm\",\n \"pup_status\",\n \"pup_list_windows\",\n \"pup_my_windows\",\n \"pup_list_sessions\",\n \"pup_open_window\",\n \"pup_navigate\",\n \"pup_eval\",\n \"pup_evaluate\",\n \"pup_screenshot\",\n \"pup_close_window\",\n \"pup_close\",\n \"pup_close_all_windows\",\n \"pup_window_info\",\n \"pup_open_tab\",\n \"pup_list_tabs\",\n \"pup_switch_tab\",\n \"pup_close_tab\",\n \"pup_switch_window\",\n \"pup_click\",\n \"pup_select\",\n \"pup_hover\",\n \"pup_type\",\n \"pup_press_key\",\n \"pup_scroll\",\n \"pup_fill\",\n \"pup_wait\",\n \"pup_reload\",\n \"pup_back\",\n \"pup_forward\",\n \"pup_set_viewport\",\n \"pup_errors\",\n \"pup_dialog\",\n \"pup_input_dispatch\",\n \"pup_render_html\",\n \"pup_fetch_url\",\n \"pup_maximize\",\n \"pup_raise_os_window\",\n \"pup_focus_window\",\n \"pup_lower_os_window\",\n \"pup_alert_window\",\n \"pup_progress\",\n \"pup_configure\",\n \"pup_use\",\n \"pup_clear_cookies\",\n \"pup_clear_site_data\",\n \"pup_quit_idle_browsers\",\n \"pup_rescan\",\n \"pup_restart_browser\",\n \"pup_set_identity\",\n \"pup_audit_icons\",\n \"pup_dashboard\",\n \"pup_credentials\",\n \"credential_list\",\n \"credential_set\",\n \"credential_delete\",\n \"pup_login\",\n \"pup_google_accounts\",\n \"pup_google_signin\",\n \"pup_credential_reveal\",\n \"pup_card_set\",\n \"pup_cards\",\n \"pup_card_delete\",\n \"pup_fill_card\",\n \"pup_wiki_set_view\",\n \"pup_annotate\",\n \"pup_floaty_click\",\n \"pup_record_start\",\n \"pup_record_stop\",\n \"pup_record_status\",\n \"pup_record_list\",\n \"pup_recorder_open\",\n \"pup_recorder_close\",\n \"pup_screen_record_start\",\n \"pup_screen_record_stop\",\n \"pup_screen_record_status\",\n \"pup_screen_record_list\",\n \"pup_highfps_extend\",\n \"pup_screenshot_element\",\n \"pup_screenshot_full_res\",\n \"pup_download\",\n \"pup_launch\",\n \"pup_deps\",\n \"pup_install_toolbar\",\n \"pup_reap_profiles\",\n \"pup_cache_prune\",\n \"pup_sweep_identities\",\n \"pup_uninstall\",\n \"pup_move_to_workspace\",\n \"pup_assisted_click\",\n \"pup_import_scan\",\n \"pup_import_browser_logins\",\n \"pup_vault_sync\",\n \"pup_vault_export\",\n \"pup_vault_import\"\n ],\n \"version\": \"2.0.697\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"MCAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.\",\n \"devPinned\": false,\n \"displayName\": \"SOLIDWORKS\",\n \"docs\": \"https://wiki.adom.inc/adom/solidworks-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe\",\n \"expectedImage\": \"swx-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"installSkill\": \"adom-wiki pkg install adom/solidworks-bridge\",\n \"installedVersion\": \"0.9.21\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 0,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791224978746,\n \"latest\": \"0.9.19\",\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/solidworks.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"solidworks\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 49861,\n \"prewarm\": null,\n \"releasedAt\": \"2026-10-05T18:49:46Z\",\n \"runningImage\": null,\n \"runningVersion\": \"0.9.19\",\n \"skillPkg\": \"adom/solidworks-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"spawn\": {\n \"entrypoint\": \"swx-bridge.exe\",\n \"instanceCount\": 0,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 49861\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/solidworks\",\n \"status\": \"running\",\n \"statusVerb\": \"swx_status\",\n \"tags\": [\n \"solidworks\",\n \"mcad\",\n \"cad\",\n \"bom\",\n \"step\",\n \"mass-properties\",\n \"modeling\",\n \"fusion-parity\"\n ],\n \"timeouts\": {\n \"default\": 120,\n \"prefixes\": [],\n \"verbs\": {\n \"action_ledger\": 20,\n \"activate_document\": 180,\n \"bom\": 300,\n \"check_recovery\": 180,\n \"close_all_documents\": 240,\n \"close_all_safely\": 600,\n \"close_doc\": 180,\n \"close_import_temps\": 600,\n \"close_window\": 120,\n \"cloud_status\": 90,\n \"design_info\": 180,\n \"dismiss_blocking_dialogs\": 180,\n \"document_info\": 120,\n \"export\": 300,\n \"export_3mf\": 300,\n \"export_dwg\": 300,\n \"export_dxf\": 300,\n \"export_glb\": 300,\n \"export_iges\": 300,\n \"export_parasolid\": 300,\n \"export_pdf\": 300,\n \"export_sat\": 300,\n \"export_step\": 300,\n \"export_stl\": 300,\n \"find_files\": 180,\n \"get_app_state\": 90,\n \"get_parameters\": 240,\n \"get_preferences\": 90,\n \"import\": 420,\n \"inspect_bodies\": 180,\n \"interference\": 600,\n \"kill\": 240,\n \"new_document\": 180,\n \"open\": 300,\n \"pack_and_go\": 600,\n \"rebuild_check\": 300,\n \"render_image\": 600,\n \"reset_workspace\": 600,\n \"run_script\": 420,\n \"save_as\": 420,\n \"set_driving_badge\": 120,\n \"set_parameter\": 420,\n \"set_preference\": 90,\n \"show_assembly\": 600,\n \"show_drawing\": 600,\n \"show_part\": 600,\n \"shutdown\": 900,\n \"sign_in\": 240,\n \"start\": 300,\n \"state\": 180,\n \"stop\": 420,\n \"verb_times\": 20,\n \"window_info\": 120\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 561.4917190312397,\n \"verbCount\": 69,\n \"verbPrefixes\": [\n \"swx_\"\n ],\n \"verbs\": [\n \"swx_action_ledger\",\n \"swx_activate_document\",\n \"swx_add_component\",\n \"swx_bom\",\n \"swx_check_recovery\",\n \"swx_close_all_documents\",\n \"swx_close_all_safely\",\n \"swx_close_doc\",\n \"swx_close_import_temps\",\n \"swx_close_window\",\n \"swx_cloud_status\",\n \"swx_com_eval\",\n \"swx_describe\",\n \"swx_design_info\",\n \"swx_dismiss_blocking_dialogs\",\n \"swx_docs\",\n \"swx_document_info\",\n \"swx_export\",\n \"swx_export_3mf\",\n \"swx_export_dwg\",\n \"swx_export_dxf\",\n \"swx_export_glb\",\n \"swx_export_iges\",\n \"swx_export_parasolid\",\n \"swx_export_pdf\",\n \"swx_export_sat\",\n \"swx_export_step\",\n \"swx_export_stl\",\n \"swx_find_files\",\n \"swx_get_app_state\",\n \"swx_get_parameters\",\n \"swx_get_preferences\",\n \"swx_import\",\n \"swx_inspect_bodies\",\n \"swx_interference\",\n \"swx_kill\",\n \"swx_mass_properties\",\n \"swx_new_document\",\n \"swx_open\",\n \"swx_pack_and_go\",\n \"swx_progress\",\n \"swx_props_get\",\n \"swx_props_set\",\n \"swx_readiness\",\n \"swx_rebuild_check\",\n \"swx_recover_list\",\n \"swx_render_image\",\n \"swx_reset_workspace\",\n \"swx_run_macro\",\n \"swx_run_script\",\n \"swx_save\",\n \"swx_save_as\",\n \"swx_screenshot\",\n \"swx_set_driving_badge\",\n \"swx_set_parameter\",\n \"swx_set_preference\",\n \"swx_show_assembly\",\n \"swx_show_drawing\",\n \"swx_show_part\",\n \"swx_shutdown\",\n \"swx_sign_in\",\n \"swx_start\",\n \"swx_state\",\n \"swx_status\",\n \"swx_stop\",\n \"swx_uninstall\",\n \"swx_user_presence\",\n \"swx_verb_times\",\n \"swx_window_info\"\n ],\n \"version\": \"0.9.21\",\n \"versionDrift\": true,\n \"watcher\": null\n }\n ],\n \"current_os\": \"windows\",\n \"durationMs\": 10,\n \"error\": \"\",\n \"invalidCount\": 0,\n \"ok\": true,\n \"output\": \"\",\n \"schemaVersion\": 1,\n \"staleCheckedAt\": 1791215191,\n \"status\": \"ok\",\n \"success\": true,\n \"summary\": {\n \"bundled\": 1,\n \"cache\": 6,\n \"invalid\": 0,\n \"paused\": 0,\n \"third_party\": 0,\n \"total\": 7\n },\n \"timeoutSeconds\": 10\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235628.4784775, + "raw": { + "_hint": "Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.", + "_skillsHint": "For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).", + "bridges": [ + { + "author": "Adom Inc.", + "category": "CAD", + "depsInstallingSec": null, + "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", + "devPinned": true, + "displayName": "Autodesk Fusion 360", + "docs": "https://wiki.adom.inc/adom/fusion-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe", + "expectedImage": "adom-fusion-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/fusion-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "installSkill": "adom-wiki pkg install adom/fusion-bridge", + "installedVersion": "1.12.0-dev.8", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python" + ], + "lastSpawnError": null, + "lastUsedMs": 1791235281522, + "latest": null, + "livePids": [ + 42780 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/fusion360.log", + "manifestSource": null, + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json", + "manifestUrlFollowed": null, + "name": "fusion360", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.", + "supported": false + }, + "macos": { + "reason": "Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.", + "supported": true + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 50618, + "prewarm": { + "assets": [ + "AdomBridge add-in sync", + "PCB design-rules catalog cache" + ], + "lastRun": { + "at": "2026-10-05T15:41:57Z", + "elapsedMs": 2344, + "error": null, + "ok": true, + "verb": "fusion_prewarm", + "version": "1.12.0-dev.5" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "fusion_prewarm" + }, + "releasedAt": "2026-06-26T06:00:00Z", + "runningImage": "adom-fusion-bridge.exe", + "runningVersion": "1.12.0-dev.5", + "skillPkg": "adom/fusion-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "spawn": { + "entrypoint": "adom-fusion-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 50618 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/fusion360", + "status": "running", + "statusVerb": "fusion_get_app_state", + "tags": [ + "fusion360", + "autodesk", + "cad", + "exports", + "aps", + "modeling" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "open", + "seconds": 150 + } + ], + "verbs": { + "aps_open": 150, + "aps_recent": 120, + "aps_search": 120, + "build_library_3d": 1800, + "capture_library_views": 600, + "close_all_documents": 90, + "demo": 300, + "export_3mf": 360, + "export_board_image": 90, + "export_bom": 90, + "export_cpl": 90, + "export_dwg": 150, + "export_dxf": 150, + "export_f3d": 360, + "export_fbx": 360, + "export_gerbers": 210, + "export_iges": 360, + "export_obj": 360, + "export_sat": 360, + "export_skp": 360, + "export_step": 360, + "export_stl": 360, + "export_usdz": 360, + "generate_package": 120, + "get_preferences": 25, + "install_fusion": 90, + "make_3d_package": 200, + "prewarm": 120, + "run_modeling_script": 180, + "search_cloud_files": 200, + "set_preference": 40, + "signin": 150, + "start": 90, + "walk_cloud_tree": 620 + } + }, + "updateAvailable": false, + "usageScore": 21181.933709008805, + "verbCount": 167, + "verbPrefixes": [ + "fusion_" + ], + "verbs": [ + "fusion_account", + "fusion_action_ledger", + "fusion_activate_document", + "fusion_addin_status", + "fusion_alerts", + "fusion_apply_fusion_update", + "fusion_aps_browse", + "fusion_aps_create_folder", + "fusion_aps_download", + "fusion_aps_file_info", + "fusion_aps_forget_browser", + "fusion_aps_get", + "fusion_aps_get_browser", + "fusion_aps_open", + "fusion_aps_recent", + "fusion_aps_search", + "fusion_aps_set_browser", + "fusion_aps_set_client_id", + "fusion_aps_signin", + "fusion_aps_status", + "fusion_aps_upload", + "fusion_aps_versions", + "fusion_assembly_bom", + "fusion_attach_3d_package", + "fusion_bind_library_3d", + "fusion_board_info", + "fusion_board_stackup", + "fusion_build_library_3d", + "fusion_cancel_run", + "fusion_capture_library_views", + "fusion_check_recovery", + "fusion_claim_seat", + "fusion_cleanup_cloud_files", + "fusion_close_all_documents", + "fusion_close_document", + "fusion_close_window", + "fusion_create_cloud_folder", + "fusion_create_library", + "fusion_delete_cloud_file", + "fusion_demo", + "fusion_demo_progress", + "fusion_describe", + "fusion_detect_layers", + "fusion_dismiss_blocking_dialogs", + "fusion_document_info", + "fusion_eagle_import_status", + "fusion_electron_pan", + "fusion_electron_run", + "fusion_electron_select", + "fusion_electron_zoom", + "fusion_electronics_query", + "fusion_execute_text_command", + "fusion_export_3mf", + "fusion_export_board_image", + "fusion_export_bom", + "fusion_export_cloud_file", + "fusion_export_cpl", + "fusion_export_dwg", + "fusion_export_dxf", + "fusion_export_eagle_source", + "fusion_export_f3d", + "fusion_export_fbx", + "fusion_export_gerbers", + "fusion_export_iges", + "fusion_export_lbr", + "fusion_export_obj", + "fusion_export_optimized_glb", + "fusion_export_sat", + "fusion_export_skp", + "fusion_export_source", + "fusion_export_step", + "fusion_export_stl", + "fusion_export_usdz", + "fusion_fetch_optimized_glb", + "fusion_generate_package", + "fusion_get_app_state", + "fusion_get_design_info", + "fusion_get_parameters", + "fusion_get_preferences", + "fusion_import_electronics", + "fusion_import_step", + "fusion_inspect_bodies", + "fusion_install_fusion", + "fusion_install_library_bundle", + "fusion_interactive", + "fusion_kill", + "fusion_library_manager", + "fusion_library_parts", + "fusion_list_cloud_files", + "fusion_list_cloud_projects", + "fusion_list_text_commands", + "fusion_live_feed", + "fusion_make_3d_package", + "fusion_make_showcase_project", + "fusion_make_test_project", + "fusion_managed_library_create", + "fusion_managed_library_link", + "fusion_managed_library_pull", + "fusion_managed_library_push", + "fusion_managed_library_unlink", + "fusion_mcp_call", + "fusion_mcp_enable", + "fusion_mcp_resources", + "fusion_mcp_status", + "fusion_mcp_tools", + "fusion_mech_capabilities", + "fusion_mech_operation_status", + "fusion_mechanical", + "fusion_narrate", + "fusion_new_electronics_from_eagle", + "fusion_notify_owner", + "fusion_open_board", + "fusion_open_by_urn", + "fusion_open_by_urn_note", + "fusion_open_cloud_file", + "fusion_open_design", + "fusion_open_electronics", + "fusion_open_lbr", + "fusion_open_schematic", + "fusion_physical_properties", + "fusion_plan_library_import", + "fusion_plan_route", + "fusion_preflight_lbr", + "fusion_prefs_close", + "fusion_prefs_open", + "fusion_prewarm", + "fusion_prove_result", + "fusion_readiness", + "fusion_release_seat", + "fusion_reset_workspace", + "fusion_resolve_seat_dialog", + "fusion_restart_for_addin", + "fusion_route_net", + "fusion_routing_drc", + "fusion_routing_state", + "fusion_run_modeling_script", + "fusion_save_to_cloud", + "fusion_schematic", + "fusion_screenshot_fusion", + "fusion_search_cloud_files", + "fusion_set_auto_update", + "fusion_set_design_rules", + "fusion_set_driving_badge", + "fusion_set_parameter", + "fusion_set_preference", + "fusion_set_seat_takeover", + "fusion_set_window_sizing", + "fusion_show_2d_board", + "fusion_show_3d_board", + "fusion_show_3d_package", + "fusion_show_attributes", + "fusion_show_footprint", + "fusion_show_library", + "fusion_show_project", + "fusion_show_schematic", + "fusion_show_symbol", + "fusion_signin", + "fusion_signin_2fa", + "fusion_start", + "fusion_state", + "fusion_stop", + "fusion_take_screenshot", + "fusion_uninstall", + "fusion_verb_times", + "fusion_view", + "fusion_walk_cloud_tree", + "fusion_web_signin" + ], + "version": "1.12.0-dev.8", + "versionDrift": true, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "developer-tools", + "depsInstallingSec": null, + "description": "Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.", + "devPinned": false, + "displayName": "Hydrogen Desktop", + "docs": "https://wiki.adom.inc/adom/adom-desktop", + "entryMismatch": false, + "entrypoint": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/", + "expectedImage": null, + "heroAvailable": false, + "heroDocs": "https://wiki.adom.inc/adom/hydrogen-desktop", + "homepage": "https://wiki.adom.inc/adom/adom-desktop", + "installPath": "\\\\?\\C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges\\hd", + "installSkill": "adom-wiki pkg install adom/adom-desktop", + "installedVersion": "1.0.0", + "installedVersionSource": "cache", + "instanceCount": null, + "languages": [], + "lastSpawnError": null, + "lastUsedMs": 0, + "latest": null, + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/hd.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": null, + "manifestUrlFollowed": null, + "name": "hd", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "HD currently ships Windows-only; Linux variant in scope for HD's future releases.", + "supported": false + }, + "macos": { + "reason": "HD currently ships Windows-only.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": null, + "prewarm": null, + "releasedAt": "2026-06-30T13:13:22Z", + "runningImage": null, + "runningVersion": null, + "skillPkg": "adom/adom-desktop", + "source": "bundled", + "sourceDir": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd", + "spawn": { + "entrypoint": "", + "instanceCount": null, + "kind": "external-http", + "manifestPort": 47084, + "persistent": false, + "portBlocked": null, + "runtimePort": null + }, + "spawnKind": "external-http", + "stableUrl": "http://127.0.0.1:24680/open/hd", + "status": "stopped", + "statusVerb": null, + "tags": [ + "hydrogen-desktop", + "control-api", + "http", + "lifecycle" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 0.0, + "verbCount": 11, + "verbPrefixes": [], + "verbs": [ + "hd_api", + "hd_status", + "hd_launch", + "hd_stop", + "hd_restart", + "hd_log", + "hd_screenshot", + "hd_shot", + "hd_open_url", + "hd_browser_profiles", + "hd_ship" + ], + "version": "1.0.0", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "EDA", + "depsInstallingSec": null, + "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", + "devPinned": false, + "displayName": "KiCad EDA", + "docs": "https://wiki.adom.inc/adom/kicad-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe", + "expectedImage": "kicad-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "installSkill": "adom-wiki pkg install adom/kicad-bridge", + "installedVersion": "1.0.55", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python", + "PowerShell" + ], + "lastSpawnError": null, + "lastUsedMs": 1790956354547, + "latest": "1.0.55", + "livePids": [ + 36872 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/kicad.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json", + "manifestUrlFollowed": null, + "name": "kicad", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "", + "supported": false + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 60896, + "prewarm": { + "assets": [ + "kicad-cli warm (detection)", + "KiCad first-run config + setup wizard marked done", + "KiCad's own taskbar shortcut identity" + ], + "lastRun": { + "at": "2026-10-05T15:41:58Z", + "elapsedMs": 273, + "error": null, + "ok": false, + "verb": "kicad_prewarm", + "version": "1.0.55" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "kicad_prewarm" + }, + "releasedAt": "2026-06-26T16:00:00Z", + "runningImage": "kicad-bridge.exe", + "runningVersion": "1.0.55", + "skillPkg": "adom/kicad-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "spawn": { + "entrypoint": "kicad-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 60896 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/kicad", + "status": "running", + "statusVerb": "kicad_status", + "tags": [ + "pcb", + "schematic", + "open-source", + "kicad-10", + "kicad-11-ready" + ], + "timeouts": { + "default": 130, + "prefixes": [], + "verbs": { + "autoroute": 900, + "demo": 600, + "enable_software_opengl": 240, + "export_gerber": 210, + "export_molecule": 420, + "export_pdf": 180, + "export_step": 300, + "export_svg": 180, + "format_upgrade": 180, + "freerouting": 900, + "open_3d_viewer": 300, + "prewarm": 120, + "run_drc": 300, + "run_erc": 300, + "upgrade": 900 + } + }, + "updateAvailable": false, + "usageScore": 1038.1541030656697, + "verbCount": 119, + "verbPrefixes": [ + "kicad_" + ], + "verbs": [ + "kicad_describe", + "kicad_status", + "kicad_readiness", + "kicad_list_versions", + "kicad_diagnostics", + "kicad_run_drc", + "kicad_run_erc", + "kicad_export_gerber", + "kicad_export_pdf", + "kicad_export_svg", + "kicad_export_step", + "kicad_export_bom_csv", + "kicad_uninstall", + "kicad_extract_netlist", + "kicad_trace_net", + "kicad_find_connections", + "kicad_analyze_connections", + "kicad_lint_board", + "kicad_lint_schematic", + "kicad_lint_library", + "kicad_format_upgrade", + "kicad_list_symbols", + "kicad_list_footprints", + "kicad_adom_library_status", + "kicad_get_settings", + "kicad_set_settings", + "kicad_list_design_rules", + "kicad_set_design_rules", + "kicad_3d_viewer_settings", + "kicad_taskbar_repair", + "kicad_prewarm", + "kicad_model_check", + "kicad_pcm_list", + "kicad_pcm_install", + "kicad_pcm_uninstall", + "kicad_pcm_add_repository", + "kicad_pcm_remove_repository", + "kicad_check_for_updates", + "kicad_upgrade", + "kicad_sch_place_symbol", + "kicad_sch_wire", + "kicad_sch_label", + "kicad_sch_move", + "kicad_sch_delete", + "kicad_sch_set_property", + "kicad_ipc_api", + "kicad_export_molecule", + "kicad_errors", + "kicad_log_tail", + "kicad_bridge_status", + "kicad_bridge_call", + "kicad_install_plugin", + "kicad_plugin_diagnose", + "kicad_install_library", + "kicad_uninstall_library", + "kicad_install_symbol", + "kicad_install_footprint", + "kicad_install_library_bundle", + "kicad_adom_library_heal", + "kicad_make_part_project", + "kicad_export_part", + "kicad_silk_fields_batch", + "kicad_silk_graphics_batch", + "kicad_text_bounds", + "kicad_silk_text_batch", + "kicad_routing_state", + "kicad_route_net", + "kicad_remove_route", + "kicad_add_zone", + "kicad_apply_zone_plan", + "kicad_zone_state", + "kicad_select_net", + "kicad_select_clear", + "kicad_remove_zone", + "kicad_routing_validate", + "kicad_board_pads", + "kicad_add_track", + "kicad_add_via", + "kicad_route", + "kicad_autoroute", + "kicad_freerouting", + "kicad_placement_state", + "kicad_move_footprint", + "kicad_placement_validate", + "kicad_refresh_board_views", + "kicad_launch", + "kicad_open_board", + "kicad_open_schematic", + "kicad_open_symbol_editor", + "kicad_open_footprint_editor", + "kicad_menu_items", + "kicad_3d_view", + "kicad_open_3d_viewer", + "kicad_open_editors", + "kicad_close", + "kicad_close_symbol_editor", + "kicad_close_footprint_editor", + "kicad_close_3d_viewer", + "kicad_dismiss_dialogs", + "kicad_window_info", + "kicad_state", + "kicad_screenshot_all", + "kicad_send_key", + "kicad_click", + "kicad_fix_keyboard", + "kicad_place_footprint", + "kicad_enable_software_opengl", + "kicad_rescan_libraries", + "kicad_show_project", + "kicad_show_symbol", + "kicad_show_footprint", + "kicad_show_3d_chip", + "kicad_show_schematic", + "kicad_show_2d_board", + "kicad_show_3d_board", + "kicad_show_library", + "kicad_progress", + "kicad_verb_times", + "kicad_demo" + ], + "version": "1.0.55", + "versionDrift": false, + "watcher": { + "configKey": "project_watch", + "defaultGlobs": [ + "*.kicad_pcb", + "*.kicad_sch", + "*.kicad_pro" + ], + "description": "Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).", + "displayName": "Project Watch", + "supports": true + } + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.", + "devPinned": false, + "displayName": "Adom Native Browser", + "docs": "https://wiki.adom.inc/adom/nb-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js", + "expectedImage": "node.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/nb-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "installSkill": "adom-wiki pkg install adom/nb-bridge", + "installedVersion": "0.16.33", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Node/JS" + ], + "lastSpawnError": null, + "lastUsedMs": 1791220671752, + "latest": "0.16.33", + "livePids": [ + 32228 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/native-browser.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json", + "manifestUrlFollowed": null, + "name": "native-browser", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.", + "supported": false + }, + "macos": { + "reason": "Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 51703, + "prewarm": { + "assets": [], + "lastRun": { + "at": "2026-09-22T19:44:55Z", + "elapsedMs": 41, + "error": null, + "ok": true, + "verb": "nbrowser_prewarm", + "version": "0.16.33" + }, + "requiresHostApp": false, + "timeoutSeconds": null, + "verb": "nbrowser_prewarm" + }, + "releasedAt": "2026-09-22T15:18:44Z", + "runningImage": "node.exe", + "runningVersion": "0.16.33", + "skillPkg": "adom/nb-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "spawn": { + "entrypoint": "server.js", + "instanceCount": 1, + "kind": "node", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 51703 + }, + "spawnKind": "node", + "stableUrl": "http://127.0.0.1:24680/open/native-browser", + "status": "running", + "statusVerb": "nbrowser_status", + "tags": [ + "nb", + "nbe", + "native-browser", + "chrome", + "edge", + "nbrowser", + "pup-parity" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "screenshot", + "seconds": 120 + }, + { + "prefix": "record", + "seconds": 120 + } + ], + "verbs": { + "fetch_url": 120, + "input_dispatch": 120, + "select": 30, + "wait": 125 + } + }, + "updateAvailable": false, + "usageScore": 917.3832275989035, + "verbCount": 88, + "verbPrefixes": [ + "nbrowser_" + ], + "verbs": [ + "nbrowser_status", + "nbrowser_readiness", + "nbrowser_install_chrome", + "nbrowser_prewarm", + "nbrowser_chrome_status", + "nbrowser_ping", + "nbrowser_progress", + "nbrowser_activity", + "nbrowser_open_window", + "nbrowser_close_window", + "nbrowser_owned", + "nbrowser_cleanup", + "nbrowser_force_close", + "nbrowser_switch_window", + "nbrowser_list_windows", + "nbrowser_window_state", + "nbrowser_fullscreen", + "nbrowser_login_state", + "nbrowser_credentials", + "nbrowser_profiles", + "nbrowser_use_profile", + "nbrowser_pin_session", + "nbrowser_open_os_window", + "nbrowser_os_windows", + "nbrowser_wake_profile", + "nbrowser_resolve_profiles", + "nbrowser_whoami", + "nbrowser_profile_block", + "nbrowser_profile_unblock", + "nbrowser_rescan", + "nbrowser_resync_sessions", + "nbrowser_open_tab", + "nbrowser_close_tab", + "nbrowser_switch_tab", + "nbrowser_list_tabs", + "nbrowser_navigate", + "nbrowser_reload", + "nbrowser_back", + "nbrowser_forward", + "nbrowser_wait", + "nbrowser_wait_for", + "nbrowser_keepalive", + "nbrowser_screenshot", + "nbrowser_screenshot_full_res", + "nbrowser_eval", + "nbrowser_evaluate", + "nbrowser_input_dispatch", + "nbrowser_scroll", + "nbrowser_click", + "nbrowser_select", + "nbrowser_set_file_input", + "nbrowser_set_date", + "nbrowser_totp", + "nbrowser_register_totp", + "nbrowser_add_extension_origin", + "nbrowser_type", + "nbrowser_press_key", + "nbrowser_fetch_url", + "nbrowser_download_wait", + "nbrowser_errors", + "nbrowser_close", + "nbrowser_record_start", + "nbrowser_record_stop", + "nbrowser_record_status", + "nbrowser_record_list", + "nbrowser_flash", + "nbrowser_flash_stop", + "nbrowser_apply_settings", + "nbrowser_settings", + "nbrowser_flash_mode", + "nbrowser_taskbar", + "nbrowser_describe", + "nbrowser_handle_dialog", + "nbrowser_state", + "nbrowser_demo", + "nbrowser_uninstall", + "nbrowser_dev_reload", + "nbrowser_clear_cookies", + "nbrowser_caption", + "nbrowser_focus", + "nbrowser_hover", + "nbrowser_double_click", + "nbrowser_right_click", + "nbrowser_login_form", + "nbrowser_autologin", + "nbrowser_cursor", + "nbrowser_events", + "nbrowser_download" + ], + "version": "0.16.33", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Manufacturing", + "depsInstallingSec": null, + "description": "The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.", + "devPinned": false, + "displayName": "Puma Bridge (Essemtec ePlace)", + "docs": "https://wiki.adom.inc/adom/puma-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe", + "expectedImage": "puma-bridge-host.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/puma-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "installSkill": "adom-wiki pkg install adom/puma-bridge", + "installedVersion": "0.2.7", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1790623763822, + "latest": "0.2.6", + "livePids": [ + 32008 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puma-bridge.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json", + "manifestUrlFollowed": null, + "name": "puma-bridge", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "", + "supported": true + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 64764, + "prewarm": null, + "releasedAt": "2026-09-23T15:54:11Z", + "runningImage": "puma-bridge-host.exe", + "runningVersion": "0.2.7", + "skillPkg": "adom/puma-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "spawn": { + "entrypoint": "puma-bridge-host.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 64764 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puma-bridge", + "status": "running", + "statusVerb": "puma_write_status", + "tags": [ + "smt", + "essemtec", + "puma", + "eplace", + "pick-and-place", + "manufacturing", + "factoryos" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 2.692019331367393, + "verbCount": 9, + "verbPrefixes": [ + "puma_" + ], + "verbs": [ + "puma_ping", + "puma_state", + "puma_get", + "puma_feeders", + "puma_dryrun", + "puma_write", + "puma_revert", + "puma_write_status", + "puma_describe" + ], + "version": "0.2.7", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.", + "devPinned": false, + "displayName": "Puppeteer (Chrome for Testing + Native)", + "docs": "https://wiki.adom.inc/adom/pup-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe", + "expectedImage": "adom-pup-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "installSkill": "adom-wiki pkg install adom/pup-bridge", + "installedVersion": "2.0.697", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791212202067, + "latest": "2.0.697", + "livePids": [ + 68812 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puppeteer.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json", + "manifestUrlFollowed": null, + "name": "puppeteer", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "not yet", + "supported": false + }, + "macos": { + "reason": "The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 57134, + "prewarm": { + "assets": [ + "chrome-for-testing" + ], + "lastRun": { + "at": "2026-10-05T14:55:58Z", + "elapsedMs": 1409, + "error": null, + "ok": true, + "verb": "pup_prewarm", + "version": "2.0.697" + }, + "requiresHostApp": false, + "timeoutSeconds": 900, + "verb": "pup_prewarm" + }, + "releasedAt": "2026-10-05T14:55:48Z", + "runningImage": "adom-pup-bridge.exe", + "runningVersion": "2.0.697", + "skillPkg": "adom/pup-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "spawn": { + "entrypoint": "adom-pup-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 8851, + "persistent": true, + "portBlocked": null, + "runtimePort": 57134 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puppeteer", + "status": "running", + "statusVerb": "pup_readiness", + "tags": [ + "puppeteer", + "chrome", + "headful", + "recording" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "record", + "seconds": 90 + } + ], + "verbs": { + "credential_reveal": 150, + "fill_card": 150, + "open_window": 150, + "prewarm": 240, + "use": 240 + } + }, + "updateAvailable": false, + "usageScore": 580.2325755673542, + "verbCount": 97, + "verbPrefixes": [ + "pup_", + "browser_" + ], + "verbs": [ + "pup_describe", + "pup_readiness", + "pup_prewarm", + "pup_status", + "pup_list_windows", + "pup_my_windows", + "pup_list_sessions", + "pup_open_window", + "pup_navigate", + "pup_eval", + "pup_evaluate", + "pup_screenshot", + "pup_close_window", + "pup_close", + "pup_close_all_windows", + "pup_window_info", + "pup_open_tab", + "pup_list_tabs", + "pup_switch_tab", + "pup_close_tab", + "pup_switch_window", + "pup_click", + "pup_select", + "pup_hover", + "pup_type", + "pup_press_key", + "pup_scroll", + "pup_fill", + "pup_wait", + "pup_reload", + "pup_back", + "pup_forward", + "pup_set_viewport", + "pup_errors", + "pup_dialog", + "pup_input_dispatch", + "pup_render_html", + "pup_fetch_url", + "pup_maximize", + "pup_raise_os_window", + "pup_focus_window", + "pup_lower_os_window", + "pup_alert_window", + "pup_progress", + "pup_configure", + "pup_use", + "pup_clear_cookies", + "pup_clear_site_data", + "pup_quit_idle_browsers", + "pup_rescan", + "pup_restart_browser", + "pup_set_identity", + "pup_audit_icons", + "pup_dashboard", + "pup_credentials", + "credential_list", + "credential_set", + "credential_delete", + "pup_login", + "pup_google_accounts", + "pup_google_signin", + "pup_credential_reveal", + "pup_card_set", + "pup_cards", + "pup_card_delete", + "pup_fill_card", + "pup_wiki_set_view", + "pup_annotate", + "pup_floaty_click", + "pup_record_start", + "pup_record_stop", + "pup_record_status", + "pup_record_list", + "pup_recorder_open", + "pup_recorder_close", + "pup_screen_record_start", + "pup_screen_record_stop", + "pup_screen_record_status", + "pup_screen_record_list", + "pup_highfps_extend", + "pup_screenshot_element", + "pup_screenshot_full_res", + "pup_download", + "pup_launch", + "pup_deps", + "pup_install_toolbar", + "pup_reap_profiles", + "pup_cache_prune", + "pup_sweep_identities", + "pup_uninstall", + "pup_move_to_workspace", + "pup_assisted_click", + "pup_import_scan", + "pup_import_browser_logins", + "pup_vault_sync", + "pup_vault_export", + "pup_vault_import" + ], + "version": "2.0.697", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "MCAD", + "depsInstallingSec": null, + "description": "Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.", + "devPinned": false, + "displayName": "SOLIDWORKS", + "docs": "https://wiki.adom.inc/adom/solidworks-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe", + "expectedImage": "swx-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "installSkill": "adom-wiki pkg install adom/solidworks-bridge", + "installedVersion": "0.9.21", + "installedVersionSource": "cache", + "instanceCount": 0, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791224978746, + "latest": "0.9.19", + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/solidworks.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json", + "manifestUrlFollowed": null, + "name": "solidworks", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "macos": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 49861, + "prewarm": null, + "releasedAt": "2026-10-05T18:49:46Z", + "runningImage": null, + "runningVersion": "0.9.19", + "skillPkg": "adom/solidworks-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "spawn": { + "entrypoint": "swx-bridge.exe", + "instanceCount": 0, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 49861 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/solidworks", + "status": "running", + "statusVerb": "swx_status", + "tags": [ + "solidworks", + "mcad", + "cad", + "bom", + "step", + "mass-properties", + "modeling", + "fusion-parity" + ], + "timeouts": { + "default": 120, + "prefixes": [], + "verbs": { + "action_ledger": 20, + "activate_document": 180, + "bom": 300, + "check_recovery": 180, + "close_all_documents": 240, + "close_all_safely": 600, + "close_doc": 180, + "close_import_temps": 600, + "close_window": 120, + "cloud_status": 90, + "design_info": 180, + "dismiss_blocking_dialogs": 180, + "document_info": 120, + "export": 300, + "export_3mf": 300, + "export_dwg": 300, + "export_dxf": 300, + "export_glb": 300, + "export_iges": 300, + "export_parasolid": 300, + "export_pdf": 300, + "export_sat": 300, + "export_step": 300, + "export_stl": 300, + "find_files": 180, + "get_app_state": 90, + "get_parameters": 240, + "get_preferences": 90, + "import": 420, + "inspect_bodies": 180, + "interference": 600, + "kill": 240, + "new_document": 180, + "open": 300, + "pack_and_go": 600, + "rebuild_check": 300, + "render_image": 600, + "reset_workspace": 600, + "run_script": 420, + "save_as": 420, + "set_driving_badge": 120, + "set_parameter": 420, + "set_preference": 90, + "show_assembly": 600, + "show_drawing": 600, + "show_part": 600, + "shutdown": 900, + "sign_in": 240, + "start": 300, + "state": 180, + "stop": 420, + "verb_times": 20, + "window_info": 120 + } + }, + "updateAvailable": false, + "usageScore": 561.4917190312397, + "verbCount": 69, + "verbPrefixes": [ + "swx_" + ], + "verbs": [ + "swx_action_ledger", + "swx_activate_document", + "swx_add_component", + "swx_bom", + "swx_check_recovery", + "swx_close_all_documents", + "swx_close_all_safely", + "swx_close_doc", + "swx_close_import_temps", + "swx_close_window", + "swx_cloud_status", + "swx_com_eval", + "swx_describe", + "swx_design_info", + "swx_dismiss_blocking_dialogs", + "swx_docs", + "swx_document_info", + "swx_export", + "swx_export_3mf", + "swx_export_dwg", + "swx_export_dxf", + "swx_export_glb", + "swx_export_iges", + "swx_export_parasolid", + "swx_export_pdf", + "swx_export_sat", + "swx_export_step", + "swx_export_stl", + "swx_find_files", + "swx_get_app_state", + "swx_get_parameters", + "swx_get_preferences", + "swx_import", + "swx_inspect_bodies", + "swx_interference", + "swx_kill", + "swx_mass_properties", + "swx_new_document", + "swx_open", + "swx_pack_and_go", + "swx_progress", + "swx_props_get", + "swx_props_set", + "swx_readiness", + "swx_rebuild_check", + "swx_recover_list", + "swx_render_image", + "swx_reset_workspace", + "swx_run_macro", + "swx_run_script", + "swx_save", + "swx_save_as", + "swx_screenshot", + "swx_set_driving_badge", + "swx_set_parameter", + "swx_set_preference", + "swx_show_assembly", + "swx_show_drawing", + "swx_show_part", + "swx_shutdown", + "swx_sign_in", + "swx_start", + "swx_state", + "swx_status", + "swx_stop", + "swx_uninstall", + "swx_user_presence", + "swx_verb_times", + "swx_window_info" + ], + "version": "0.9.21", + "versionDrift": true, + "watcher": null + } + ], + "current_os": "windows", + "durationMs": 10, + "error": "", + "invalidCount": 0, + "ok": true, + "output": "", + "schemaVersion": 1, + "staleCheckedAt": 1791215191, + "status": "ok", + "success": true, + "summary": { + "bundled": 1, + "cache": 6, + "invalid": 0, + "paused": 0, + "third_party": 0, + "total": 7 + }, + "timeoutSeconds": 10 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0003-fusion_get_preferences.json b/docs/mechanical-verification/cp8/restart/calls/0003-fusion_get_preferences.json new file mode 100644 index 0000000..9a4edbb --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0003-fusion_get_preferences.json @@ -0,0 +1,38 @@ +{ + "target": "adom_drew2", + "verb": "fusion_get_preferences", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235628.4808686, + "mutating": false, + "stdout": "{\n \"_hint\": \"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\n \"_timeoutHint\": \"ab waits up to 25s 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 \"applied\": {},\n \"current\": {\n \"activeTheme\": \"darkblue\",\n \"cameraPivot\": true,\n \"gestureNav\": true,\n \"invertScrollZoom\": true,\n \"lengthUnit\": \"mm\",\n \"modelingOrientation\": \"zup\",\n \"orbitScheme\": \"fusion360\",\n \"theme\": \"device\"\n },\n \"durationMs\": 138,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 25s 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.\\\",\\\"applied\\\":{},\\\"current\\\":{\\\"activeTheme\\\":\\\"darkblue\\\",\\\"cameraPivot\\\":true,\\\"gestureNav\\\":true,\\\"invertScrollZoom\\\":true,\\\"lengthUnit\\\":\\\"mm\\\",\\\"modelingOrientation\\\":\\\"zup\\\",\\\"orbitScheme\\\":\\\"fusion360\\\",\\\"theme\\\":\\\"device\\\"},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":25}\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 25\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235628.6251748, + "raw": { + "_hint": "Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).", + "_timeoutHint": "ab waits up to 25s 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.", + "applied": {}, + "current": { + "activeTheme": "darkblue", + "cameraPivot": true, + "gestureNav": true, + "invertScrollZoom": true, + "lengthUnit": "mm", + "modelingOrientation": "zup", + "orbitScheme": "fusion360", + "theme": "device" + }, + "durationMs": 138, + "error": "", + "output": "{\"_hint\":\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\"_timeoutHint\":\"ab waits up to 25s 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.\",\"applied\":{},\"current\":{\"activeTheme\":\"darkblue\",\"cameraPivot\":true,\"gestureNav\":true,\"invertScrollZoom\":true,\"lengthUnit\":\"mm\",\"modelingOrientation\":\"zup\",\"orbitScheme\":\"fusion360\",\"theme\":\"device\"},\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":25}", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 25 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0004-fusion_mcp_call.json b/docs/mechanical-verification/cp8/restart/calls/0004-fusion_mcp_call.json new file mode 100644 index 0000000..ec27588 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0004-fusion_mcp_call.json @@ -0,0 +1,46 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mcp_call", + "args": { + "tool": "fusion_mcp_execute", + "arguments": { + "featureType": "script", + "object": { + "script": "import adsk.core, adsk.fusion, json, threading, builtins, os, platform, sys\ndef run(_context:str):\n assert threading.current_thread() is threading.main_thread()\n app=adsk.core.Application.get()\n expected={'runId': '20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'sessionId': '3c5e6744-d1ac-4276-9264-b05a96c51e3d', 'host': 'ADOM_DREW2', 'pid': 41728, 'scratch': 'C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'nonce': '7575c5bb7b3b474ab621f55d649416a4', 'original': {'creationId': '70b2c575-f830-4751-9f88-2f1f3ab91fb1', 'modified': False, 'name': 'Untitled', 'saved': False}}\n \n assert os.getpid()==expected['pid'] and platform.node().lower()==expected['host'].lower()\n registry=getattr(builtins,'_adom_mechanical_ralph_runs',None)\n assert isinstance(registry,dict) and expected['runId'] in registry\n owned_run=registry[expected['runId']]\n assert not owned_run.get('provisionalImports') and not owned_run.get('retainRequired')\n assert all(row.get('closed') is True and not row.get('retainRequired') for row in owned_run['documents'].values())\n assert app.documents.count==1 and len(owned_run['baselineObjects'])==1\n original=owned_run['activeObject']\n assert app.activeDocument==app.documents.item(0)==owned_run['baselineObjects'][0]==original\n fingerprint={'creationId':original.creationId,'name':original.name,'modified':original.isModified,'saved':original.isSaved}\n assert fingerprint==expected['original']==owned_run['activeFingerprint']\n assert not original.isModified and not original.isSaved and original.dataFile is None\n assert app.userInterface.activeCommand in ('','SelectCommand','Select')\n assert len([m for n,m in list(sys.modules.items()) if n.endswith('.mechanical.core') and getattr(m,'SESSION_ID',None)==expected['sessionId']])==1\n design=adsk.fusion.Design.cast(original.products.itemByProductType('DesignProductType'))\n assert design is not None\n assert design.rootComponent.bRepBodies.count==design.rootComponent.sketches.count==design.rootComponent.allOccurrences.count==design.timeline.count==0\n result={'success':True,'pid':os.getpid(),'sessionId':expected['sessionId'],'original':fingerprint}\n print('ADOM_HISTORY_NATIVE='+json.dumps(result))\n", + "readOnly": true + } + }, + "timeout": 40 + }, + "requestJson": "{\"tool\": \"fusion_mcp_execute\", \"arguments\": {\"featureType\": \"script\", \"object\": {\"script\": \"import adsk.core, adsk.fusion, json, threading, builtins, os, platform, sys\\ndef run(_context:str):\\n assert threading.current_thread() is threading.main_thread()\\n app=adsk.core.Application.get()\\n expected={'runId': '20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'sessionId': '3c5e6744-d1ac-4276-9264-b05a96c51e3d', 'host': 'ADOM_DREW2', 'pid': 41728, 'scratch': 'C:/Users/drew/AppData/Local/Temp/adom-fusion-ralph/20261005T210310Z-568fe7869d0b41d5a83014811fe170ac', 'nonce': '7575c5bb7b3b474ab621f55d649416a4', 'original': {'creationId': '70b2c575-f830-4751-9f88-2f1f3ab91fb1', 'modified': False, 'name': 'Untitled', 'saved': False}}\\n \\n assert os.getpid()==expected['pid'] and platform.node().lower()==expected['host'].lower()\\n registry=getattr(builtins,'_adom_mechanical_ralph_runs',None)\\n assert isinstance(registry,dict) and expected['runId'] in registry\\n owned_run=registry[expected['runId']]\\n assert not owned_run.get('provisionalImports') and not owned_run.get('retainRequired')\\n assert all(row.get('closed') is True and not row.get('retainRequired') for row in owned_run['documents'].values())\\n assert app.documents.count==1 and len(owned_run['baselineObjects'])==1\\n original=owned_run['activeObject']\\n assert app.activeDocument==app.documents.item(0)==owned_run['baselineObjects'][0]==original\\n fingerprint={'creationId':original.creationId,'name':original.name,'modified':original.isModified,'saved':original.isSaved}\\n assert fingerprint==expected['original']==owned_run['activeFingerprint']\\n assert not original.isModified and not original.isSaved and original.dataFile is None\\n assert app.userInterface.activeCommand in ('','SelectCommand','Select')\\n assert len([m for n,m in list(sys.modules.items()) if n.endswith('.mechanical.core') and getattr(m,'SESSION_ID',None)==expected['sessionId']])==1\\n design=adsk.fusion.Design.cast(original.products.itemByProductType('DesignProductType'))\\n assert design is not None\\n assert design.rootComponent.bRepBodies.count==design.rootComponent.sketches.count==design.rootComponent.allOccurrences.count==design.timeline.count==0\\n result={'success':True,'pid':os.getpid(),'sessionId':expected['sessionId'],'original':fingerprint}\\n print('ADOM_HISTORY_NATIVE='+json.dumps(result))\\n\", \"readOnly\": true}}, \"timeout\": 40}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235628.6264548, + "mutating": false, + "stdout": "{\n \"_hint\": \"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\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\": 100,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\\\",\\\"_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.\\\",\\\"result\\\":{\\\"content\\\":[{\\\"text\\\":\\\"{\\\\n \\\\\\\"message\\\\\\\": \\\\\\\"ADOM_HISTORY_NATIVE={\\\\\\\\\\\\\\\"success\\\\\\\\\\\\\\\": true, \\\\\\\\\\\\\\\"pid\\\\\\\\\\\\\\\": 41728, \\\\\\\\\\\\\\\"sessionId\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"original\\\\\\\\\\\\\\\": {\\\\\\\\\\\\\\\"creationId\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"name\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"Untitled\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"modified\\\\\\\\\\\\\\\": false, \\\\\\\\\\\\\\\"saved\\\\\\\\\\\\\\\": false}}\\\\\\\\n\\\\\\\",\\\\n \\\\\\\"success\\\\\\\": true\\\\n}\\\",\\\"type\\\":\\\"text\\\"}]},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_mcp_status\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60,\\\"tool\\\":\\\"fusion_mcp_execute\\\"}\",\n \"result\": {\n \"content\": [\n {\n \"text\": \"{\\n \\\"message\\\": \\\"ADOM_HISTORY_NATIVE={\\\\\\\"success\\\\\\\": true, \\\\\\\"pid\\\\\\\": 41728, \\\\\\\"sessionId\\\\\\\": \\\\\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\\\\\", \\\\\\\"original\\\\\\\": {\\\\\\\"creationId\\\\\\\": \\\\\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\\\\\", \\\\\\\"name\\\\\\\": \\\\\\\"Untitled\\\\\\\", \\\\\\\"modified\\\\\\\": false, \\\\\\\"saved\\\\\\\": false}}\\\\n\\\",\\n \\\"success\\\": true\\n}\",\n \"type\": \"text\"\n }\n ]\n },\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_mcp_status\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"tool\": \"fusion_mcp_execute\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235628.7329783, + "raw": { + "_hint": "Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.", + "_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": 100, + "error": "", + "output": "{\"_hint\":\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\"_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.\",\"result\":{\"content\":[{\"text\":\"{\\n \\\"message\\\": \\\"ADOM_HISTORY_NATIVE={\\\\\\\"success\\\\\\\": true, \\\\\\\"pid\\\\\\\": 41728, \\\\\\\"sessionId\\\\\\\": \\\\\\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\\\\\", \\\\\\\"original\\\\\\\": {\\\\\\\"creationId\\\\\\\": \\\\\\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\\\\\", \\\\\\\"name\\\\\\\": \\\\\\\"Untitled\\\\\\\", \\\\\\\"modified\\\\\\\": false, \\\\\\\"saved\\\\\\\": false}}\\\\n\\\",\\n \\\"success\\\": true\\n}\",\"type\":\"text\"}]},\"shell\":\"rust\",\"statusVerb\":\"fusion_mcp_status\",\"success\":true,\"timeoutSeconds\":60,\"tool\":\"fusion_mcp_execute\"}", + "result": { + "content": [ + { + "text": "{\n \"message\": \"ADOM_HISTORY_NATIVE={\\\"success\\\": true, \\\"pid\\\": 41728, \\\"sessionId\\\": \\\"3c5e6744-d1ac-4276-9264-b05a96c51e3d\\\", \\\"original\\\": {\\\"creationId\\\": \\\"70b2c575-f830-4751-9f88-2f1f3ab91fb1\\\", \\\"name\\\": \\\"Untitled\\\", \\\"modified\\\": false, \\\"saved\\\": false}}\\n\",\n \"success\": true\n}", + "type": "text" + } + ] + }, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_mcp_status", + "success": true, + "timeoutSeconds": 60, + "tool": "fusion_mcp_execute" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0005-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0005-run_script.json new file mode 100644 index 0000000..aaaf565 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0005-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCcKJGNwOEV4cGVjdGVkPVtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRTdHJpbmcoW0NvbnZlcnRdOjpGcm9tQmFzZTY0U3RyaW5nKCdleUpvYjNOMElqb2dJa0ZFVDAxZlJGSkZWeklpTENBaWNHbGtJam9nTkRFM01qZ3NJQ0pqY21WaGRHVmtWWFJqSWpvZ0lqSXdNall0TVRBdE1EVlVNakU2TURFNk5EWXVOalV6TmpNNE1Gb2lMQ0FpWlhobFkzVjBZV0pzWlNJNklDSkRPbHhjVlhObGNuTmNYR1J5WlhkY1hFRndjRVJoZEdGY1hFeHZZMkZzWEZ4QmRYUnZaR1Z6YTF4Y2QyVmlaR1Z3Ykc5NVhGeHdjbTlrZFdOMGFXOXVYRnczTXpaa01tSTBZelZsTm1JNU5XVTNOMk14TVRjeU1XUmhNakl5WTJZeU1XTTJZVEZtWXpGbVhGeEdkWE5wYjI0ek5qQXVaWGhsSWl3Z0lteGhkVzVqYUdWeUlqb2dJa002WEZ4VmMyVnljMXhjWkhKbGQxeGNRWEJ3UkdGMFlWeGNURzlqWVd4Y1hFRjFkRzlrWlhOclhGeDNaV0prWlhCc2IzbGNYSEJ5YjJSMVkzUnBiMjVjWERaaE1HTTVOakV4TWpreFpEUTFZbUk1TWpJMk9UZ3dNakE1T1RFM1l6TmtYRnhHZFhOcGIyNU1ZWFZ1WTJobGNpNWxlR1VpZlE9PScpKSB8IENvbnZlcnRGcm9tLUpzb24KaWYoJGVudjpDT01QVVRFUk5BTUUgLWNuZSAkY3A4RXhwZWN0ZWQuaG9zdCl7dGhyb3cgJ0hvc3QgY2hhbmdlZCd9CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpCmlmKCRjcDhQcm9jZXNzZXMuQ291bnQgLW5lIDEpe3Rocm93ICdQcm9jZXNzIGNvdW50IGNoYW5nZWQnfQokY3A4UHJvY2Vzcz0kY3A4UHJvY2Vzc2VzWzBdCmlmKCRjcDhQcm9jZXNzLlByb2Nlc3NJZCAtbmUgJGNwOEV4cGVjdGVkLnBpZCAtb3IgJGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJykgLWNuZSAkY3A4RXhwZWN0ZWQuY3JlYXRlZFV0YyAtb3IgJGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGggLWNuZSAkY3A4RXhwZWN0ZWQuZXhlY3V0YWJsZSl7dGhyb3cgJ1Byb2Nlc3MgaWRlbnRpdHkgY2hhbmdlZCd9CmlmKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGNwOEV4cGVjdGVkLmxhdW5jaGVyIC1QYXRoVHlwZSBMZWFmKSAtb3IgLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAoJGNwOEV4cGVjdGVkLmxhdW5jaGVyKycuaW5pJykgLVBhdGhUeXBlIExlYWYpKXt0aHJvdyAnT2JzZXJ2ZWQgY29tcGxldGUgbGF1bmNoZXIgbWlzc2luZyd9CiRjcDhMYXVuY2hlckhhc2g9KEdldC1GaWxlSGFzaCAtTGl0ZXJhbFBhdGggJGNwOEV4cGVjdGVkLmxhdW5jaGVyIC1BbGdvcml0aG0gU0hBMjU2KS5IYXNoCiRjcDhNYW5hZ2VkPUdldC1Qcm9jZXNzIC1JZCAkY3A4RXhwZWN0ZWQucGlkIC1FcnJvckFjdGlvbiBTdG9wCmlmKCRjcDhNYW5hZ2VkLk1haW5XaW5kb3dIYW5kbGUgLWVxIDAgLW9yIC1ub3QgJGNwOE1hbmFnZWQuQ2xvc2VNYWluV2luZG93KCkpe3Rocm93ICdHcmFjZWZ1bCBjbG9zZSB3YXMgbm90IGFjY2VwdGVkJ30KaWYoLW5vdCAkY3A4TWFuYWdlZC5XYWl0Rm9yRXhpdCgyMDAwMCkpe3Rocm93ICdHcmFjZWZ1bCBjbG9zZSBub3QgY29tcGxldGU7IG5vIGZvcmNlIGtpbGwgb3IgcmVsYXVuY2gnfQppZihAKEdldC1DaW1JbnN0YW5jZSBXaW4zMl9Qcm9jZXNzIC1GaWx0ZXIgIk5hbWU9J0Z1c2lvbjM2MC5leGUnIikuQ291bnQgLW5lIDApe3Rocm93ICdGdXNpb24gcHJvY2VzcyByZW1haW5zOyBubyByZWxhdW5jaCd9CkB7c3VjY2Vzcz0kdHJ1ZTsgY2xvc2VkUGlkPVtpbnRdJGNwOEV4cGVjdGVkLnBpZDsgbGF1bmNoZXI9W3N0cmluZ10kY3A4RXhwZWN0ZWQubGF1bmNoZXI7IGxhdW5jaGVyU2hhMjU2PSRjcDhMYXVuY2hlckhhc2g7IGdyYWNlZnVsPSR0cnVlfSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcwo=", + "timeoutSeconds": 30, + "reason": "Gracefully close the exact pristine Fusion process once for the authorized durable-history test; no repair, force kill or capture" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCcKJGNwOEV4cGVjdGVkPVtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRTdHJpbmcoW0NvbnZlcnRdOjpGcm9tQmFzZTY0U3RyaW5nKCdleUpvYjNOMElqb2dJa0ZFVDAxZlJGSkZWeklpTENBaWNHbGtJam9nTkRFM01qZ3NJQ0pqY21WaGRHVmtWWFJqSWpvZ0lqSXdNall0TVRBdE1EVlVNakU2TURFNk5EWXVOalV6TmpNNE1Gb2lMQ0FpWlhobFkzVjBZV0pzWlNJNklDSkRPbHhjVlhObGNuTmNYR1J5WlhkY1hFRndjRVJoZEdGY1hFeHZZMkZzWEZ4QmRYUnZaR1Z6YTF4Y2QyVmlaR1Z3Ykc5NVhGeHdjbTlrZFdOMGFXOXVYRnczTXpaa01tSTBZelZsTm1JNU5XVTNOMk14TVRjeU1XUmhNakl5WTJZeU1XTTJZVEZtWXpGbVhGeEdkWE5wYjI0ek5qQXVaWGhsSWl3Z0lteGhkVzVqYUdWeUlqb2dJa002WEZ4VmMyVnljMXhjWkhKbGQxeGNRWEJ3UkdGMFlWeGNURzlqWVd4Y1hFRjFkRzlrWlhOclhGeDNaV0prWlhCc2IzbGNYSEJ5YjJSMVkzUnBiMjVjWERaaE1HTTVOakV4TWpreFpEUTFZbUk1TWpJMk9UZ3dNakE1T1RFM1l6TmtYRnhHZFhOcGIyNU1ZWFZ1WTJobGNpNWxlR1VpZlE9PScpKSB8IENvbnZlcnRGcm9tLUpzb24KaWYoJGVudjpDT01QVVRFUk5BTUUgLWNuZSAkY3A4RXhwZWN0ZWQuaG9zdCl7dGhyb3cgJ0hvc3QgY2hhbmdlZCd9CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpCmlmKCRjcDhQcm9jZXNzZXMuQ291bnQgLW5lIDEpe3Rocm93ICdQcm9jZXNzIGNvdW50IGNoYW5nZWQnfQokY3A4UHJvY2Vzcz0kY3A4UHJvY2Vzc2VzWzBdCmlmKCRjcDhQcm9jZXNzLlByb2Nlc3NJZCAtbmUgJGNwOEV4cGVjdGVkLnBpZCAtb3IgJGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJykgLWNuZSAkY3A4RXhwZWN0ZWQuY3JlYXRlZFV0YyAtb3IgJGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGggLWNuZSAkY3A4RXhwZWN0ZWQuZXhlY3V0YWJsZSl7dGhyb3cgJ1Byb2Nlc3MgaWRlbnRpdHkgY2hhbmdlZCd9CmlmKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGNwOEV4cGVjdGVkLmxhdW5jaGVyIC1QYXRoVHlwZSBMZWFmKSAtb3IgLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAoJGNwOEV4cGVjdGVkLmxhdW5jaGVyKycuaW5pJykgLVBhdGhUeXBlIExlYWYpKXt0aHJvdyAnT2JzZXJ2ZWQgY29tcGxldGUgbGF1bmNoZXIgbWlzc2luZyd9CiRjcDhMYXVuY2hlckhhc2g9KEdldC1GaWxlSGFzaCAtTGl0ZXJhbFBhdGggJGNwOEV4cGVjdGVkLmxhdW5jaGVyIC1BbGdvcml0aG0gU0hBMjU2KS5IYXNoCiRjcDhNYW5hZ2VkPUdldC1Qcm9jZXNzIC1JZCAkY3A4RXhwZWN0ZWQucGlkIC1FcnJvckFjdGlvbiBTdG9wCmlmKCRjcDhNYW5hZ2VkLk1haW5XaW5kb3dIYW5kbGUgLWVxIDAgLW9yIC1ub3QgJGNwOE1hbmFnZWQuQ2xvc2VNYWluV2luZG93KCkpe3Rocm93ICdHcmFjZWZ1bCBjbG9zZSB3YXMgbm90IGFjY2VwdGVkJ30KaWYoLW5vdCAkY3A4TWFuYWdlZC5XYWl0Rm9yRXhpdCgyMDAwMCkpe3Rocm93ICdHcmFjZWZ1bCBjbG9zZSBub3QgY29tcGxldGU7IG5vIGZvcmNlIGtpbGwgb3IgcmVsYXVuY2gnfQppZihAKEdldC1DaW1JbnN0YW5jZSBXaW4zMl9Qcm9jZXNzIC1GaWx0ZXIgIk5hbWU9J0Z1c2lvbjM2MC5leGUnIikuQ291bnQgLW5lIDApe3Rocm93ICdGdXNpb24gcHJvY2VzcyByZW1haW5zOyBubyByZWxhdW5jaCd9CkB7c3VjY2Vzcz0kdHJ1ZTsgY2xvc2VkUGlkPVtpbnRdJGNwOEV4cGVjdGVkLnBpZDsgbGF1bmNoZXI9W3N0cmluZ10kY3A4RXhwZWN0ZWQubGF1bmNoZXI7IGxhdW5jaGVyU2hhMjU2PSRjcDhMYXVuY2hlckhhc2g7IGdyYWNlZnVsPSR0cnVlfSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcwo=\", \"timeoutSeconds\": 30, \"reason\": \"Gracefully close the exact pristine Fusion process once for the authorized durable-history test; no repair, force kill or capture\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235628.7340612, + "mutating": false, + "stdout": "{\n \"durationMs\": 8112,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"launcherSha256\\\":\\\"EC27389A58B26399D6FAC0E4D73241B1D71F767AD0A51DD8AC60C54F234D81E9\\\",\\\"launcher\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Autodesk\\\\\\\\webdeploy\\\\\\\\production\\\\\\\\6a0c9611291d45bb9226980209917c3d\\\\\\\\FusionLauncher.exe\\\",\\\"closedPid\\\":41728,\\\"graceful\\\":true,\\\"success\\\":true}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 45\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235636.8645992, + "raw": { + "durationMs": 8112, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"launcherSha256\":\"EC27389A58B26399D6FAC0E4D73241B1D71F767AD0A51DD8AC60C54F234D81E9\",\"launcher\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Autodesk\\\\webdeploy\\\\production\\\\6a0c9611291d45bb9226980209917c3d\\\\FusionLauncher.exe\",\"closedPid\":41728,\"graceful\":true,\"success\":true}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 45 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0006-launch_process.json b/docs/mechanical-verification/cp8/restart/calls/0006-launch_process.json new file mode 100644 index 0000000..7f3cb1d --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0006-launch_process.json @@ -0,0 +1,36 @@ +{ + "target": "adom_drew2", + "verb": "launch_process", + "args": { + "path": "C:/Windows/System32/cmd.exe", + "args": [ + "/c", + "start", + "", + "/min", + "C:\\Users\\drew\\AppData\\Local\\Autodesk\\webdeploy\\production\\6a0c9611291d45bb9226980209917c3d\\FusionLauncher.exe" + ], + "window": "hidden", + "breakawayFromJob": true, + "detached": true, + "reason": "Start the verified Fusion launcher once, minimized, for the authorized history test; no dialog repair or screenshots" + }, + "requestJson": "{\"path\": \"C:/Windows/System32/cmd.exe\", \"args\": [\"/c\", \"start\", \"\", \"/min\", \"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Autodesk\\\\webdeploy\\\\production\\\\6a0c9611291d45bb9226980209917c3d\\\\FusionLauncher.exe\"], \"window\": \"hidden\", \"breakawayFromJob\": true, \"detached\": true, \"reason\": \"Start the verified Fusion launcher once, minimized, for the authorized history test; no dialog repair or screenshots\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235636.8650887, + "mutating": false, + "stdout": "{\n \"_hint\": \"args is an ARRAY \u2014 no shell quoting. Detached (fire-and-forget): returns immediately with pid; use process_kill {pid} to stop it, process_list to check it. window:\\\"hidden\\\" suppresses the console. For a script you want to WAIT on, use run_script.\",\n \"durationMs\": 19,\n \"pid\": 37992,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"success\": true,\n \"timeoutSeconds\": 30\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235636.8902001, + "raw": { + "_hint": "args is an ARRAY \u2014 no shell quoting. Detached (fire-and-forget): returns immediately with pid; use process_kill {pid} to stop it, process_list to check it. window:\"hidden\" suppresses the console. For a script you want to WAIT on, use run_script.", + "durationMs": 19, + "pid": 37992, + "schemaVersion": 1, + "status": "ok", + "success": true, + "timeoutSeconds": 30 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0007-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0007-run_script.json new file mode 100644 index 0000000..d9687a4 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0007-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK", + "timeoutSeconds": 12, + "reason": "Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK\", \"timeoutSeconds\": 12, \"reason\": \"Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235641.89113, + "mutating": false, + "stdout": "{\n \"durationMs\": 2354,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"processes\\\":[{\\\"ProcessId\\\":55528}],\\\"addin\\\":null,\\\"listeners\\\":[],\\\"observationError\\\":\\\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\\\"}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235644.2639403, + "raw": { + "durationMs": 2354, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"processes\":[{\"ProcessId\":55528}],\"addin\":null,\"listeners\":[],\"observationError\":\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\"}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0008-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0008-run_script.json new file mode 100644 index 0000000..c8502c2 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0008-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK", + "timeoutSeconds": 12, + "reason": "Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK\", \"timeoutSeconds\": 12, \"reason\": \"Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235649.2647061, + "mutating": false, + "stdout": "{\n \"durationMs\": 2688,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"processes\\\":[{\\\"ProcessId\\\":55528}],\\\"addin\\\":null,\\\"listeners\\\":[],\\\"observationError\\\":\\\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\\\"}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235651.9731333, + "raw": { + "durationMs": 2688, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"processes\":[{\"ProcessId\":55528}],\"addin\":null,\"listeners\":[],\"observationError\":\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\"}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0009-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0009-run_script.json new file mode 100644 index 0000000..061e895 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0009-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK", + "timeoutSeconds": 12, + "reason": "Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK\", \"timeoutSeconds\": 12, \"reason\": \"Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235656.9739878, + "mutating": false, + "stdout": "{\n \"durationMs\": 2029,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"processes\\\":[{\\\"ProcessId\\\":55528}],\\\"addin\\\":null,\\\"listeners\\\":[],\\\"observationError\\\":\\\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\\\"}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235659.0171099, + "raw": { + "durationMs": 2029, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"processes\":[{\"ProcessId\":55528}],\"addin\":null,\"listeners\":[],\"observationError\":\"No matching MSFT_NetTCPConnection objects found by CIM query for instances of the ROOT/StandardCimv2/MSFT_NetTCPConnection class on the CIM server: SELECT * FROM MSFT_NetTCPConnection WHERE ((LocalPort = 8774)) AND ((State = 2)). Verify query parameters and retry.\"}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0010-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0010-run_script.json new file mode 100644 index 0000000..032a095 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0010-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK", + "timeoutSeconds": 12, + "reason": "Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwokY3A4U3RhdHVzPSRudWxsOyAkY3A4RXJyb3I9JG51bGw7ICRjcDhMaXN0ZW5lcnM9QCgpOwp0cnkgewogICRjcDhMaXN0ZW5lcnM9QChHZXQtTmV0VENQQ29ubmVjdGlvbiAtTG9jYWxQb3J0IDg3NzQgLVN0YXRlIExpc3RlbiAtRXJyb3JBY3Rpb24gU3RvcCk7CiAgJGNwOFN0YXR1cz1JbnZva2UtUmVzdE1ldGhvZCAtVXJpICdodHRwOi8vMTI3LjAuMC4xOjg3NzQvc3RhdHVzJyAtTWV0aG9kIEdldCAtVGltZW91dFNlYyAzOwp9IGNhdGNoIHsgJGNwOEVycm9yPSRfLkV4Y2VwdGlvbi5NZXNzYWdlIH07CkB7aG9zdD0kZW52OkNPTVBVVEVSTkFNRTsgcHJvY2Vzc2VzPUAoJGNwOFByb2Nlc3NlcyB8IFNlbGVjdC1PYmplY3QgUHJvY2Vzc0lkKTsgbGlzdGVuZXJzPUAoJGNwOExpc3RlbmVycyB8IFNlbGVjdC1PYmplY3QgTG9jYWxBZGRyZXNzLE93bmluZ1Byb2Nlc3MpOyBhZGRpbj0kY3A4U3RhdHVzOyBvYnNlcnZhdGlvbkVycm9yPSRjcDhFcnJvcn0gfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggOCAtQ29tcHJlc3MK\", \"timeoutSeconds\": 12, \"reason\": \"Observe Fusion process and add-in listener only; no restart repair, update, dialog action or capture\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235664.0179458, + "mutating": false, + "stdout": "{\n \"durationMs\": 1930,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"processes\\\":[{\\\"ProcessId\\\":55528}],\\\"addin\\\":{\\\"busy\\\":false,\\\"version\\\":\\\"1.12.0-dev.8\\\",\\\"pyThreads\\\":4},\\\"listeners\\\":[{\\\"LocalAddress\\\":\\\"127.0.0.1\\\",\\\"OwningProcess\\\":55528}],\\\"observationError\\\":null}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235665.9908023, + "raw": { + "durationMs": 1930, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"processes\":[{\"ProcessId\":55528}],\"addin\":{\"busy\":false,\"version\":\"1.12.0-dev.8\",\"pyThreads\":4},\"listeners\":[{\"LocalAddress\":\"127.0.0.1\",\"OwningProcess\":55528}],\"observationError\":null}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0011-run_script.json b/docs/mechanical-verification/cp8/restart/calls/0011-run_script.json new file mode 100644 index 0000000..5b93eca --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0011-run_script.json @@ -0,0 +1,31 @@ +{ + "target": "adom_drew2", + "verb": "run_script", + "args": { + "interpreter": "powershell", + "scriptB64": "JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwppZigkY3A4UHJvY2Vzc2VzLkNvdW50IC1uZSAxKXt0aHJvdyAnRXhwZWN0ZWQgZXhhY3RseSBvbmUgRnVzaW9uIHByb2Nlc3MnfTsKJGNwOFByb2Nlc3M9JGNwOFByb2Nlc3Nlc1swXTsKQHtob3N0PSRlbnY6Q09NUFVURVJOQU1FOyBwaWQ9W2ludF0kY3A4UHJvY2Vzcy5Qcm9jZXNzSWQ7IGNyZWF0ZWRVdGM9JGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJyk7IGV4ZWN1dGFibGU9JGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGh9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCg==", + "timeoutSeconds": 12, + "reason": "Read process identity for the controlled Fusion restart history test" + }, + "requestJson": "{\"interpreter\": \"powershell\", \"scriptB64\": \"JEVycm9yQWN0aW9uUHJlZmVyZW5jZT0nU3RvcCc7CiRjcDhQcm9jZXNzZXM9QChHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyAtRmlsdGVyICJOYW1lPSdGdXNpb24zNjAuZXhlJyIpOwppZigkY3A4UHJvY2Vzc2VzLkNvdW50IC1uZSAxKXt0aHJvdyAnRXhwZWN0ZWQgZXhhY3RseSBvbmUgRnVzaW9uIHByb2Nlc3MnfTsKJGNwOFByb2Nlc3M9JGNwOFByb2Nlc3Nlc1swXTsKQHtob3N0PSRlbnY6Q09NUFVURVJOQU1FOyBwaWQ9W2ludF0kY3A4UHJvY2Vzcy5Qcm9jZXNzSWQ7IGNyZWF0ZWRVdGM9JGNwOFByb2Nlc3MuQ3JlYXRpb25EYXRlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCdvJyk7IGV4ZWN1dGFibGU9JGNwOFByb2Nlc3MuRXhlY3V0YWJsZVBhdGh9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCg==\", \"timeoutSeconds\": 12, \"reason\": \"Read process identity for the controlled Fusion restart history test\"}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235665.9911826, + "mutating": false, + "stdout": "{\n \"durationMs\": 741,\n \"exitCode\": 0,\n \"ok\": true,\n \"schemaVersion\": 1,\n \"status\": \"ok\",\n \"stderr\": \"\",\n \"stdout\": \"{\\\"host\\\":\\\"ADOM_DREW2\\\",\\\"pid\\\":55528,\\\"createdUtc\\\":\\\"2026-10-05T21:27:16.9237550Z\\\",\\\"executable\\\":\\\"C:\\\\\\\\Users\\\\\\\\drew\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Autodesk\\\\\\\\webdeploy\\\\\\\\production\\\\\\\\736d2b4c5e6b95e77c11721da222cf21c6a1fc1f\\\\\\\\Fusion360.exe\\\"}\\r\\n\",\n \"success\": true,\n \"timedOut\": false,\n \"timeoutSeconds\": 27\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235666.7494066, + "raw": { + "durationMs": 741, + "exitCode": 0, + "ok": true, + "schemaVersion": 1, + "status": "ok", + "stderr": "", + "stdout": "{\"host\":\"ADOM_DREW2\",\"pid\":55528,\"createdUtc\":\"2026-10-05T21:27:16.9237550Z\",\"executable\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Autodesk\\\\webdeploy\\\\production\\\\736d2b4c5e6b95e77c11721da222cf21c6a1fc1f\\\\Fusion360.exe\"}\r\n", + "success": true, + "timedOut": false, + "timeoutSeconds": 27 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0012-fusion_mech_capabilities.json b/docs/mechanical-verification/cp8/restart/calls/0012-fusion_mech_capabilities.json new file mode 100644 index 0000000..e894a9f --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0012-fusion_mech_capabilities.json @@ -0,0 +1,6432 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mech_capabilities", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235666.7498512, + "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\": 321,\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\\\":\\\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\\\",\\\"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\": \"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\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": 1791235667.0839858, + "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": 321, + "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\":\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\"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": "dd15182e-3fa9-4ea3-bc57-4175e60ef00c", + "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/restart/calls/0013-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/restart/calls/0013-fusion_mech_operation_status.json new file mode 100644 index 0000000..ac4314e --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0013-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 roadmap build", + "startedAt": 1791235667.0966425, + "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\": \"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\n \"durationMs\": 61,\n \"error\": \"\",\n \"historical\": true,\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\\\":\\\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\\\",\\\"historical\\\":true,\\\"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": 1791235667.1656253, + "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": "dd15182e-3fa9-4ea3-bc57-4175e60ef00c", + "durationMs": 61, + "error": "", + "historical": true, + "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\":\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\"historical\":true,\"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/restart/calls/0014-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/restart/calls/0014-fusion_mech_operation_status.json new file mode 100644 index 0000000..80129f6 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0014-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 roadmap build", + "startedAt": 1791235667.1672027, + "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\": \"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\n \"durationMs\": 31,\n \"error\": \"\",\n \"historical\": true,\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\\\":\\\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\\\",\\\"historical\\\":true,\\\"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": 1791235667.204088, + "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": "dd15182e-3fa9-4ea3-bc57-4175e60ef00c", + "durationMs": 31, + "error": "", + "historical": true, + "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\":\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\"historical\":true,\"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/restart/calls/0015-fusion_mech_operation_status.json b/docs/mechanical-verification/cp8/restart/calls/0015-fusion_mech_operation_status.json new file mode 100644 index 0000000..c900eba --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0015-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 roadmap build", + "startedAt": 1791235667.204872, + "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\": \"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\n \"durationMs\": 34,\n \"error\": \"\",\n \"historical\": true,\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\\\":\\\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\\\",\\\"historical\\\":true,\\\"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": 1791235667.2471166, + "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": "dd15182e-3fa9-4ea3-bc57-4175e60ef00c", + "durationMs": 34, + "error": "", + "historical": true, + "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\":\"dd15182e-3fa9-4ea3-bc57-4175e60ef00c\",\"historical\":true,\"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/restart/calls/0016-bridge_list.json b/docs/mechanical-verification/cp8/restart/calls/0016-bridge_list.json new file mode 100644 index 0000000..5b5fcb4 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0016-bridge_list.json @@ -0,0 +1,1455 @@ +{ + "target": "adom_drew2", + "verb": "bridge_list", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235667.2478426, + "mutating": false, + "stdout": "{\n \"_hint\": \"Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.\",\n \"_skillsHint\": \"For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).\",\n \"bridges\": [\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"CAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.\",\n \"devPinned\": true,\n \"displayName\": \"Autodesk Fusion 360\",\n \"docs\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe\",\n \"expectedImage\": \"adom-fusion-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/fusion-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"installSkill\": \"adom-wiki pkg install adom/fusion-bridge\",\n \"installedVersion\": \"1.12.0-dev.8\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791235667230,\n \"latest\": null,\n \"livePids\": [\n 42780\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/fusion360.log\",\n \"manifestSource\": null,\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"fusion360\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.\",\n \"supported\": true\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 50618,\n \"prewarm\": {\n \"assets\": [\n \"AdomBridge add-in sync\",\n \"PCB design-rules catalog cache\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:57Z\",\n \"elapsedMs\": 2344,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"fusion_prewarm\",\n \"version\": \"1.12.0-dev.5\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"fusion_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T06:00:00Z\",\n \"runningImage\": \"adom-fusion-bridge.exe\",\n \"runningVersion\": \"1.12.0-dev.5\",\n \"skillPkg\": \"adom/fusion-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360\",\n \"spawn\": {\n \"entrypoint\": \"adom-fusion-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 50618\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/fusion360\",\n \"status\": \"running\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"tags\": [\n \"fusion360\",\n \"autodesk\",\n \"cad\",\n \"exports\",\n \"aps\",\n \"modeling\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"open\",\n \"seconds\": 150\n }\n ],\n \"verbs\": {\n \"aps_open\": 150,\n \"aps_recent\": 120,\n \"aps_search\": 120,\n \"build_library_3d\": 1800,\n \"capture_library_views\": 600,\n \"close_all_documents\": 90,\n \"demo\": 300,\n \"export_3mf\": 360,\n \"export_board_image\": 90,\n \"export_bom\": 90,\n \"export_cpl\": 90,\n \"export_dwg\": 150,\n \"export_dxf\": 150,\n \"export_f3d\": 360,\n \"export_fbx\": 360,\n \"export_gerbers\": 210,\n \"export_iges\": 360,\n \"export_obj\": 360,\n \"export_sat\": 360,\n \"export_skp\": 360,\n \"export_step\": 360,\n \"export_stl\": 360,\n \"export_usdz\": 360,\n \"generate_package\": 120,\n \"get_preferences\": 25,\n \"install_fusion\": 90,\n \"make_3d_package\": 200,\n \"prewarm\": 120,\n \"run_modeling_script\": 180,\n \"search_cloud_files\": 200,\n \"set_preference\": 40,\n \"signin\": 150,\n \"start\": 90,\n \"walk_cloud_tree\": 620\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 21187.274521115574,\n \"verbCount\": 167,\n \"verbPrefixes\": [\n \"fusion_\"\n ],\n \"verbs\": [\n \"fusion_account\",\n \"fusion_action_ledger\",\n \"fusion_activate_document\",\n \"fusion_addin_status\",\n \"fusion_alerts\",\n \"fusion_apply_fusion_update\",\n \"fusion_aps_browse\",\n \"fusion_aps_create_folder\",\n \"fusion_aps_download\",\n \"fusion_aps_file_info\",\n \"fusion_aps_forget_browser\",\n \"fusion_aps_get\",\n \"fusion_aps_get_browser\",\n \"fusion_aps_open\",\n \"fusion_aps_recent\",\n \"fusion_aps_search\",\n \"fusion_aps_set_browser\",\n \"fusion_aps_set_client_id\",\n \"fusion_aps_signin\",\n \"fusion_aps_status\",\n \"fusion_aps_upload\",\n \"fusion_aps_versions\",\n \"fusion_assembly_bom\",\n \"fusion_attach_3d_package\",\n \"fusion_bind_library_3d\",\n \"fusion_board_info\",\n \"fusion_board_stackup\",\n \"fusion_build_library_3d\",\n \"fusion_cancel_run\",\n \"fusion_capture_library_views\",\n \"fusion_check_recovery\",\n \"fusion_claim_seat\",\n \"fusion_cleanup_cloud_files\",\n \"fusion_close_all_documents\",\n \"fusion_close_document\",\n \"fusion_close_window\",\n \"fusion_create_cloud_folder\",\n \"fusion_create_library\",\n \"fusion_delete_cloud_file\",\n \"fusion_demo\",\n \"fusion_demo_progress\",\n \"fusion_describe\",\n \"fusion_detect_layers\",\n \"fusion_dismiss_blocking_dialogs\",\n \"fusion_document_info\",\n \"fusion_eagle_import_status\",\n \"fusion_electron_pan\",\n \"fusion_electron_run\",\n \"fusion_electron_select\",\n \"fusion_electron_zoom\",\n \"fusion_electronics_query\",\n \"fusion_execute_text_command\",\n \"fusion_export_3mf\",\n \"fusion_export_board_image\",\n \"fusion_export_bom\",\n \"fusion_export_cloud_file\",\n \"fusion_export_cpl\",\n \"fusion_export_dwg\",\n \"fusion_export_dxf\",\n \"fusion_export_eagle_source\",\n \"fusion_export_f3d\",\n \"fusion_export_fbx\",\n \"fusion_export_gerbers\",\n \"fusion_export_iges\",\n \"fusion_export_lbr\",\n \"fusion_export_obj\",\n \"fusion_export_optimized_glb\",\n \"fusion_export_sat\",\n \"fusion_export_skp\",\n \"fusion_export_source\",\n \"fusion_export_step\",\n \"fusion_export_stl\",\n \"fusion_export_usdz\",\n \"fusion_fetch_optimized_glb\",\n \"fusion_generate_package\",\n \"fusion_get_app_state\",\n \"fusion_get_design_info\",\n \"fusion_get_parameters\",\n \"fusion_get_preferences\",\n \"fusion_import_electronics\",\n \"fusion_import_step\",\n \"fusion_inspect_bodies\",\n \"fusion_install_fusion\",\n \"fusion_install_library_bundle\",\n \"fusion_interactive\",\n \"fusion_kill\",\n \"fusion_library_manager\",\n \"fusion_library_parts\",\n \"fusion_list_cloud_files\",\n \"fusion_list_cloud_projects\",\n \"fusion_list_text_commands\",\n \"fusion_live_feed\",\n \"fusion_make_3d_package\",\n \"fusion_make_showcase_project\",\n \"fusion_make_test_project\",\n \"fusion_managed_library_create\",\n \"fusion_managed_library_link\",\n \"fusion_managed_library_pull\",\n \"fusion_managed_library_push\",\n \"fusion_managed_library_unlink\",\n \"fusion_mcp_call\",\n \"fusion_mcp_enable\",\n \"fusion_mcp_resources\",\n \"fusion_mcp_status\",\n \"fusion_mcp_tools\",\n \"fusion_mech_capabilities\",\n \"fusion_mech_operation_status\",\n \"fusion_mechanical\",\n \"fusion_narrate\",\n \"fusion_new_electronics_from_eagle\",\n \"fusion_notify_owner\",\n \"fusion_open_board\",\n \"fusion_open_by_urn\",\n \"fusion_open_by_urn_note\",\n \"fusion_open_cloud_file\",\n \"fusion_open_design\",\n \"fusion_open_electronics\",\n \"fusion_open_lbr\",\n \"fusion_open_schematic\",\n \"fusion_physical_properties\",\n \"fusion_plan_library_import\",\n \"fusion_plan_route\",\n \"fusion_preflight_lbr\",\n \"fusion_prefs_close\",\n \"fusion_prefs_open\",\n \"fusion_prewarm\",\n \"fusion_prove_result\",\n \"fusion_readiness\",\n \"fusion_release_seat\",\n \"fusion_reset_workspace\",\n \"fusion_resolve_seat_dialog\",\n \"fusion_restart_for_addin\",\n \"fusion_route_net\",\n \"fusion_routing_drc\",\n \"fusion_routing_state\",\n \"fusion_run_modeling_script\",\n \"fusion_save_to_cloud\",\n \"fusion_schematic\",\n \"fusion_screenshot_fusion\",\n \"fusion_search_cloud_files\",\n \"fusion_set_auto_update\",\n \"fusion_set_design_rules\",\n \"fusion_set_driving_badge\",\n \"fusion_set_parameter\",\n \"fusion_set_preference\",\n \"fusion_set_seat_takeover\",\n \"fusion_set_window_sizing\",\n \"fusion_show_2d_board\",\n \"fusion_show_3d_board\",\n \"fusion_show_3d_package\",\n \"fusion_show_attributes\",\n \"fusion_show_footprint\",\n \"fusion_show_library\",\n \"fusion_show_project\",\n \"fusion_show_schematic\",\n \"fusion_show_symbol\",\n \"fusion_signin\",\n \"fusion_signin_2fa\",\n \"fusion_start\",\n \"fusion_state\",\n \"fusion_stop\",\n \"fusion_take_screenshot\",\n \"fusion_uninstall\",\n \"fusion_verb_times\",\n \"fusion_view\",\n \"fusion_walk_cloud_tree\",\n \"fusion_web_signin\"\n ],\n \"version\": \"1.12.0-dev.8\",\n \"versionDrift\": true,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"developer-tools\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.\",\n \"devPinned\": false,\n \"displayName\": \"Hydrogen Desktop\",\n \"docs\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"entryMismatch\": false,\n \"entrypoint\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/\",\n \"expectedImage\": null,\n \"heroAvailable\": false,\n \"heroDocs\": \"https://wiki.adom.inc/adom/hydrogen-desktop\",\n \"homepage\": \"https://wiki.adom.inc/adom/adom-desktop\",\n \"installPath\": \"\\\\\\\\?\\\\C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\Adom Bridge\\\\bridges\\\\hd\",\n \"installSkill\": \"adom-wiki pkg install adom/adom-desktop\",\n \"installedVersion\": \"1.0.0\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": null,\n \"languages\": [],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 0,\n \"latest\": null,\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/hd.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": null,\n \"manifestUrlFollowed\": null,\n \"name\": \"hd\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"HD currently ships Windows-only; Linux variant in scope for HD's future releases.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"HD currently ships Windows-only.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": null,\n \"prewarm\": null,\n \"releasedAt\": \"2026-06-30T13:13:22Z\",\n \"runningImage\": null,\n \"runningVersion\": null,\n \"skillPkg\": \"adom/adom-desktop\",\n \"source\": \"bundled\",\n \"sourceDir\": \"//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd\",\n \"spawn\": {\n \"entrypoint\": \"\",\n \"instanceCount\": null,\n \"kind\": \"external-http\",\n \"manifestPort\": 47084,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": null\n },\n \"spawnKind\": \"external-http\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/hd\",\n \"status\": \"stopped\",\n \"statusVerb\": null,\n \"tags\": [\n \"hydrogen-desktop\",\n \"control-api\",\n \"http\",\n \"lifecycle\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 0.0,\n \"verbCount\": 11,\n \"verbPrefixes\": [],\n \"verbs\": [\n \"hd_api\",\n \"hd_status\",\n \"hd_launch\",\n \"hd_stop\",\n \"hd_restart\",\n \"hd_log\",\n \"hd_screenshot\",\n \"hd_shot\",\n \"hd_open_url\",\n \"hd_browser_profiles\",\n \"hd_ship\"\n ],\n \"version\": \"1.0.0\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"EDA\",\n \"depsInstallingSec\": null,\n \"description\": \"Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.\",\n \"devPinned\": false,\n \"displayName\": \"KiCad EDA\",\n \"docs\": \"https://wiki.adom.inc/adom/kicad-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe\",\n \"expectedImage\": \"kicad-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"installSkill\": \"adom-wiki pkg install adom/kicad-bridge\",\n \"installedVersion\": \"1.0.55\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Python\",\n \"PowerShell\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790956354547,\n \"latest\": \"1.0.55\",\n \"livePids\": [\n 36872\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/kicad.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"kicad\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 60896,\n \"prewarm\": {\n \"assets\": [\n \"kicad-cli warm (detection)\",\n \"KiCad first-run config + setup wizard marked done\",\n \"KiCad's own taskbar shortcut identity\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T15:41:58Z\",\n \"elapsedMs\": 273,\n \"error\": null,\n \"ok\": false,\n \"verb\": \"kicad_prewarm\",\n \"version\": \"1.0.55\"\n },\n \"requiresHostApp\": true,\n \"timeoutSeconds\": null,\n \"verb\": \"kicad_prewarm\"\n },\n \"releasedAt\": \"2026-06-26T16:00:00Z\",\n \"runningImage\": \"kicad-bridge.exe\",\n \"runningVersion\": \"1.0.55\",\n \"skillPkg\": \"adom/kicad-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad\",\n \"spawn\": {\n \"entrypoint\": \"kicad-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 60896\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/kicad\",\n \"status\": \"running\",\n \"statusVerb\": \"kicad_status\",\n \"tags\": [\n \"pcb\",\n \"schematic\",\n \"open-source\",\n \"kicad-10\",\n \"kicad-11-ready\"\n ],\n \"timeouts\": {\n \"default\": 130,\n \"prefixes\": [],\n \"verbs\": {\n \"autoroute\": 900,\n \"demo\": 600,\n \"enable_software_opengl\": 240,\n \"export_gerber\": 210,\n \"export_molecule\": 420,\n \"export_pdf\": 180,\n \"export_step\": 300,\n \"export_svg\": 180,\n \"format_upgrade\": 180,\n \"freerouting\": 900,\n \"open_3d_viewer\": 300,\n \"prewarm\": 120,\n \"run_drc\": 300,\n \"run_erc\": 300,\n \"upgrade\": 900\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 1038.1217984801588,\n \"verbCount\": 119,\n \"verbPrefixes\": [\n \"kicad_\"\n ],\n \"verbs\": [\n \"kicad_describe\",\n \"kicad_status\",\n \"kicad_readiness\",\n \"kicad_list_versions\",\n \"kicad_diagnostics\",\n \"kicad_run_drc\",\n \"kicad_run_erc\",\n \"kicad_export_gerber\",\n \"kicad_export_pdf\",\n \"kicad_export_svg\",\n \"kicad_export_step\",\n \"kicad_export_bom_csv\",\n \"kicad_uninstall\",\n \"kicad_extract_netlist\",\n \"kicad_trace_net\",\n \"kicad_find_connections\",\n \"kicad_analyze_connections\",\n \"kicad_lint_board\",\n \"kicad_lint_schematic\",\n \"kicad_lint_library\",\n \"kicad_format_upgrade\",\n \"kicad_list_symbols\",\n \"kicad_list_footprints\",\n \"kicad_adom_library_status\",\n \"kicad_get_settings\",\n \"kicad_set_settings\",\n \"kicad_list_design_rules\",\n \"kicad_set_design_rules\",\n \"kicad_3d_viewer_settings\",\n \"kicad_taskbar_repair\",\n \"kicad_prewarm\",\n \"kicad_model_check\",\n \"kicad_pcm_list\",\n \"kicad_pcm_install\",\n \"kicad_pcm_uninstall\",\n \"kicad_pcm_add_repository\",\n \"kicad_pcm_remove_repository\",\n \"kicad_check_for_updates\",\n \"kicad_upgrade\",\n \"kicad_sch_place_symbol\",\n \"kicad_sch_wire\",\n \"kicad_sch_label\",\n \"kicad_sch_move\",\n \"kicad_sch_delete\",\n \"kicad_sch_set_property\",\n \"kicad_ipc_api\",\n \"kicad_export_molecule\",\n \"kicad_errors\",\n \"kicad_log_tail\",\n \"kicad_bridge_status\",\n \"kicad_bridge_call\",\n \"kicad_install_plugin\",\n \"kicad_plugin_diagnose\",\n \"kicad_install_library\",\n \"kicad_uninstall_library\",\n \"kicad_install_symbol\",\n \"kicad_install_footprint\",\n \"kicad_install_library_bundle\",\n \"kicad_adom_library_heal\",\n \"kicad_make_part_project\",\n \"kicad_export_part\",\n \"kicad_silk_fields_batch\",\n \"kicad_silk_graphics_batch\",\n \"kicad_text_bounds\",\n \"kicad_silk_text_batch\",\n \"kicad_routing_state\",\n \"kicad_route_net\",\n \"kicad_remove_route\",\n \"kicad_add_zone\",\n \"kicad_apply_zone_plan\",\n \"kicad_zone_state\",\n \"kicad_select_net\",\n \"kicad_select_clear\",\n \"kicad_remove_zone\",\n \"kicad_routing_validate\",\n \"kicad_board_pads\",\n \"kicad_add_track\",\n \"kicad_add_via\",\n \"kicad_route\",\n \"kicad_autoroute\",\n \"kicad_freerouting\",\n \"kicad_placement_state\",\n \"kicad_move_footprint\",\n \"kicad_placement_validate\",\n \"kicad_refresh_board_views\",\n \"kicad_launch\",\n \"kicad_open_board\",\n \"kicad_open_schematic\",\n \"kicad_open_symbol_editor\",\n \"kicad_open_footprint_editor\",\n \"kicad_menu_items\",\n \"kicad_3d_view\",\n \"kicad_open_3d_viewer\",\n \"kicad_open_editors\",\n \"kicad_close\",\n \"kicad_close_symbol_editor\",\n \"kicad_close_footprint_editor\",\n \"kicad_close_3d_viewer\",\n \"kicad_dismiss_dialogs\",\n \"kicad_window_info\",\n \"kicad_state\",\n \"kicad_screenshot_all\",\n \"kicad_send_key\",\n \"kicad_click\",\n \"kicad_fix_keyboard\",\n \"kicad_place_footprint\",\n \"kicad_enable_software_opengl\",\n \"kicad_rescan_libraries\",\n \"kicad_show_project\",\n \"kicad_show_symbol\",\n \"kicad_show_footprint\",\n \"kicad_show_3d_chip\",\n \"kicad_show_schematic\",\n \"kicad_show_2d_board\",\n \"kicad_show_3d_board\",\n \"kicad_show_library\",\n \"kicad_progress\",\n \"kicad_verb_times\",\n \"kicad_demo\"\n ],\n \"version\": \"1.0.55\",\n \"versionDrift\": false,\n \"watcher\": {\n \"configKey\": \"project_watch\",\n \"defaultGlobs\": [\n \"*.kicad_pcb\",\n \"*.kicad_sch\",\n \"*.kicad_pro\"\n ],\n \"description\": \"Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).\",\n \"displayName\": \"Project Watch\",\n \"supports\": true\n }\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.\",\n \"devPinned\": false,\n \"displayName\": \"Adom Native Browser\",\n \"docs\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js\",\n \"expectedImage\": \"node.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/nb-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"installSkill\": \"adom-wiki pkg install adom/nb-bridge\",\n \"installedVersion\": \"0.16.33\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Node/JS\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791220671752,\n \"latest\": \"0.16.33\",\n \"livePids\": [\n 32228\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/native-browser.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"native-browser\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 51703,\n \"prewarm\": {\n \"assets\": [],\n \"lastRun\": {\n \"at\": \"2026-09-22T19:44:55Z\",\n \"elapsedMs\": 41,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"nbrowser_prewarm\",\n \"version\": \"0.16.33\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": null,\n \"verb\": \"nbrowser_prewarm\"\n },\n \"releasedAt\": \"2026-09-22T15:18:44Z\",\n \"runningImage\": \"node.exe\",\n \"runningVersion\": \"0.16.33\",\n \"skillPkg\": \"adom/nb-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser\",\n \"spawn\": {\n \"entrypoint\": \"server.js\",\n \"instanceCount\": 1,\n \"kind\": \"node\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 51703\n },\n \"spawnKind\": \"node\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/native-browser\",\n \"status\": \"running\",\n \"statusVerb\": \"nbrowser_status\",\n \"tags\": [\n \"nb\",\n \"nbe\",\n \"native-browser\",\n \"chrome\",\n \"edge\",\n \"nbrowser\",\n \"pup-parity\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"screenshot\",\n \"seconds\": 120\n },\n {\n \"prefix\": \"record\",\n \"seconds\": 120\n }\n ],\n \"verbs\": {\n \"fetch_url\": 120,\n \"input_dispatch\": 120,\n \"select\": 30,\n \"wait\": 125\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 917.3546810807766,\n \"verbCount\": 88,\n \"verbPrefixes\": [\n \"nbrowser_\"\n ],\n \"verbs\": [\n \"nbrowser_status\",\n \"nbrowser_readiness\",\n \"nbrowser_install_chrome\",\n \"nbrowser_prewarm\",\n \"nbrowser_chrome_status\",\n \"nbrowser_ping\",\n \"nbrowser_progress\",\n \"nbrowser_activity\",\n \"nbrowser_open_window\",\n \"nbrowser_close_window\",\n \"nbrowser_owned\",\n \"nbrowser_cleanup\",\n \"nbrowser_force_close\",\n \"nbrowser_switch_window\",\n \"nbrowser_list_windows\",\n \"nbrowser_window_state\",\n \"nbrowser_fullscreen\",\n \"nbrowser_login_state\",\n \"nbrowser_credentials\",\n \"nbrowser_profiles\",\n \"nbrowser_use_profile\",\n \"nbrowser_pin_session\",\n \"nbrowser_open_os_window\",\n \"nbrowser_os_windows\",\n \"nbrowser_wake_profile\",\n \"nbrowser_resolve_profiles\",\n \"nbrowser_whoami\",\n \"nbrowser_profile_block\",\n \"nbrowser_profile_unblock\",\n \"nbrowser_rescan\",\n \"nbrowser_resync_sessions\",\n \"nbrowser_open_tab\",\n \"nbrowser_close_tab\",\n \"nbrowser_switch_tab\",\n \"nbrowser_list_tabs\",\n \"nbrowser_navigate\",\n \"nbrowser_reload\",\n \"nbrowser_back\",\n \"nbrowser_forward\",\n \"nbrowser_wait\",\n \"nbrowser_wait_for\",\n \"nbrowser_keepalive\",\n \"nbrowser_screenshot\",\n \"nbrowser_screenshot_full_res\",\n \"nbrowser_eval\",\n \"nbrowser_evaluate\",\n \"nbrowser_input_dispatch\",\n \"nbrowser_scroll\",\n \"nbrowser_click\",\n \"nbrowser_select\",\n \"nbrowser_set_file_input\",\n \"nbrowser_set_date\",\n \"nbrowser_totp\",\n \"nbrowser_register_totp\",\n \"nbrowser_add_extension_origin\",\n \"nbrowser_type\",\n \"nbrowser_press_key\",\n \"nbrowser_fetch_url\",\n \"nbrowser_download_wait\",\n \"nbrowser_errors\",\n \"nbrowser_close\",\n \"nbrowser_record_start\",\n \"nbrowser_record_stop\",\n \"nbrowser_record_status\",\n \"nbrowser_record_list\",\n \"nbrowser_flash\",\n \"nbrowser_flash_stop\",\n \"nbrowser_apply_settings\",\n \"nbrowser_settings\",\n \"nbrowser_flash_mode\",\n \"nbrowser_taskbar\",\n \"nbrowser_describe\",\n \"nbrowser_handle_dialog\",\n \"nbrowser_state\",\n \"nbrowser_demo\",\n \"nbrowser_uninstall\",\n \"nbrowser_dev_reload\",\n \"nbrowser_clear_cookies\",\n \"nbrowser_caption\",\n \"nbrowser_focus\",\n \"nbrowser_hover\",\n \"nbrowser_double_click\",\n \"nbrowser_right_click\",\n \"nbrowser_login_form\",\n \"nbrowser_autologin\",\n \"nbrowser_cursor\",\n \"nbrowser_events\",\n \"nbrowser_download\"\n ],\n \"version\": \"0.16.33\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Manufacturing\",\n \"depsInstallingSec\": null,\n \"description\": \"The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.\",\n \"devPinned\": false,\n \"displayName\": \"Puma Bridge (Essemtec ePlace)\",\n \"docs\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe\",\n \"expectedImage\": \"puma-bridge-host.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/puma-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"installSkill\": \"adom-wiki pkg install adom/puma-bridge\",\n \"installedVersion\": \"0.2.7\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1790623763822,\n \"latest\": \"0.2.6\",\n \"livePids\": [\n 32008\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puma-bridge.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puma-bridge\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"\",\n \"supported\": true\n },\n \"macos\": {\n \"reason\": \"\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 64764,\n \"prewarm\": null,\n \"releasedAt\": \"2026-09-23T15:54:11Z\",\n \"runningImage\": \"puma-bridge-host.exe\",\n \"runningVersion\": \"0.2.7\",\n \"skillPkg\": \"adom/puma-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge\",\n \"spawn\": {\n \"entrypoint\": \"puma-bridge-host.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 64764\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puma-bridge\",\n \"status\": \"running\",\n \"statusVerb\": \"puma_write_status\",\n \"tags\": [\n \"smt\",\n \"essemtec\",\n \"puma\",\n \"eplace\",\n \"pick-and-place\",\n \"manufacturing\",\n \"factoryos\"\n ],\n \"timeouts\": null,\n \"updateAvailable\": false,\n \"usageScore\": 2.691935562909098,\n \"verbCount\": 9,\n \"verbPrefixes\": [\n \"puma_\"\n ],\n \"verbs\": [\n \"puma_ping\",\n \"puma_state\",\n \"puma_get\",\n \"puma_feeders\",\n \"puma_dryrun\",\n \"puma_write\",\n \"puma_revert\",\n \"puma_write_status\",\n \"puma_describe\"\n ],\n \"version\": \"0.2.7\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"Browser Automation\",\n \"depsInstallingSec\": null,\n \"description\": \"Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.\",\n \"devPinned\": false,\n \"displayName\": \"Puppeteer (Chrome for Testing + Native)\",\n \"docs\": \"https://wiki.adom.inc/adom/pup-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe\",\n \"expectedImage\": \"adom-pup-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"installSkill\": \"adom-wiki pkg install adom/pup-bridge\",\n \"installedVersion\": \"2.0.697\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 1,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791212202067,\n \"latest\": \"2.0.697\",\n \"livePids\": [\n 68812\n ],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/puppeteer.log\",\n \"manifestSource\": \"insidersManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"puppeteer\",\n \"paused\": false,\n \"persistent\": true,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"not yet\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 57134,\n \"prewarm\": {\n \"assets\": [\n \"chrome-for-testing\"\n ],\n \"lastRun\": {\n \"at\": \"2026-10-05T14:55:58Z\",\n \"elapsedMs\": 1409,\n \"error\": null,\n \"ok\": true,\n \"verb\": \"pup_prewarm\",\n \"version\": \"2.0.697\"\n },\n \"requiresHostApp\": false,\n \"timeoutSeconds\": 900,\n \"verb\": \"pup_prewarm\"\n },\n \"releasedAt\": \"2026-10-05T14:55:48Z\",\n \"runningImage\": \"adom-pup-bridge.exe\",\n \"runningVersion\": \"2.0.697\",\n \"skillPkg\": \"adom/pup-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer\",\n \"spawn\": {\n \"entrypoint\": \"adom-pup-bridge.exe\",\n \"instanceCount\": 1,\n \"kind\": \"exe\",\n \"manifestPort\": 8851,\n \"persistent\": true,\n \"portBlocked\": null,\n \"runtimePort\": 57134\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/puppeteer\",\n \"status\": \"running\",\n \"statusVerb\": \"pup_readiness\",\n \"tags\": [\n \"puppeteer\",\n \"chrome\",\n \"headful\",\n \"recording\"\n ],\n \"timeouts\": {\n \"default\": 60,\n \"prefixes\": [\n {\n \"prefix\": \"record\",\n \"seconds\": 90\n }\n ],\n \"verbs\": {\n \"credential_reveal\": 150,\n \"fill_card\": 150,\n \"open_window\": 150,\n \"prewarm\": 240,\n \"use\": 240\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 580.2145202778763,\n \"verbCount\": 97,\n \"verbPrefixes\": [\n \"pup_\",\n \"browser_\"\n ],\n \"verbs\": [\n \"pup_describe\",\n \"pup_readiness\",\n \"pup_prewarm\",\n \"pup_status\",\n \"pup_list_windows\",\n \"pup_my_windows\",\n \"pup_list_sessions\",\n \"pup_open_window\",\n \"pup_navigate\",\n \"pup_eval\",\n \"pup_evaluate\",\n \"pup_screenshot\",\n \"pup_close_window\",\n \"pup_close\",\n \"pup_close_all_windows\",\n \"pup_window_info\",\n \"pup_open_tab\",\n \"pup_list_tabs\",\n \"pup_switch_tab\",\n \"pup_close_tab\",\n \"pup_switch_window\",\n \"pup_click\",\n \"pup_select\",\n \"pup_hover\",\n \"pup_type\",\n \"pup_press_key\",\n \"pup_scroll\",\n \"pup_fill\",\n \"pup_wait\",\n \"pup_reload\",\n \"pup_back\",\n \"pup_forward\",\n \"pup_set_viewport\",\n \"pup_errors\",\n \"pup_dialog\",\n \"pup_input_dispatch\",\n \"pup_render_html\",\n \"pup_fetch_url\",\n \"pup_maximize\",\n \"pup_raise_os_window\",\n \"pup_focus_window\",\n \"pup_lower_os_window\",\n \"pup_alert_window\",\n \"pup_progress\",\n \"pup_configure\",\n \"pup_use\",\n \"pup_clear_cookies\",\n \"pup_clear_site_data\",\n \"pup_quit_idle_browsers\",\n \"pup_rescan\",\n \"pup_restart_browser\",\n \"pup_set_identity\",\n \"pup_audit_icons\",\n \"pup_dashboard\",\n \"pup_credentials\",\n \"credential_list\",\n \"credential_set\",\n \"credential_delete\",\n \"pup_login\",\n \"pup_google_accounts\",\n \"pup_google_signin\",\n \"pup_credential_reveal\",\n \"pup_card_set\",\n \"pup_cards\",\n \"pup_card_delete\",\n \"pup_fill_card\",\n \"pup_wiki_set_view\",\n \"pup_annotate\",\n \"pup_floaty_click\",\n \"pup_record_start\",\n \"pup_record_stop\",\n \"pup_record_status\",\n \"pup_record_list\",\n \"pup_recorder_open\",\n \"pup_recorder_close\",\n \"pup_screen_record_start\",\n \"pup_screen_record_stop\",\n \"pup_screen_record_status\",\n \"pup_screen_record_list\",\n \"pup_highfps_extend\",\n \"pup_screenshot_element\",\n \"pup_screenshot_full_res\",\n \"pup_download\",\n \"pup_launch\",\n \"pup_deps\",\n \"pup_install_toolbar\",\n \"pup_reap_profiles\",\n \"pup_cache_prune\",\n \"pup_sweep_identities\",\n \"pup_uninstall\",\n \"pup_move_to_workspace\",\n \"pup_assisted_click\",\n \"pup_import_scan\",\n \"pup_import_browser_logins\",\n \"pup_vault_sync\",\n \"pup_vault_export\",\n \"pup_vault_import\"\n ],\n \"version\": \"2.0.697\",\n \"versionDrift\": false,\n \"watcher\": null\n },\n {\n \"author\": \"Adom Inc.\",\n \"category\": \"MCAD\",\n \"depsInstallingSec\": null,\n \"description\": \"Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.\",\n \"devPinned\": false,\n \"displayName\": \"SOLIDWORKS\",\n \"docs\": \"https://wiki.adom.inc/adom/solidworks-bridge\",\n \"entryMismatch\": false,\n \"entrypoint\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe\",\n \"expectedImage\": \"swx-bridge.exe\",\n \"heroAvailable\": false,\n \"heroDocs\": null,\n \"homepage\": \"https://wiki.adom.inc/adom/adom-bridge\",\n \"installPath\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"installSkill\": \"adom-wiki pkg install adom/solidworks-bridge\",\n \"installedVersion\": \"0.9.21\",\n \"installedVersionSource\": \"cache\",\n \"instanceCount\": 0,\n \"languages\": [\n \"Binary\"\n ],\n \"lastSpawnError\": null,\n \"lastUsedMs\": 1791224978746,\n \"latest\": \"0.9.19\",\n \"livePids\": [],\n \"logPath\": \"C:/Users/drew/.adom/bridge-logs/solidworks.log\",\n \"manifestSource\": \"updateManifestUrl\",\n \"manifestUrl\": \"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json\",\n \"manifestUrlFollowed\": null,\n \"name\": \"solidworks\",\n \"paused\": false,\n \"persistent\": false,\n \"platforms\": {\n \"linux\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"macos\": {\n \"reason\": \"SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.\",\n \"supported\": false\n },\n \"windows\": {\n \"reason\": \"\",\n \"supported\": true\n }\n },\n \"port\": 49861,\n \"prewarm\": null,\n \"releasedAt\": \"2026-10-05T18:49:46Z\",\n \"runningImage\": null,\n \"runningVersion\": \"0.9.19\",\n \"skillPkg\": \"adom/solidworks-bridge\",\n \"source\": \"cache\",\n \"sourceDir\": \"C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks\",\n \"spawn\": {\n \"entrypoint\": \"swx-bridge.exe\",\n \"instanceCount\": 0,\n \"kind\": \"exe\",\n \"manifestPort\": 0,\n \"persistent\": false,\n \"portBlocked\": null,\n \"runtimePort\": 49861\n },\n \"spawnKind\": \"exe\",\n \"stableUrl\": \"http://127.0.0.1:24680/open/solidworks\",\n \"status\": \"running\",\n \"statusVerb\": \"swx_status\",\n \"tags\": [\n \"solidworks\",\n \"mcad\",\n \"cad\",\n \"bom\",\n \"step\",\n \"mass-properties\",\n \"modeling\",\n \"fusion-parity\"\n ],\n \"timeouts\": {\n \"default\": 120,\n \"prefixes\": [],\n \"verbs\": {\n \"action_ledger\": 20,\n \"activate_document\": 180,\n \"bom\": 300,\n \"check_recovery\": 180,\n \"close_all_documents\": 240,\n \"close_all_safely\": 600,\n \"close_doc\": 180,\n \"close_import_temps\": 600,\n \"close_window\": 120,\n \"cloud_status\": 90,\n \"design_info\": 180,\n \"dismiss_blocking_dialogs\": 180,\n \"document_info\": 120,\n \"export\": 300,\n \"export_3mf\": 300,\n \"export_dwg\": 300,\n \"export_dxf\": 300,\n \"export_glb\": 300,\n \"export_iges\": 300,\n \"export_parasolid\": 300,\n \"export_pdf\": 300,\n \"export_sat\": 300,\n \"export_step\": 300,\n \"export_stl\": 300,\n \"find_files\": 180,\n \"get_app_state\": 90,\n \"get_parameters\": 240,\n \"get_preferences\": 90,\n \"import\": 420,\n \"inspect_bodies\": 180,\n \"interference\": 600,\n \"kill\": 240,\n \"new_document\": 180,\n \"open\": 300,\n \"pack_and_go\": 600,\n \"rebuild_check\": 300,\n \"render_image\": 600,\n \"reset_workspace\": 600,\n \"run_script\": 420,\n \"save_as\": 420,\n \"set_driving_badge\": 120,\n \"set_parameter\": 420,\n \"set_preference\": 90,\n \"show_assembly\": 600,\n \"show_drawing\": 600,\n \"show_part\": 600,\n \"shutdown\": 900,\n \"sign_in\": 240,\n \"start\": 300,\n \"state\": 180,\n \"stop\": 420,\n \"verb_times\": 20,\n \"window_info\": 120\n }\n },\n \"updateAvailable\": false,\n \"usageScore\": 561.4742469072098,\n \"verbCount\": 69,\n \"verbPrefixes\": [\n \"swx_\"\n ],\n \"verbs\": [\n \"swx_action_ledger\",\n \"swx_activate_document\",\n \"swx_add_component\",\n \"swx_bom\",\n \"swx_check_recovery\",\n \"swx_close_all_documents\",\n \"swx_close_all_safely\",\n \"swx_close_doc\",\n \"swx_close_import_temps\",\n \"swx_close_window\",\n \"swx_cloud_status\",\n \"swx_com_eval\",\n \"swx_describe\",\n \"swx_design_info\",\n \"swx_dismiss_blocking_dialogs\",\n \"swx_docs\",\n \"swx_document_info\",\n \"swx_export\",\n \"swx_export_3mf\",\n \"swx_export_dwg\",\n \"swx_export_dxf\",\n \"swx_export_glb\",\n \"swx_export_iges\",\n \"swx_export_parasolid\",\n \"swx_export_pdf\",\n \"swx_export_sat\",\n \"swx_export_step\",\n \"swx_export_stl\",\n \"swx_find_files\",\n \"swx_get_app_state\",\n \"swx_get_parameters\",\n \"swx_get_preferences\",\n \"swx_import\",\n \"swx_inspect_bodies\",\n \"swx_interference\",\n \"swx_kill\",\n \"swx_mass_properties\",\n \"swx_new_document\",\n \"swx_open\",\n \"swx_pack_and_go\",\n \"swx_progress\",\n \"swx_props_get\",\n \"swx_props_set\",\n \"swx_readiness\",\n \"swx_rebuild_check\",\n \"swx_recover_list\",\n \"swx_render_image\",\n \"swx_reset_workspace\",\n \"swx_run_macro\",\n \"swx_run_script\",\n \"swx_save\",\n \"swx_save_as\",\n \"swx_screenshot\",\n \"swx_set_driving_badge\",\n \"swx_set_parameter\",\n \"swx_set_preference\",\n \"swx_show_assembly\",\n \"swx_show_drawing\",\n \"swx_show_part\",\n \"swx_shutdown\",\n \"swx_sign_in\",\n \"swx_start\",\n \"swx_state\",\n \"swx_status\",\n \"swx_stop\",\n \"swx_uninstall\",\n \"swx_user_presence\",\n \"swx_verb_times\",\n \"swx_window_info\"\n ],\n \"version\": \"0.9.21\",\n \"versionDrift\": true,\n \"watcher\": null\n }\n ],\n \"current_os\": \"windows\",\n \"durationMs\": 15,\n \"error\": \"\",\n \"invalidCount\": 0,\n \"ok\": true,\n \"output\": \"\",\n \"schemaVersion\": 1,\n \"staleCheckedAt\": 1791215191,\n \"status\": \"ok\",\n \"success\": true,\n \"summary\": {\n \"bundled\": 1,\n \"cache\": 6,\n \"invalid\": 0,\n \"paused\": 0,\n \"third_party\": 0,\n \"total\": 7\n },\n \"timeoutSeconds\": 10\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235667.270382, + "raw": { + "_hint": "Per-bridge runtime info. `source` tells you where the bridge code lives: bundled (installer ships it) / cache (wiki-streamed, writable) / third_party (installed via bridge_install). Use bridge_install to add a new bridge from a wiki manifest URL, bridge_pause/resume to control lifecycle without uninstalling, bridge_uninstall to remove. v1.8.0+.", + "_skillsHint": "For each bridge here with skillPkg != null, the container should run its `installSkill` to get that bridge's SKILL.md into ~/.claude/skills/ (then `adom-wiki pkg update` keeps them current). skillPkg:null bridges ship their skill in the adom-bridge core pkg (or have none).", + "bridges": [ + { + "author": "Adom Inc.", + "category": "CAD", + "depsInstallingSec": null, + "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", + "devPinned": true, + "displayName": "Autodesk Fusion 360", + "docs": "https://wiki.adom.inc/adom/fusion-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe", + "expectedImage": "adom-fusion-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/fusion-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "installSkill": "adom-wiki pkg install adom/fusion-bridge", + "installedVersion": "1.12.0-dev.8", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python" + ], + "lastSpawnError": null, + "lastUsedMs": 1791235667230, + "latest": null, + "livePids": [ + 42780 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/fusion360.log", + "manifestSource": null, + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json", + "manifestUrlFollowed": null, + "name": "fusion360", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to.", + "supported": false + }, + "macos": { + "reason": "Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py.", + "supported": true + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 50618, + "prewarm": { + "assets": [ + "AdomBridge add-in sync", + "PCB design-rules catalog cache" + ], + "lastRun": { + "at": "2026-10-05T15:41:57Z", + "elapsedMs": 2344, + "error": null, + "ok": true, + "verb": "fusion_prewarm", + "version": "1.12.0-dev.5" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "fusion_prewarm" + }, + "releasedAt": "2026-06-26T06:00:00Z", + "runningImage": "adom-fusion-bridge.exe", + "runningVersion": "1.12.0-dev.5", + "skillPkg": "adom/fusion-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/fusion360", + "spawn": { + "entrypoint": "adom-fusion-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 50618 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/fusion360", + "status": "running", + "statusVerb": "fusion_get_app_state", + "tags": [ + "fusion360", + "autodesk", + "cad", + "exports", + "aps", + "modeling" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "open", + "seconds": 150 + } + ], + "verbs": { + "aps_open": 150, + "aps_recent": 120, + "aps_search": 120, + "build_library_3d": 1800, + "capture_library_views": 600, + "close_all_documents": 90, + "demo": 300, + "export_3mf": 360, + "export_board_image": 90, + "export_bom": 90, + "export_cpl": 90, + "export_dwg": 150, + "export_dxf": 150, + "export_f3d": 360, + "export_fbx": 360, + "export_gerbers": 210, + "export_iges": 360, + "export_obj": 360, + "export_sat": 360, + "export_skp": 360, + "export_step": 360, + "export_stl": 360, + "export_usdz": 360, + "generate_package": 120, + "get_preferences": 25, + "install_fusion": 90, + "make_3d_package": 200, + "prewarm": 120, + "run_modeling_script": 180, + "search_cloud_files": 200, + "set_preference": 40, + "signin": 150, + "start": 90, + "walk_cloud_tree": 620 + } + }, + "updateAvailable": false, + "usageScore": 21187.274521115574, + "verbCount": 167, + "verbPrefixes": [ + "fusion_" + ], + "verbs": [ + "fusion_account", + "fusion_action_ledger", + "fusion_activate_document", + "fusion_addin_status", + "fusion_alerts", + "fusion_apply_fusion_update", + "fusion_aps_browse", + "fusion_aps_create_folder", + "fusion_aps_download", + "fusion_aps_file_info", + "fusion_aps_forget_browser", + "fusion_aps_get", + "fusion_aps_get_browser", + "fusion_aps_open", + "fusion_aps_recent", + "fusion_aps_search", + "fusion_aps_set_browser", + "fusion_aps_set_client_id", + "fusion_aps_signin", + "fusion_aps_status", + "fusion_aps_upload", + "fusion_aps_versions", + "fusion_assembly_bom", + "fusion_attach_3d_package", + "fusion_bind_library_3d", + "fusion_board_info", + "fusion_board_stackup", + "fusion_build_library_3d", + "fusion_cancel_run", + "fusion_capture_library_views", + "fusion_check_recovery", + "fusion_claim_seat", + "fusion_cleanup_cloud_files", + "fusion_close_all_documents", + "fusion_close_document", + "fusion_close_window", + "fusion_create_cloud_folder", + "fusion_create_library", + "fusion_delete_cloud_file", + "fusion_demo", + "fusion_demo_progress", + "fusion_describe", + "fusion_detect_layers", + "fusion_dismiss_blocking_dialogs", + "fusion_document_info", + "fusion_eagle_import_status", + "fusion_electron_pan", + "fusion_electron_run", + "fusion_electron_select", + "fusion_electron_zoom", + "fusion_electronics_query", + "fusion_execute_text_command", + "fusion_export_3mf", + "fusion_export_board_image", + "fusion_export_bom", + "fusion_export_cloud_file", + "fusion_export_cpl", + "fusion_export_dwg", + "fusion_export_dxf", + "fusion_export_eagle_source", + "fusion_export_f3d", + "fusion_export_fbx", + "fusion_export_gerbers", + "fusion_export_iges", + "fusion_export_lbr", + "fusion_export_obj", + "fusion_export_optimized_glb", + "fusion_export_sat", + "fusion_export_skp", + "fusion_export_source", + "fusion_export_step", + "fusion_export_stl", + "fusion_export_usdz", + "fusion_fetch_optimized_glb", + "fusion_generate_package", + "fusion_get_app_state", + "fusion_get_design_info", + "fusion_get_parameters", + "fusion_get_preferences", + "fusion_import_electronics", + "fusion_import_step", + "fusion_inspect_bodies", + "fusion_install_fusion", + "fusion_install_library_bundle", + "fusion_interactive", + "fusion_kill", + "fusion_library_manager", + "fusion_library_parts", + "fusion_list_cloud_files", + "fusion_list_cloud_projects", + "fusion_list_text_commands", + "fusion_live_feed", + "fusion_make_3d_package", + "fusion_make_showcase_project", + "fusion_make_test_project", + "fusion_managed_library_create", + "fusion_managed_library_link", + "fusion_managed_library_pull", + "fusion_managed_library_push", + "fusion_managed_library_unlink", + "fusion_mcp_call", + "fusion_mcp_enable", + "fusion_mcp_resources", + "fusion_mcp_status", + "fusion_mcp_tools", + "fusion_mech_capabilities", + "fusion_mech_operation_status", + "fusion_mechanical", + "fusion_narrate", + "fusion_new_electronics_from_eagle", + "fusion_notify_owner", + "fusion_open_board", + "fusion_open_by_urn", + "fusion_open_by_urn_note", + "fusion_open_cloud_file", + "fusion_open_design", + "fusion_open_electronics", + "fusion_open_lbr", + "fusion_open_schematic", + "fusion_physical_properties", + "fusion_plan_library_import", + "fusion_plan_route", + "fusion_preflight_lbr", + "fusion_prefs_close", + "fusion_prefs_open", + "fusion_prewarm", + "fusion_prove_result", + "fusion_readiness", + "fusion_release_seat", + "fusion_reset_workspace", + "fusion_resolve_seat_dialog", + "fusion_restart_for_addin", + "fusion_route_net", + "fusion_routing_drc", + "fusion_routing_state", + "fusion_run_modeling_script", + "fusion_save_to_cloud", + "fusion_schematic", + "fusion_screenshot_fusion", + "fusion_search_cloud_files", + "fusion_set_auto_update", + "fusion_set_design_rules", + "fusion_set_driving_badge", + "fusion_set_parameter", + "fusion_set_preference", + "fusion_set_seat_takeover", + "fusion_set_window_sizing", + "fusion_show_2d_board", + "fusion_show_3d_board", + "fusion_show_3d_package", + "fusion_show_attributes", + "fusion_show_footprint", + "fusion_show_library", + "fusion_show_project", + "fusion_show_schematic", + "fusion_show_symbol", + "fusion_signin", + "fusion_signin_2fa", + "fusion_start", + "fusion_state", + "fusion_stop", + "fusion_take_screenshot", + "fusion_uninstall", + "fusion_verb_times", + "fusion_view", + "fusion_walk_cloud_tree", + "fusion_web_signin" + ], + "version": "1.12.0-dev.8", + "versionDrift": true, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "developer-tools", + "depsInstallingSec": null, + "description": "Bridge to Hydrogen Desktop's HTTP control API. Drives setup, the Claude workspace, WSL/container lifecycle, and read-only diagnostics via direct HTTP \u2014 no shell-out, no quote mangling. HD runs as a sibling Tauri app; AD does NOT spawn it.", + "devPinned": false, + "displayName": "Hydrogen Desktop", + "docs": "https://wiki.adom.inc/adom/adom-desktop", + "entryMismatch": false, + "entrypoint": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd/", + "expectedImage": null, + "heroAvailable": false, + "heroDocs": "https://wiki.adom.inc/adom/hydrogen-desktop", + "homepage": "https://wiki.adom.inc/adom/adom-desktop", + "installPath": "\\\\?\\C:\\Users\\drew\\AppData\\Local\\Adom Bridge\\bridges\\hd", + "installSkill": "adom-wiki pkg install adom/adom-desktop", + "installedVersion": "1.0.0", + "installedVersionSource": "cache", + "instanceCount": null, + "languages": [], + "lastSpawnError": null, + "lastUsedMs": 0, + "latest": null, + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/hd.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": null, + "manifestUrlFollowed": null, + "name": "hd", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "HD currently ships Windows-only; Linux variant in scope for HD's future releases.", + "supported": false + }, + "macos": { + "reason": "HD currently ships Windows-only.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": null, + "prewarm": null, + "releasedAt": "2026-06-30T13:13:22Z", + "runningImage": null, + "runningVersion": null, + "skillPkg": "adom/adom-desktop", + "source": "bundled", + "sourceDir": "//?/C:/Users/drew/AppData/Local/Adom Bridge/bridges/hd", + "spawn": { + "entrypoint": "", + "instanceCount": null, + "kind": "external-http", + "manifestPort": 47084, + "persistent": false, + "portBlocked": null, + "runtimePort": null + }, + "spawnKind": "external-http", + "stableUrl": "http://127.0.0.1:24680/open/hd", + "status": "stopped", + "statusVerb": null, + "tags": [ + "hydrogen-desktop", + "control-api", + "http", + "lifecycle" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 0.0, + "verbCount": 11, + "verbPrefixes": [], + "verbs": [ + "hd_api", + "hd_status", + "hd_launch", + "hd_stop", + "hd_restart", + "hd_log", + "hd_screenshot", + "hd_shot", + "hd_open_url", + "hd_browser_profiles", + "hd_ship" + ], + "version": "1.0.0", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "EDA", + "depsInstallingSec": null, + "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", + "devPinned": false, + "displayName": "KiCad EDA", + "docs": "https://wiki.adom.inc/adom/kicad-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad/kicad-bridge.exe", + "expectedImage": "kicad-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "installSkill": "adom-wiki pkg install adom/kicad-bridge", + "installedVersion": "1.0.55", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Python", + "PowerShell" + ], + "lastSpawnError": null, + "lastUsedMs": 1790956354547, + "latest": "1.0.55", + "livePids": [ + 36872 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/kicad.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/kicad-bridge/files/adom-bridge-kicad-manifest.json", + "manifestUrlFollowed": null, + "name": "kicad", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "", + "supported": false + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 60896, + "prewarm": { + "assets": [ + "kicad-cli warm (detection)", + "KiCad first-run config + setup wizard marked done", + "KiCad's own taskbar shortcut identity" + ], + "lastRun": { + "at": "2026-10-05T15:41:58Z", + "elapsedMs": 273, + "error": null, + "ok": false, + "verb": "kicad_prewarm", + "version": "1.0.55" + }, + "requiresHostApp": true, + "timeoutSeconds": null, + "verb": "kicad_prewarm" + }, + "releasedAt": "2026-06-26T16:00:00Z", + "runningImage": "kicad-bridge.exe", + "runningVersion": "1.0.55", + "skillPkg": "adom/kicad-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/kicad", + "spawn": { + "entrypoint": "kicad-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 60896 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/kicad", + "status": "running", + "statusVerb": "kicad_status", + "tags": [ + "pcb", + "schematic", + "open-source", + "kicad-10", + "kicad-11-ready" + ], + "timeouts": { + "default": 130, + "prefixes": [], + "verbs": { + "autoroute": 900, + "demo": 600, + "enable_software_opengl": 240, + "export_gerber": 210, + "export_molecule": 420, + "export_pdf": 180, + "export_step": 300, + "export_svg": 180, + "format_upgrade": 180, + "freerouting": 900, + "open_3d_viewer": 300, + "prewarm": 120, + "run_drc": 300, + "run_erc": 300, + "upgrade": 900 + } + }, + "updateAvailable": false, + "usageScore": 1038.1217984801588, + "verbCount": 119, + "verbPrefixes": [ + "kicad_" + ], + "verbs": [ + "kicad_describe", + "kicad_status", + "kicad_readiness", + "kicad_list_versions", + "kicad_diagnostics", + "kicad_run_drc", + "kicad_run_erc", + "kicad_export_gerber", + "kicad_export_pdf", + "kicad_export_svg", + "kicad_export_step", + "kicad_export_bom_csv", + "kicad_uninstall", + "kicad_extract_netlist", + "kicad_trace_net", + "kicad_find_connections", + "kicad_analyze_connections", + "kicad_lint_board", + "kicad_lint_schematic", + "kicad_lint_library", + "kicad_format_upgrade", + "kicad_list_symbols", + "kicad_list_footprints", + "kicad_adom_library_status", + "kicad_get_settings", + "kicad_set_settings", + "kicad_list_design_rules", + "kicad_set_design_rules", + "kicad_3d_viewer_settings", + "kicad_taskbar_repair", + "kicad_prewarm", + "kicad_model_check", + "kicad_pcm_list", + "kicad_pcm_install", + "kicad_pcm_uninstall", + "kicad_pcm_add_repository", + "kicad_pcm_remove_repository", + "kicad_check_for_updates", + "kicad_upgrade", + "kicad_sch_place_symbol", + "kicad_sch_wire", + "kicad_sch_label", + "kicad_sch_move", + "kicad_sch_delete", + "kicad_sch_set_property", + "kicad_ipc_api", + "kicad_export_molecule", + "kicad_errors", + "kicad_log_tail", + "kicad_bridge_status", + "kicad_bridge_call", + "kicad_install_plugin", + "kicad_plugin_diagnose", + "kicad_install_library", + "kicad_uninstall_library", + "kicad_install_symbol", + "kicad_install_footprint", + "kicad_install_library_bundle", + "kicad_adom_library_heal", + "kicad_make_part_project", + "kicad_export_part", + "kicad_silk_fields_batch", + "kicad_silk_graphics_batch", + "kicad_text_bounds", + "kicad_silk_text_batch", + "kicad_routing_state", + "kicad_route_net", + "kicad_remove_route", + "kicad_add_zone", + "kicad_apply_zone_plan", + "kicad_zone_state", + "kicad_select_net", + "kicad_select_clear", + "kicad_remove_zone", + "kicad_routing_validate", + "kicad_board_pads", + "kicad_add_track", + "kicad_add_via", + "kicad_route", + "kicad_autoroute", + "kicad_freerouting", + "kicad_placement_state", + "kicad_move_footprint", + "kicad_placement_validate", + "kicad_refresh_board_views", + "kicad_launch", + "kicad_open_board", + "kicad_open_schematic", + "kicad_open_symbol_editor", + "kicad_open_footprint_editor", + "kicad_menu_items", + "kicad_3d_view", + "kicad_open_3d_viewer", + "kicad_open_editors", + "kicad_close", + "kicad_close_symbol_editor", + "kicad_close_footprint_editor", + "kicad_close_3d_viewer", + "kicad_dismiss_dialogs", + "kicad_window_info", + "kicad_state", + "kicad_screenshot_all", + "kicad_send_key", + "kicad_click", + "kicad_fix_keyboard", + "kicad_place_footprint", + "kicad_enable_software_opengl", + "kicad_rescan_libraries", + "kicad_show_project", + "kicad_show_symbol", + "kicad_show_footprint", + "kicad_show_3d_chip", + "kicad_show_schematic", + "kicad_show_2d_board", + "kicad_show_3d_board", + "kicad_show_library", + "kicad_progress", + "kicad_verb_times", + "kicad_demo" + ], + "version": "1.0.55", + "versionDrift": false, + "watcher": { + "configKey": "project_watch", + "defaultGlobs": [ + "*.kicad_pcb", + "*.kicad_sch", + "*.kicad_pro" + ], + "description": "Monitors a KiCad project folder for file changes and syncs them to Docker. Configured via the set_project_watch / trigger_project_watch verbs (AD core owns the watcher; the KiCad section of AD's Settings panel was removed in AD 1.9.117 \u2014 the config keys are still honored).", + "displayName": "Project Watch", + "supports": true + } + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.", + "devPinned": false, + "displayName": "Adom Native Browser", + "docs": "https://wiki.adom.inc/adom/nb-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser/server.js", + "expectedImage": "node.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/nb-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "installSkill": "adom-wiki pkg install adom/nb-bridge", + "installedVersion": "0.16.33", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Node/JS" + ], + "lastSpawnError": null, + "lastUsedMs": 1791220671752, + "latest": "0.16.33", + "livePids": [ + 32228 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/native-browser.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/pages/adom/nb-bridge/files/native-browser-bridge-manifest.json", + "manifestUrlFollowed": null, + "name": "native-browser", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "Pending; bridge + host are OS-agnostic Node, only the install/registration layer is Windows-specific.", + "supported": false + }, + "macos": { + "reason": "Windows-first; Kyle ports to macOS as a fast-follow (NativeMessagingHosts live under ~/Library/Application Support//NativeMessagingHosts; bridge/host are OS-agnostic Node).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 51703, + "prewarm": { + "assets": [], + "lastRun": { + "at": "2026-09-22T19:44:55Z", + "elapsedMs": 41, + "error": null, + "ok": true, + "verb": "nbrowser_prewarm", + "version": "0.16.33" + }, + "requiresHostApp": false, + "timeoutSeconds": null, + "verb": "nbrowser_prewarm" + }, + "releasedAt": "2026-09-22T15:18:44Z", + "runningImage": "node.exe", + "runningVersion": "0.16.33", + "skillPkg": "adom/nb-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/native-browser", + "spawn": { + "entrypoint": "server.js", + "instanceCount": 1, + "kind": "node", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 51703 + }, + "spawnKind": "node", + "stableUrl": "http://127.0.0.1:24680/open/native-browser", + "status": "running", + "statusVerb": "nbrowser_status", + "tags": [ + "nb", + "nbe", + "native-browser", + "chrome", + "edge", + "nbrowser", + "pup-parity" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "screenshot", + "seconds": 120 + }, + { + "prefix": "record", + "seconds": 120 + } + ], + "verbs": { + "fetch_url": 120, + "input_dispatch": 120, + "select": 30, + "wait": 125 + } + }, + "updateAvailable": false, + "usageScore": 917.3546810807766, + "verbCount": 88, + "verbPrefixes": [ + "nbrowser_" + ], + "verbs": [ + "nbrowser_status", + "nbrowser_readiness", + "nbrowser_install_chrome", + "nbrowser_prewarm", + "nbrowser_chrome_status", + "nbrowser_ping", + "nbrowser_progress", + "nbrowser_activity", + "nbrowser_open_window", + "nbrowser_close_window", + "nbrowser_owned", + "nbrowser_cleanup", + "nbrowser_force_close", + "nbrowser_switch_window", + "nbrowser_list_windows", + "nbrowser_window_state", + "nbrowser_fullscreen", + "nbrowser_login_state", + "nbrowser_credentials", + "nbrowser_profiles", + "nbrowser_use_profile", + "nbrowser_pin_session", + "nbrowser_open_os_window", + "nbrowser_os_windows", + "nbrowser_wake_profile", + "nbrowser_resolve_profiles", + "nbrowser_whoami", + "nbrowser_profile_block", + "nbrowser_profile_unblock", + "nbrowser_rescan", + "nbrowser_resync_sessions", + "nbrowser_open_tab", + "nbrowser_close_tab", + "nbrowser_switch_tab", + "nbrowser_list_tabs", + "nbrowser_navigate", + "nbrowser_reload", + "nbrowser_back", + "nbrowser_forward", + "nbrowser_wait", + "nbrowser_wait_for", + "nbrowser_keepalive", + "nbrowser_screenshot", + "nbrowser_screenshot_full_res", + "nbrowser_eval", + "nbrowser_evaluate", + "nbrowser_input_dispatch", + "nbrowser_scroll", + "nbrowser_click", + "nbrowser_select", + "nbrowser_set_file_input", + "nbrowser_set_date", + "nbrowser_totp", + "nbrowser_register_totp", + "nbrowser_add_extension_origin", + "nbrowser_type", + "nbrowser_press_key", + "nbrowser_fetch_url", + "nbrowser_download_wait", + "nbrowser_errors", + "nbrowser_close", + "nbrowser_record_start", + "nbrowser_record_stop", + "nbrowser_record_status", + "nbrowser_record_list", + "nbrowser_flash", + "nbrowser_flash_stop", + "nbrowser_apply_settings", + "nbrowser_settings", + "nbrowser_flash_mode", + "nbrowser_taskbar", + "nbrowser_describe", + "nbrowser_handle_dialog", + "nbrowser_state", + "nbrowser_demo", + "nbrowser_uninstall", + "nbrowser_dev_reload", + "nbrowser_clear_cookies", + "nbrowser_caption", + "nbrowser_focus", + "nbrowser_hover", + "nbrowser_double_click", + "nbrowser_right_click", + "nbrowser_login_form", + "nbrowser_autologin", + "nbrowser_cursor", + "nbrowser_events", + "nbrowser_download" + ], + "version": "0.16.33", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Manufacturing", + "depsInstallingSec": null, + "description": "The Adom Desktop bridge for the Essemtec Puma / ePlace. Reads + dry-run: machine state, recipe/package/component/feeder reads, the full feeder fleet from Supply/Feeder/*.feeder.xml, and dry-run of any WriteOp (preflight + physics-bounds + unified diff). F4 adds puma_write \u2014 GATED production writes of FileWrite.* library objects to real XML files under --data-folder (atomic write + XML-verify + audit; approver enforced; refused when the machine is Productive), plus puma_revert \u2014 canonical revert of a prior write by correlationId (CAS-pinned to the recorded result hash, its own audit entry, same write gate). Off by default: requires --enable-writes. eData stays vendor-read-only. 0.2.5: puma_feeders binds each loaded lane to its component/part number (carrierType, componentName, partValue, packageName, componentBarcode) via the Supply/Carrier -> Component library chain (#639). 0.2.6: the write audit records ab's X-Adom-Verified-Origin (relay | local | bridge, plus the X-Adom-Caller-Delegate chain for a bridge callback; a missing header records as local-unattributed) beside the approver \u2014 attribution, never a gate. New puma_write_status (declared as statusVerb): what happened to a write by correlationId, so a caller whose transport timed out polls instead of declaring the write unknown. 0.2.7: the host is a GUI-subsystem exe (no console window of its own) and its git subprocess runs with CreateNoWindow, so the bridge can never leave a conhost window on the desktop across ab respawns or reinstalls.", + "devPinned": false, + "displayName": "Puma Bridge (Essemtec ePlace)", + "docs": "https://wiki.adom.inc/adom/puma-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge/puma-bridge-host.exe", + "expectedImage": "puma-bridge-host.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/puma-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "installSkill": "adom-wiki pkg install adom/puma-bridge", + "installedVersion": "0.2.7", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1790623763822, + "latest": "0.2.6", + "livePids": [ + 32008 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puma-bridge.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/adom/puma-bridge/files/adom-bridge-puma-manifest.json", + "manifestUrlFollowed": null, + "name": "puma-bridge", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "", + "supported": true + }, + "macos": { + "reason": "", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 64764, + "prewarm": null, + "releasedAt": "2026-09-23T15:54:11Z", + "runningImage": "puma-bridge-host.exe", + "runningVersion": "0.2.7", + "skillPkg": "adom/puma-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puma-bridge", + "spawn": { + "entrypoint": "puma-bridge-host.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 0, + "persistent": true, + "portBlocked": null, + "runtimePort": 64764 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puma-bridge", + "status": "running", + "statusVerb": "puma_write_status", + "tags": [ + "smt", + "essemtec", + "puma", + "eplace", + "pick-and-place", + "manufacturing", + "factoryos" + ], + "timeouts": null, + "updateAvailable": false, + "usageScore": 2.691935562909098, + "verbCount": 9, + "verbPrefixes": [ + "puma_" + ], + "verbs": [ + "puma_ping", + "puma_state", + "puma_get", + "puma_feeders", + "puma_dryrun", + "puma_write", + "puma_revert", + "puma_write_status", + "puma_describe" + ], + "version": "0.2.7", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "Browser Automation", + "depsInstallingSec": null, + "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. pup_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. pup_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, pup_alert_window posts a native toast whose click focuses the window, pup_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.", + "devPinned": false, + "displayName": "Puppeteer (Chrome for Testing + Native)", + "docs": "https://wiki.adom.inc/adom/pup-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer/adom-pup-bridge.exe", + "expectedImage": "adom-pup-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "installSkill": "adom-wiki pkg install adom/pup-bridge", + "installedVersion": "2.0.697", + "installedVersionSource": "cache", + "instanceCount": 1, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791212202067, + "latest": "2.0.697", + "livePids": [ + 68812 + ], + "logPath": "C:/Users/drew/.adom/bridge-logs/puppeteer.log", + "manifestSource": "insidersManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/pup-bridge/files/adom-bridge-puppeteer-manifest.json", + "manifestUrlFollowed": null, + "name": "puppeteer", + "paused": false, + "persistent": true, + "platforms": { + "linux": { + "reason": "not yet", + "supported": false + }, + "macos": { + "reason": "The Rust exe is Windows-only for now; host-mac is stubbed for the Mac port. macOS runs the Node build (public tier).", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 57134, + "prewarm": { + "assets": [ + "chrome-for-testing" + ], + "lastRun": { + "at": "2026-10-05T14:55:58Z", + "elapsedMs": 1409, + "error": null, + "ok": true, + "verb": "pup_prewarm", + "version": "2.0.697" + }, + "requiresHostApp": false, + "timeoutSeconds": 900, + "verb": "pup_prewarm" + }, + "releasedAt": "2026-10-05T14:55:48Z", + "runningImage": "adom-pup-bridge.exe", + "runningVersion": "2.0.697", + "skillPkg": "adom/pup-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/puppeteer", + "spawn": { + "entrypoint": "adom-pup-bridge.exe", + "instanceCount": 1, + "kind": "exe", + "manifestPort": 8851, + "persistent": true, + "portBlocked": null, + "runtimePort": 57134 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/puppeteer", + "status": "running", + "statusVerb": "pup_readiness", + "tags": [ + "puppeteer", + "chrome", + "headful", + "recording" + ], + "timeouts": { + "default": 60, + "prefixes": [ + { + "prefix": "record", + "seconds": 90 + } + ], + "verbs": { + "credential_reveal": 150, + "fill_card": 150, + "open_window": 150, + "prewarm": 240, + "use": 240 + } + }, + "updateAvailable": false, + "usageScore": 580.2145202778763, + "verbCount": 97, + "verbPrefixes": [ + "pup_", + "browser_" + ], + "verbs": [ + "pup_describe", + "pup_readiness", + "pup_prewarm", + "pup_status", + "pup_list_windows", + "pup_my_windows", + "pup_list_sessions", + "pup_open_window", + "pup_navigate", + "pup_eval", + "pup_evaluate", + "pup_screenshot", + "pup_close_window", + "pup_close", + "pup_close_all_windows", + "pup_window_info", + "pup_open_tab", + "pup_list_tabs", + "pup_switch_tab", + "pup_close_tab", + "pup_switch_window", + "pup_click", + "pup_select", + "pup_hover", + "pup_type", + "pup_press_key", + "pup_scroll", + "pup_fill", + "pup_wait", + "pup_reload", + "pup_back", + "pup_forward", + "pup_set_viewport", + "pup_errors", + "pup_dialog", + "pup_input_dispatch", + "pup_render_html", + "pup_fetch_url", + "pup_maximize", + "pup_raise_os_window", + "pup_focus_window", + "pup_lower_os_window", + "pup_alert_window", + "pup_progress", + "pup_configure", + "pup_use", + "pup_clear_cookies", + "pup_clear_site_data", + "pup_quit_idle_browsers", + "pup_rescan", + "pup_restart_browser", + "pup_set_identity", + "pup_audit_icons", + "pup_dashboard", + "pup_credentials", + "credential_list", + "credential_set", + "credential_delete", + "pup_login", + "pup_google_accounts", + "pup_google_signin", + "pup_credential_reveal", + "pup_card_set", + "pup_cards", + "pup_card_delete", + "pup_fill_card", + "pup_wiki_set_view", + "pup_annotate", + "pup_floaty_click", + "pup_record_start", + "pup_record_stop", + "pup_record_status", + "pup_record_list", + "pup_recorder_open", + "pup_recorder_close", + "pup_screen_record_start", + "pup_screen_record_stop", + "pup_screen_record_status", + "pup_screen_record_list", + "pup_highfps_extend", + "pup_screenshot_element", + "pup_screenshot_full_res", + "pup_download", + "pup_launch", + "pup_deps", + "pup_install_toolbar", + "pup_reap_profiles", + "pup_cache_prune", + "pup_sweep_identities", + "pup_uninstall", + "pup_move_to_workspace", + "pup_assisted_click", + "pup_import_scan", + "pup_import_browser_logins", + "pup_vault_sync", + "pup_vault_export", + "pup_vault_import" + ], + "version": "2.0.697", + "versionDrift": false, + "watcher": null + }, + { + "author": "Adom Inc.", + "category": "MCAD", + "depsInstallingSec": null, + "description": "Bridge for SOLIDWORKS desktop CAD \u2014 create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.", + "devPinned": false, + "displayName": "SOLIDWORKS", + "docs": "https://wiki.adom.inc/adom/solidworks-bridge", + "entryMismatch": false, + "entrypoint": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks/swx-bridge.exe", + "expectedImage": "swx-bridge.exe", + "heroAvailable": false, + "heroDocs": null, + "homepage": "https://wiki.adom.inc/adom/adom-bridge", + "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "installSkill": "adom-wiki pkg install adom/solidworks-bridge", + "installedVersion": "0.9.21", + "installedVersionSource": "cache", + "instanceCount": 0, + "languages": [ + "Binary" + ], + "lastSpawnError": null, + "lastUsedMs": 1791224978746, + "latest": "0.9.19", + "livePids": [], + "logPath": "C:/Users/drew/.adom/bridge-logs/solidworks.log", + "manifestSource": "updateManifestUrl", + "manifestUrl": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json", + "manifestUrlFollowed": null, + "name": "solidworks", + "paused": false, + "persistent": false, + "platforms": { + "linux": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "macos": { + "reason": "SOLIDWORKS desktop is Windows-only; the bridge drives its COM API.", + "supported": false + }, + "windows": { + "reason": "", + "supported": true + } + }, + "port": 49861, + "prewarm": null, + "releasedAt": "2026-10-05T18:49:46Z", + "runningImage": null, + "runningVersion": "0.9.19", + "skillPkg": "adom/solidworks-bridge", + "source": "cache", + "sourceDir": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks", + "spawn": { + "entrypoint": "swx-bridge.exe", + "instanceCount": 0, + "kind": "exe", + "manifestPort": 0, + "persistent": false, + "portBlocked": null, + "runtimePort": 49861 + }, + "spawnKind": "exe", + "stableUrl": "http://127.0.0.1:24680/open/solidworks", + "status": "running", + "statusVerb": "swx_status", + "tags": [ + "solidworks", + "mcad", + "cad", + "bom", + "step", + "mass-properties", + "modeling", + "fusion-parity" + ], + "timeouts": { + "default": 120, + "prefixes": [], + "verbs": { + "action_ledger": 20, + "activate_document": 180, + "bom": 300, + "check_recovery": 180, + "close_all_documents": 240, + "close_all_safely": 600, + "close_doc": 180, + "close_import_temps": 600, + "close_window": 120, + "cloud_status": 90, + "design_info": 180, + "dismiss_blocking_dialogs": 180, + "document_info": 120, + "export": 300, + "export_3mf": 300, + "export_dwg": 300, + "export_dxf": 300, + "export_glb": 300, + "export_iges": 300, + "export_parasolid": 300, + "export_pdf": 300, + "export_sat": 300, + "export_step": 300, + "export_stl": 300, + "find_files": 180, + "get_app_state": 90, + "get_parameters": 240, + "get_preferences": 90, + "import": 420, + "inspect_bodies": 180, + "interference": 600, + "kill": 240, + "new_document": 180, + "open": 300, + "pack_and_go": 600, + "rebuild_check": 300, + "render_image": 600, + "reset_workspace": 600, + "run_script": 420, + "save_as": 420, + "set_driving_badge": 120, + "set_parameter": 420, + "set_preference": 90, + "show_assembly": 600, + "show_drawing": 600, + "show_part": 600, + "shutdown": 900, + "sign_in": 240, + "start": 300, + "state": 180, + "stop": 420, + "verb_times": 20, + "window_info": 120 + } + }, + "updateAvailable": false, + "usageScore": 561.4742469072098, + "verbCount": 69, + "verbPrefixes": [ + "swx_" + ], + "verbs": [ + "swx_action_ledger", + "swx_activate_document", + "swx_add_component", + "swx_bom", + "swx_check_recovery", + "swx_close_all_documents", + "swx_close_all_safely", + "swx_close_doc", + "swx_close_import_temps", + "swx_close_window", + "swx_cloud_status", + "swx_com_eval", + "swx_describe", + "swx_design_info", + "swx_dismiss_blocking_dialogs", + "swx_docs", + "swx_document_info", + "swx_export", + "swx_export_3mf", + "swx_export_dwg", + "swx_export_dxf", + "swx_export_glb", + "swx_export_iges", + "swx_export_parasolid", + "swx_export_pdf", + "swx_export_sat", + "swx_export_step", + "swx_export_stl", + "swx_find_files", + "swx_get_app_state", + "swx_get_parameters", + "swx_get_preferences", + "swx_import", + "swx_inspect_bodies", + "swx_interference", + "swx_kill", + "swx_mass_properties", + "swx_new_document", + "swx_open", + "swx_pack_and_go", + "swx_progress", + "swx_props_get", + "swx_props_set", + "swx_readiness", + "swx_rebuild_check", + "swx_recover_list", + "swx_render_image", + "swx_reset_workspace", + "swx_run_macro", + "swx_run_script", + "swx_save", + "swx_save_as", + "swx_screenshot", + "swx_set_driving_badge", + "swx_set_parameter", + "swx_set_preference", + "swx_show_assembly", + "swx_show_drawing", + "swx_show_part", + "swx_shutdown", + "swx_sign_in", + "swx_start", + "swx_state", + "swx_status", + "swx_stop", + "swx_uninstall", + "swx_user_presence", + "swx_verb_times", + "swx_window_info" + ], + "version": "0.9.21", + "versionDrift": true, + "watcher": null + } + ], + "current_os": "windows", + "durationMs": 15, + "error": "", + "invalidCount": 0, + "ok": true, + "output": "", + "schemaVersion": 1, + "staleCheckedAt": 1791215191, + "status": "ok", + "success": true, + "summary": { + "bundled": 1, + "cache": 6, + "invalid": 0, + "paused": 0, + "third_party": 0, + "total": 7 + }, + "timeoutSeconds": 10 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0017-fusion_get_preferences.json b/docs/mechanical-verification/cp8/restart/calls/0017-fusion_get_preferences.json new file mode 100644 index 0000000..1205f4a --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0017-fusion_get_preferences.json @@ -0,0 +1,38 @@ +{ + "target": "adom_drew2", + "verb": "fusion_get_preferences", + "args": {}, + "requestJson": "{}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235667.272305, + "mutating": false, + "stdout": "{\n \"_hint\": \"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\n \"_timeoutHint\": \"ab waits up to 25s 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 \"applied\": {},\n \"current\": {\n \"activeTheme\": \"darkblue\",\n \"cameraPivot\": true,\n \"gestureNav\": true,\n \"invertScrollZoom\": true,\n \"lengthUnit\": \"mm\",\n \"modelingOrientation\": \"zup\",\n \"orbitScheme\": \"fusion360\",\n \"theme\": \"device\"\n },\n \"durationMs\": 6152,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\\\",\\\"_timeoutHint\\\":\\\"ab waits up to 25s 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.\\\",\\\"applied\\\":{},\\\"current\\\":{\\\"activeTheme\\\":\\\"darkblue\\\",\\\"cameraPivot\\\":true,\\\"gestureNav\\\":true,\\\"invertScrollZoom\\\":true,\\\"lengthUnit\\\":\\\"mm\\\",\\\"modelingOrientation\\\":\\\"zup\\\",\\\"orbitScheme\\\":\\\"fusion360\\\",\\\"theme\\\":\\\"device\\\"},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_get_app_state\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":25}\",\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_get_app_state\",\n \"success\": true,\n \"timeoutSeconds\": 25\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235673.4318206, + "raw": { + "_hint": "Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).", + "_timeoutHint": "ab waits up to 25s 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.", + "applied": {}, + "current": { + "activeTheme": "darkblue", + "cameraPivot": true, + "gestureNav": true, + "invertScrollZoom": true, + "lengthUnit": "mm", + "modelingOrientation": "zup", + "orbitScheme": "fusion360", + "theme": "device" + }, + "durationMs": 6152, + "error": "", + "output": "{\"_hint\":\"Current Fusion preferences. Change any with fusion_set_preference, keys: theme (light/darkblue/darkgray/classic/device/dark), invertScrollZoom (bool), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - applies to the active design).\",\"_timeoutHint\":\"ab waits up to 25s 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.\",\"applied\":{},\"current\":{\"activeTheme\":\"darkblue\",\"cameraPivot\":true,\"gestureNav\":true,\"invertScrollZoom\":true,\"lengthUnit\":\"mm\",\"modelingOrientation\":\"zup\",\"orbitScheme\":\"fusion360\",\"theme\":\"device\"},\"shell\":\"rust\",\"statusVerb\":\"fusion_get_app_state\",\"success\":true,\"timeoutSeconds\":25}", + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_get_app_state", + "success": true, + "timeoutSeconds": 25 + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/calls/0018-fusion_mcp_call.json b/docs/mechanical-verification/cp8/restart/calls/0018-fusion_mcp_call.json new file mode 100644 index 0000000..1ff6cc4 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/calls/0018-fusion_mcp_call.json @@ -0,0 +1,46 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mcp_call", + "args": { + "tool": "fusion_mcp_execute", + "arguments": { + "featureType": "script", + "object": { + "script": "import adsk.core, adsk.fusion, json, threading, builtins, os, platform, sys\ndef run(_context:str):\n assert threading.current_thread() is threading.main_thread()\n app=adsk.core.Application.get()\n import threading\n assert threading.current_thread() is threading.main_thread()\n import adsk.core, adsk.fusion, os, platform, json\n app=adsk.core.Application.get()\n assert app.documents.count == 1\n doc=app.activeDocument\n assert doc is not None and app.documents.item(0)==doc\n assert not doc.isModified and not doc.isSaved and doc.dataFile is None\n assert app.userInterface.activeCommand in ('', 'SelectCommand', 'Select')\n design=adsk.fusion.Design.cast(doc.products.itemByProductType('DesignProductType'))\n assert design is not None\n assert design.rootComponent.bRepBodies.count == design.rootComponent.sketches.count == design.rootComponent.allOccurrences.count == design.timeline.count == 0\n result={'success':True,'pid':os.getpid(),'host':platform.node(),'fusionVersion':app.version,'creationId':doc.creationId,'modified':doc.isModified,'saved':doc.isSaved,'geometryEmpty':True}\n print('ADOM_HISTORY_NATIVE='+json.dumps(result))\n", + "readOnly": true + } + }, + "timeout": 40 + }, + "requestJson": "{\"tool\": \"fusion_mcp_execute\", \"arguments\": {\"featureType\": \"script\", \"object\": {\"script\": \"import adsk.core, adsk.fusion, json, threading, builtins, os, platform, sys\\ndef run(_context:str):\\n assert threading.current_thread() is threading.main_thread()\\n app=adsk.core.Application.get()\\n import threading\\n assert threading.current_thread() is threading.main_thread()\\n import adsk.core, adsk.fusion, os, platform, json\\n app=adsk.core.Application.get()\\n assert app.documents.count == 1\\n doc=app.activeDocument\\n assert doc is not None and app.documents.item(0)==doc\\n assert not doc.isModified and not doc.isSaved and doc.dataFile is None\\n assert app.userInterface.activeCommand in ('', 'SelectCommand', 'Select')\\n design=adsk.fusion.Design.cast(doc.products.itemByProductType('DesignProductType'))\\n assert design is not None\\n assert design.rootComponent.bRepBodies.count == design.rootComponent.sketches.count == design.rootComponent.allOccurrences.count == design.timeline.count == 0\\n result={'success':True,'pid':os.getpid(),'host':platform.node(),'fusionVersion':app.version,'creationId':doc.creationId,'modified':doc.isModified,'saved':doc.isSaved,'geometryEmpty':True}\\n print('ADOM_HISTORY_NATIVE='+json.dumps(result))\\n\", \"readOnly\": true}}, \"timeout\": 40}", + "runId": "20261005T210310Z-568fe7869d0b41d5a83014811fe170ac", + "caller": "Fusion roadmap build", + "startedAt": 1791235673.4327776, + "mutating": false, + "stdout": "{\n \"_hint\": \"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\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\": 855,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\\\",\\\"_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.\\\",\\\"result\\\":{\\\"content\\\":[{\\\"text\\\":\\\"{\\\\n \\\\\\\"error\\\\\\\": \\\\\\\"Workspace Activated: Design\\\\\\\\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: False, isValid: True, name: Adom, productType: DesignProductType\\\\\\\\nTraceback (most recent call last):\\\\\\\\n File \\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\", line 47, in \\\\\\\\n File \\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\", line 30, in run\\\\\\\\nUnboundLocalError: cannot access local variable 'threading' where it is not associated with a value\\\\\\\\n\\\\\\\",\\\\n \\\\\\\"success\\\\\\\": false\\\\n}\\\",\\\"type\\\":\\\"text\\\"}]},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_mcp_status\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60,\\\"tool\\\":\\\"fusion_mcp_execute\\\"}\",\n \"result\": {\n \"content\": [\n {\n \"text\": \"{\\n \\\"error\\\": \\\"Workspace Activated: Design\\\\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: False, isValid: True, name: Adom, productType: DesignProductType\\\\nTraceback (most recent call last):\\\\n File \\\\\\\"\\\\\\\", line 47, in \\\\n File \\\\\\\"\\\\\\\", line 30, in run\\\\nUnboundLocalError: cannot access local variable 'threading' where it is not associated with a value\\\\n\\\",\\n \\\"success\\\": false\\n}\",\n \"type\": \"text\"\n }\n ]\n },\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_mcp_status\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"tool\": \"fusion_mcp_execute\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235674.2951586, + "raw": { + "_hint": "Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.", + "_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": 855, + "error": "", + "output": "{\"_hint\":\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\"_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.\",\"result\":{\"content\":[{\"text\":\"{\\n \\\"error\\\": \\\"Workspace Activated: Design\\\\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: False, isValid: True, name: Adom, productType: DesignProductType\\\\nTraceback (most recent call last):\\\\n File \\\\\\\"\\\\\\\", line 47, in \\\\n File \\\\\\\"\\\\\\\", line 30, in run\\\\nUnboundLocalError: cannot access local variable 'threading' where it is not associated with a value\\\\n\\\",\\n \\\"success\\\": false\\n}\",\"type\":\"text\"}]},\"shell\":\"rust\",\"statusVerb\":\"fusion_mcp_status\",\"success\":true,\"timeoutSeconds\":60,\"tool\":\"fusion_mcp_execute\"}", + "result": { + "content": [ + { + "text": "{\n \"error\": \"Workspace Activated: Design\\nToolbar State: event: workspaceActivated, tabId: AdomTab, isActive: False, isVisible: False, isValid: True, name: Adom, productType: DesignProductType\\nTraceback (most recent call last):\\n File \\\"\\\", line 47, in \\n File \\\"\\\", line 30, in run\\nUnboundLocalError: cannot access local variable 'threading' where it is not associated with a value\\n\",\n \"success\": false\n}", + "type": "text" + } + ] + }, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_mcp_status", + "success": true, + "timeoutSeconds": 60, + "tool": "fusion_mcp_execute" + } +} \ No newline at end of file diff --git a/docs/mechanical-verification/cp8/restart/close-exact-process.ps1 b/docs/mechanical-verification/cp8/restart/close-exact-process.ps1 new file mode 100644 index 0000000..88b4e60 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/close-exact-process.ps1 @@ -0,0 +1,14 @@ +$ErrorActionPreference='Stop' +$cp8Expected=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('eyJob3N0IjogIkFET01fRFJFVzIiLCAicGlkIjogNDE3MjgsICJjcmVhdGVkVXRjIjogIjIwMjYtMTAtMDVUMjE6MDE6NDYuNjUzNjM4MFoiLCAiZXhlY3V0YWJsZSI6ICJDOlxcVXNlcnNcXGRyZXdcXEFwcERhdGFcXExvY2FsXFxBdXRvZGVza1xcd2ViZGVwbG95XFxwcm9kdWN0aW9uXFw3MzZkMmI0YzVlNmI5NWU3N2MxMTcyMWRhMjIyY2YyMWM2YTFmYzFmXFxGdXNpb24zNjAuZXhlIiwgImxhdW5jaGVyIjogIkM6XFxVc2Vyc1xcZHJld1xcQXBwRGF0YVxcTG9jYWxcXEF1dG9kZXNrXFx3ZWJkZXBsb3lcXHByb2R1Y3Rpb25cXDZhMGM5NjExMjkxZDQ1YmI5MjI2OTgwMjA5OTE3YzNkXFxGdXNpb25MYXVuY2hlci5leGUifQ==')) | ConvertFrom-Json +if($env:COMPUTERNAME -cne $cp8Expected.host){throw 'Host changed'} +$cp8Processes=@(Get-CimInstance Win32_Process -Filter "Name='Fusion360.exe'") +if($cp8Processes.Count -ne 1){throw 'Process count changed'} +$cp8Process=$cp8Processes[0] +if($cp8Process.ProcessId -ne $cp8Expected.pid -or $cp8Process.CreationDate.ToUniversalTime().ToString('o') -cne $cp8Expected.createdUtc -or $cp8Process.ExecutablePath -cne $cp8Expected.executable){throw 'Process identity changed'} +if(-not (Test-Path -LiteralPath $cp8Expected.launcher -PathType Leaf) -or -not (Test-Path -LiteralPath ($cp8Expected.launcher+'.ini') -PathType Leaf)){throw 'Observed complete launcher missing'} +$cp8LauncherHash=(Get-FileHash -LiteralPath $cp8Expected.launcher -Algorithm SHA256).Hash +$cp8Managed=Get-Process -Id $cp8Expected.pid -ErrorAction Stop +if($cp8Managed.MainWindowHandle -eq 0 -or -not $cp8Managed.CloseMainWindow()){throw 'Graceful close was not accepted'} +if(-not $cp8Managed.WaitForExit(20000)){throw 'Graceful close not complete; no force kill or relaunch'} +if(@(Get-CimInstance Win32_Process -Filter "Name='Fusion360.exe'").Count -ne 0){throw 'Fusion process remains; no relaunch'} +@{success=$true; closedPid=[int]$cp8Expected.pid; launcher=[string]$cp8Expected.launcher; launcherSha256=$cp8LauncherHash; graceful=$true} | ConvertTo-Json -Compress diff --git a/docs/mechanical-verification/cp8/restart/qualified-postcheck/calls/0001-fusion_mcp_call.json b/docs/mechanical-verification/cp8/restart/qualified-postcheck/calls/0001-fusion_mcp_call.json new file mode 100644 index 0000000..b15a6f1 --- /dev/null +++ b/docs/mechanical-verification/cp8/restart/qualified-postcheck/calls/0001-fusion_mcp_call.json @@ -0,0 +1,46 @@ +{ + "target": "adom_drew2", + "verb": "fusion_mcp_call", + "args": { + "tool": "fusion_mcp_execute", + "arguments": { + "featureType": "script", + "object": { + "script": "import adsk.core,adsk.fusion,json,threading,os,platform\ndef run(_context:str):\n assert threading.current_thread() is threading.main_thread()\n app=adsk.core.Application.get()\n assert os.getpid()==55528 and platform.node().lower()=='adom_drew2'\n assert app.documents.count==1\n doc=app.activeDocument\n assert doc is not None and app.documents.item(0)==doc\n assert not doc.isModified and not doc.isSaved and doc.dataFile is None\n assert app.userInterface.activeCommand in ('','SelectCommand','Select')\n design=adsk.fusion.Design.cast(doc.products.itemByProductType('DesignProductType'))\n assert design is not None\n assert design.rootComponent.bRepBodies.count==design.rootComponent.sketches.count==design.rootComponent.allOccurrences.count==design.timeline.count==0\n print('ADOM_HISTORY_POSTCHECK='+json.dumps({'success':True,'pid':os.getpid(),'host':platform.node(),'fusionVersion':app.version,'creationId':doc.creationId,'modified':doc.isModified,'saved':doc.isSaved,'geometryEmpty':True}))\n", + "readOnly": true + } + }, + "timeout": 40 + }, + "requestJson": "{\"tool\": \"fusion_mcp_execute\", \"arguments\": {\"featureType\": \"script\", \"object\": {\"script\": \"import adsk.core,adsk.fusion,json,threading,os,platform\\ndef run(_context:str):\\n assert threading.current_thread() is threading.main_thread()\\n app=adsk.core.Application.get()\\n assert os.getpid()==55528 and platform.node().lower()=='adom_drew2'\\n assert app.documents.count==1\\n doc=app.activeDocument\\n assert doc is not None and app.documents.item(0)==doc\\n assert not doc.isModified and not doc.isSaved and doc.dataFile is None\\n assert app.userInterface.activeCommand in ('','SelectCommand','Select')\\n design=adsk.fusion.Design.cast(doc.products.itemByProductType('DesignProductType'))\\n assert design is not None\\n assert design.rootComponent.bRepBodies.count==design.rootComponent.sketches.count==design.rootComponent.allOccurrences.count==design.timeline.count==0\\n print('ADOM_HISTORY_POSTCHECK='+json.dumps({'success':True,'pid':os.getpid(),'host':platform.node(),'fusionVersion':app.version,'creationId':doc.creationId,'modified':doc.isModified,'saved':doc.isSaved,'geometryEmpty':True}))\\n\", \"readOnly\": true}}, \"timeout\": 40}", + "runId": "cp8-restart-postcheck", + "caller": "Fusion roadmap build", + "startedAt": 1791235756.2207813, + "mutating": false, + "stdout": "{\n \"_hint\": \"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\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\": 1199,\n \"error\": \"\",\n \"output\": \"{\\\"_hint\\\":\\\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\\\",\\\"_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.\\\",\\\"result\\\":{\\\"content\\\":[{\\\"text\\\":\\\"{\\\\n \\\\\\\"message\\\\\\\": \\\\\\\"ADOM_HISTORY_POSTCHECK={\\\\\\\\\\\\\\\"success\\\\\\\\\\\\\\\": true, \\\\\\\\\\\\\\\"pid\\\\\\\\\\\\\\\": 55528, \\\\\\\\\\\\\\\"host\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"adom_drew2\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"fusionVersion\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"2705.1.30\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"creationId\\\\\\\\\\\\\\\": \\\\\\\\\\\\\\\"cdf1e4ec-a727-4ffe-8975-d10e11191864\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"modified\\\\\\\\\\\\\\\": false, \\\\\\\\\\\\\\\"saved\\\\\\\\\\\\\\\": false, \\\\\\\\\\\\\\\"geometryEmpty\\\\\\\\\\\\\\\": true}\\\\\\\\n\\\\\\\",\\\\n \\\\\\\"success\\\\\\\": true\\\\n}\\\",\\\"type\\\":\\\"text\\\"}]},\\\"shell\\\":\\\"rust\\\",\\\"statusVerb\\\":\\\"fusion_mcp_status\\\",\\\"success\\\":true,\\\"timeoutSeconds\\\":60,\\\"tool\\\":\\\"fusion_mcp_execute\\\"}\",\n \"result\": {\n \"content\": [\n {\n \"text\": \"{\\n \\\"message\\\": \\\"ADOM_HISTORY_POSTCHECK={\\\\\\\"success\\\\\\\": true, \\\\\\\"pid\\\\\\\": 55528, \\\\\\\"host\\\\\\\": \\\\\\\"adom_drew2\\\\\\\", \\\\\\\"fusionVersion\\\\\\\": \\\\\\\"2705.1.30\\\\\\\", \\\\\\\"creationId\\\\\\\": \\\\\\\"cdf1e4ec-a727-4ffe-8975-d10e11191864\\\\\\\", \\\\\\\"modified\\\\\\\": false, \\\\\\\"saved\\\\\\\": false, \\\\\\\"geometryEmpty\\\\\\\": true}\\\\n\\\",\\n \\\"success\\\": true\\n}\",\n \"type\": \"text\"\n }\n ]\n },\n \"schemaVersion\": 1,\n \"shell\": \"rust\",\n \"status\": \"ok\",\n \"statusVerb\": \"fusion_mcp_status\",\n \"success\": true,\n \"timeoutSeconds\": 60,\n \"tool\": \"fusion_mcp_execute\"\n}\n", + "stderr": "", + "returncode": 0, + "finishedAt": 1791235757.4365482, + "raw": { + "_hint": "Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.", + "_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": 1199, + "error": "", + "output": "{\"_hint\":\"Autodesk MCP tool result. Content is usually a list of {type,text} blocks. If it complains about no active document, open one first (fusion_aps_open) - MCP acts on the ACTIVE Fusion document.\",\"_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.\",\"result\":{\"content\":[{\"text\":\"{\\n \\\"message\\\": \\\"ADOM_HISTORY_POSTCHECK={\\\\\\\"success\\\\\\\": true, \\\\\\\"pid\\\\\\\": 55528, \\\\\\\"host\\\\\\\": \\\\\\\"adom_drew2\\\\\\\", \\\\\\\"fusionVersion\\\\\\\": \\\\\\\"2705.1.30\\\\\\\", \\\\\\\"creationId\\\\\\\": \\\\\\\"cdf1e4ec-a727-4ffe-8975-d10e11191864\\\\\\\", \\\\\\\"modified\\\\\\\": false, \\\\\\\"saved\\\\\\\": false, \\\\\\\"geometryEmpty\\\\\\\": true}\\\\n\\\",\\n \\\"success\\\": true\\n}\",\"type\":\"text\"}]},\"shell\":\"rust\",\"statusVerb\":\"fusion_mcp_status\",\"success\":true,\"timeoutSeconds\":60,\"tool\":\"fusion_mcp_execute\"}", + "result": { + "content": [ + { + "text": "{\n \"message\": \"ADOM_HISTORY_POSTCHECK={\\\"success\\\": true, \\\"pid\\\": 55528, \\\"host\\\": \\\"adom_drew2\\\", \\\"fusionVersion\\\": \\\"2705.1.30\\\", \\\"creationId\\\": \\\"cdf1e4ec-a727-4ffe-8975-d10e11191864\\\", \\\"modified\\\": false, \\\"saved\\\": false, \\\"geometryEmpty\\\": true}\\n\",\n \"success\": true\n}", + "type": "text" + } + ] + }, + "schemaVersion": 1, + "shell": "rust", + "status": "ok", + "statusVerb": "fusion_mcp_status", + "success": true, + "timeoutSeconds": 60, + "tool": "fusion_mcp_execute" + } +} \ No newline at end of file