app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
Port occurrence translation and contract authoring to Rust; publish verified R21 source
42 files changed
+26759−140
diff truncated
docs/mechanical-progress/README.md+31−13docs/mechanical-progress/status.json+44−11native-rust/BASELINE-R20-FIX3-PRODUCT-FREEZE1.txt+186native-rust/DEVELOPMENT.md+21−53native-rust/PRODUCT-SOURCE-SHA256.txt+25−18native-rust/R21-VALIDATION.json+36native-rust/README.md+18−31native-rust/docs/R21-OCCURRENCE-TRANSLATION.md+98native-rust/native-addin/AdomFusionRustNative.manifest+2−2native-rust/native-addin/build.rs+1native-rust/native-addin/shim/assembly.inc+2−1native-rust/native-addin/shim/placement.inc+45native-rust/native-addin/shim/sdk.cpp+1native-rust/native-addin/shim/sdk.h+4native-rust/native-addin/src/assembly/arguments.rs+47−1native-rust/native-addin/src/assembly/mod.rs+58−3native-rust/native-addin/src/assembly/placement.rs+318native-rust/native-addin/src/assembly/placement_tests.rs+469native-rust/native-addin/src/assembly/tests.rs+1−1native-rust/native-addin/src/execution.rs+10−1native-rust/native-addin/src/execution_placement_tests.rs+176native-rust/native-addin/src/execution_tests.rs+2native-rust/native-addin/src/http.rs+1native-rust/native-addin/src/native.rs+1−1native-rust/native-addin/src/native/assembly_adapter.rs+137−1native-rust/native-addin/src/service.rs+10−1native-rust/native-addin/src/service_assembly_tests.rs+65native-rust/native-addin/src/sketches/dimensions/tests.rs+1−1native-rust/native-addin/src/sketches/entities/tests.rs+1−1native-rust/review/R21-AUTHOR-SELF-REVIEW.md+46native-rust/tools/contract-authoring/.cargo/config.toml+4native-rust/tools/contract-authoring/Cargo.lock+213native-rust/tools/contract-authoring/Cargo.toml+10native-rust/tools/contract-authoring/FREEZE2.md+36native-rust/tools/contract-authoring/README.md+124native-rust/tools/contract-authoring/SOURCE-SHA256-2.txt+21native-rust/tools/contract-authoring/VENDOR-ORIGIN.md+6native-rust/tools/contract-authoring/data/catalog.json+3622native-rust/tools/contract-authoring/data/mechanical-schema.json+6993native-rust/tools/contract-authoring/evidence/BASELINE.json+33native-rust/tools/contract-authoring/evidence/baseline/bridge.json+318native-rust/tools/contract-authoring/evidence/baseline/describe.json+13522docs/mechanical-progress/README.md+31−13@@ -16,22 +16,22 @@ PR #10 was closed and replaced by the current-master foundation work. These four PRs are unmerged; they are historical implementation references, not approval to ship Python-backed additions under the Rust migration requirement. -The R20-fix3 native Rust checkpoint is available in [draft PR #19](https://wiki.adom.inc/adom/fusion-bridge/prs/19)+The R21 native Rust checkpoint is available in [draft PR #19](https://wiki.adom.inc/adom/fusion-bridge/prs/19) on the isolated `native-rust-checkpoint-2026-10-16` branch. It does not-replace or configure the installed bridge. The completed frozen product source-and assembly protocol verifier are included; R21 work in progress is excluded.+replace or configure the installed bridge. The frozen product source, protocol verifiers, independent placement observer+and Rust contract-authoring tool are included. R21 actual-app qualification is pending. ## Python to Rust -**17 of 61 legacy mechanical operations have limited native implementations;-44 do not yet have native handlers.** That is approximately 28% by operation+**18 of 61 legacy mechanical operations have limited native implementations;+43 do not yet have native handlers.** That is approximately 30% by operation count, not 28% of engineering work or complete behavioral parity. Nine native-helper operations bring the completed candidate to 26 exposed operations.+helper operations bring the current source candidate to 27 exposed operations. No operation is being claimed as fully qualified across every legacy behavior. -The 17 implemented subsets are `assembly_properties`, `bom`, `bom_export`,+The 18 implemented subsets are `assembly_properties`, `bom`, `bom_export`, `component_create`, `component_metadata`, `feature_create`, `inspect`,-`material_list`, `mcmaster_discover`, `new_design`, `occurrence_insert`,+`material_list`, `mcmaster_discover`, `new_design`, `occurrence_insert`, `occurrence_update`, `parameter_create`, `parameter_set`, `sketch_constraint`, `sketch_create`, `sketch_dimension`, and `sketch_geometry`. @@ -51,13 +51,30 @@ whole-codebase conversion percentage has not yet been established. | Runtime and safety | Rust transport, owner-thread execution, document/revision checks, durable results, replay/conflict handling; bounded live campaigns | Broader restart/failure/soak tests, deployment and installer integration | | Parameters and sketches | Parameter create/set, origin sketches, eight primitive types; finite horizontal/vertical constraint and 42 mm driving-dimension live tests | General solver graphs, other dimensions, edits, offsets, projection and broader persistence | | Solids and physical properties | Basic one-sided new-body extrusion and bounded root physical-property reads exercised live | Independent geometry/material qualification gaps; additional solid features, arbitrary assemblies and editing |-| Assemblies | Empty flat component creation, shared occurrences and local purchasing metadata independently checked in Fusion | Physical child components, nesting, native online metadata; R21 absolute positioning under development; joints and motion |+| Assemblies | Empty flat component creation, shared occurrences and local purchasing metadata independently checked in Fusion | Physical child components, nesting, native online metadata; R21 absolute translation compiled and tested; actual Fusion pending; joints and motion | | BOM | Rust collection/CSV core and native handlers implemented; portable/Windows core tests pass | Successful complete actual-app BOM traversal and CSV export qualification | | McMaster | Native command registration discovery exercised live | Plugin launch, model download, CAD import and placement | | Exploded views, animation and rendering | Standalone Rust exploded planner passes 31 tests on each platform; older Python feature PRs are available | Native preview lifecycle, presentation/animation/render workflows and persistence | | Geometry and service access | Identity and revision foundations exist | Import/export, general measurements, interference/collision, configurations and connection to AI Flow Mechanical | | Other bridge functions | Existing electronics and other production features remain available through the legacy bridge | Remaining Python runtime, embedded execution and tooling migration; full regression qualification | +## Current conversion work++R21 absolute occurrence positioning has passed **508 Linux tests and 512 Windows+tests**, including native SDK compilation and release linking. Its 28-test+protocol verifier and 20-test independent pose/snapshot observer have passed+portable tests, native Windows tests and binding compilation checks. The+observer also links against the installed Fusion SDK. Actual Fusion qualification+is still pending. This is a finite translation+subset, not general placement parity.++A Rust replacement for contract-authoring tooling reproduces all 665,236 bytes+of the historical contract, including 179 frozen entries, 178 runtime verbs and+61 mechanical schemas. Explicit changed-catalog refreezing is implemented; all 21 tests pass on Linux+and Windows, including actual CLI and atomic-publication checks. Release CI adoption+and macOS atomic publication remain pending. No Python runtime has been+removed from the installed bridge by these source changes.+ ## Latest completed verification R20-fix3: **494 Linux tests and 498 Windows tests passed**, plus binding/SDK@@ -85,10 +102,11 @@ native bridge or CAD collision engine. The projects are complementary, but **there is no implemented integration today**. See the [integration assessment and proposed boundary](AI-FLOW-INTEGRATION.md). -The next useful delivery is a connected service-access workflow: complete the-finite positioning prerequisite, add the model-derived evidence adapter and-the physical geometry/measurement support it needs, and qualify that path in-Fusion. Unimplemented collision checks must remain explicitly unresolved.+The current priority is to complete Python-to-Rust conversion of existing bridge+behavior and supporting tooling before adding more features. That includes+portable and Windows tests, bounded background Fusion qualification, persistence+and regression checks. The AI Flow evidence adapter and additional service-access+features are deferred until this migration is complete. Public releases require the relevant live tests plus package, installation, regression and release-channel qualification; source publication alone does not meet that gate.
docs/mechanical-progress/status.json+44−11@@ -1,21 +1,21 @@ {- "asOf": "2026-10-16T16:07:08.200Z",- "candidate": "R20-fix3",- "sourceManifestSha256": "9dd6f2f225a21b71cdc8cc51fe0b480b86f351dcc253939ac96b0354b7dc5208",+ "asOf": "2026-10-16T19:09:04.992Z",+ "candidate": "R21",+ "sourceManifestSha256": "c2b42e34335a2cc49a1762b3bd140dffe542d544aa7e81721d87449082cbe197", "counts": { "legacyMechanicalOperations": 61,- "legacyOperationsWithFiniteNativeImplementation": 17,- "legacyOperationsWithoutNativeHandler": 44,+ "legacyOperationsWithFiniteNativeImplementation": 18,+ "legacyOperationsWithoutNativeHandler": 43, "nativeHelperOperations": 9,- "nativeExposedOperations": 26,+ "nativeExposedOperations": 27, "totalMechanicalSchemas": 70, "fullyQualifiedLegacyParityOperations": 0, "publicReplacementReleases": 0 }, "latestInstallableVersion": "1.11.39", "nativePublicReplacementReleased": false,- "linuxTests": 494,- "windowsTests": 498,+ "linuxTests": 508,+ "windowsTests": 512, "implementedSubsets": [ { "operation": "assembly_properties",@@ -61,6 +61,10 @@ "operation": "occurrence_insert", "scope": "Exact owned empty flat root definitions/shared instances with identity placement and local name/purchasing metadata. R20-fix3 finite live protocol, journal and independent SDK checks passed. Online native PN/description, child solids, nesting, transforms and full legacy parity remain pending." },+ {+ "operation": "occurrence_update",+ "scope": "Absolute translation in mm of an exact native-owned empty ungrounded root occurrence with identity orientation, followed by one captured position. No rotations, visibility/grounding edits, nested/external/physical assemblies. Source/Linux/Windows passed; actual Fusion and semantic persistence pending."+ }, { "operation": "parameter_create", "scope": "Single user parameter with exact document guards; no full legacy rollback"@@ -116,7 +120,6 @@ "motion_link_delete", "motion_link_edit", "occurrence_delete",- "occurrence_update", "parameter_batch", "plane_create", "regular_joint_create",@@ -134,11 +137,41 @@ ], "positioning": { "candidate": "R21",- "status": "in development; not included or live-qualified"+ "sourceManifestSha256": "c2b42e34335a2cc49a1762b3bd140dffe542d544aa7e81721d87449082cbe197",+ "linuxTests": 508,+ "windowsTests": 512,+ "releaseDllLinked": true,+ "status": "Product, verifier and independent observer source review and Linux/Windows tests passed; actual Fusion qualification pending",+ "actualFusionQualified": false,+ "publicReplacementReleased": false,+ "verifierLinuxTests": 28,+ "verifierWindowsTests": 28,+ "observerLinuxTests": 20,+ "observerWindowsTests": 20 }, "johnIntegration": { "repo": "adom/adom-aiflow-mechanical", "commit": "1195dc3f103cbf01a53ffaa85a414ef98be8fe53", "implemented": false- }+ },+ "workPriority": {+ "first": "Complete Python-to-Rust conversion of existing runtime and supporting tooling with regression qualification",+ "then": "Additional feature buildout and AI Flow integration",+ "newFeatureWorkDeferred": true+ },+ "contractAuthoring": {+ "source": "rust-contract-authoring-r1",+ "sourceManifest": "7e9afe38589eecedf425a39c27a9dfd8e229556332f1cde362f43af5f88d1d2e",+ "sourceFiles": 21,+ "linuxTests": 21,+ "windowsTests": 21,+ "status": "Historical reproduction and explicit refreeze implemented and independently reviewed; actual Windows CLI tests passed",+ "historicalContractBytes": 665236,+ "historicalBytesEqual": true,+ "releaseCiIntegrated": false,+ "macosExclusivePublication": false,+ "runtimePort": false+ },+ "latestCandidateActualFusionQualified": false,+ "lastActualFusionQualifiedCandidate": "R20-fix3 (finite empty assembly only)" }
native-rust/BASELINE-R20-FIX3-PRODUCT-FREEZE1.txtadded+186@@ -0,0 +1,186 @@+a01b87e607d6f4575906dde605ff16d4a9425389f78230f99f7a5af516637391 .cargo/config.toml+6d301973ae13a6cdbad9a74b5adc7f45f22f151971935318aab2b05c847282f2 BASELINE-BOM-OFFLINE-FREEZE5.txt+2287227fbc61858a7ea9ca7794da38fde685e7336352dc7961f1f058e080adb6 BASELINE-M12-FIX2-PRODUCT-SHA256.txt+39f5af6c227b7ba21c2d06139dcb5442cd6514592ecc321b5b55eabd1c37f7dc BASELINE-R10-PRODUCT-FREEZE2.txt+f68c2d3c85bbb2be452b85cc4b11e908147f7b7fbc59a2bc51f8a11b11644812 BASELINE-R11-PRODUCT-FREEZE1.txt+8820646b4120e4fe75647e7983f0179b626cb6c69dd2b34b2b6a23253ffb3c7f BASELINE-R12-FIX1-PRODUCT-FREEZE1.txt+17e32b0a851d1a299ccd68a6d1a0b4019ec4df957d1be037df2d2fdf4539ea8d BASELINE-R12-PRODUCT-FREEZE1.txt+ed677db7dcb6a4ba379c4268655c9b10578128145d4d6050f19eeb2066a75e82 BASELINE-R13-PRODUCT-FREEZE1.txt+01f0c503e58894d36c12b4de94e2acbbf3cc2e6aa6938d15283fbfb908139864 BASELINE-R14-PRODUCT-FREEZE1.txt+7eb86f73fc1201123bfb4a16261ce1af8ec29c0f834cd0924f956b6175c734df BASELINE-R15-PRODUCT-FREEZE2.txt+85bcf6a7cf4c5435a61b17095e4f7bae600e21f8a05cd4eada71737691a10375 BASELINE-R16-PRODUCT-FREEZE1.txt+b18dd8d127318d903839b150bbc24ed068c2abbfb5db6fcbfc08065f117c261e BASELINE-R17-PRODUCT-FREEZE1.txt+3ac27fee0e361fb408b38efad971ab1b7913428c5641f0fd471205e9c0be9d00 BASELINE-R18-FIX1-SOURCE-SHA256.txt+3ce574d2443c34f5feeb81dfd7298d2ed7f9e47129d739ec83507f98ac6ae12a BASELINE-R18-FIX2-DELTA-SHA256.txt+85790b8e509392e71e663ff5fbb2db6d755cc77f9738ca9f53766dd18ee7d5bb BASELINE-R18-PRODUCT-FREEZE2.txt+3465c2fd655934c365ca5d4e3b5ee74300a0895abd9e898155aceeaac79b51d3 BASELINE-R19-FIX1-PRODUCT-FREEZE1.txt+11549c7596c77c21a05b25dc98d2a8f57ff1b1cb9af41d02c58e3b0a0998607b BASELINE-R19-PRODUCT-FREEZE1.txt+6f67e82c988e97bf7a731c9894822196e7797d6196c8024f44c60f4f9ac945a3 BASELINE-R20-FIX1-PRODUCT-FREEZE1.txt+63ae9355a32fc07ad77c5ff970a658c43043d4be113c9e68d8a152de9cdaf7d4 BASELINE-R20-FIX2-PRODUCT-FREEZE1.txt+bd1d41d25dc8984289f96d96aa9588208e7325784b1b7884b5064996381daff0 BASELINE-R20-PRODUCT-FREEZE1.txt+ae4730b08fa12c9bad86e34888145dcbeffee41378e5a48e75425287a1232af7 BASELINE-R9-PRODUCT-FREEZE1.txt+1bb8aaa94cd1053c11503abdf05fda4474865a82dea34cd1030ef5354f9da686 BASELINE-R9-SHA256.txt+4b45849f6e5f3bd864ddf48f2d0d72e1ad0f4e24a2eb4d6501431a00674de286 BASELINE-SKETCH-CORE-SHA256.txt+6240f37683bc88201c06eebbce446e2773bc5f3ae50796e2598aee1caee40408 Cargo.lock+788e7ccca864c51315f1ed5511d49686337a4f86659fdcbb788920d3c2a53909 Cargo.toml+ff8848812031fff59be39bfe0b3d24c4cf2a2625a0f6124d41a1ec0ab5a9d812 FREEZE-1.md+89ea322a69dfd14abd051b5329120e813b02adeaa062382e328df278956b32b0 MIGRATION-PLAN.md+7c22348acf34c50006732a36c4dda4d3818aec0c2403512049222742776d5b72 README.md+c2835d074ecf03fd00129a1bde2a8ab8d6d0f8663cf3536363dbc49ecaaa5a2c artifact-publication/Cargo.toml+1f32453f88d1d2ee76d8e3b0f248bfacec1c67a94cd6f875786750ae165d47fc artifact-publication/PORT-MAPPING.md+e605a756e5f717a23c0a2b79de4aa2306d273e0bb60445f790c5430d1a7f51d1 artifact-publication/README.md+b81e358a447fc7aba88dfced299d01d392b6e80e8ca47fa0ba81edd5146857e9 artifact-publication/SOURCE-CHECKSUMS.sha256+52d0204d39ec9f545d6a9ddf743e4f532a2d85d489f05a98b7ee63f3c335291d artifact-publication/src/lib.rs+5027d4be2bf26de9189a97304b396ca4d7c47dbce018c9d4b26e806cbbe9ff4f artifact-publication/src/tests.rs+4e89d520a665baa7ae6f5336b74345116fd4276eb51761817ebd2db818db68ad artifact-publication/src/windows.rs+382d5e5b2980703eb27cc3be21d6fcf97668bb49f15d8c35b20c5c3ed6c727bf bom-core/Cargo.toml+9b1beb410dab4b12100a5d9ab09709bbca0150e2224e8c3c0e02f8d42ff5293b bom-core/PORT-MAPPING.md+f7665b03dfbc651306482757b77308591a6a85a4a4363fc080cb2c86659f9e76 bom-core/README.md+9edd8875056d669c6ffa703c05766e0422a80ca50c5b1af0f433e225c43096ea bom-core/SOURCE-CHECKSUMS.sha256+91363ffaa71324facf53920b35d5d59f3d9d3c842888ed9cd2af883e91e8fa6d bom-core/src/configuration.rs+1d01f830d358ef7f4a33dfec2c37f0eac31a8248bd0e5b13c95743cb0da5aa6d bom-core/src/csv.rs+b5b9173c80f1675a089dac56fe7dc733a64656c7cf6aec62f413cc84c92ead17 bom-core/src/engine.rs+600314246e321b0af5d3084363b592f551b65ff21b10904980af35d08a4babc8 bom-core/src/lib.rs+4b30580a7fc7dd9160ab54f6940efd530eef9c6cc61732407d4331bd2f75343b bom-core/src/model.rs+e10309eeecd1f1b7953e30a6a11a7f2983381b5f8e9dc8af2a9107ba9ed676d0 bom-core/tests/bom.rs+8fad180d2fb978badc1c2c0ba517779e7275f877b0fff5cdf63f32ff6a6be206 dispatch/Cargo.toml+3c48b96a5a5a8e2e65b46057708da146d0e71001f88ac245ee04bb49e0fade4b dispatch/src/lib.rs+0d91cc892db75f821a3c5856fd52262d204cd533508d42091b817b233400efcf docs/EXACT-SKETCH-ENTITIES.md+30d46e99ab0b7bc1c566308b5281562003c033d46662874c7e781822443787de docs/MATERIAL-CATALOG.md+b58faeb82f9ea61a81b2f82d79dc75adc47ed3fe2662340964e23e04c9e1554c docs/NATIVE-LIFECYCLE-PLAN.md+104555b187afc24b6a292b3c04c8080560f9e845e1d3c04f12acfaa0c2e8113e docs/NATIVE-MCMASTER-DISCOVERY.md+21f986d15bf693a11543fdf33395102d492a8da3bb0c58f415798b8bd0a0ad0b docs/NATIVE-ROOT-PHYSICAL.md+940b95247b2b81698fa37a885c9a8d0c1d7326cc305596207efb4eb98eb79c13 docs/NATIVE-SKETCH-LINE-STATE.md+974a7192e9349e51be2e96660872277b67347ead90f434fb778066a46c1361c7 docs/NATIVE-SKETCH-RELATIONS.md+58c4503428cef152365906b673a89d3fb1ba0ba930e434f57dfc8a62c587c230 docs/NEXT-HORIZONTAL-VERTICAL.md+63e66a5d2de636d3b3286875e59dbd3c20e6a4a93f2c1484426bfad97877d866 docs/PORTING-LEDGER.json+88dc171b00cdce3abba2a88f1645193906f65efa6555629932255f4f8ae4d5c0 docs/PORTING-LEDGER.md+ecc80b6be5fadc9f78dc153662297d3d7f9a553c90883be946f6b425f2100876 docs/R10-SKETCH-CONTRACT.md+dd63aa299c1a1b851b4cdeab4026a5e02cd3903a521996e6b215db4e479d42ab docs/R11-GEOMETRY-CONTRACT.md+bcc6e736cadbcdbeaedc8e8be7cbf695ecac4111dd636cd37e284d2e82e3326c docs/R12-EXTRUDE-CONTRACT.md+b375c41e1457c3bb4ddac68485990acf730fc4b600a92274ac5664146131f92c docs/R12-EXTRUDE-START-FIX.md+1e8ed0c8ecff96ea6f842dbe06f6177ee710549f231abadb4a6979a07a2d6bbc docs/R18-FREEZE2-TYPED-RELATION-FIX.md+aeb714fb3cc50fa39d64e021dc2aa75c6607fda724f6b59eb0c0bc7e567e2c7b docs/R18-LIVE-INCIDENCE-FIX.md+4bf8b8b77588455776465577d3b0716b81fe7ff7955d105a107537aa6ecf4f42 docs/R19-DRIVING-DIMENSION.md+583183e76a3ccb833bff6849db733e3f335457bc4db04c387a505d67686d8667 docs/R19-FREEZE1.md+a568cc74e46f74b9f9c0b5df572d9ef80b03f5dc7972652609e62307d066adfa docs/R19-LIVE-CREATOR-FIX.md+ad5ca0ef4740b53938264e49d067f5343019befd751d900e1b5e3edf6749dbeb docs/R20-ASSEMBLY-CONTRACT.md+6452903f5af8163ac0382dd155ff836cfe710afb0ce08ddef22a32ad4b05d046 docs/R20-ASSEMBLY-PLAN.md+028c253c63968a592e42ee95060240a4ce47f0f0c0fdea91c1babf4f749f53bc docs/R20-INITIAL-COMPONENT-REVISION-FIX3.md+add06ac9a9b9939ef7fea0745a0f0b5f29cbe541899a329854defba460286dcc docs/R20-INSTRUMENT-ONLY-FIX1.md+a49950322471cd1304488896306e1d5e5c79fc5d880022d57e8eeda0b15d83d5 docs/R20-POST-EFFECT-READ-SETTLING-FIX2.md+9f8b7fa3b4fecbad38c41da397c5357ee3a8d03516340b9fde3f03aa0638f4af docs/R8-LIFECYCLE-CONTRACT.md+9ad620bd3d90cc01019ef9c47718307895bad9df34208f3576db389362ac01ba docs/R9-BOM-CONTRACT.md+bbc1ff6fbae1524a9d790f15023bcd309748a7ed2e58936c151edcf56dfa6458 journal/Cargo.toml+92105e517befa03a2fb23af64cfd719f2128893a6cfb848e5a0146510d918f6f journal/README.md+140ceec15f4cbd5c5dfc710d2fa4353d6299a43003968a01a4d2c896e82d8d3f journal/RETENTION.md+2c91bba2faba3276eb509fa79fb9b05f063abe6bc9a50c60bc82ac92f06e2e5a journal/src/lib.rs+aba8177c419a696a44307cbd15875f6de87aaf1bb40d205edc76644390388a57 journal/src/retained.rs+73d89174bf1ab63ed8be850bc2369ec863f274dfad399f24531e672f632c35a5 journal/src/retained/tests.rs+ec6ac4bde4b2d6c56aa4fe2f9c2d838593c3fbe8ad4ae572e0ec18d5e6a8e2a0 journal/src/storage_policy.rs+b5b28a98ff1160cd534ee11d718e3d367e4d99da0ba80258a82c9baf30288b0c journal/src/tests.rs+32b6426889954b64de3d1f6167ca22a535e3e61dbdaa1e905a01dc26f3aaeca8 journal/src/windows_storage.rs+f59394e5e74ed65e8e282bf107905608aac6ca1593a2e0f6c067ea0f1cf6fc7e journal/src/windows_storage/tests.rs+7a2a8a0eb1f6d89cee26f64785a6419085f8025877c8f1b681ea55063149414c mechanical/Cargo.toml+04381f0b98143bff0ae5dabc3793dcb873dbb08b7269f7fdc885ed87afdd30b5 mechanical/schema.json+d4c665d47d01f810c1982e409de0bb8cbbb40e2858765af92c7f976379aaec53 mechanical/src/lib.rs+5fb5e46ef72dabc2455178b6eaf6f4dece66e1f01d702474050e5f95ca11e9fd mechanical/src/operations.rs+ad431541393d199d8107ed9478dec98fa839c6f112a62368035d107dac71b909 mechanical/src/schema.rs+605310c504ea99530cc5f67f161fb2665f8106195840650d1620d63dfb5d42a9 mechanical/src/wire.rs+c90013975ccee20dc087cdd5bde037b39aab31fb4f6ee22398862117bf3038f3 mechanical/tests/contracts.rs+3fe05e8f2dcac0943203f8fead842bb8ad57a76a43e6a0d3c2896347d7fd5fe9 native-addin/AdomFusionRustNative.manifest+a0ebb0e5df3b01cfae1d4ffc012c8e1d97ef28adf6030a682381d7285432443a native-addin/AdomFusionRustProbe.manifest+5b92039a741ab7cab658a1b226f5f771d36228c260e6d0e710383a71613e2634 native-addin/Cargo.toml+50b899dcdb6d9f8e96d9036ca252ff786739cf20bfece30355b6b7c008cd6d17 native-addin/build.rs+9bbab3a9d50fc7af93fdda173bdfe95137889b6e222e393895fb4bc5cbfadacd native-addin/shim/assembly.inc+fb16c2ba8198623a303ffcecb1c37729e760ad2cfd78ec0fc49e6453820656fa native-addin/shim/bom.inc+dd6e16ae408c74b4bc4324117cae3cefc1d5ae75d7d750b66d7d6be0d2cccb7f native-addin/shim/dimension_creator.h+600a30c338ffcf3be1dd4f59ac2c883d46ebc009853c1364675d1d5e0e8c97ff native-addin/shim/dimensions.inc+d8bf0a788bebfcc1eccfc330b25bf02f9dc4d86c9b2aef8e964730634decfd0f native-addin/shim/document_lifecycle.inc+d3693d7888a487ca0206043981a753cd034c9a268f9bf6ed336d757dd7e675bd native-addin/shim/events.cpp+3b2ea21d015b6f65a83816196b4c7848c1d25004cc62fa3c02cccb7c96cdd76b native-addin/shim/extrusion.inc+8fd6f37c4c13983caa7180c8326cb1e334746bcb8e2faef21b3eea2303f070b8 native-addin/shim/isolated_line_incidence.h+1027dec4c4121f294fe66b245350095e147b7b8b83edc53d7dcfb1658f517bd3 native-addin/shim/line_state.inc+5ba1a786db512480fc77e8899875ef1bae43dec2174d3a22254e0dae0f534b6b native-addin/shim/materials.inc+142c7cdea6c8d3dcc63a37e7aeac877ad6637c8450fcf6254448e468b20fa49b native-addin/shim/mechanical.inc+c4002e957aff096e21f7a1ef68e00f920e57a0c062c0d980644cfcfd9837c55c native-addin/shim/physical.inc+d51b10641539369d3ae5df9c4a50a9a158000fd6f88c02d296832503c2bb43cb native-addin/shim/purchased.inc+cd35642f361b4230d8408a68d9ab47716bf63e74fd2c27a8d8679e129858db72 native-addin/shim/reference_presence.h+86186eb94fccb245e127916270e7fd677ab3931ba98ba6dab3d6570c5f395c4f native-addin/shim/relation_identity.h+94bd275a815ad37b20b969398d9b153ff7bad0d62fc4d1cd53892f94870ed1b1 native-addin/shim/relations.inc+3125fc9d024807998fdd7f674542e0412538b60c61e72ca0947842d11d27faab native-addin/shim/sdk.cpp+e57fb4b660105fc7d120aa40106645204f1c8b7e6e42c45dad92db3a767db799 native-addin/shim/sdk.h+2ae9b60e40f3263ba48490d21a3848ce745c32f1731293d6d433425f8eebdbc2 native-addin/shim/sketch.inc+44f66af62e1159ba47e9365d48d9d0a2abee6c6343fb49e44df24d293fbe6225 native-addin/shim/sketch_geometry.inc+6abcfafa16671c22784aea14b2a6b65feed269c93e84f63f60d79a4d62ef6f43 native-addin/shim/tests/dimension_creator.cpp+f0bfc487d731f0092fac187668bbe96a222575138da4bb4224620b3a502d6d8f native-addin/shim/tests/isolated_line_incidence.cpp+3569f96c7ac208ab15d136a82e8b1b6a3934f3beaff30ce1f0e08b893ed48d5a native-addin/shim/tests/reference_presence.cpp+7978b44f35f0cc9a45ec59bfe835846c967378e7371d360173d351cab5f84723 native-addin/shim/tests/relation_identity.cpp+033d006595501f7801182d27c1ca0b33e074aa46a40f26ba4c1109ec2b744238 native-addin/src/assembly/arguments.rs+4c39f02f73bfc214e54885047cb7112f09c5a54bcaffe59b7cf3a78d53aa0f63 native-addin/src/assembly/mod.rs+65358708f94150efb60b50324a34c313a014fb2fdcd787d502e77fff9300e827 native-addin/src/assembly/readback.rs+ec38e472032bfd55bbd8073e2f17d397cd0f7f97975dc4478aac616a9f495760 native-addin/src/assembly/readback_tests.rs+ba74bf5de81cd636cd58e4b73d38b981d4581894076e401d795127411bf73d98 native-addin/src/assembly/tests.rs+5a12bcd6c6c79cb3fb6cff156c42393eac0d3f67e2f5c6e0c8567831fe82c9b6 native-addin/src/bom.rs+c01c6daa39723b19de9134f87b853c072d87cf8b96568f74313eee42fb5ca01e native-addin/src/bom/tests.rs+57b3a8baf947cd6e73cbd458c087014db9728947571cd70a106156696a8a28b1 native-addin/src/bom_export.rs+3d421449de05bf060f88177e554e4e0f4c09d8395b781c0fff4cab360557991f native-addin/src/bytes.rs+ffb0ad0cb074261a1a2601012e9a05fd081f54f98ce01f952df205fac9825a36 native-addin/src/execution.rs+bd9a6112b9bc9da993f29e273b98cbba9cce4b146558ae223eb985c48cef2910 native-addin/src/execution_assembly_tests.rs+6471c1037767a20f777a0f54049e9b7d43e2e04d05e340124fac7a43211d8d1e native-addin/src/execution_dimensions_tests.rs+786583fdfaa50788b981418ae22a59387d800a69b09dad0a54b15a54eff881fd native-addin/src/execution_tests.rs+3ff8f5d923f63d2d3db982a3f64cefd488c4ec613763166b2cff99160eb0a129 native-addin/src/http.rs+f1cd4ebb9a6a3ce4d2882c60d60c0a883d8e97898fab3a1fb0949d4822968d8a native-addin/src/identity.rs+22fdcf60ca9e9007d87744106e2c36d55d065b86a21ba38909a40416da82ab70 native-addin/src/identity/document_lifecycle.rs+fa43f66c1a3bcccb9e8afb9019e9bffada500f8b22d8e59237e869d5bcc33129 native-addin/src/identity/document_lifecycle/tests.rs+7eb3deefc3aa843a883cddc3c9a3e788faf3d1448b83537f8174fda2021971b0 native-addin/src/identity/tests.rs+2bcd50f5aac0097fbaab1f33511ca689ac32c4650e91cba3ed4307e0d1ead433 native-addin/src/lib.rs+c72023e5b133243f57eeef357bc8e0f9fd84a826b5caa27c702313d963fb8d56 native-addin/src/lifecycle.rs+57b36e034c16cd89d8a79f82957c2aa9fcd605ecbbd82fb127a3d759dcf1c004 native-addin/src/materials.rs+0ff6a858a7f73cdd9d388dd0ac0db79d2b7759bed7a74f448d584e3b335e4f5c native-addin/src/materials/tests.rs+57d73a033a424bbe492a7eeffeb962aa383eb03876264a7b384f73ccd2671ad1 native-addin/src/mechanics.rs+0ecf824bb72f53209f40fd0b74c3cc57f0c35af52473b6736fa39d0ab6d0b679 native-addin/src/mechanics/tests.rs+9c36cd44fc3d328914a01fcb41b8e04bacc5e29110c05cfbabd4d6bcd57f0aa1 native-addin/src/native.rs+eab151c295d1ad91b2253b5412627a6dd1c5bdc7df4fac3670e05c99daf140cb native-addin/src/native/assembly_adapter.rs+a12dfbec596982bd0c8b63bbf613f88e700cadab50063ef3a3068ff8bc141163 native-addin/src/native/bom_adapter.rs+c53748268eacb5491db95f58e5fa74c765bd592f77fb7e0e6c2d46eb43407ae9 native-addin/src/native/material_adapter.rs+59ac3ba583f5603ff058e654989612aa26a53bcc305025db22ccbf8004ccbaa1 native-addin/src/native/physical_adapter.rs+9fb1123d4c260dc974f879398c9b69c538c2d602bc1f2131c9c128337ee9f151 native-addin/src/native/purchased_adapter.rs+13f4257b1b83e3146b4f36ea8dbca2d4fb8b52c06aa205cc69abc41e25153c3f native-addin/src/native/sketch_adapter.rs+8d7c4f07d4081bc12d024aaf4b4273a149ba52cf1a4e94ce2c594db912c3b8e3 native-addin/src/native/sketch_adapter/dimensions.rs+4635f4e7767911cccb9950027dfb76a43c2b1c307dbd98691fc4722e1c03ae6e native-addin/src/native/sketch_adapter/line_state.rs+ed9a7084c4b35e9310a2a79b043ad56777d4ac994c3f6771b703ad2befa6a1ee native-addin/src/native/sketch_adapter/relations.rs+8dd1bf8571dd10c196f49ce6f29c37e4c41e51b0be182b7147c13e8948ac326b native-addin/src/operation_status.rs+dc61df6eec9bf0c40f2a1c04dd5cacc9e48eea8a8b68051fabc7836faa1c1f84 native-addin/src/operation_status_tests.rs+ad466294ae06992eedbcb072ea61518aa7f45af4df8e578ea5a75dd0d90b917c native-addin/src/physical.rs+10033ff4504497e5fa43b82aeda383aa50b40147a5fd53c3501fcc901e57130d native-addin/src/physical/tests.rs+eaf8687f29cc875bd325472ba53248f1051ccc652464f8b27102130c08abbdd8 native-addin/src/purchased.rs+affcf86e95eefdc2e542b9472c659b0adc9dc1dd384389c3d2d6e07b94969b72 native-addin/src/purchased/tests.rs+d131718590950fefbce202286c364d54dd7ab9d33bd228f3bc3a8b1cb6501a02 native-addin/src/service.rs+d7dbd4fc7429a22aae40689652e233ec0f93268959069e4d030972f76eaa8047 native-addin/src/service_assembly_tests.rs+fff7e54efa9107fd9205d3e0ea1b68118710540b77f038a4e5641ecbdfb92a27 native-addin/src/service_dimensions_tests.rs+4cb6cafa7900ec5983f95767ad76e2d7597f459212f8a7620d455c92931e864a native-addin/src/service_line_state_tests.rs+09c82d0dbdddb9c1b5f0e33435ae1b800b3fbfc9fdb612fc30643619bc5665e4 native-addin/src/service_physical_tests.rs+78f102d927389b36701ac841cd1bb4340c00d388c2452287dcc332ea0fb748c0 native-addin/src/service_relations_tests.rs+ac7250ec9afbc587ab6a96c8f86891784e93dd8df4dacf93f6cd8d04cade3228 native-addin/src/sketches.rs+2ecd6d699d643e452b0da0d9b1dfe34b9a5ec0167e43bdf418ca329b09bb12db native-addin/src/sketches/dimensions.rs+78803762d523e41ac7f5f829269eee76f14c186f2509ebfa8d701c1ce2bfae09 native-addin/src/sketches/dimensions/tests.rs+79f1ed6b76a70c42f4a6453ce269db4b7fcc05152a38479dd418a621665e0cf9 native-addin/src/sketches/entities.rs+89dd6f4b55b916e4df139f2e1b50b42422e3d198ac84e0cd32c9c36f3df3fe74 native-addin/src/sketches/entities/tests.rs+4bef39635aa3d637200a9a18193c5c91c1d4c33092da49064f257f853a053bd5 native-addin/src/sketches/extrusion.rs+0f7d81df08e416304e1af2bc8ab9f02e5755925cc82ee81e4efcdc8a7a25ec5b native-addin/src/sketches/extrusion/tests.rs+e0ac32e6eb7ff272eb8c1ab9fb4578026869f7acb25d12f9e197e4cf6acf0279 native-addin/src/sketches/geometry.rs+b8a5dea25d00cf24310d8ef51ad14e274fce73ffc92dd5933ab792c47cc850b0 native-addin/src/sketches/geometry/tests.rs+2001185a3f728cc748a3db510c06c46fd2a0142f6ba1853e101b8ecf2431f37f native-addin/src/sketches/line_state.rs+429fb16fb879209d1540d3c4aa47833ee8daa94701d05af6a945e2776f0d815d native-addin/src/sketches/line_state/tests.rs+0f9263c584617a6d0b35e73ae39b40b11295dd017d89db0de0dbeefafd0fbdfa native-addin/src/sketches/relations.rs+b8a538bc79cd368e70a847279b4ff9f80c93a7cfe1c040b1bcac28122f7b7034 native-addin/src/sketches/relations/tests.rs+32e8d691669c5214cfd96138017a3c4d49a047f7e85bc5647ad77f5a51d54485 native-addin/src/sketches/tests.rs+0bd347b09b2ad337ae49db79cabde9a49b32524065b398430bfe341af0481d82 native-addin/src/wake_tests.rs+c2a08e5f51717a710be15ca40b1d0e0b8e79344d89eaecb75ac6438cc2d400f8 sketch-plan-core/Cargo.toml+d03d751118ccb0698b6d924467f09e619b930d6e1cbc4ec90f515e104495b85a sketch-plan-core/PORT-MAPPING.md+cf664371de11f85630623156a3c74cd5b0098697e69d6dba9d991efb0618c403 sketch-plan-core/README.md+e4b8c3bce1c5c4be0fa6b75635a1a659e52446397dd50ee69c20dd221ea776a6 sketch-plan-core/SOURCE-CHECKSUMS.sha256+caa6bc758706e09d999b4e92a0a06902b968173d552d500990a92ed4a62ef710 sketch-plan-core/src/lib.rs+6cc56f5423d9c5d7d2580ce2b8911c169a1634c329cda98ca8709ec35b214432 sketch-plan-core/src/model.rs+d10731185caff5e52bd8abfc1c7909e899480d244fc8afcd701a9efd51e942f2 sketch-plan-core/tests/geometry.rs
native-rust/DEVELOPMENT.md+21−53@@ -1,55 +1,23 @@ # Native Rust development checkpoint, 16 October 2026 -This is reviewable development source, not the installable Fusion bridge. It is-an isolated workspace and is not added to the existing bridge's build, installer,-runtime selection, package manifest or release channel.--The 186 product files are byte-for-byte R20-fix3, verified against-[PRODUCT-SOURCE-SHA256.txt](PRODUCT-SOURCE-SHA256.txt). That manifest's SHA-256 is-`9dd6f2f225a21b71cdc8cc51fe0b480b86f351dcc253939ac96b0354b7dc5208`.-The included 12-file assembly verifier is its separate C20 freeze2. Baseline-manifests and historical README/ledger statements are preserved as evidence;-their original dates and author-local status are not the current progress report.-Read [current progress](../docs/mechanical-progress/README.md) for current claims.--Rust owns mechanical policy, transport, dispatch, identities, journal and result-handling. The typed C++ adapter invokes Autodesk's C++ SDK and retains native-objects. It does not execute Python. The preserved production add-in still does.--## Validation--R20-fix3 passed 494 Linux and 498 Windows tests, GNU binding checks, SDK syntax-and Windows SDK linking. The actual Fusion assembly campaign passed 52 protocol-requests and six successful durable operations with zero uncertain attempts.-A separate public-SDK observer checked two definitions, three shared occurrences-(A/B/A), identity transforms, local metadata and exact stable revisions.-Normal product/observer stop and closed-journal integrity checks passed.--These results qualify that finite empty-component assembly scope. They do not-qualify arbitrary CAD models, physical child assemblies, BOM export, native-online part metadata, positioning, collision, animation, full legacy parity or-production replacement. Prior failed attempts retain their original status.--The [qualification receipt](../docs/mechanical-progress/r20-assembly-qualification.json)-binds the tested product manifest, DLL, protocol results, observer results and-closed journal. This publication includes product tests and the protocol-verifier; independent observer source and full live receipts remain in the-working evidence archive and are not all reproduced in this source checkpoint.--## Building portable tests--Run from this `native-rust` directory, independently of the existing `rust/`-workspace. Vendored dependencies and build products are intentionally excluded.-Populate the frozen configuration's vendor directory with `cargo vendor --locked-vendor` before running `cargo test --workspace --locked --offline`. Cargo's-vendor command uses registry sources by default; do not pass-`--respect-source-config` when bootstrapping the absent vendor directory.--Windows native building also requires the installed Autodesk Fusion C++ SDK;-see `native-addin/build.rs` for the SDK configuration. SDK headers, libraries,-DLLs, runtime credentials and active-session authorities are not distributed-here. The live verifier requires a fresh explicit disposable-fixture authority;-portable test success is not permission to run it on a user's document.--R21 occurrence positioning remains a separate unfinished qualification effort-and is deliberately outside this frozen source checkpoint.+This draft contains R21 development source. It is an isolated workspace and does not replace the existing bridge's build, installer, runtime selection, package manifest or release channel.++The product's 193 files match [PRODUCT-SOURCE-SHA256.txt](PRODUCT-SOURCE-SHA256.txt), SHA-256 c2b42e34335a2cc49a1762b3bd140dffe542d544aa7e81721d87449082cbe197. R21 has 18 finite subsets of the 61 legacy mechanical operations and nine native helpers. Full legacy parity is not established. The new subset is absolute translation of an exact owned empty root occurrence, with a captured position; rotations, grounding changes, nested/physical assemblies and general placement are not included.++## Verification state++R21 passed 508 Linux and 512 Windows tests, binding and installed SDK checks, and release DLL linking. Its protocol verifier passed 28 tests on each platform. The separate public-SDK placement observer passed 20 tests on each platform and SDK linking. Independent source reviews passed. R21 has not yet been run in Fusion; actual pose/snapshot qualification, semantic archive/reopen persistence and package/regression release gates remain pending.++The previous R20-fix3 actual Fusion assembly result remains a separately bound historical result: 52 requests, six durable successes, zero uncertain attempts and independent public-SDK checks of two empty definitions/three shared occurrences, local metadata and identity poses. See [that receipt](../docs/mechanical-progress/r20-assembly-qualification.json). It does not qualify R21 translations or reconcile failed historical attempts.++The new contract-authoring tool ports catalog expansion and contract freezing to Rust, including explicit changed-catalog refreezing and fresh output bundles. All 21 tool tests pass on Linux and Windows, including actual CLI and atomic publication. All 665,236 historical contract bytes match. It uses a caller-supplied date and stricter malformed-input validation. Its historical Python files are inert test fixtures, never executed. Release-CI adoption and macOS atomic-publication support remain pending. See [tool instructions](tools/contract-authoring/README.md).++Rust owns policy, transport, dispatch, identities, journals and results. Typed C++ glue invokes Autodesk's SDK. The preserved installed bridge still contains Python. Current priority is complete existing-behavior conversion before additional features or the AI Flow evidence adapter.++## Source layout and builds++The product, placement protocol verifier, observer and authoring tool each have source manifests. Older baseline manifests, READMEs and ledgers retain their original dated statements; use this document and [current progress](../docs/mechanical-progress/README.md) for current qualification claims. The previous C20 assembly verifier remains for historical reproduction.++Vendored dependencies, build products, SDK headers/libraries, live authorities, runtime credentials and active journals are excluded. In each isolated workspace, bootstrap with cargo vendor --locked vendor before cargo test --workspace --locked --offline. Do not use --respect-source-config while the vendor directory is absent. The placement verifier additionally uses the exact product mechanical crate through its relative path. Windows native DLL builds require the installed Autodesk Fusion C++ SDK; see each build.rs.++Live test clients require fresh explicit fixture authority and exact host/process/document checks. Passing portable tests is not authority to mutate an arbitrary design. No installable release is created by this source publication.
native-rust/PRODUCT-SOURCE-SHA256.txt+25−18@@ -17,6 +17,7 @@ b18dd8d127318d903839b150bbc24ed068c2abbfb5db6fcbfc08065f117c261e BASELINE-R17-P 11549c7596c77c21a05b25dc98d2a8f57ff1b1cb9af41d02c58e3b0a0998607b BASELINE-R19-PRODUCT-FREEZE1.txt 6f67e82c988e97bf7a731c9894822196e7797d6196c8024f44c60f4f9ac945a3 BASELINE-R20-FIX1-PRODUCT-FREEZE1.txt 63ae9355a32fc07ad77c5ff970a658c43043d4be113c9e68d8a152de9cdaf7d4 BASELINE-R20-FIX2-PRODUCT-FREEZE1.txt+9dd6f2f225a21b71cdc8cc51fe0b480b86f351dcc253939ac96b0354b7dc5208 BASELINE-R20-FIX3-PRODUCT-FREEZE1.txt bd1d41d25dc8984289f96d96aa9588208e7325784b1b7884b5064996381daff0 BASELINE-R20-PRODUCT-FREEZE1.txt ae4730b08fa12c9bad86e34888145dcbeffee41378e5a48e75425287a1232af7 BASELINE-R9-PRODUCT-FREEZE1.txt 1bb8aaa94cd1053c11503abdf05fda4474865a82dea34cd1030ef5354f9da686 BASELINE-R9-SHA256.txt@@ -25,7 +26,7 @@ ae4730b08fa12c9bad86e34888145dcbeffee41378e5a48e75425287a1232af7 BASELINE-R9-PR 788e7ccca864c51315f1ed5511d49686337a4f86659fdcbb788920d3c2a53909 Cargo.toml ff8848812031fff59be39bfe0b3d24c4cf2a2625a0f6124d41a1ec0ab5a9d812 FREEZE-1.md 89ea322a69dfd14abd051b5329120e813b02adeaa062382e328df278956b32b0 MIGRATION-PLAN.md-7c22348acf34c50006732a36c4dda4d3818aec0c2403512049222742776d5b72 README.md+eef9698df9c3619e93e7d5a3f393cf37b9f098c3834e7da851f72c08f0a1a627 README.md c2835d074ecf03fd00129a1bde2a8ab8d6d0f8663cf3536363dbc49ecaaa5a2c artifact-publication/Cargo.toml 1f32453f88d1d2ee76d8e3b0f248bfacec1c67a94cd6f875786750ae165d47fc artifact-publication/PORT-MAPPING.md e605a756e5f717a23c0a2b79de4aa2306d273e0bb60445f790c5430d1a7f51d1 artifact-publication/README.md@@ -69,6 +70,7 @@ ad5ca0ef4740b53938264e49d067f5343019befd751d900e1b5e3edf6749dbeb docs/R20-ASSEM 028c253c63968a592e42ee95060240a4ce47f0f0c0fdea91c1babf4f749f53bc docs/R20-INITIAL-COMPONENT-REVISION-FIX3.md add06ac9a9b9939ef7fea0745a0f0b5f29cbe541899a329854defba460286dcc docs/R20-INSTRUMENT-ONLY-FIX1.md a49950322471cd1304488896306e1d5e5c79fc5d880022d57e8eeda0b15d83d5 docs/R20-POST-EFFECT-READ-SETTLING-FIX2.md+04a9afd3803ceb7f3584572eb87f4639c4c9115a3026f365bd90982157e58636 docs/R21-OCCURRENCE-TRANSLATION.md 9f8b7fa3b4fecbad38c41da397c5357ee3a8d03516340b9fde3f03aa0638f4af docs/R8-LIFECYCLE-CONTRACT.md 9ad620bd3d90cc01019ef9c47718307895bad9df34208f3576db389362ac01ba docs/R9-BOM-CONTRACT.md bbc1ff6fbae1524a9d790f15023bcd309748a7ed2e58936c151edcf56dfa6458 journal/Cargo.toml@@ -88,11 +90,11 @@ d4c665d47d01f810c1982e409de0bb8cbbb40e2858765af92c7f976379aaec53 mechanical/src ad431541393d199d8107ed9478dec98fa839c6f112a62368035d107dac71b909 mechanical/src/schema.rs 605310c504ea99530cc5f67f161fb2665f8106195840650d1620d63dfb5d42a9 mechanical/src/wire.rs c90013975ccee20dc087cdd5bde037b39aab31fb4f6ee22398862117bf3038f3 mechanical/tests/contracts.rs-3fe05e8f2dcac0943203f8fead842bb8ad57a76a43e6a0d3c2896347d7fd5fe9 native-addin/AdomFusionRustNative.manifest+45fd7c55bfab35f886157d3444a0ef6e113e8a2a18a37ecf1970eb0593e113dc native-addin/AdomFusionRustNative.manifest a0ebb0e5df3b01cfae1d4ffc012c8e1d97ef28adf6030a682381d7285432443a native-addin/AdomFusionRustProbe.manifest 5b92039a741ab7cab658a1b226f5f771d36228c260e6d0e710383a71613e2634 native-addin/Cargo.toml-50b899dcdb6d9f8e96d9036ca252ff786739cf20bfece30355b6b7c008cd6d17 native-addin/build.rs-9bbab3a9d50fc7af93fdda173bdfe95137889b6e222e393895fb4bc5cbfadacd native-addin/shim/assembly.inc+ed6bba3b21a655ec3361e7d79eb9063f9a5666156c68a63d1f17c007ae20cc28 native-addin/build.rs+a331ed066463e91f91956028643087414f710f78ca8cd384b012f2132e2a39fb native-addin/shim/assembly.inc fb16c2ba8198623a303ffcecb1c37729e760ad2cfd78ec0fc49e6453820656fa native-addin/shim/bom.inc dd6e16ae408c74b4bc4324117cae3cefc1d5ae75d7d750b66d7d6be0d2cccb7f native-addin/shim/dimension_creator.h 600a30c338ffcf3be1dd4f59ac2c883d46ebc009853c1364675d1d5e0e8c97ff native-addin/shim/dimensions.inc@@ -104,32 +106,36 @@ d3693d7888a487ca0206043981a753cd034c9a268f9bf6ed336d757dd7e675bd native-addin/s 5ba1a786db512480fc77e8899875ef1bae43dec2174d3a22254e0dae0f534b6b native-addin/shim/materials.inc 142c7cdea6c8d3dcc63a37e7aeac877ad6637c8450fcf6254448e468b20fa49b native-addin/shim/mechanical.inc c4002e957aff096e21f7a1ef68e00f920e57a0c062c0d980644cfcfd9837c55c native-addin/shim/physical.inc+6dc3f6f995e37c0cdd3a14876abaaef630cb22b28bbedcfccf6e2bbceafa1d9b native-addin/shim/placement.inc d51b10641539369d3ae5df9c4a50a9a158000fd6f88c02d296832503c2bb43cb native-addin/shim/purchased.inc cd35642f361b4230d8408a68d9ab47716bf63e74fd2c27a8d8679e129858db72 native-addin/shim/reference_presence.h 86186eb94fccb245e127916270e7fd677ab3931ba98ba6dab3d6570c5f395c4f native-addin/shim/relation_identity.h 94bd275a815ad37b20b969398d9b153ff7bad0d62fc4d1cd53892f94870ed1b1 native-addin/shim/relations.inc-3125fc9d024807998fdd7f674542e0412538b60c61e72ca0947842d11d27faab native-addin/shim/sdk.cpp-e57fb4b660105fc7d120aa40106645204f1c8b7e6e42c45dad92db3a767db799 native-addin/shim/sdk.h+019177b67473ba045b37e3fd13bcb321b52a3519aa3540af9297fb7a265a727e native-addin/shim/sdk.cpp+aa003d77323bea9b60f9d4046e3be283cbcb0935b185a6cde9c37f92080a7bba native-addin/shim/sdk.h 2ae9b60e40f3263ba48490d21a3848ce745c32f1731293d6d433425f8eebdbc2 native-addin/shim/sketch.inc 44f66af62e1159ba47e9365d48d9d0a2abee6c6343fb49e44df24d293fbe6225 native-addin/shim/sketch_geometry.inc 6abcfafa16671c22784aea14b2a6b65feed269c93e84f63f60d79a4d62ef6f43 native-addin/shim/tests/dimension_creator.cpp f0bfc487d731f0092fac187668bbe96a222575138da4bb4224620b3a502d6d8f native-addin/shim/tests/isolated_line_incidence.cpp 3569f96c7ac208ab15d136a82e8b1b6a3934f3beaff30ce1f0e08b893ed48d5a native-addin/shim/tests/reference_presence.cpp 7978b44f35f0cc9a45ec59bfe835846c967378e7371d360173d351cab5f84723 native-addin/shim/tests/relation_identity.cpp-033d006595501f7801182d27c1ca0b33e074aa46a40f26ba4c1109ec2b744238 native-addin/src/assembly/arguments.rs-4c39f02f73bfc214e54885047cb7112f09c5a54bcaffe59b7cf3a78d53aa0f63 native-addin/src/assembly/mod.rs+3913f45060c1f67c36dfebcc1e9ab18af0b344ceb9887ef792b37350079e4ad6 native-addin/src/assembly/arguments.rs+580f683490c12c578cb963d332ce5c4e298a5e7fcc6c85d6b7ac15133049b7b6 native-addin/src/assembly/mod.rs+f36d72f73adb94201d1dc13853e3ba49ef66d8b5dc2c31ecd287852631379d16 native-addin/src/assembly/placement.rs+76ee8c3764c3560f8846e18a051052706341e30543f90e74ba62b226e88f9104 native-addin/src/assembly/placement_tests.rs 65358708f94150efb60b50324a34c313a014fb2fdcd787d502e77fff9300e827 native-addin/src/assembly/readback.rs ec38e472032bfd55bbd8073e2f17d397cd0f7f97975dc4478aac616a9f495760 native-addin/src/assembly/readback_tests.rs-ba74bf5de81cd636cd58e4b73d38b981d4581894076e401d795127411bf73d98 native-addin/src/assembly/tests.rs+2cf5fefc596862b20e1b33e29adca8f7a86dbcfd7fc85d2ed0f5608607a6e812 native-addin/src/assembly/tests.rs 5a12bcd6c6c79cb3fb6cff156c42393eac0d3f67e2f5c6e0c8567831fe82c9b6 native-addin/src/bom.rs c01c6daa39723b19de9134f87b853c072d87cf8b96568f74313eee42fb5ca01e native-addin/src/bom/tests.rs 57b3a8baf947cd6e73cbd458c087014db9728947571cd70a106156696a8a28b1 native-addin/src/bom_export.rs 3d421449de05bf060f88177e554e4e0f4c09d8395b781c0fff4cab360557991f native-addin/src/bytes.rs-ffb0ad0cb074261a1a2601012e9a05fd081f54f98ce01f952df205fac9825a36 native-addin/src/execution.rs+c828357b7218714d852c70e078fc5492e46ce99330dc94f87644c03f6ba25682 native-addin/src/execution.rs bd9a6112b9bc9da993f29e273b98cbba9cce4b146558ae223eb985c48cef2910 native-addin/src/execution_assembly_tests.rs 6471c1037767a20f777a0f54049e9b7d43e2e04d05e340124fac7a43211d8d1e native-addin/src/execution_dimensions_tests.rs-786583fdfaa50788b981418ae22a59387d800a69b09dad0a54b15a54eff881fd native-addin/src/execution_tests.rs-3ff8f5d923f63d2d3db982a3f64cefd488c4ec613763166b2cff99160eb0a129 native-addin/src/http.rs+5693e7e1594477bda345ae3dad4dc28c79a1aa154227a9d2ef4d3af380ac8625 native-addin/src/execution_placement_tests.rs+c546068f93257c88870e9039f6e3401118d6806540065d0ef019c52fc50606b3 native-addin/src/execution_tests.rs+281126dcd59c7f9b94389293960af1cf5336034c9179e28fabfbc32baeeadd58 native-addin/src/http.rs f1cd4ebb9a6a3ce4d2882c60d60c0a883d8e97898fab3a1fb0949d4822968d8a native-addin/src/identity.rs 22fdcf60ca9e9007d87744106e2c36d55d065b86a21ba38909a40416da82ab70 native-addin/src/identity/document_lifecycle.rs fa43f66c1a3bcccb9e8afb9019e9bffada500f8b22d8e59237e869d5bcc33129 native-addin/src/identity/document_lifecycle/tests.rs@@ -140,8 +146,8 @@ c72023e5b133243f57eeef357bc8e0f9fd84a826b5caa27c702313d963fb8d56 native-addin/s 0ff6a858a7f73cdd9d388dd0ac0db79d2b7759bed7a74f448d584e3b335e4f5c native-addin/src/materials/tests.rs 57d73a033a424bbe492a7eeffeb962aa383eb03876264a7b384f73ccd2671ad1 native-addin/src/mechanics.rs 0ecf824bb72f53209f40fd0b74c3cc57f0c35af52473b6736fa39d0ab6d0b679 native-addin/src/mechanics/tests.rs-9c36cd44fc3d328914a01fcb41b8e04bacc5e29110c05cfbabd4d6bcd57f0aa1 native-addin/src/native.rs-eab151c295d1ad91b2253b5412627a6dd1c5bdc7df4fac3670e05c99daf140cb native-addin/src/native/assembly_adapter.rs+40009bd8d895af749e4abc38ec2f6a475a0cab3ab6ee69ce88771efb93333e19 native-addin/src/native.rs+ab357214b9999e345566aadc1dc3f42a761a6a793aa98e5a2dc84a4e78b434d5 native-addin/src/native/assembly_adapter.rs a12dfbec596982bd0c8b63bbf613f88e700cadab50063ef3a3068ff8bc141163 native-addin/src/native/bom_adapter.rs c53748268eacb5491db95f58e5fa74c765bd592f77fb7e0e6c2d46eb43407ae9 native-addin/src/native/material_adapter.rs 59ac3ba583f5603ff058e654989612aa26a53bcc305025db22ccbf8004ccbaa1 native-addin/src/native/physical_adapter.rs@@ -156,17 +162,17 @@ ad466294ae06992eedbcb072ea61518aa7f45af4df8e578ea5a75dd0d90b917c native-addin/s 10033ff4504497e5fa43b82aeda383aa50b40147a5fd53c3501fcc901e57130d native-addin/src/physical/tests.rs eaf8687f29cc875bd325472ba53248f1051ccc652464f8b27102130c08abbdd8 native-addin/src/purchased.rs affcf86e95eefdc2e542b9472c659b0adc9dc1dd384389c3d2d6e07b94969b72 native-addin/src/purchased/tests.rs-d131718590950fefbce202286c364d54dd7ab9d33bd228f3bc3a8b1cb6501a02 native-addin/src/service.rs-d7dbd4fc7429a22aae40689652e233ec0f93268959069e4d030972f76eaa8047 native-addin/src/service_assembly_tests.rs+86ea36b9cd94783051e8f7a7c1e50907e42f774f38c0dc5a5814fff4b523f34e native-addin/src/service.rs+47b8af095ecb864ff6efae90dd6ca008afd3b74695730a4ffa381e01d4657f53 native-addin/src/service_assembly_tests.rs fff7e54efa9107fd9205d3e0ea1b68118710540b77f038a4e5641ecbdfb92a27 native-addin/src/service_dimensions_tests.rs 4cb6cafa7900ec5983f95767ad76e2d7597f459212f8a7620d455c92931e864a native-addin/src/service_line_state_tests.rs 09c82d0dbdddb9c1b5f0e33435ae1b800b3fbfc9fdb612fc30643619bc5665e4 native-addin/src/service_physical_tests.rs 78f102d927389b36701ac841cd1bb4340c00d388c2452287dcc332ea0fb748c0 native-addin/src/service_relations_tests.rs ac7250ec9afbc587ab6a96c8f86891784e93dd8df4dacf93f6cd8d04cade3228 native-addin/src/sketches.rs 2ecd6d699d643e452b0da0d9b1dfe34b9a5ec0167e43bdf418ca329b09bb12db native-addin/src/sketches/dimensions.rs-78803762d523e41ac7f5f829269eee76f14c186f2509ebfa8d701c1ce2bfae09 native-addin/src/sketches/dimensions/tests.rs+151d0c5045062cd78c25500bafe6f7860088a847e998cbd21e0d569544d52bfc native-addin/src/sketches/dimensions/tests.rs 79f1ed6b76a70c42f4a6453ce269db4b7fcc05152a38479dd418a621665e0cf9 native-addin/src/sketches/entities.rs-89dd6f4b55b916e4df139f2e1b50b42422e3d198ac84e0cd32c9c36f3df3fe74 native-addin/src/sketches/entities/tests.rs+82bac23b021db69d419225bad2929df6e8623a2779ecb37db130de8288ae860e native-addin/src/sketches/entities/tests.rs 4bef39635aa3d637200a9a18193c5c91c1d4c33092da49064f257f853a053bd5 native-addin/src/sketches/extrusion.rs 0f7d81df08e416304e1af2bc8ab9f02e5755925cc82ee81e4efcdc8a7a25ec5b native-addin/src/sketches/extrusion/tests.rs e0ac32e6eb7ff272eb8c1ab9fb4578026869f7acb25d12f9e197e4cf6acf0279 native-addin/src/sketches/geometry.rs@@ -177,6 +183,7 @@ b8a5dea25d00cf24310d8ef51ad14e274fce73ffc92dd5933ab792c47cc850b0 native-addin/s b8a538bc79cd368e70a847279b4ff9f80c93a7cfe1c040b1bcac28122f7b7034 native-addin/src/sketches/relations/tests.rs 32e8d691669c5214cfd96138017a3c4d49a047f7e85bc5647ad77f5a51d54485 native-addin/src/sketches/tests.rs 0bd347b09b2ad337ae49db79cabde9a49b32524065b398430bfe341af0481d82 native-addin/src/wake_tests.rs+3dabe6e9edeecd73a779b4b6491a4f6d1e6115ce50b9e1eac8c540f7c9fb91c9 review/R21-AUTHOR-SELF-REVIEW.md c2a08e5f51717a710be15ca40b1d0e0b8e79344d89eaecb75ac6438cc2d400f8 sketch-plan-core/Cargo.toml d03d751118ccb0698b6d924467f09e619b930d6e1cbc4ec90f515e104495b85a sketch-plan-core/PORT-MAPPING.md cf664371de11f85630623156a3c74cd5b0098697e69d6dba9d991efb0618c403 sketch-plan-core/README.md
native-rust/R21-VALIDATION.jsonadded+36@@ -0,0 +1,36 @@+{+ "at": "2026-10-16T19:09:04.992Z",+ "product": {+ "sourceManifest": "c2b42e34335a2cc49a1762b3bd140dffe542d544aa7e81721d87449082cbe197",+ "linuxTests": 508,+ "windowsTests": 512,+ "actualFusion": "NOT_RUN"+ },+ "placementVerifier": {+ "sourceManifest": "74ef74635037acc2670116c6c67fa00b4b33099cda8b741dcdbafd6fd0497c77",+ "linuxTests": 28,+ "windowsTests": 28+ },+ "placementObserver": {+ "sourceManifest": "e488d07c2b7c1a714f03bda9b54693ad496b4351c64d2eec4f7da8ab3438345b",+ "linuxTests": 20,+ "windowsTests": 20,+ "sdkLink": "PASS",+ "actualFusion": "NOT_RUN"+ },+ "contractAuthoring": {+ "source": "rust-contract-authoring-r1",+ "sourceManifest": "7e9afe38589eecedf425a39c27a9dfd8e229556332f1cde362f43af5f88d1d2e",+ "sourceFiles": 21,+ "linuxTests": 21,+ "windowsTests": 21,+ "status": "Historical reproduction and explicit refreeze implemented and independently reviewed; actual Windows CLI tests passed",+ "historicalContractBytes": 665236,+ "historicalBytesEqual": true,+ "releaseCiIntegrated": false,+ "macosExclusivePublication": false,+ "runtimePort": false+ },+ "sourceReviews": "CLEAR",+ "release": false+}
native-rust/README.md+18−31@@ -1,35 +1,22 @@-# Rust native Fusion checkpoint R20-fix3+# Rust native Fusion checkpoint R21 -This isolated candidate adds exact retained empty root component creation,-shared identity-placed root occurrences, staged owned metadata and read-only-assembly projection. Rust owns policy, reference publication, scoped revisions,-readback, result accounting and journal coordination. C++ performs bounded typed-Autodesk calls and retains the exact returned native objects.+R21 adds bounded absolute translation of an exact owned flat root occurrence,+followed by one explicitly guarded captured position. Rust controls admission,+units, stale guards, readback, result stages and the durable journal. C++ contains+only typed Autodesk ABI calls and retained SDK object holders. -The explicit `native-root-assembly-v1` contract preserves all earlier finite-operation-specific headers and behavior. See [the contract](docs/R20-ASSEMBLY-CONTRACT.md)-and [the implementation scope](docs/R20-ASSEMBLY-PLAN.md). Native PN/description-writes require a separate complete online preflight. Local names/attributes and-shared-instance creation do not fetch those fields. No placement setter,-snapshot capture, arbitrary adoption, child-solid authoring, rollback or full-legacy assembly parity is claimed.+The new occurrence_update operation requires+`native-root-occurrence-translation-v1`; prior operations and the primary+`native-root-assembly-v1` contract remain supported. Rotation, grounding edits,+unrelated pending positions, arbitrary object adoption, rollback and automatic+retry remain unsupported. See [the finite contract](docs/R21-OCCURRENCE-TRANSLATION.md). -Baseline is exact R20-fix2 product freeze1, 184 source files, manifest-`63ae9355a32fc07ad77c5ff970a658c43043d4be113c9e68d8a152de9cdaf7d4`.-All exact baseline bytes are archived under `evidence/baseline-source`.-Prior source directories, journals and live receipts remain untouched.-R19-fix1's observed exact native Sketch creator correction remains unchanged;-see [its retained note](docs/R19-LIVE-CREATOR-FIX.md).+The exact R20-fix3 186-file baseline is archived under evidence/baseline-source+and recorded by BASELINE-R20-FIX3-PRODUCT-FREEZE1.txt. All earlier frozen source+and live evidence remain unchanged. Prior unknown operations remain unknown. -Source tests, GNU bindings and installed SDK syntax do not qualify Fusion's-actual occurrence/timeline/grounding/metadata behavior. Root independent review,-Windows build, bounded protocol campaign and separate public-SDK observation-are required before any qualification or release claim. This candidate has not-been loaded, installed or published by its author. No Python, screenshots or-host actions were used.--This correction permits initial component revision witnesses to settle only-alongside a demonstrated first root-revision drift, followed by two complete-strict equal projections. The independent comparison against pre-effect state-still rejects unrelated component revision changes. It preserves mutation-once,-journal and read/preflight rules. See the [fix3 policy](docs/R20-INITIAL-COMPONENT-REVISION-FIX3.md).+This candidate is source-tested only. Root independent review, actual Windows+SDK build, protocol execution and independent SDK observation remain separate+gates. No host actions, Python, installation or publication were performed by+this author. Root-owned verification/native-placements is not part of the+product freeze and is not qualified by product unit tests.
native-rust/docs/R21-OCCURRENCE-TRANSLATION.mdadded+98@@ -0,0 +1,98 @@+# R21 finite occurrence placement++This source-only checkpoint adds `occurrence_update` under the operation-specific+`X-Adom-Mechanical-Contract: native-root-occurrence-translation-v1` header.+The advertised primary contract and runtime mechanicalContract remain+`native-root-assembly-v1`; all earlier finite operation headers remain valid.+`assemblyTransformsSupported:false` still describes general create/insert transforms.+`occurrenceTranslationSupported:true` describes this narrower operation.++A request contains current sessionId, a new operationId, the exact published+assembly target, and an exact occurrence ref:++```json+{"op":"occurrence_update","sessionId":"<epoch>","operationId":"move-1","target":{"documentId":"<exact-document>","revision":"<root-assembly-projection-v1 digest>"},"occurrence":{"documentId":"<same-document>","revision":"<same-digest>","objectType":"Occurrence","occurrenceId":"<published-exact-occurrence>"},"transform":{"position":[25,-10,5]}}+```++Position is absolute root-assembly millimetres, finite and bounded to ±1,000,000+on each axis. Native `Matrix3D::getCell(row,col)` data are row-major, with cm+translations at indexes 3/7/11; array flattening assumptions are not used.+Orientation must remain identity. The comparison tolerance is 1e-8 cm for pose+readback/no-op detection, and the existing projection validates nontranslation+cells within 1e-10 of identity. Rotation/axis/angle, either grounding argument,+foreign or retired ownership, grounding already present, nonlocal/nested/+configured/suppressed occurrences, and pre-existing pending positions refuse.+Existing owned definitions remain empty leaves. This does not implement a+collision solver, exploded-view animation, general transforms or legacy parity.++Rust performs complete before/after checks. A plan contains owned data only;+SDK handles remain on the owner thread. The worker durably starts the journal+before dispatching execution. Execution repeats admission state, then invokes+one transform2 setter. An acknowledged setter must yield two identical complete+projections with exactly the intended pose change, pending=true, unchanged+snapshot membership, unchanged timeline and unchanged component revisions,+metadata and sibling occurrences. Only then can one `Snapshots::add` occur.+Two further strict complete projections must agree: pending=false, the new exact+retained Snapshot at the next fixed slot, exactly one new timeline row at the+old timeline count, previous snapshots unchanged, and all other assembly facts+unchanged. The idle-command guard is SelectCommand on the owning callback; it+is not a proof of all internal transaction contexts.++This path has **no read-settling allowance**. R20-fix3's separately qualified+post-creation read-settling policy remains unchanged for old assembly effects.+Every placement root bracket and repeated capture must be strictly equal.+Snapshot and assembly membership checks enumerate complete bounded collections.+Snapshot references use fixed capacity 64, reserved before add, with exact+returned-object retention before fallible acknowledgment/readback. The retained+Snapshot children release before occurrence/component/design parents. A failed+or uncertain release retains the existing context/module fence. Snapshot+TimelineObject health must currently be Healthy (0), unsuppressed, unrolled,+and exactly present in the same design timeline. Other health states refuse;+actual SDK snapshot health/position behavior remains a live qualification gate.+Timeline capacity (4096) and snapshot capacity (64) refuse before effects.++The result records stages `occurrenceTransform` and `positionSnapshot` separately.+Each attempt has invoked/acknowledged, component and occurrence. Transform IDs+are the exact retained slots; position capture is design-wide, so its component+and occurrence are null. `snapshotSlot` identifies the retained returned slot.+`placementEvidence` exposes requestedPositionMm, requestedMatrixCm,+observedMatrixCm, intermediateProjectionDigest, and before/intermediate/after+position states `{pending,timeline,timelinePosition,snapshots:[{slot,timelineIndex,health}]}`.+Success includes the unchanged occurrenceId and a refreshed occurrenceRef.++An ambiguous setter/capture, panic, ownership change or failed postcondition+retains the observed invocation prefix, reports unknown/reconciliationRequired,+faults this assembly book, and authorizes no replay. A proven pre-invocation+refusal reports nativeExecutionStarted=false. Terminal persistence loss uses the+existing bounded observed-result layer. No automatic retry, rollback, timeline+movement or grounding setter occurs. Bounded first-difference and root-bracket+diagnostics preserve the available read failure without extra SDK calls.++The implementation is Rust policy and existing Rust HTTP/journal coordination,+with only typed C++ ABI calls. It does not duplicate John's independent Rust+mechanical review CLI or claim that CLI is integrated.++## Evidence and limits++The exact 186-file R20-fix3 baseline manifest is+`9dd6f2f225a21b71cdc8cc51fe0b480b86f351dcc253939ac96b0354b7dc5208`.+Its bytes are archived under evidence/baseline-source. No earlier source,+receipt, unknown operation or live model was altered by this source task.+The pause receipt in evidence/working records the temporary overlap review.++Portable tests cover repeated absolute moves, shared-instance preservation,+all admission bounds, both invocation failures/acknowledgment losses, wrong+readback/identity/timeline/member state, capture/command panics, replay/conflict,+no-op durable refusal, terminal storage loss, header refusal and the maximum+bounded success envelope. Linux tests, GNU Rust binding compilation and adapted+installed-header syntax checks do not prove Autodesk runtime behavior. Native+MSVC build, root source review, C21 protocol qualification and independent SDK+observation remain required. C21 is root-owned and excluded from this product+freeze. No host execution, installation or publishing was performed here.++Official sources: installed Fusion/Fusion/{Snapshot,Snapshots,TimelineObject}.h,+Fusion/Components/Occurrence.h and Core/Geometry/Matrix3D.h. Public references:+[transform2](https://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/files/fusion_Occurrence_transform2.htm),+[TimelineObject healthState](https://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/files/fusion_TimelineObject_healthState.htm).+The latter documents health as the associated object's state; this checkpoint+makes no assumption that an unknown health state is a healthy capture.
native-rust/native-addin/AdomFusionRustNative.manifest+2−2@@ -3,9 +3,9 @@ "type": "addin", "author": "Adom Industries", "description": {- "": "Experimental Rust native Fusion service: exact owned flat root component creation, shared identity-placed occurrences and staged metadata with scoped revisions, durable replay and unknown retention. Preserves prior finite dimension, geometry, BOM, material/physical and McMaster discovery contracts. No child-solid creation, transforms, arbitrary adoption or full legacy parity."+ "": "Experimental Rust native Fusion service: exact owned flat root components, shared occurrences and staged metadata, with bounded absolute occurrence translation and separately guarded captured positions. Preserves prior finite dimension, geometry, BOM, material/physical and McMaster contracts. No rotations, grounding edits, arbitrary adoption, rollback or full legacy parity." },- "version": "0.15.0-dev",+ "version": "0.16.0-dev", "supportedOS": "windows", "runOnStartup": false }
native-rust/native-addin/build.rs+1@@ -19,6 +19,7 @@ fn main() { println!("cargo:rerun-if-changed=shim/relations.inc"); println!("cargo:rerun-if-changed=shim/dimensions.inc"); println!("cargo:rerun-if-changed=shim/assembly.inc");+ println!("cargo:rerun-if-changed=shim/placement.inc"); println!("cargo:rerun-if-changed=shim/dimension_creator.h"); println!("cargo:rerun-if-changed=shim/relation_identity.h"); println!("cargo:rerun-if-changed=shim/events.cpp");
native-rust/native-addin/shim/assembly.inc+2−1@@ -2,6 +2,7 @@ #include <Fusion/Components/Occurrences.h> #include <Fusion/Components/Components.h> #include <Fusion/Fusion/Snapshots.h>+#include <Fusion/Fusion/Snapshot.h> #include <Fusion/Components/Joints.h> #include <Fusion/Components/AsBuiltJoints.h> #include <Fusion/Components/RigidGroups.h>@@ -10,7 +11,7 @@ #include <Fusion/Components/MotionLinks.h> #include <Fusion/Components/JointOrigins.h> #include <array>-struct AfAssembly {AfContext*context;Ptr<adsk::core::Document>document;Ptr<adsk::fusion::Design>design;Ptr<adsk::fusion::Component>root;std::array<Ptr<adsk::fusion::Component>,32>components{};std::array<Ptr<adsk::fusion::Occurrence>,64>occurrences{};size_t nc=0,no=0;bool release_attempted=false;};+struct AfAssembly {AfContext*context;Ptr<adsk::core::Document>document;Ptr<adsk::fusion::Design>design;Ptr<adsk::fusion::Component>root;std::array<Ptr<adsk::fusion::Component>,32>components{};std::array<Ptr<adsk::fusion::Occurrence>,64>occurrences{};std::array<Ptr<adsk::fusion::Snapshot>,64>snapshots{};size_t nc=0,no=0,ns=0;bool release_attempted=false,positions_opened=false;}; static_assert(sizeof(AfAssemblyRoot)==128&&sizeof(AfAssemblyComponent)==80&&sizeof(AfAssemblyOccurrence)==176,"assembly ABI"); static_assert(offsetof(AfAssemblyRoot,flags)==104&&offsetof(AfAssemblyOccurrence,matrix)==16&&offsetof(AfAssemblyOccurrence,flags)==144,"assembly ABI offsets"); static int assembly_check(AfContext*c,AfDocumentRef*d,AfAssembly*v,AfExtrudeDiagnostic*diag){
native-rust/native-addin/shim/placement.incadded+45@@ -0,0 +1,45 @@+// Typed absolute pose and captured-position calls; all policy is in Rust.+#include <cmath>+static_assert(sizeof(AfAssemblyPositions)==800 && offsetof(AfAssemblyPositions,indexes)==32 && offsetof(AfAssemblyPositions,health)==544,"placement ABI");+static int placement_members(AfContext*c,AfAssembly*v,AfExtrudeDiagnostic*d){+ auto snapshots=v->design->snapshots();if(!ex_ok(c,d,850)||!snapshots)return 7;+ auto count=snapshots->count();if(!ex_ok(c,d,851)||count>64)return 5;+ if(!v->positions_opened){v->positions_opened=true;v->ns=count;for(size_t i=0;i<count;++i){v->snapshots[i]=snapshots->item(i);if(!ex_ok(c,d,852)||!v->snapshots[i])return 7;}}+ if(count!=v->ns)return 6;+ std::array<bool,64>seen{};+ for(size_t i=0;i<count;++i){auto item=snapshots->item(i);if(!ex_ok(c,d,853)||!item)return 7;size_t slot=64;for(size_t j=0;j<v->ns;++j)if(v->snapshots[j]==item){if(slot!=64)return 6;slot=j;}if(slot==64||seen[slot])return 6;seen[slot]=true;bool valid=item->isValid();if(!ex_ok(c,d,854)||!valid)return 3;}+ return 0;+}+extern "C" int af_assembly_positions(AfContext*c,AfDocumentRef*doc,AfAssembly*v,AfAssemblyPositions*out,AfExtrudeDiagnostic*d)noexcept{+ if(!out||!d)return 1;*out={};try{+ int r=assembly_check(c,doc,v,d);if(r)return r;r=placement_members(c,v,d);if(r)return r;+ auto timeline=v->design->timeline();if(!ex_ok(c,d,855)||!timeline)return 7;+ out->timeline=timeline->count();if(!ex_ok(c,d,856))return 7;out->timeline_position=timeline->markerPosition();if(!ex_ok(c,d,857))return 7;+ auto snapshots=v->design->snapshots();if(!ex_ok(c,d,858)||!snapshots)return 7;+ out->pending=snapshots->hasPendingSnapshot();if(!ex_ok(c,d,859))return 7;out->count=v->ns;+ for(size_t i=0;i<v->ns;++i){auto t=v->snapshots[i]->timelineObject();if(!ex_ok(c,d,860)||!t)return 7;auto parent=t->parentTimeline();if(!ex_ok(c,d,861)||parent!=timeline)return 6;int index=t->index();if(!ex_ok(c,d,862)||index<0||static_cast<uint64_t>(index)>=out->timeline)return 6;auto at=timeline->item(index);if(!ex_ok(c,d,863)||at!=t)return 6;bool suppressed=t->isSuppressed();if(!ex_ok(c,d,864)||suppressed)return 6;bool rolled=t->isRolledBack();if(!ex_ok(c,d,865)||rolled)return 6;out->indexes[i]=index;out->health[i]=static_cast<uint32_t>(t->healthState());if(!ex_ok(c,d,866))return 7;}+ r=assembly_check(c,doc,v,d);return r?r:placement_members(c,v,d);+ }catch(...){return 4;}+}+extern "C" int af_assembly_translate(AfContext*c,AfDocumentRef*doc,AfAssembly*v,uint64_t oi,const double*m,uint32_t*invoked,uint64_t*component,AfExtrudeDiagnostic*d)noexcept{+ if(!m||!invoked||!component||!d)return 1;*invoked=0;*component=UINT64_MAX;try{+ int r=assembly_check(c,doc,v,d);if(r)return r;r=placement_members(c,v,d);if(r)return r;if(oi>=v->no)return 1;+ auto active=c->app->activeDocument();if(!ex_ok(c,d,867)||active!=v->document)return 6;+ auto snapshots=v->design->snapshots();if(!ex_ok(c,d,868)||!snapshots)return 7;bool pending=snapshots->hasPendingSnapshot();if(!ex_ok(c,d,869)||pending)return 6;+ auto occurrence=v->occurrences[oi];bool valid=occurrence->isValid();if(!ex_ok(c,d,870)||!valid)return 3;bool grounded=occurrence->isGrounded();if(!ex_ok(c,d,871)||grounded)return 6;bool parent=occurrence->isGroundToParent();if(!ex_ok(c,d,872)||parent)return 6;+ auto comp=occurrence->component();if(!ex_ok(c,d,881)||!comp)return 7;size_t ci=0;for(;ci<v->nc;++ci)if(v->components[ci]==comp)break;if(ci==v->nc)return 6;*component=ci;+ auto matrix=adsk::core::Matrix3D::create();if(!ex_ok(c,d,873)||!matrix)return 7;+ for(int row=0;row<4;++row)for(int col=0;col<4;++col){const int i=row*4+col;bool translation=col==3&&row<3;double expected=row==col?1.:0.;if(!std::isfinite(m[i])||(translation?std::abs(m[i])>100000.:m[i]!=expected))return 5;bool set=matrix->setCell(row,col,m[i]);if(!ex_ok(c,d,874)||!set)return 7;double actual=matrix->getCell(row,col);if(!ex_ok(c,d,875)||actual!=m[i])return 6;}+ *invoked=1;bool accepted=occurrence->transform2(matrix);return ex_ok(c,d,876)&&accepted?0:7;+ }catch(...){return 4;}+}+extern "C" int af_assembly_capture_position(AfContext*c,AfDocumentRef*doc,AfAssembly*v,uint32_t*invoked,uint64_t*slot,AfExtrudeDiagnostic*d)noexcept{+ if(!invoked||!slot||!d)return 1;*invoked=0;*slot=UINT64_MAX;try{+ int r=assembly_check(c,doc,v,d);if(r)return r;r=placement_members(c,v,d);if(r)return r;if(v->ns>=64)return 5;+ auto active=c->app->activeDocument();if(!ex_ok(c,d,877)||active!=v->document)return 6;+ auto snapshots=v->design->snapshots();if(!ex_ok(c,d,878)||!snapshots)return 7;bool pending=snapshots->hasPendingSnapshot();if(!ex_ok(c,d,879)||!pending)return 6;+ size_t i=v->ns++;*invoked=1;v->snapshots[i]=snapshots->add();+ if(!ex_ok(c,d,880)||!v->snapshots[i])return 7;*slot=i;+ return placement_members(c,v,d);+ }catch(...){return 4;}+}
native-rust/native-addin/shim/sdk.cpp+1@@ -156,3 +156,4 @@ extern "C" int af_document_ref_read(AfContext* context, AfDocumentRef* document, #include "dimensions.inc" #include "assembly.inc"+#include "placement.inc"
native-rust/native-addin/shim/sdk.h+4@@ -142,7 +142,11 @@ struct AfAssembly; struct AfAssemblyRoot {uint64_t counts[13];uint32_t flags[6];}; struct AfAssemblyComponent {uint64_t counts[10];}; struct AfAssemblyOccurrence {uint64_t component,children;double matrix[16];uint32_t flags[7];};+struct AfAssemblyPositions {uint64_t count,timeline,timeline_position;uint32_t pending,reserved;int64_t indexes[64];uint32_t health[64];}; extern "C" {+int af_assembly_positions(AfContext*,AfDocumentRef*,AfAssembly*,AfAssemblyPositions*,AfExtrudeDiagnostic*) noexcept;+int af_assembly_translate(AfContext*,AfDocumentRef*,AfAssembly*,uint64_t,const double*,uint32_t*,uint64_t*,AfExtrudeDiagnostic*) noexcept;+int af_assembly_capture_position(AfContext*,AfDocumentRef*,AfAssembly*,uint32_t*,uint64_t*,AfExtrudeDiagnostic*) noexcept; int af_assembly_open(AfContext*,AfDocumentRef*,AfAssembly**,AfExtrudeDiagnostic*) noexcept; int af_assembly_close(AfContext*,AfAssembly*) noexcept; int af_assembly_root(AfContext*,AfDocumentRef*,AfAssembly*,AfAssemblyRoot*,AfBytes,void*,AfExtrudeDiagnostic*) noexcept;
native-rust/native-addin/src/assembly/arguments.rs+47−1@@ -18,6 +18,10 @@ pub enum Action { component_id: String, changes: Vec<Change>, },+ Translate {+ occurrence_id: String,+ position_mm: [f64; 3],+ }, } impl Action { pub fn cloud(&self) -> bool {@@ -38,7 +42,7 @@ impl Action { pub fn is_write(op: &str) -> bool { matches!( op,- "component_create" | "occurrence_insert" | "component_metadata"+ "component_create" | "occurrence_insert" | "component_metadata" | "occurrence_update" ) } fn name(value: &Value) -> std::result::Result<String, &'static str> {@@ -201,6 +205,48 @@ pub(super) fn parse(r: &PreparedRequest) -> std::result::Result<Action, &'static let rev = a["target"]["revision"] .as_str() .ok_or("native_assembly_revision_required")?;+ if r.operation() == "occurrence_update" {+ if a.get("grounded").is_some() || a.get("groundedToParent").is_some() {+ return Err("native_placement_grounding_changes_unsupported");+ }+ let reference = a["occurrence"]+ .as_object()+ .ok_or("native_placement_exact_occurrence_required")?;+ if reference.len() != 4+ || reference.get("documentId").and_then(Value::as_str) != Some(doc)+ || reference.get("revision").and_then(Value::as_str) != Some(rev)+ || reference.get("objectType").and_then(Value::as_str) != Some("Occurrence")+ {+ return Err("native_placement_exact_occurrence_required");+ }+ let id = reference+ .get("occurrenceId")+ .and_then(Value::as_str)+ .filter(|s| !s.is_empty())+ .ok_or("native_placement_exact_occurrence_required")?;+ let transform = a["transform"]+ .as_object()+ .ok_or("native_placement_position_only")?;+ if transform.len() != 1 {+ return Err("native_placement_position_only");+ }+ let p = transform+ .get("position")+ .and_then(Value::as_array)+ .filter(|p| p.len() == 3)+ .ok_or("native_placement_position_only")?;+ let mut position_mm = [0.; 3];+ for (i, v) in p.iter().enumerate() {+ position_mm[i] = v+ .as_f64()+ .filter(|v| v.is_finite() && v.abs() <= placement::MAX_MM)+ .ok_or("native_placement_position_bound")?;+ }+ return Ok(Action::Translate {+ occurrence_id: id.into(),+ position_mm,+ });+ } if a.get("parent").is_some() { return Err("native_assembly_implicit_root_parent_only"); }
native-rust/native-addin/src/assembly/mod.rs+58−3@@ -11,15 +11,18 @@ use std::{ thread::{self, ThreadId}, }; mod arguments;+pub mod placement; mod readback; pub use arguments::{is_write, supported_arguments, Action, Change}; pub use readback::Capture; #[cfg(test)]+pub(crate) mod placement_tests;+#[cfg(test)] mod readback_tests; #[cfg(test)] pub(crate) mod tests; pub const CONTRACT: &str = "native-root-assembly-v1";-pub const SCOPE:&str="root-assembly-projection-v1: current-session exact native flat root components/occurrences, revisions, names, AdomMechanical metadata, identity placements, bounded resource/timeline state; no child-solid authoring, arbitrary adoption, rollback or full legacy parity";+pub const SCOPE:&str="root-assembly-projection-v1: current-session exact native flat root components/occurrences, revisions, names, AdomMechanical metadata, identity-orientation placements including bounded captured translations, bounded resource/timeline state; no child-solid authoring, arbitrary adoption, rollback or full legacy parity"; pub const PREFIX: &str = "root-assembly-projection-v1:"; pub const MAX_DOCUMENTS: usize = 16; pub const MAX_COMPONENTS: usize = 32;@@ -146,6 +149,21 @@ pub trait Backend { } fn add(&self, handle: &Self::Handle, component: Option<usize>) -> Attempt; fn change(&self, handle: &Self::Handle, component: usize, change: &Change) -> Attempt;+ fn positions(&self, _handle: &Self::Handle) -> Result<placement::PositionState> {+ Err("native_placement_backend_unavailable".into())+ }+ fn translate(+ &self,+ _handle: &Self::Handle,+ _occurrence: usize,+ _matrix: &[f64; 16],+ ) -> Attempt {+ Attempt::default()+ }+ fn capture_position(&self, _handle: &Self::Handle) -> placement::SnapshotAttempt {+ placement::SnapshotAttempt::default()+ }+ fn record_observation_diagnostic(&self, _value: Value) {} fn diagnostic(&self) -> Value { Value::Null }@@ -157,6 +175,7 @@ pub struct Plan { revision: String, before: Projection, action: Action,+ placement_before: Option<placement::PositionState>, } impl Plan { pub fn document_id(&self) -> &str {@@ -217,12 +236,15 @@ fn text(s: &str) -> bool { s.len() <= 4096 && !s.contains('\0') } fn validate(p: &Projection) -> Result<()> {+ validate_projection(p, false)+}+fn validate_projection(p: &Projection, allow_pending: bool) -> Result<()> { let r = &p.root; if !r.active || !r.parametric || !r.hybrid || r.configured- || r.pending_snapshot+ || (r.pending_snapshot && !allow_pending) || r.mesh_bodies != 0 || r.joints != 0 || r.as_built_joints != 0@@ -295,9 +317,15 @@ fn validate(p: &Projection) -> Result<()> { return Err("native_assembly_occurrence_scope_unsupported".into()); } for i in 0..16 {+ if [3, 7, 11].contains(&i) {+ if !o.matrix[i].is_finite() || o.matrix[i].abs() > placement::MAX_MM / 10. {+ return Err("native_placement_position_bound".into());+ }+ continue;+ } let expected = if i % 5 == 0 { 1. } else { 0. }; if !o.matrix[i].is_finite() || (o.matrix[i] - expected).abs() > 1e-10 {- return Err("native_assembly_identity_placement_required".into());+ return Err("native_assembly_identity_orientation_required".into()); } } }@@ -455,6 +483,7 @@ impl<H> Book<H> { return Err("native_assembly_idle_command_required".into()); } let p = snapshot(b, self.entries[i].handle.as_ref().unwrap(), action.cloud())?;+ let mut placement_before = None; let rev = revision(&p)?; if r.arguments()["target"]["revision"].as_str() != Some(&rev) { return Err("target_revision_mismatch".into());@@ -476,6 +505,23 @@ impl<H> Book<H> { } => { resolve_component(doc, id, &p)?; }+ Action::Translate {+ occurrence_id,+ position_mm,+ } => {+ placement::admit(doc, occurrence_id, position_mm, &p)?;+ let (guarded, positions) =+ placement::observe(b, self.entries[i].handle.as_ref().unwrap(), false)?;+ if guarded != p {+ return Err("target_revision_mismatch".into());+ }+ if positions.snapshots.len() >= placement::MAX_SNAPSHOTS+ || positions.timeline >= 4096+ {+ return Err("native_placement_snapshot_capacity".into());+ }+ placement_before = Some(positions);+ } } Ok(Plan { authority: self.authority,@@ -483,9 +529,13 @@ impl<H> Book<H> { revision: rev, before: p, action,+ placement_before, }) } pub fn execute<B: Backend<Handle = H>>(&mut self, b: &B, plan: Plan) -> Value {+ if matches!(plan.action, Action::Translate { .. }) {+ return self.execute_translation(b, plan);+ } if let Err(e) = self.ready() { return error(&e); }@@ -559,6 +609,9 @@ impl<H> Book<H> { } => { target = Some(resolve_component(&plan.document_id, id, &plan.before)?); }+ Action::Translate { .. } => {+ return Err("native_placement_dispatch_mismatch".into())+ } } let ci = target.unwrap(); for change in plan.action.changes() {@@ -765,6 +818,8 @@ pub fn known_refusal(code: &str) -> bool { | "native_assembly_owned_empty_leaf_required" | "native_assembly_unowned_membership" | "native_assembly_identity_placement_required"+ | "native_assembly_identity_orientation_required"+ | "native_placement_position_bound" | "native_assembly_occurrence_scope_unsupported" ) }
native-rust/native-addin/src/assembly/placement.rsadded+318@@ -0,0 +1,318 @@+//! Finite absolute translation and separately acknowledged captured position.+use super::*;+pub const SCOPE:&str="Absolute numeric-mm translation of one exact owned ungrounded flat root occurrence with identity orientation. Once-only transform2 followed by one explicitly guarded design-wide captured position; all other poses/definitions unchanged. No rotation, grounding change, pending unrelated positions, rollback, automatic retry or full legacy parity.";+pub const CONTRACT: &str = "native-root-occurrence-translation-v1";+pub const MAX_MM: f64 = 1_000_000.;+pub const MAX_SNAPSHOTS: usize = 64;+pub const EPS_CM: f64 = 1e-8;+#[derive(Clone, Debug, PartialEq, Eq, Serialize)]+#[serde(rename_all = "camelCase")]+pub struct SnapshotFact {+ pub slot: usize,+ pub timeline_index: u64,+ pub health: u32,+}+#[derive(Clone, Debug, PartialEq, Eq, Serialize)]+#[serde(rename_all = "camelCase")]+pub struct PositionState {+ pub pending: bool,+ pub timeline: u64,+ pub timeline_position: u64,+ pub snapshots: Vec<SnapshotFact>,+}+#[derive(Clone, Debug, Default)]+pub struct SnapshotAttempt {+ pub attempt: Attempt,+ pub snapshot_slot: Option<usize>,+}+fn validate_positions(s: &PositionState, p: &Projection) -> Result<()> {+ if s.snapshots.len() > MAX_SNAPSHOTS+ || s.pending != p.root.pending_snapshot+ || s.timeline != p.root.timeline+ || s.timeline_position != p.root.timeline_position+ {+ return Err("native_placement_position_state_mismatch".into());+ }+ let mut indexes = std::collections::BTreeSet::new();+ for (i, f) in s.snapshots.iter().enumerate() {+ if f.slot != i+ || f.timeline_index >= s.timeline+ || f.health != 0+ || !indexes.insert(f.timeline_index)+ {+ return Err("native_placement_snapshot_scope_unsupported".into());+ }+ }+ Ok(())+}+fn capture<B: Backend>(b: &B, h: &B::Handle, pending: bool) -> Result<Projection> {+ if b.command()? != "SelectCommand" {+ return Err("native_placement_idle_command_required".into());+ }+ let a = b.capture(h, false)?;+ if a.projection.root != a.root_after {+ if let Some(d) = root_capture_diagnostic(&a.projection.root, &a.root_after) {+ b.record_observation_diagnostic(d);+ }+ return Err("native_placement_root_changed_during_capture".into());+ }+ validate_projection(&a.projection, pending)?;+ if a.projection.cloud_metadata || a.projection.root.pending_snapshot != pending {+ return Err("native_placement_pending_state_mismatch".into());+ }+ Ok(a.projection)+}+pub(super) fn observe<B: Backend>(+ b: &B,+ h: &B::Handle,+ pending: bool,+) -> Result<(Projection, PositionState)> {+ let positions = b.positions(h)?;+ let a = capture(b, h, pending)?;+ let final_positions = b.positions(h)?;+ // The final root bracket follows every position getter, so a getter-induced+ // revision change cannot escape the complete repeated-capture comparison.+ let z = capture(b, h, pending)?;+ validate_positions(&positions, &a)?;+ validate_positions(&final_positions, &z)?;+ if a != z || positions != final_positions {+ let difference = readback::projection_difference(&a, &z, "placement_strict_capture_pair");+ b.record_observation_diagnostic(json!({"kind":"native_placement_capture_change","firstProjectionDifference":difference,"positionsBefore":positions,"positionsAfter":final_positions,"additionalSdkReads":0,"retryAttempted":false}));+ return Err("native_placement_projection_changed".into());+ }+ Ok((z, final_positions))+}+pub fn matrix(position: &[f64; 3]) -> [f64; 16] {+ [+ 1.,+ 0.,+ 0.,+ position[0] / 10.,+ 0.,+ 1.,+ 0.,+ position[1] / 10.,+ 0.,+ 0.,+ 1.,+ position[2] / 10.,+ 0.,+ 0.,+ 0.,+ 1.,+ ]+}+fn exact_occurrence(doc: &str, id: &str, p: &Projection) -> Result<usize> {+ (0..p.occurrences.len())+ .find(|&i| occurrence_id(doc, i) == id)+ .ok_or_else(|| "native_placement_occurrence_not_owned".into())+}+pub(super) fn admit(doc: &str, id: &str, position: &[f64; 3], p: &Projection) -> Result<usize> {+ if position.iter().any(|v| !v.is_finite() || v.abs() > MAX_MM) {+ return Err("native_placement_position_bound".into());+ }+ let i = exact_occurrence(doc, id, p)?;+ if p.occurrences[i].grounded || p.occurrences[i].grounded_to_parent {+ return Err("native_placement_grounded_occurrence".into());+ }+ if p.occurrences[i]+ .matrix+ .iter()+ .zip(matrix(position))+ .all(|(a, b)| (a - b).abs() <= EPS_CM)+ {+ return Err("native_placement_no_change".into());+ }+ Ok(i)+}+fn verify_pose<B: Backend>(+ b: &B,+ before: &Projection,+ after: &Projection,+ oi: usize,+ wanted: &[f64; 16],+ captured: bool,+) -> Result<()> {+ let mut expected = before.clone();+ expected.root.revision = after.root.revision.clone();+ expected.root.pending_snapshot = after.root.pending_snapshot;+ expected.occurrences[oi].matrix = *wanted;+ if captured {+ expected.root.timeline = before.root.timeline + 1;+ expected.root.timeline_position = expected.root.timeline;+ }+ if let Some(d) = readback::projection_difference(&expected, after, "placement_expected_delta") {+ b.record_observation_diagnostic(d);+ }+ if before.components != after.components || before.occurrences.len() != after.occurrences.len()+ {+ return Err("native_placement_unrelated_definition_changed".into());+ }+ let actual = &after.occurrences[oi].matrix;+ if actual+ .iter()+ .zip(wanted)+ .any(|(a, b)| !a.is_finite() || (a - b).abs() > EPS_CM)+ {+ return Err("native_placement_pose_mismatch".into());+ }+ let mut normalized = after.clone();+ normalized.root.revision = before.root.revision.clone();+ normalized.root.pending_snapshot = before.root.pending_snapshot;+ if captured {+ if after.root.timeline != before.root.timeline + 1+ || after.root.timeline_position != after.root.timeline+ {+ return Err("native_placement_timeline_delta".into());+ }+ normalized.root.timeline = before.root.timeline;+ normalized.root.timeline_position = before.root.timeline_position;+ }+ normalized.occurrences[oi].matrix = before.occurrences[oi].matrix;+ if normalized != *before {+ return Err("native_placement_unrelated_state_changed".into());+ }+ Ok(())+}+impl<H> Book<H> {+ pub(super) fn execute_translation<B: Backend<Handle = H>>(+ &mut self,+ b: &B,+ plan: Plan,+ ) -> Value {+ if let Err(e) = self.ready() {+ return error(&e);+ }+ if plan.authority != self.authority {+ return error("native_assembly_foreign_plan");+ }+ let Some(i) = self+ .entries+ .iter()+ .position(|e| e.document == plan.document_id && !e.retired && e.handle.is_some())+ else {+ return error("native_assembly_document_retired");+ };+ let Action::Translate {+ occurrence_id: id,+ position_mm,+ } = &plan.action+ else {+ return error("native_placement_dispatch_mismatch");+ };+ let Some(initial_positions) = plan.placement_before.as_ref() else {+ return error("native_placement_missing_plan");+ };+ let oi = match admit(&plan.document_id, id, position_mm, &plan.before) {+ Ok(i) => i,+ Err(e) => return error(&e),+ };+ let ci = plan.before.occurrences[oi].component;+ let h = self.entries[i].handle.as_ref().unwrap();+ let wanted = matrix(position_mm);+ let check = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| -> Result<()> {+ let (p, s) = observe(b, h, false)?;+ if p != plan.before || s != *initial_positions {+ return Err("target_revision_mismatch".into());+ }+ if s.snapshots.len() >= MAX_SNAPSHOTS || s.timeline >= 4096 {+ return Err("native_placement_snapshot_capacity".into());+ }+ Ok(())+ }));+ match check {+ Ok(Ok(())) => {}+ Ok(Err(e)) => return error(&e),+ Err(_) => return error("native_placement_pre_effect_panic"),+ };+ let mut pose_attempt = Attempt::default();+ let mut snapshot_attempt = SnapshotAttempt::default();+ let mut stage_count = 0;+ let mut intermediate: Option<(Projection, PositionState)> = None;+ let mut observed: Option<(Projection, PositionState)> = None;+ self.faulted = true;+ let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| -> Result<()> {+ pose_attempt.invoked = true;+ pose_attempt.component = Some(ci);+ pose_attempt.occurrence = Some(oi);+ stage_count = 1;+ pose_attempt = b.translate(h, oi, &wanted);+ if !pose_attempt.invoked || !pose_attempt.acknowledged {+ return Err("native_placement_transform_unconfirmed".into());+ }+ if pose_attempt.component != Some(ci) || pose_attempt.occurrence != Some(oi) {+ return Err("native_placement_effect_identity_mismatch".into());+ }+ intermediate = Some(observe(b, h, true)?);+ let (p, s) = intermediate.as_ref().unwrap();+ verify_pose(b, &plan.before, p, oi, &wanted, false)?;+ let mut normalized = s.clone();+ normalized.pending = false;+ if normalized != *initial_positions {+ return Err("native_placement_snapshot_changed_before_capture".into());+ }+ if b.command()? != "SelectCommand" {+ return Err("native_placement_command_changed_before_capture".into());+ }+ snapshot_attempt.attempt.invoked = true;+ stage_count = 2;+ snapshot_attempt = b.capture_position(h);+ if !snapshot_attempt.attempt.invoked || !snapshot_attempt.attempt.acknowledged {+ return Err("native_placement_capture_unconfirmed".into());+ }+ if snapshot_attempt.snapshot_slot != Some(initial_positions.snapshots.len()) {+ return Err("native_placement_snapshot_identity_mismatch".into());+ }+ observed = Some(observe(b, h, false)?);+ let (p, s) = observed.as_ref().unwrap();+ verify_pose(b, &plan.before, p, oi, &wanted, true)?;+ if s.snapshots.len() != initial_positions.snapshots.len() + 1+ || s.snapshots[..initial_positions.snapshots.len()]+ != initial_positions.snapshots[..]+ || s.snapshots.last().unwrap().timeline_index != initial_positions.timeline+ {+ return Err("native_placement_snapshot_membership_delta".into());+ }+ Ok(())+ }));+ let invoked = pose_attempt.invoked || snapshot_attempt.attempt.invoked;+ let format = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| -> Result<Value> {+ let stages = [+ json!({"stage":"occurrenceTransform","attempt":pose_attempt}),+ json!({"stage":"positionSnapshot","attempt":snapshot_attempt.attempt,"snapshotSlot":snapshot_attempt.snapshot_slot}),+ ];+ let evidence = json!({"coordinateSpace":"root_assembly","inputUnit":"mm","matrixTranslationUnit":"cm","requestedPositionMm":position_mm,"requestedMatrixCm":wanted,"before":initial_positions,"intermediate":intermediate.as_ref().map(|(_,s)|s),"after":observed.as_ref().map(|(_,s)|s),"intermediateProjectionDigest":intermediate.as_ref().and_then(|(p,_)|revision(p).ok()),"observedMatrixCm":observed.as_ref().map(|(p,_)|p.occurrences[oi].matrix),"stableCapturesPerStage":2,"maximumTransformInvocations":1,"maximumCaptureInvocations":1,"effectRetryAttempted":false});+ let failed = match &result {+ Ok(Ok(())) => None,+ Ok(Err(e)) => Some(e.as_str()),+ Err(_) => Some("native_placement_effect_or_readback_panic"),+ };+ if let Some(e) = failed {+ return Ok(+ json!({"success":false,"errorCode":e,"nativeExecutionStarted":invoked,"stages":&stages[..stage_count],"placementEvidence":evidence,"sdkDiagnostic":diagnostic(b),"automaticReplayAllowed":false,"rollbackAttempted":false}),+ );+ }+ let data = output(&plan.document_id, &observed.as_ref().unwrap().0)?;+ let reference = json!({"documentId":plan.document_id,"revision":data["target"]["revision"],"objectType":"Occurrence","occurrenceId":id});+ Ok(+ json!({"success":true,"data":data,"occurrenceId":id,"occurrenceRef":reference,"stages":&stages[..stage_count],"placementEvidence":evidence,"nativeExecutionStarted":true,"automaticReplayAllowed":false,"rollbackAttempted":false,"legacyParity":false}),+ )+ }));+ let mut response = match format {+ Ok(Ok(v)) => v,+ Ok(Err(e)) => {+ json!({"success":false,"errorCode":e,"nativeExecutionStarted":invoked,"poseAttempt":pose_attempt,"snapshotAttempt":snapshot_attempt.attempt})+ }+ Err(_) => {+ json!({"success":false,"errorCode":"native_placement_observation_failed","nativeExecutionStarted":invoked,"poseAttempt":pose_attempt,"snapshotAttempt":snapshot_attempt.attempt})+ }+ };+ if response["success"] == true || !invoked {+ self.faulted = false;+ } else {+ response["outcome"] = json!("unknown");+ response["reconciliationRequired"] = json!(true);+ }+ response+ }+}
native-rust/native-addin/src/assembly/placement_tests.rsadded+469@@ -0,0 +1,469 @@+use super::placement::*;+use super::*;+use std::cell::{Cell, RefCell};+pub(crate) struct PlacementFake {+ pub state: RefCell<Projection>,+ pub snapshots: RefCell<Vec<SnapshotFact>>,+ pub transforms: Cell<usize>,+ pub captures: Cell<usize>,+ pub mode: Cell<u32>,+ reads: Cell<usize>,+ position_reads: Cell<usize>,+ diagnostic: RefCell<Value>,+}+impl Default for PlacementFake {+ fn default() -> Self {+ let mut p = tests::empty();+ let mut c = tests::component();+ c.part_number = None;+ c.description = None;+ p.components = vec![c.clone(), c];+ p.occurrences = vec![+ tests::occurrence(0),+ tests::occurrence(1),+ tests::occurrence(0),+ ];+ p.root.components = 3;+ p.root.occurrences = 3;+ p.root.timeline = 3;+ p.root.timeline_position = 3;+ Self {+ state: RefCell::new(p),+ snapshots: RefCell::new(vec![]),+ transforms: Cell::new(0),+ captures: Cell::new(0),+ mode: Cell::new(0),+ reads: Cell::new(0),+ position_reads: Cell::new(0),+ diagnostic: RefCell::new(Value::Null),+ }+ }+}+impl Backend for PlacementFake {+ type Handle = u64;+ fn open(&self) -> Open<u64> {+ Open {+ handle: Some(1),+ acknowledged: true,+ }+ }+ fn command(&self) -> Result<String> {+ if self.mode.get() == 13 && self.transforms.get() > 0 {+ panic!("command after transform")+ }+ Ok("SelectCommand".into())+ }+ fn snapshot(&self, _: &u64, cloud: bool) -> Result<Projection> {+ assert!(!cloud);+ self.reads.set(self.reads.get() + 1);+ if self.transforms.get() > 0 {+ if self.mode.get() == 12 {+ panic!("capture after effect")+ }+ if self.mode.get() == 14 {+ return Err("sdk_read_error".into());+ }+ }+ let mut p = self.state.borrow().clone();+ if self.mode.get() == 15 && self.transforms.get() > 0 {+ p.root.revision = format!("read{}", self.reads.get())+ }+ Ok(p)+ }+ fn capture(&self, h: &u64, cloud: bool) -> Result<Capture> {+ let projection = self.snapshot(h, cloud)?;+ let mut root_after = projection.root.clone();+ if self.mode.get() == 16 && self.transforms.get() > 0 {+ root_after.revision = "drift".into()+ }+ Ok(Capture {+ projection,+ root_after,+ })+ }+ fn add(&self, _: &u64, _: Option<usize>) -> Attempt {+ panic!("not allowed")+ }+ fn change(&self, _: &u64, _: usize, _: &Change) -> Attempt {+ panic!("not allowed")+ }+ fn positions(&self, _: &u64) -> Result<PositionState> {+ if self.transforms.get() > 0 {+ self.position_reads.set(self.position_reads.get() + 1);+ if self.mode.get() == 23 && self.position_reads.get() == 2 {+ self.state.borrow_mut().root.revision = "position-getter-drift".into();+ }+ }+ let p = self.state.borrow();+ Ok(PositionState {+ pending: p.root.pending_snapshot,+ timeline: p.root.timeline,+ timeline_position: p.root.timeline_position,+ snapshots: self.snapshots.borrow().clone(),+ })+ }+ fn translate(&self, _: &u64, oi: usize, m: &[f64; 16]) -> Attempt {+ self.transforms.set(self.transforms.get() + 1);+ let mode = self.mode.get();+ if mode == 1 {+ return Attempt::default();+ }+ if mode == 11 {+ panic!("setter panic")+ }+ let mut p = self.state.borrow_mut();+ p.occurrences[oi].matrix = *m;+ p.root.revision = format!("pose{}", self.transforms.get());+ p.root.pending_snapshot = mode != 3;+ if mode == 4 {+ p.occurrences[0].matrix[3] = 99.+ }+ if mode == 5 {+ p.components[1].revision = "foreign".into()+ }+ if mode == 6 {+ p.root.name = "foreign".into()+ }+ if mode == 17 {+ p.occurrences[oi].matrix[7] += 1.+ }+ Attempt {+ invoked: true,+ acknowledged: mode != 2,+ component: Some(if mode == 18 {+ 1+ } else {+ p.occurrences[oi].component+ }),+ occurrence: Some(oi),+ }+ }+ fn capture_position(&self, _: &u64) -> SnapshotAttempt {+ self.captures.set(self.captures.get() + 1);+ if self.mode.get() == 19 {+ panic!("snapshot panic")+ }+ let mut p = self.state.borrow_mut();+ let mut ss = self.snapshots.borrow_mut();+ let slot = ss.len();+ ss.push(SnapshotFact {+ slot,+ timeline_index: p.root.timeline,+ health: if self.mode.get() == 10 { 2 } else { 0 },+ });+ p.root.timeline += 1;+ p.root.timeline_position = p.root.timeline;+ p.root.pending_snapshot = self.mode.get() == 8;+ p.root.revision = format!("snapshot{}", self.captures.get());+ if self.mode.get() == 9 {+ ss.last_mut().unwrap().timeline_index = 0+ }+ if self.mode.get() == 20 {+ p.occurrences[1].matrix[11] = 1.+ }+ if self.mode.get() == 21 {+ p.components[0].revision = "changed-after-capture".into()+ }+ SnapshotAttempt {+ attempt: Attempt {+ invoked: true,+ acknowledged: self.mode.get() != 7,+ component: None,+ occurrence: None,+ },+ snapshot_slot: Some(if self.mode.get() == 22 {+ slot + 1+ } else {+ slot+ }),+ }+ }+ fn record_observation_diagnostic(&self, v: Value) {+ self.diagnostic.replace(v);+ }+ fn diagnostic(&self) -> Value {+ self.diagnostic.borrow().clone()+ }+}+pub(crate) fn request_for(+ book: &mut Book<u64>,+ b: &PlacementFake,+ epoch: &str,+ id: &str,+ position: [f64; 3],+) -> PreparedRequest {+ let v = book.inspect(b, tests::DOC, None, false).unwrap();+ let t = &v["data"]["target"];+ tests::prepare(+ json!({"op":"occurrence_update","sessionId":epoch,"operationId":id,"target":t,"occurrence":{"documentId":t["documentId"],"revision":t["revision"],"objectType":"Occurrence","occurrenceId":v["data"]["occurrences"][2]["occurrenceId"]},"transform":{"position":position}}),+ epoch,+ )+}+const E: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";+#[test]+fn placement_two_absolute_moves_preserve_definitions_siblings_and_publish_exact_stages() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let original = b.state.borrow().clone();+ for (n, p) in [[25., -10., 5.], [-5., 20., 10.]].into_iter().enumerate() {+ let r = request_for(&mut book, &b, E, &format!("move{n}"), p);+ let plan = book.preflight(&b, &r).unwrap();+ let v = book.execute(&b, plan);+ assert_eq!(v["success"], true, "{v}");+ assert_eq!(+ v["placementEvidence"]["after"]["snapshots"]+ .as_array()+ .unwrap()+ .len(),+ n + 1+ );+ assert_eq!(v["stages"][0]["attempt"]["component"], 0);+ assert!(v["stages"][1]["attempt"]["component"].is_null());+ assert_eq!(v["stages"][1]["snapshotSlot"], n);+ assert_eq!(v["data"]["occurrences"][2]["matrix"], json!(matrix(&p)));+ assert_eq!(v["occurrenceRef"]["occurrenceId"], v["occurrenceId"]);+ let state = b.state.borrow();+ assert_eq!(state.components, original.components);+ assert_eq!(state.occurrences[..2], original.occurrences[..2]);+ drop(state);+ assert!(book.inspect(&b, tests::DOC, None, false).is_ok());+ }+ assert_eq!(b.transforms.get(), 2);+ assert_eq!(b.captures.get(), 2);+}+#[test]+fn placement_partial_effect_failures_never_capture_or_retry() {+ for mode in [2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18] {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "fault", [25., -10., 5.]);+ let plan = book.preflight(&b, &r).unwrap();+ b.mode.set(mode);+ let v = book.execute(&b, plan);+ assert_eq!(v["outcome"], "unknown", "mode{mode}: {v}");+ assert_eq!(v["reconciliationRequired"], true);+ assert_eq!(b.transforms.get(), 1);+ assert_eq!(b.captures.get(), 0);+ assert!(book.faulted);+ assert!(book.preflight(&b, &r).is_err());+ if matches!(mode, 15 | 16) {+ assert!(v["sdkDiagnostic"].is_object(), "{v}")+ }+ }+}+#[test]+fn placement_snapshot_failures_preserve_both_attempts_and_block_reentry() {+ for mode in [7, 8, 9, 10, 19, 20, 21, 22] {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "fault", [25., -10., 5.]);+ let plan = book.preflight(&b, &r).unwrap();+ b.mode.set(mode);+ let v = book.execute(&b, plan);+ assert_eq!(v["outcome"], "unknown", "mode{mode}: {v}");+ assert_eq!(v["stages"].as_array().unwrap().len(), 2);+ assert_eq!((b.transforms.get(), b.captures.get()), (1, 1));+ assert!(book.faulted);+ }+}+#[test]+fn placement_proven_pre_invocation_refusal_does_not_poison_book() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "no-call", [25., -10., 5.]);+ let plan = book.preflight(&b, &r).unwrap();+ b.mode.set(1);+ let v = book.execute(&b, plan);+ assert_eq!(v["nativeExecutionStarted"], false);+ assert!(v.get("outcome").is_none());+ assert!(!book.faulted);+ assert_eq!(b.captures.get(), 0);+}+#[test]+fn placement_noop_grounding_stale_foreign_capacity_refuse_before_effect() {+ for mode in 0..8 {+ let b = PlacementFake::default();+ let mut book = Book::default();+ if mode == 1 {+ b.state.borrow_mut().occurrences[2].grounded = true+ }+ if mode == 2 {+ b.state.borrow_mut().occurrences[2].grounded_to_parent = true+ }+ if mode == 5 {+ let mut p = b.state.borrow_mut();+ p.root.timeline = 67;+ p.root.timeline_position = 67;+ *b.snapshots.borrow_mut() = (0..64)+ .map(|i| SnapshotFact {+ slot: i,+ timeline_index: 3 + i as u64,+ health: 0,+ })+ .collect();+ }+ if mode == 7 {+ let mut p = b.state.borrow_mut();+ p.root.timeline = 4096;+ p.root.timeline_position = 4096;+ }+ let r = request_for(+ &mut book,+ &b,+ E,+ "refuse",+ if mode == 0 { [0.; 3] } else { [25., -10., 5.] },+ );+ let mut a = r.arguments().clone();+ if mode == 3 {+ a["target"]["revision"] = json!(format!("{PREFIX}{}", "0".repeat(64)));+ a["occurrence"]["revision"] = a["target"]["revision"].clone();+ }+ if mode == 4 {+ a["occurrence"]["occurrenceId"] = json!("foreign");+ }+ if mode == 6 {+ b.state.borrow_mut().root.pending_snapshot = true;+ }+ let r = tests::prepare(a, E);+ assert!(book.preflight(&b, &r).is_err(), "mode{mode}");+ assert_eq!((b.transforms.get(), b.captures.get()), (0, 0));+ }+}+#[test]+fn placement_argument_refusals_are_static_and_do_not_discard_legacy_fields() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "args", [25., -10., 5.]);+ for (key, value, code) in [+ (+ "grounded",+ json!(false),+ "native_placement_grounding_changes_unsupported",+ ),+ (+ "groundedToParent",+ json!(true),+ "native_placement_grounding_changes_unsupported",+ ),+ (+ "transform",+ json!({"position":[1,2,3],"axis":[1,0,0]}),+ "native_placement_position_only",+ ),+ (+ "transform",+ json!({"position":[1,2,3],"angle":0}),+ "native_placement_position_only",+ ),+ (+ "transform",+ json!({"position":[1000001,0,0]}),+ "native_placement_position_bound",+ ),+ ] {+ let mut a = r.arguments().clone();+ a[key] = value;+ let r = tests::prepare(a, E);+ assert_eq!(supported_arguments(&r).unwrap_err(), code);+ }+ let mut a = r.arguments().clone();+ a["occurrence"]["documentId"] = json!("foreign");+ assert_eq!(+ supported_arguments(&tests::prepare(a, E)).unwrap_err(),+ "native_placement_exact_occurrence_required"+ );+ assert_eq!(b.transforms.get(), 0);+}+#[test]+fn placement_state_between_preflight_and_execute_refuses_without_effect() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "race", [25., -10., 5.]);+ let plan = book.preflight(&b, &r).unwrap();+ b.state.borrow_mut().occurrences[0].matrix[3] = 2.;+ let v = book.execute(&b, plan);+ assert_eq!(v["errorCode"], "target_revision_mismatch");+ assert_eq!(v["nativeExecutionStarted"], false);+ assert_eq!((b.transforms.get(), b.captures.get()), (0, 0));+}+#[test]+fn placement_maximum_snapshot_result_stays_within_reserved_result_budget() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ {+ let mut p = b.state.borrow_mut();+ p.root.timeline = 66;+ p.root.timeline_position = 66;+ *b.snapshots.borrow_mut() = (0..63)+ .map(|i| SnapshotFact {+ slot: i,+ timeline_index: 3 + i as u64,+ health: 0,+ })+ .collect();+ p.components = (0..MAX_COMPONENTS)+ .map(|_| {+ let mut c = tests::component();+ c.part_number = None;+ c.description = None;+ c+ })+ .collect();+ p.occurrences = (0..MAX_OCCURRENCES)+ .map(|i| tests::occurrence(i % MAX_COMPONENTS))+ .collect();+ p.root.components = MAX_COMPONENTS as u64 + 1;+ p.root.occurrences = MAX_OCCURRENCES as u64;+ for i in 0..120 {+ p.components[0]+ .attributes+ .insert(format!("padding{i}"), "x".repeat(1024));+ if serde_json::to_vec(&*p).unwrap().len() > MAX_BYTES {+ p.components[0].attributes.remove(&format!("padding{i}"));+ break;+ }+ }+ }+ let r = request_for(&mut book, &b, E, "max", [1000000., -1000000., 1000000.]);+ let plan = book.preflight(&b, &r).unwrap();+ let v = book.execute(&b, plan);+ assert_eq!(v["success"], true, "{v}");+ assert!(serde_json::to_vec(&v).unwrap().len() < 256 * 1024);+}++#[test]+fn placement_position_getter_revision_change_is_inside_final_root_bracket() {+ let b = PlacementFake::default();+ let mut book = Book::default();+ let r = request_for(&mut book, &b, E, "getter-drift", [25., -10., 5.]);+ let plan = book.preflight(&b, &r).unwrap();+ b.mode.set(23);+ let v = book.execute(&b, plan);+ assert_eq!(v["outcome"], "unknown", "{v}");+ assert_eq!(v["errorCode"], "native_placement_projection_changed");+ assert_eq!((b.transforms.get(), b.captures.get()), (1, 0));+ assert_eq!(+ v["sdkDiagnostic"]["firstProjectionDifference"]["path"],+ "/root/revision"+ );+}++#[test]+fn placement_unsupported_read_projection_is_known_refusal_but_sdk_failure_is_not() {+ for (cell, value, expected) in [+ (0, 0.5, "native_assembly_identity_orientation_required"),+ (3, 100001., "native_placement_position_bound"),+ ] {+ let b = PlacementFake::default();+ b.state.borrow_mut().occurrences[2].matrix[cell] = value;+ let mut book = Book::default();+ let error = book.inspect(&b, tests::DOC, None, false).unwrap_err();+ assert_eq!(error, expected);+ assert!(known_refusal(&error));+ assert_eq!((b.transforms.get(), b.captures.get()), (0, 0));+ }+ assert!(!known_refusal("native_assembly_sdk_status_7"));+ assert!(!known_refusal("native_placement_projection_changed"));+ assert!(!known_refusal("native_placement_transform_unconfirmed"));+}
native-rust/native-addin/src/assembly/tests.rs+1−1@@ -678,7 +678,7 @@ fn maximum_published_reference_overhead_fits_native_retained_record_budget() { fn assembly_capability_inventory_preserves_prior_operations_and_narrows_native_arguments() { let c = crate::execution::capabilities(); assert_eq!(c["contractVersion"], CONTRACT);- assert_eq!(c["operations"].as_array().unwrap().len(), 26);+ assert_eq!(c["operations"].as_array().unwrap().len(), 27); assert_eq!(c["rootAssemblySupport"], true); assert_eq!(c["assemblyTransformsSupported"], false); assert_eq!(c["legacyParity"], false);
native-rust/native-addin/src/execution.rs+10−1@@ -165,6 +165,8 @@ pub fn capabilities() -> Value { .remove("parent"); schema[op]["properties"]["transform"]["description"]=json!("Only absent or exactly identity transform is supported. Nonzero translation/rotation refuses before admission; no snapshot capture."); }+ schema["occurrence_update"]["description"] = json!(crate::assembly::placement::SCOPE);+ schema["occurrence_update"]["properties"] = json!({"occurrence":{"type":"object","required":["documentId","revision","objectType","occurrenceId"],"additionalProperties":false,"properties":{"documentId":{"type":"string"},"revision":{"type":"string"},"objectType":{"enum":["Occurrence"]},"occurrenceId":{"type":"string"}}},"transform":{"type":"object","required":["position"],"additionalProperties":false,"properties":{"position":{"type":"array","minItems":3,"maxItems":3,"items":{"type":"number","minimum":-1000000,"maximum":1000000}}}}}); schema["occurrence_insert"]["properties"]["independentCopy"] = json!({"enum":[false]}); for key in ["partNumber", "description"] { schema["component_create"]["properties"]["metadata"]["properties"]@@ -251,7 +253,8 @@ pub fn capabilities() -> Value { "native_assembly_inspect", "component_create", "occurrence_insert",- "component_metadata"+ "component_metadata",+ "occurrence_update" ]); result["sketchLineStateSupport"] = json!(true); result["sketchLineStateRevisionScope"] = json!(crate::sketches::line_state::SCOPE);@@ -261,6 +264,11 @@ pub fn capabilities() -> Value { result["rootAssemblyScope"] = json!(crate::assembly::SCOPE); result["assemblyNativeMetadataRequiresOnline"] = json!(true); result["assemblyTransformsSupported"] = json!(false);+ result["occurrenceTranslationSupported"] = json!(true);+ result["placementContract"] = json!(crate::assembly::placement::CONTRACT);+ result["placementRequiredHeader"] =+ json!("X-Adom-Mechanical-Contract: native-root-occurrence-translation-v1");+ result["placementScope"] = json!(crate::assembly::placement::SCOPE); result["sketchDimensionSupport"] = json!(true); result["sketchDimensionScope"] = json!(crate::sketches::dimensions::SCOPE); result["sketchRelationScope"] = json!(crate::sketches::relations::SCOPE);@@ -288,6 +296,7 @@ pub fn supported(op: &str) -> bool { | "component_create" | "component_metadata" | "occurrence_insert"+ | "occurrence_update" | "native_sketch_dimensions" | "sketch_dimension" | "native_sketch_relations"
native-rust/native-addin/src/execution_placement_tests.rsadded+176@@ -0,0 +1,176 @@+struct PlacementRig {+ common: Rig,+ backend: crate::assembly::placement_tests::PlacementFake,+ book: RefCell<crate::assembly::Book<u64>>,+}+impl PlacementRig {+ fn new() -> Self {+ Self {+ common: Rig::new(),+ backend: Default::default(),+ book: Default::default(),+ }+ }+ fn request(&self, id: &str) -> PreparedRequest {+ crate::assembly::placement_tests::request_for(+ &mut self.book.borrow_mut(),+ &self.backend,+ &self.common.queue.epoch().to_string(),+ id,+ [25., -10., 5.],+ )+ }+ fn reply(&self, t: &mut Task) -> Result<Reply, String> {+ match t {+ Task::AssemblyPreflight(r) => {+ Ok(match self.book.borrow_mut().preflight(&self.backend, r) {+ Ok(p) => Reply::AssemblyPlan(p),+ Err(e) => Reply::Value(+ json!({"success":false,"errorCode":e,"nativeExecutionStarted":false}),+ ),+ })+ }+ Task::AssemblyExecute(p) => Ok(Reply::Value(+ self.book+ .borrow_mut()+ .execute(&self.backend, p.take().unwrap()),+ )),+ _ => Err("unexpected placement task".into()),+ }+ }+ fn execute(&self, r: PreparedRequest) -> Response {+ let op = r.arguments()["operationId"].as_str().unwrap().to_owned();+ let client = self.common.spawn(r, Duration::from_secs(5));+ let end = Instant::now() + Duration::from_secs(6);+ while !client.is_finished() {+ assert!(Instant::now() < end);+ if let Some(mut c) = self+ .common+ .queue+ .take_next(self.common.queue.epoch())+ .unwrap()+ {+ if matches!(c.task(), Task::AssemblyExecute(_)) {+ assert_eq!(+ self.common+ .reader+ .journal()+ .unwrap()+ .status(&self.common.queue.epoch().to_string(), &op)+ .unwrap()+ .durable+ .unwrap()+ .record+ .unwrap()+ .phase,+ Phase::Executing+ );+ }+ let v = self.reply(c.task_mut());+ c.complete(v).unwrap();+ } else {+ thread::sleep(Duration::from_millis(1));+ }+ }+ client.join().unwrap()+ }+}+#[test]+fn placement_durable_start_two_stages_replay_conflict_and_noop() {+ let rig = PlacementRig::new();+ let r = rig.request("move");+ let (code, v) = rig.execute(r.clone());+ assert_eq!(code, 200, "{v}");+ assert_eq!(v["operationStatus"]["authority"], "durable_terminal");+ assert_eq!(v["stages"].as_array().unwrap().len(), 2);+ let (_, again) = rig.execute(r.clone());+ assert_eq!(again["replayed"], true);+ assert_eq!(again["data"], v["data"]);+ assert_eq!(+ (rig.backend.transforms.get(), rig.backend.captures.get()),+ (1, 1)+ );+ let mut conflict = r.arguments().clone();+ conflict["transform"]["position"] = json!([1, 2, 3]);+ assert_eq!(+ rig.execute(prepare_request(conflict, &rig.common.queue.epoch().to_string()).unwrap())+ .0,+ 409+ );+ let fresh = rig.request("noop");+ let (_, no) = rig.execute(fresh);+ assert_eq!(no["errorCode"], "native_placement_no_change");+ assert_eq!(no["operationStatus"]["authority"], "durable_terminal");+ assert_eq!(+ (rig.backend.transforms.get(), rig.backend.captures.get()),+ (1, 1)+ );+}+#[test]+fn placement_unknown_snapshot_ack_remains_unknown_without_any_effect_replay() {+ let rig = PlacementRig::new();+ let r = rig.request("unknown-capture");+ rig.backend.mode.set(7);+ let (code, v) = rig.execute(r.clone());+ assert_eq!(code, 503, "{v}");+ assert_eq!(v["outcome"], "unknown");+ assert_eq!(v["stages"][0]["attempt"]["acknowledged"], true);+ assert_eq!(v["stages"][1]["attempt"]["invoked"], true);+ assert_eq!(v["stages"][1]["attempt"]["acknowledged"], false);+ let (_, again) = rig.execute(r);+ assert_eq!(again["replayed"], true);+ assert_eq!(again["outcome"], "unknown");+ assert_eq!(+ (rig.backend.transforms.get(), rig.backend.captures.get()),+ (1, 1)+ );+}+#[test]+fn placement_terminal_storage_loss_retains_pose_and_snapshot_evidence() {+ let rig = PlacementRig::new();+ let r = rig.request("lost-placement");+ let client = rig.common.spawn(r.clone(), Duration::from_secs(5));+ let end = Instant::now() + Duration::from_secs(6);+ loop {+ assert!(Instant::now() < end);+ if let Some(mut c) = rig+ .common+ .queue+ .take_next(rig.common.queue.epoch())+ .unwrap()+ {+ let execute = matches!(c.task(), Task::AssemblyExecute(_));+ let v = rig.reply(c.task_mut());+ if execute {+ let path = rig+ .common+ .directory+ .join(fusion_mechanical_journal::DATABASE_NAME);+ let held = rig.common.directory.with_extension("placement-held");+ std::fs::rename(&path, &held).unwrap();+ c.complete(v).unwrap();+ let (code, v) = client.join().unwrap();+ assert_eq!(code, 503, "{v}");+ assert_ne!(v["operationStatus"]["authority"], "durable_terminal");+ assert_eq!(+ v["placementEvidence"]["after"]["snapshots"]+ .as_array()+ .unwrap()+ .len(),+ 1+ );+ std::fs::rename(held, path).unwrap();+ let (_, again) = rig.execute(r);+ assert_eq!(again["replayed"], true);+ assert_eq!(+ (rig.backend.transforms.get(), rig.backend.captures.get()),+ (1, 1)+ );+ break;+ }+ c.complete(v).unwrap();+ } else {+ thread::sleep(Duration::from_millis(1));+ }+ }+}
native-rust/native-addin/src/execution_tests.rs+2@@ -1634,3 +1634,5 @@ impl RelationRig { include!("execution_dimensions_tests.rs"); include!("execution_assembly_tests.rs");++include!("execution_placement_tests.rs");
native-rust/native-addin/src/http.rs+1@@ -121,6 +121,7 @@ pub fn parse(bytes: &[u8], host: &str, token: &str, epoch: &str) -> Result<Reque | &"native-sketch-relations-v1" | &"native-sketch-dimensions-v1" | &"native-root-assembly-v1"+ | &"native-root-occurrence-translation-v1" ) ) { return Err(error(409, "native_contract_required"));
native-rust/native-addin/src/native.rs+1−1@@ -1358,7 +1358,7 @@ fn start() -> Result<(), String> { "epoch":epoch,"eventId":event_id,"address":address.to_string(),"token":token, "implementation":"Rust with native C++ ABI adapter","mutationSupport":!cfg!(feature="native-wake-probe"), "operationStatusConfigured":true,"journalInitialization":"background",- "effectJournalConfigured":!cfg!(feature="native-wake-probe"),"effectJournalConnected":false,"connectionStateSource":"GET /v1/health","operations":if cfg!(feature="native-wake-probe") {vec!["document_snapshot","operation_status"]} else {vec!["document_snapshot","operation_status","inspect","parameter_create","parameter_set","new_design","native_scratch_discard","native_document_activate","bom","bom_export","sketch_create","native_sketch_inspect","sketch_geometry","native_sketch_profiles","feature_create","native_sketch_entities","material_list","mcmaster_discover","assembly_properties","native_sketch_line_state","native_sketch_relations","sketch_constraint","native_sketch_dimensions","sketch_dimension","native_assembly_inspect","component_create","occurrence_insert","component_metadata"]},"mechanicalContract":if cfg!(feature="native-wake-probe") {None} else {Some("native-root-assembly-v1")},"before":before,+ "effectJournalConfigured":!cfg!(feature="native-wake-probe"),"effectJournalConnected":false,"connectionStateSource":"GET /v1/health","operations":if cfg!(feature="native-wake-probe") {vec!["document_snapshot","operation_status"]} else {vec!["document_snapshot","operation_status","inspect","parameter_create","parameter_set","new_design","native_scratch_discard","native_document_activate","bom","bom_export","sketch_create","native_sketch_inspect","sketch_geometry","native_sketch_profiles","feature_create","native_sketch_entities","material_list","mcmaster_discover","assembly_properties","native_sketch_line_state","native_sketch_relations","sketch_constraint","native_sketch_dimensions","sketch_dimension","native_assembly_inspect","component_create","occurrence_insert","component_metadata","occurrence_update"]},"mechanicalContract":if cfg!(feature="native-wake-probe") {None} else {Some("native-root-assembly-v1")},"before":before, "experimentalSingleReadProbe":cfg!(feature="native-wake-probe")}), )?; STATE
native-rust/native-addin/src/native/assembly_adapter.rs+137−1@@ -23,6 +23,29 @@ struct RawOccurrence { flags: [u32; 7], } #[repr(C)]+struct RawPositions {+ count: u64,+ timeline: u64,+ timeline_position: u64,+ pending: u32,+ reserved: u32,+ indexes: [i64; 64],+ health: [u32; 64],+}+impl Default for RawPositions {+ fn default() -> Self {+ Self {+ count: 0,+ timeline: 0,+ timeline_position: 0,+ pending: 0,+ reserved: 0,+ indexes: [0; 64],+ health: [0; 64],+ }+ }+}+#[repr(C)] struct Diagnostic { sdk_error: i32, stage: u32,@@ -42,7 +65,10 @@ impl Default for Diagnostic { } } const _: () = assert!(- std::mem::size_of::<RawRoot>() == 128+ std::mem::size_of::<RawPositions>() == 800+ && std::mem::offset_of!(RawPositions, indexes) == 32+ && std::mem::offset_of!(RawPositions, health) == 544+ && std::mem::size_of::<RawRoot>() == 128 && std::mem::size_of::<RawComponent>() == 80 && std::mem::size_of::<RawOccurrence>() == 176 && std::mem::offset_of!(RawOccurrence, matrix) == 16@@ -50,6 +76,31 @@ const _: () = assert!( && std::mem::size_of::<Diagnostic>() == 4112 ); extern "C" {+ fn af_assembly_positions(+ c: *mut c_void,+ d: *mut c_void,+ v: *mut c_void,+ out: *mut RawPositions,+ diag: *mut Diagnostic,+ ) -> i32;+ fn af_assembly_translate(+ c: *mut c_void,+ d: *mut c_void,+ v: *mut c_void,+ oi: u64,+ matrix: *const f64,+ invoked: *mut u32,+ component: *mut u64,+ diag: *mut Diagnostic,+ ) -> i32;+ fn af_assembly_capture_position(+ c: *mut c_void,+ d: *mut c_void,+ v: *mut c_void,+ invoked: *mut u32,+ slot: *mut u64,+ diag: *mut Diagnostic,+ ) -> i32; fn af_assembly_open( c: *mut c_void, d: *mut c_void,@@ -408,6 +459,91 @@ impl Backend for Adapter<'_> { occurrence: None, } }+ fn positions(&self, h: &Handle) -> Result<assembly::placement::PositionState, String> {+ let mut out = RawPositions::default();+ let mut diag = Diagnostic::default();+ let status = unsafe {+ af_assembly_positions(+ self.context.ptr.as_ptr(),+ self.document.ptr.as_ptr(),+ h.0.as_ptr(),+ &mut out,+ &mut diag,+ )+ };+ self.checked(status, diag)?;+ if out.count > 64 || out.reserved != 0 {+ return Err("native_placement_position_state_bound".into());+ }+ let pending = flag(out.pending)?;+ let mut snapshots = Vec::with_capacity(out.count as usize);+ for i in 0..out.count as usize {+ snapshots.push(assembly::placement::SnapshotFact {+ slot: i,+ timeline_index: u64::try_from(out.indexes[i])+ .map_err(|_| "native_placement_snapshot_index")?,+ health: out.health[i],+ });+ }+ Ok(assembly::placement::PositionState {+ pending,+ timeline: out.timeline,+ timeline_position: out.timeline_position,+ snapshots,+ })+ }+ fn translate(&self, h: &Handle, oi: usize, matrix: &[f64; 16]) -> Attempt {+ let mut invoked = 0;+ let mut ci = u64::MAX;+ let mut diag = Diagnostic::default();+ let status = unsafe {+ af_assembly_translate(+ self.context.ptr.as_ptr(),+ self.document.ptr.as_ptr(),+ h.0.as_ptr(),+ oi as u64,+ matrix.as_ptr(),+ &mut invoked,+ &mut ci,+ &mut diag,+ )+ };+ let acknowledged = self.checked(status, diag).is_ok() && invoked == 1;+ Attempt {+ invoked: invoked != 0,+ acknowledged,+ component: (ci != u64::MAX).then_some(ci as usize),+ occurrence: Some(oi),+ }+ }+ fn capture_position(&self, h: &Handle) -> assembly::placement::SnapshotAttempt {+ let mut invoked = 0;+ let mut slot = u64::MAX;+ let mut diag = Diagnostic::default();+ let status = unsafe {+ af_assembly_capture_position(+ self.context.ptr.as_ptr(),+ self.document.ptr.as_ptr(),+ h.0.as_ptr(),+ &mut invoked,+ &mut slot,+ &mut diag,+ )+ };+ let acknowledged = self.checked(status, diag).is_ok() && invoked == 1;+ assembly::placement::SnapshotAttempt {+ attempt: Attempt {+ invoked: invoked != 0,+ acknowledged,+ component: None,+ occurrence: None,+ },+ snapshot_slot: (slot != u64::MAX).then_some(slot as usize),+ }+ }+ fn record_observation_diagnostic(&self, value: Value) {+ self.context.extrusion_diagnostic.replace(value);+ } fn diagnostic(&self) -> Value { self.context.extrusion_diagnostic.borrow().clone() }
native-rust/native-addin/src/service.rs+10−1@@ -1167,7 +1167,16 @@ fn handle( json!({"success":false,"errorCode":"native_dimensions_contract_required","nativeExecutionStarted":false}), ); }- if (crate::assembly::is_write(prepared.operation())+ if prepared.operation() == "occurrence_update"+ && request.mechanical_contract.as_deref() != Some(crate::assembly::placement::CONTRACT)+ {+ return (+ 409,+ json!({"success":false,"errorCode":"native_placement_contract_required","nativeExecutionStarted":false}),+ );+ }+ if ((crate::assembly::is_write(prepared.operation())+ && prepared.operation() != "occurrence_update") || prepared.operation() == "native_assembly_inspect") && request.mechanical_contract.as_deref() != Some(crate::assembly::CONTRACT) {
native-rust/native-addin/src/service_assembly_tests.rs+65@@ -91,3 +91,68 @@ fn assembly_headers_admission_unknown_reads_and_no_effect_journal() { drop(reader); std::fs::remove_dir_all(directory).unwrap(); }++#[test]+#[cfg(not(feature = "native-wake-probe"))]+fn placement_header_and_static_refusal_do_not_admit_or_wake() {+ let queue = Queue::new(4).unwrap();+ let epoch = queue.epoch().to_string();+ let directory =+ std::env::temp_dir().join(format!("fusion-r21-header-{}-{epoch}", std::process::id()));+ let reader = OperationStatusReader::new(directory.clone(), epoch.clone());+ let wakes = Arc::new(AtomicU64::new(0));+ let count = wakes.clone();+ let mut server = Service::start_with_operations(+ TcpListener::bind("127.0.0.1:0").unwrap(),+ queue.clone(),+ TOKEN.into(),+ Arc::new(move || {+ count.fetch_add(1, Ordering::Relaxed);+ true+ }),+ Arc::new(Stats::default()),+ reader.clone(),+ )+ .unwrap();+ let end = Instant::now() + Duration::from_secs(5);+ while reader.health()["connected"] != true {+ assert!(Instant::now() < end);+ thread::sleep(Duration::from_millis(1));+ }+ let doc = format!("d:{epoch}:0000000000000001");+ let revision = format!("{}{}", crate::assembly::PREFIX, "a".repeat(64));+ let request = json!({"op":"occurrence_update","sessionId":epoch,"operationId":"header","target":{"documentId":doc,"revision":revision},"occurrence":{"documentId":doc,"revision":revision,"objectType":"Occurrence","occurrenceId":"owned"},"transform":{"position":[25,-10,5]}});+ let denied = post_mechanical(+ server.address(),+ &epoch,+ crate::assembly::CONTRACT,+ request.clone(),+ );+ assert_eq!(denied.0, 409);+ assert_eq!(denied.1["errorCode"], "native_placement_contract_required");+ let mut bad = request;+ bad["transform"]["angle"] = json!(0);+ let denied = post_mechanical(+ server.address(),+ &epoch,+ crate::assembly::placement::CONTRACT,+ bad,+ );+ assert_eq!(denied.0, 400);+ assert_eq!(denied.1["errorCode"], "native_placement_position_only");+ assert_eq!(wakes.load(Ordering::Relaxed), 0);+ assert!(!queue.has_queued());+ assert!(reader+ .journal()+ .unwrap()+ .status(&epoch, "header")+ .unwrap()+ .durable+ .unwrap()+ .record+ .is_none());+ assert!(server.stop());+ drop(server);+ drop(reader);+ std::fs::remove_dir_all(directory).unwrap();+}
native-rust/native-addin/src/sketches/dimensions/tests.rs+1−1@@ -414,7 +414,7 @@ fn dimension_contract_is_explicit_and_preserves_prior_scopes() { cap["dimensionsCompatibilityHeader"], format!("X-Adom-Mechanical-Contract: {CONTRACT}") );- assert_eq!(cap["operations"].as_array().unwrap().len(), 26);+ assert_eq!(cap["operations"].as_array().unwrap().len(), 27); assert_eq!(cap["sketchDimensionSupport"], true); assert_eq!(cap["legacyParity"], false); assert_eq!(cap["transactional"], false);
native-rust/native-addin/src/sketches/entities/tests.rs+1−1@@ -342,7 +342,7 @@ fn capabilities_keep_all_prior_operations_and_mark_new_read_as_incomplete() { assert_eq!(cap["legacyParity"], false); assert_eq!(cap["sketchCompleteInspection"], false); let ops = cap["operations"].as_array().unwrap();- assert_eq!(ops.len(), 26);+ assert_eq!(ops.len(), 27); for name in [ "parameter_create", "new_design",
native-rust/review/R21-AUTHOR-SELF-REVIEW.mdadded+46@@ -0,0 +1,46 @@+# R21 author review — source scope only++The author reviewed the new policy, typed ABI, native adapter, route/header and+journal paths against the archived R20-fix3 baseline. This is not independent+review. Parent root remains the independent reviewer and sole host operator.++Verified fixed reference capacity and adoption before fallible snapshot work;+exact current root occurrence/component/snapshot membership; public retained+snapshot identity; no borrowed SDK handle crossing a worker; no implicit release+on ambiguity; child-before-parent release ordering; finite position/unit limits;+identity orientation; both grounding flags refused; complete before/intermediate/+after projection comparison; no mutation retry or rollback; stale revalidation+before start and before SDK execution; separate acknowledged transform/capture+stages; durable-start and retained terminal-loss behavior; old operation headers+and primary contract preserved; truthful narrow capability/schema.++One ordering gap was found and corrected before freeze: the second position+getter set originally followed the final root capture. It now lies between the+two full captures. A deterministic regression changes root revision in that+getter and confirms unknown refusal before any snapshot add. No extra SDK reads+or settling allowance were introduced. Other initial development failures+(two ABI prototype mismatches, test access spelling and two inherited operation+count expectations) remain in working logs; final gates all pass.++The maximum snapshot/result test uses 32 components, 64 occurrences, 63 prior+snapshots, near-128KiB projection metadata and a 64th new snapshot; the result+fits the reserved 256KiB observation limit. Failure tests verify exact effect+call counts and book faulting, including capture/command panics. Actual SDK+matrix/snapshot health, root/component revisions, timeline behavior and+position persistence remain unqualified by these tests. No SDK health code is+silently treated as healthy. No successful prior unknown operation is inferred.++The SDK-linked Windows build, C21 live campaign and independent public SDK+observer are not included in this source checkpoint. No root verification+source is part of the product manifest. No John review rules or UI were added.++## Freeze2 classification correction++Post-freeze author review identified that the newly named orientation refusal+and translation bound were absent from the read route's known-refusal list.+Freeze2 adds precisely those two pure projection-validation errors. A public+Book::inspect test verifies both invalid projections invoke no effects and are+classified as known refusals; SDK errors, changing observations and uncertain+setter acknowledgment remain unclassified as known refusals. Exact freeze1+bytes/manifest are archived in evidence/freeze1-source. This is a narrow error+classification correction, not new placement support or live qualification.
native-rust/tools/contract-authoring/.cargo/config.tomladded+4@@ -0,0 +1,4 @@+[source.crates-io]+replace-with = "vendored-sources"+[source.vendored-sources]+directory = "vendor"
native-rust/tools/contract-authoring/Cargo.lockadded+213@@ -0,0 +1,213 @@+# This file is automatically @generated by Cargo.+# It is not intended for manual editing.+version = 4++[[package]]+name = "block-buffer"+version = "0.10.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"+dependencies = [+ "generic-array",+]++[[package]]+name = "cfg-if"+version = "1.0.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"++[[package]]+name = "cpufeatures"+version = "0.2.17"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"+dependencies = [+ "libc",+]++[[package]]+name = "crypto-common"+version = "0.1.7"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"+dependencies = [+ "generic-array",+ "typenum",+]++[[package]]+name = "digest"+version = "0.10.7"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"+dependencies = [+ "block-buffer",+ "crypto-common",+]++[[package]]+name = "equivalent"+version = "1.0.2"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"++[[package]]+name = "fusion-contract-authoring"+version = "0.1.0"+dependencies = [+ "serde",+ "serde_json",+ "sha2",+]++[[package]]+name = "generic-array"+version = "0.14.7"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"+dependencies = [+ "typenum",+ "version_check",+]++[[package]]+name = "hashbrown"+version = "0.17.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"++[[package]]+name = "indexmap"+version = "2.14.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb"+dependencies = [+ "equivalent",+ "hashbrown",+]++[[package]]+name = "itoa"+version = "1.0.18"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"++[[package]]+name = "libc"+version = "0.2.189"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"++[[package]]+name = "memchr"+version = "2.8.3"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"++[[package]]+name = "proc-macro2"+version = "1.0.107"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"+dependencies = [+ "unicode-ident",+]++[[package]]+name = "quote"+version = "1.0.47"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"+dependencies = [+ "proc-macro2",+]++[[package]]+name = "serde"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"+dependencies = [+ "serde_core",+]++[[package]]+name = "serde_core"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"+dependencies = [+ "serde_derive",+]++[[package]]+name = "serde_derive"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"+dependencies = [+ "proc-macro2",+ "quote",+ "syn",+]++[[package]]+name = "serde_json"+version = "1.0.151"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"+dependencies = [+ "indexmap",+ "itoa",+ "memchr",+ "serde",+ "serde_core",+ "zmij",+]++[[package]]+name = "sha2"+version = "0.10.9"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"+dependencies = [+ "cfg-if",+ "cpufeatures",+ "digest",+]++[[package]]+name = "syn"+version = "3.0.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f"+dependencies = [+ "proc-macro2",+ "quote",+ "unicode-ident",+]++[[package]]+name = "typenum"+version = "1.20.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"++[[package]]+name = "unicode-ident"+version = "1.0.24"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"++[[package]]+name = "version_check"+version = "0.9.5"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"++[[package]]+name = "zmij"+version = "1.0.23"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
native-rust/tools/contract-authoring/Cargo.tomladded+10@@ -0,0 +1,10 @@+[package]+name = "fusion-contract-authoring"+version = "0.1.0"+edition = "2021"+license = "MIT"+[dependencies]+serde = "1"+serde_json = { version = "1", features = ["preserve_order", "float_roundtrip"] }+sha2 = "0.10"+[workspace]
native-rust/tools/contract-authoring/FREEZE2.mdadded+36@@ -0,0 +1,36 @@+# Contract authoring freeze 2++Freeze1 (20 exact files, manifest 9b6135f5e99cff5d217aba4eedb9b9237642139cfe664eecdc9766d252303b0c)+is preserved under evidence/freeze1-source. Root review identified that historical+reproduction alone omitted the legacy freezer's changed-catalog authoring role.++Freeze2 adds explicit refreeze: sorted expanded verbs determine whether the old+contract is kept verbatim or regenerated. Changed/absent prior contracts use the+canonical metadata and supplied Gregorian authoring date. All cases synchronize+bridge.json and emit matching catalog.json in a new atomic directory. None of the+three input files or original baseline files is replaced. A missing prior is+explicitly represented by `-`, never inferred from a failed file read.++Historical strict check/freeze and the complete baseline byte comparison remain.+Date selection is intentionally explicit rather than Python's implicit local+date.today(). Typed canonical validation, duplicate rejection, size bounds and+malformed-prior refusal intentionally reject Python's permissive coercions. An+unchanged contract retains its old metadata, even if canonical metadata changes,+matching the old freezer's verbs-only change decision. See README for scope.++Author self-review checked unchanged and changed metadata/date paths, schema and+row expansion order, first-time generation, manifest preservation, update output+self-consistency and fresh exclusive publication. No new runtime dependencies or+CAD behavior. Canonical baseline data and all six original source evidence files+are unchanged. No Python code was executed.++Validation: 18 library and 3 actual CLI-process tests PASS on Linux; GNU Windows+tests compile and formatting PASS. CLI authoring tests change a name and summary,+check the new date and sorted manifest, check the emitted catalog against the new+contract, prove idempotence despite a later supplied date, and reject invalid+dates/existing output without touching inputs. Existing malformed/duplicate/+schema mismatch/concurrent publication/partial-staging tests remain passing.++No actual Windows execution, host installation, release CI integration or bridge+runtime conversion is claimed. This replaces one authoring tool's behavior; the+full Python-to-Rust runtime migration remains separate.
native-rust/tools/contract-authoring/README.mdadded+124@@ -0,0 +1,124 @@+# Rust contract authoring conversion R1++This isolated Rust CLI replaces the checked legacy `describe.py` table expansion+and runtime response construction with canonical JSON data. It also implements+checked contract freezing and bridge manifest verb synchronization. It does not+change a CAD handler, install a bridge, remove Python from an existing package,+or establish native mechanical runtime parity.++`data/catalog.json` is the ordered canonical table. It has explicit markers for+the mechanical schema, its ordered operation enum, and the `_STATUS` alias.+`data/mechanical-schema.json` is an exact copy of the 61-operation legacy schema;+its bytes and operation order are bound in the canonical table. These historical+schemas describe the legacy surface, not the smaller native implementation.++The current generated contract matches **all 665,236 bytes** of the checked+baseline: 179 sorted entries, every field, frozen metadata, key order and number+encoding. Runtime `describe` exposes 178 entries in original table order because+it filters the `_note` entry. It duplicates bridge/verbCount/verbs at the top+level and under data. The historical freezer does not filter `_note`; that+intentional legacy difference is preserved. Explicit null status stays null,+`_STATUS` expands to fusion_get_app_state, and false remains false.++## Use++Run from this directory (Cargo dependencies are already vendored locally):++```+cargo run --offline -- check data/catalog.json data/mechanical-schema.json evidence/baseline/describe.json+cargo run --offline -- describe data/catalog.json data/mechanical-schema.json+cargo run --offline -- freeze data/catalog.json data/mechanical-schema.json evidence/baseline/describe.json evidence/baseline/bridge.json /absolute/fresh-output-directory+cargo run --offline -- refreeze data/catalog.json data/mechanical-schema.json evidence/baseline/describe.json evidence/baseline/bridge.json 2026-10-16 /absolute/fresh-authoring-directory+```++`freeze` first checks complete equality against the explicitly supplied baseline,+then prepares `describe.json` and `bridge.json` in a private sibling directory.+It publishes the whole completed directory with exclusive rename, refusing even+an existing empty destination. It never edits the baseline, installed package,+user configuration or existing output. The manifest's other fields and ordering+remain intact; only its verbs list is synchronized when needed. If unchanged,+the entire original manifest bytes are retained.++`check` and `freeze` are strict historical identity modes: a divergent catalog+or different byte encoding refuses. `refreeze` is explicit authoring mode. It+compares sorted expanded verbs with the supplied prior contract. Unchanged verbs+preserve the entire old contract bytes/date/metadata, while still synchronizing+the manifest. Changed verbs regenerate the contract using canonical metadata and+the explicit supplied Gregorian date. Use `-` instead of a prior contract to+initialize one; an unreadable named prior file refuses. Both creation and update+publish a fresh atomic directory, never overwrite any input or installed file.++The refreeze bundle also includes catalog.json with its metadata synchronized to+the resulting contract, for repeatable subsequent authoring and checks. Schema+bytes remain the explicit separate input. A generated normal-format bundle passes+strict `check`; an unchanged prior contract with unusual byte layout is preserved+by refreeze but may correctly fail the strict historical encoding check.++The date must be supplied as YYYY-MM-DD (year 0001..9999, Gregorian leap rules).+There is no implicit local-clock read: callers choose the intended local authoring+date, and the date is only applied when verbs change. This is a deliberate policy+difference from Python's datetime.date.today(). Historical metadata+(`source:describe.py` and its old regeneration note) remains literal canonical+data for compatibility, not an instruction to execute Python. Canonical metadata+represents the old freezer's source literals. Editing those data is explicit+author intent; it cannot force unchanged verbs to rewrite prior metadata.+Release review and wiring into CI remain separate, unfinished integration work.++`extract LEGACY SCHEMA BASELINE NEW_DIRECTORY` is a one-time migration audit.+It accepts only the exact archived describe.py SHA, parses its bounded literal+table and the three known data expressions, and verifies the complete generated+contract before emitting catalog.json. It never imports, evaluates, executes or+launches Python. Normal check/describe/freeze commands use JSON only. Archived+`.py` files are historical evidence, not an execution dependency. Runtime logic+and freeze semantics were read independently in their actual source files.++## Provenance and checks++`evidence/BASELINE.json` records exact paths and hashes. The requested dev9+snapshot contains describe.py, contracts/describe.json, bridge.json, mechanical+schema and the old Rust contract loader. It has no tools/freeze-contract.py;+the actual freezer was read and archived separately from+exploded-preview-preparation/publication-oct7/published-readback. No claim is made+that those two snapshots share a source commit.++The first Rust encoding attempt passed whole-document semantic equality but+correctly refused exact publication because serde rendered two exponents as+`1e-6`, versus Python's `1e-06`. The rejected candidates/log remain under+`evidence/working`; the corrected encoder reproduces all current bytes. No+baseline discrepancy was normalized away. Number rendering is qualified against+this complete catalog and explicit exponent/Unicode cases, not asserted to be a+universal Python serializer replacement for arbitrary future floats.++Tests cover complete byte equality, reproducible literal extraction, every+runtime verb's order/status, note filtering, duplicated envelopes, all schema+keys/order, duplicate/malformed data, schema mismatch, bounded expansion,+manifest preservation, output collisions/concurrency and failure after staging+one file. Refreeze tests cover changed names/content, metadata/date refresh,+unchanged-byte preservation, absent prior initialization, leap dates, manifest+synchronization and self-consistent canonical output. CLI integration tests+exercise real processes, changed authoring, repeat idempotence and nonzero refusal+without output. Limits include 4MiB inputs/encoded files, bounded schema expansion,+serde's JSON recursion guard, strict duplicate rejection and no destination+replacement. Linux renameat2 and Windows MoveFileW implement exclusive directory+publication; other platforms refuse. Atomic visibility is tested on Linux; this+is not a power-loss durability or actual Windows execution claim.++Malformed-source tolerance intentionally differs from Python: canonical rows must+have exactly eight typed fields; the old freezer padded/truncated tuples, coerced+longRunning with bool(), and replaced falsy input/output/example with objects.+Rust refuses duplicate keys/verb names, invalid dates, wrong schema bytes/order,+and malformed prior contracts instead of silently coercing them. Unchanged prior+metadata must have the known four string fields. These restrictions do not alter+the checked current catalog. Arbitrary future floating-point spellings are not+claimed byte-identical to every Python json implementation; they remain finite+JSON with qualified current catalog and explicit encoding regression coverage.++Freeze1 is archived exactly at evidence/freeze1-source. Its reproduction-only+behavior was incomplete for authoring. Freeze2 adds explicit changed-catalog+refreezing; the canonical current data and original six baseline files remain+unchanged. No historical failed check/evidence was replaced.++No Python was run or newly authored. No Fusion/AB/host actions or runtime feature+additions were performed. Parent root is the independent reviewer; this author+previously built the native journal and several native ports, so this conversion+is not claimed to have fresh independent authorship.
native-rust/tools/contract-authoring/SOURCE-SHA256-2.txtadded+21@@ -0,0 +1,21 @@+a01b87e607d6f4575906dde605ff16d4a9425389f78230f99f7a5af516637391 .cargo/config.toml+0c7fa0247204c8696d1d9bd9917d32bb724eb53706deeccf6878ad415a4476a3 Cargo.lock+ecfbde06206488ed8425dff07543681d74f9d4e237e4f9a88738cc863b6f615d Cargo.toml+ec194bd98bde4bee795fdf753a1000ce68a6d7aa74228a9c90df16f6f5d446ef FREEZE2.md+0c40a571d3bffc6f6868c086a17a2a20b40e744e602ae1803d7478a4a56db6a5 README.md+3a0e83b3866a916bcf0deca2b12b0bdfc2f3dd631be5efbadecf83c83a32536b VENDOR-ORIGIN.md+00f00ab6a12dfa97d9363428f37f793afdc35916f47dd170133c7816ff7e791b data/catalog.json+6f704e05de031fa8ef329dc7be0b02d3a2b167eeb2fbc44ec6c2d933af4f7b48 data/mechanical-schema.json+9ef9ce6c3a7eb51e286332a49441d4460ebe4e58fe80c3d1929ace63c52ca2ed evidence/BASELINE.json+6c7d4e063ab4078d610f22d80e0d39b8dac55959f398558a2ff00257174fe11a evidence/baseline/bridge.json+70f3e2d8f2d4ffb6603c8a62478f149593f6ca19aa9a910dc26a02b607d0b7ba evidence/baseline/describe.json+d03c128566455226bca6b7535a2690577f39c2ac851cc71982f7afae8e1fcc35 evidence/baseline/describe.py+82f51090a79c57adf2f41c27229a860acdc75598aa4ead16893126cd7c848886 evidence/baseline/freeze-contract.py+69ca49c4469c323887efecb10333b51ad9f6813fc450422c155f9983238acd26 evidence/baseline/legacy-contract.rs+6f704e05de031fa8ef329dc7be0b02d3a2b167eeb2fbc44ec6c2d933af4f7b48 evidence/baseline/mechanical-schema.json+c7b7d32043e23dbbbd736becaf68bd3646104af657399e21a4b61aa0c0d15fc5 examples/audit.rs+47f26d78f7e60838aebff69af78d7629a55740ea3e02ee115c0bda996fdf01af src/lib.rs+f4cbfb76d94e2e45462c680dd235b77a87b9d1aec82470c2c233d1412c25f80f src/literal.rs+de4189ccee317457a38e4a14b1fac4567d4c5dbeb5769ceb37398ccc7483fc79 src/main.rs+e6c430a69c5063de9e1eaf597a35fcfd9fe53f4160652f129a1a774271523e15 src/tests.rs+0e1b6172dd103b723e82a28d4d4f70bf4263595bd8b9d2f0f9f23b8aac85a110 tests/cli.rs
native-rust/tools/contract-authoring/VENDOR-ORIGIN.mdadded+6@@ -0,0 +1,6 @@+The local vendor symlink points to ../rust-native-migration-r21/vendor, reusing+already frozen dependencies. Cargo.lock pins this tool's small dependency set:+serde, serde_json with preserve_order/float_roundtrip, and sha2 plus transitive+Rust crates. No dependency was downloaded. For a standalone review checkout,+copy that vendor directory or deliberately configure an ordinary Cargo registry;+the source does not inspect or mutate any package manager configuration.
native-rust/tools/contract-authoring/data/catalog.jsonadded+3622@@ -0,0 +1,3622 @@+{+ "formatVersion": 1,+ "defaultStatus": "fusion_get_app_state",+ "mechanicalSchemaSha256": "6f704e05de031fa8ef329dc7be0b02d3a2b167eeb2fbc44ec6c2d933af4f7b48",+ "mechanicalOperationOrder": [+ "inspect",+ "inspect_entity",+ "new_design",+ "parameter_set",+ "parameter_create",+ "health",+ "export",+ "transaction_probe",+ "sketch_create",+ "sketch_geometry",+ "sketch_constraint",+ "sketch_dimension",+ "sketch_project",+ "sketch_edit",+ "plane_create",+ "feature_create",+ "feature_edit",+ "entity_delete",+ "parameter_batch",+ "component_create",+ "occurrence_insert",+ "occurrence_update",+ "occurrence_delete",+ "component_metadata",+ "joint_create",+ "joint_edit",+ "joint_delete",+ "interference",+ "bom",+ "bom_export",+ "cad_import",+ "mcmaster_discover",+ "mcmaster_open",+ "material_list",+ "material_assign",+ "rigid_group_create",+ "rigid_group_edit",+ "rigid_group_delete",+ "assembly_properties",+ "geometry_query",+ "measure",+ "sketch_curve_edit",+ "sketch_offset",+ "construction_axis",+ "sketch_diagnostics",+ "joint_origin_create",+ "joint_origin_edit",+ "joint_origin_delete",+ "regular_joint_create",+ "regular_joint_edit",+ "motion_link_create",+ "motion_link_edit",+ "motion_link_delete",+ "configuration_inspect",+ "render_scene_inspect",+ "exploded_view_plan",+ "exploded_preview_create",+ "exploded_preview_sample",+ "exploded_preview_show",+ "exploded_preview_dispose",+ "exploded_preview_inspect"+ ],+ "metadata": {+ "contract": "fusion-bridge verb catalog",+ "frozen": "2026-10-06",+ "note": "The Python bridge and the Rust bridge must both serve this catalog byte-for-byte in meaning: same names, same args, same result shapes, same timeouts. Regenerate ONLY from describe.py and diff in CI.",+ "source": "describe.py"+ },+ "rows": [+ [+ "fusion_mech_capabilities",+ "Discover typed mechanical operations, exact input schemas, units, recovery limitations and current add-in session ID.",+ {},+ {+ "success": "bool",+ "sessionId": "str",+ "operations": {+ "$mechanicalSchema": true+ },+ "transactions": "object",+ "idempotency": "object"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_mechanical",+ "Guarded main-thread parametric parts and assemblies: sketches, solid features, atomic parameter edits, component definitions/copies/placement, seven as-built joint motions and limits, rigid groups, interference, materials and assembly mass/center of mass, local supplier STEP/SAT import with SHA/provenance, native McMaster command, structured/flat BOM CSV, topology readback, health and safe exports. Geometry queries refuse ambiguous selections; root-space distance/angle measurements return witness points. Typed sketch trim/extend/split/break and signed modern offsets, reference-defined construction axes and native sketch constraint diagnostics are available through exact operation schemas. Regular geometry-solving joints, joint origins and native motion links have guarded typed operations, exact attachment/parameter readback and timeline restoration. Read-only configuration inspection and active-row BOM provenance are available; configuration lifecycle and configured-design model writes remain disabled pending native recovery/archive gates. Incomplete configuration scope also blocks complete BOM output. Typed model mutations use runtime-proven PTransaction recovery; transaction_probe verifies the backend (new_design does this automatically). Writes require sessionId,operationId and current target {documentId,revision}. Durable admission must commit before dispatch. Retry exact args with the same ID; query durable status after timeout. Old-session history is readable but never replayed. Storage failure after execution returns reconciliation-required, preserving available evidence without claiming rollback. References expire on model changes. Files/document lifecycle are outside model transactions.",+ {+ "op": {+ "$mechanicalOperationEnum": true+ },+ "sessionId": "required for writes from mech_capabilities",+ "operationId": "required unique write ID; reuse unchanged for retry",+ "target": "existing-document writes: {documentId,revision} from inspect",+ "operationSchemas": {+ "$mechanicalSchema": true+ }+ },+ {+ "success": "bool",+ "sessionId": "str",+ "operationId": "str on writes",+ "data": "operation result including fresh target",+ "errorCode": "stable str on failure",+ "recovery": "reported on failed mutation",+ "durability": "terminalRecorded and recorded phase for durable writes",+ "outcome": "unknown or not_executed on storage/delivery failure"+ },+ 300,+ "fusion_mech_operation_status",+ true,+ {+ "op": "inspect"+ }+ ],+ [+ "fusion_mech_operation_status",+ "Read durable typed-operation history by recorded sessionId and operationId, including after HTTP timeout or add-in restart. Returns the recorded request digest, source version, target identity, phase/timestamps and terminal result. Historical nonterminal work is interrupted/unknown and never replayed. Admission without a durable dispatch claim or uncertain persistence requires reconciliation. Missing history never proves no execution. This observational route bypasses lifecycle repair, window etiquette and the CAD queue; it never starts/restarts Fusion or dismisses dialogs. An unavailable add-in returns operation_status_unavailable with unknown outcome. SQLite recovery may repair only the app-owned journal. A native call monopolizing Python's GIL can still delay responses.",+ {+ "sessionId": "required str",+ "operationId": "required str"+ },+ {+ "success": "bool",+ "state": "running|succeeded|failed|interrupted|reconciliation_required",+ "phase": "admitted|dispatched|executing|succeeded|failed|not_executed",+ "historical": "bool",+ "currentSessionId": "str",+ "history": "durable identity/phase/timestamps",+ "reconciliationRequired": "bool",+ "result": "recorded terminal result or null",+ "observedResult": "bounded unconfirmed current-session result or null"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_routing_state",+ "Read the live board's identity, geometry revision, pads, copper and per-net airwires from a fresh Fusion export.",+ {+ "expectDocument": "required exact active board name",+ "boardId": "optional document creationId guard"+ },+ {+ "boardId": "str",+ "revision": "str",+ "nets": "list",+ "pads": "list",+ "segments": "list",+ "vias": "list",+ "remainingNets": "list"+ },+ 60,+ "fusion_routing_state",+ false,+ {+ "expectDocument": "fusion-routing"+ }+ ],+ [+ "fusion_plan_route",+ "Calculate a read-only, bounded orthogonal A* path between two pads on a live two-layer board. Uses existing copper and the shared conservative clearance model. Returns explicit route args for route_net; native DRC is still required after mutation.",+ {+ "expectDocument": "required str",+ "boardId": "required str",+ "expectedRevision": "required str",+ "net": "required str",+ "fromPad": "required str",+ "toPad": "required str",+ "width": "mm default 0.25",+ "viaDiameter": "mm default 0.6",+ "viaDrill": "mm default 0.3",+ "grid": "mm 0.1..5 default 0.5",+ "allowVias": "bool default true",+ "viaCost": "mm-equivalent cost default 5",+ "maxNodes": "int 1..100000 default 25000",+ "timeoutMs": "int 10..5000 default 3000"+ },+ {+ "success": "bool",+ "mutated": "false",+ "revision": "str",+ "plan": "{items,route,planner}"+ },+ 60,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_route_net",+ "Create explicit net copper in the live Fusion canvas. Conservative clearance preflight, board/revision guards and exact copper readback. One or several trace segments per call; no general autorouting. Use routing_drc for native DRC.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required from routing_state",+ "expectedRevision": "required from routing_state",+ "net": "required exact name",+ "points": "waypoints [x,y] or {pad} or {x,y,layer}",+ "paths": "optional list of paths instead of points",+ "width": "mm, default .25",+ "layer": "1 or 16, default 1",+ "viaDiameter": "mm, default .6",+ "viaDrill": "mm, default .3",+ "clearance": "mm lower bound, default .2",+ "dryRun": "optional bool"+ },+ {+ "success": "bool",+ "mutated": "bool",+ "verified": "bool",+ "revision": "str",+ "plan": "obj",+ "remainingNets": "list"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_move_parts",+ "Place parts on the live board: one MOVE (absolute, mm) and ROTATE per part, each its own undo step, then a fresh export reads every element back. The layout half of the AI flow's Fusion lane (adom-aiflow place land). Coordinates are Fusion's (y up).",+ {+ "expectDocument": "required exact board name",+ "boardId": "required from routing_state",+ "expectedRevision": "required from routing_state",+ "parts": "required [{ref, x, y, rotation}] rotation in degrees or an EAGLE rotation like R90 / MR180"+ },+ {+ "success": "bool",+ "verified": "bool",+ "moved": "[ref]",+ "mismatched": "[{ref,want,got}]",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_place_vias",+ "Add vias at exact points (stitching, thermal, escape): VIA per via with its drill and diameter, then read back.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required",+ "vias": "required [{net, x, y, diameter (mm, default 0.6), drill (mm, default 0.3)}]"+ },+ {+ "success": "bool",+ "verified": "bool",+ "missing": "list",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_apply_pours",+ "Draw copper pours from a plan: POLYGON per pour (net, layer 1 or 16, outline points, isolate, rank 1..6, width, thermals, orphans), skipping any already on the board with the same net, layer and outline, then RATSNEST fills them. The reply carries Fusion's own fill per pour (filledMm2, islands) and per layer. Removing a pour is not done here.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required",+ "pours": "required [{net, layer, points:[[x,y]...], isolate (mm, default 0.25), rank (default 1), width (mm, default 0.25), thermals (default true), orphans (default false)}]"+ },+ {+ "success": "bool",+ "verified": "bool",+ "added": "[net]",+ "kept": "[net]",+ "pours": "[{net,layer,outline,filledMm2,islands,filled}]",+ "filledAreaByLayerMm2": "{layer:mm2}",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_pour_state",+ "Read every pour on the live board with Fusion's own computed fill: filled area per pour, per layer and per net, and which pours were never filled (no RATSNEST since they were drawn). The measure step of the AI flow's Fusion lane.",+ {+ "expectDocument": "required exact board name",+ "boardId": "optional"+ },+ {+ "pours": "list",+ "filledAreaByLayerMm2": "{layer:mm2}",+ "filledAreaByNetMm2": "{net:mm2}",+ "unfilled": "[net]",+ "revision": "str"+ },+ 60,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_ripup_nets",+ "Take whole nets' tracks and vias back up (RIPUP per net, one undo step each) so they can be routed again, wider or another way. Their pours stay. Readback proves no track or via is left on those nets and no pour was lost.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required",+ "nets": "required [net name]"+ },+ {+ "success": "bool",+ "verified": "bool",+ "ripped": "[net]",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_schematic_run",+ "Build a schematic live: a list of complete, non-interactive EAGLE commands run one at a time on the active schematic (ADD 'dev@lib' 'NAME' R0 (x y), VALUE, NET 'name' (pts), LABEL, WIRE, TEXT, LAYER, CHANGE STYLE/SIZE/WIDTH/RATIO, WINDOW FIT), with an optional pause between them so a viewer sees it grow. Anything else is refused before the first command runs. ADD is proven against libraryPath on disk first (the deviceset must be there; the library is USEd by the bridge), so the component picker can never open. Readback: the parts and nets on the sheet from a fresh export.",+ {+ "expectDocument": "optional exact schematic name",+ "libraryPath": "required for ADD: the .lbr on this machine (its file name is the library name in ADD)",+ "commands": "required [command] (1..400)",+ "pauseMs": "optional 0..3000 between commands"+ },+ {+ "success": "bool",+ "verified": "bool",+ "parts": "[name]",+ "added": "[name]",+ "nets": "{net:[part.pin]}",+ "commands": "int"+ },+ 120,+ "fusion_get_app_state",+ false,+ {}+ ],+ [+ "fusion_board_bom",+ "The bill of materials from the live board's own part attributes: one line per MPN with designators, quantity, value, package, manufacturer and the Mouser, DigiKey and LCSC numbers, plus the JLCPCB form (Comment, Designator, Footprint, LCSC). Board-only parts (test pads) are listed as such, and any part missing a distributor number is named. Read-only; with outputDir it also writes bom.csv and bom-jlcpcb.csv there.",+ {+ "expectDocument": "required exact board name",+ "outputDir": "optional folder on this machine for bom.csv + bom-jlcpcb.csv"+ },+ {+ "lines": "[{designators,quantity,value,package,mpn,manufacturer,mouser,digikey,lcsc}]",+ "csv": "str",+ "jlcpcbCsv": "str",+ "files": "{name:path}",+ "boardOnly": "[str]",+ "missingPartNumbers": "{mouser,digikey,lcsc:[str]}"+ },+ 60,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_change_pours",+ "Change existing pours in place: the pen width (the narrowest copper the fill can reach; a pen wider than a throat leaves it empty) and the isolation. Each pour is named by net, layer and outline, picked on the midpoint of its longest edge, then RATSNEST refills. The readback proves each pour took its new width/isolate and that no track or via changed, and reports the filled area before and after.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required",+ "pours": "required [{net, layer, points:[[x,y]...], width? (mm), isolate? (mm)}]"+ },+ {+ "success": "bool",+ "verified": "bool",+ "changes": "[{net,layer,width:[before,after],isolate:[before,after],filledMm2:[before,after]}]",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_board_seed",+ "Write the design a new board starts from, as EAGLE source on this machine: the board outline, the fab's design rules (Fusion's own rules block with your clearance, edge distance, minimum width and drill, hole-to-hole, pad and via restring and copper weight; Fusion's defaults are 0.35 mm drill, 1 mm to the edge and a 25 % pad restring, wrong for most fabs), the fixed parts at their places with their nets, and the library they come from. Then fusion_new_electronics_from_eagle imports it as a linked schematic and board.",+ {+ "libraryPath": "required .lbr on this machine",+ "outDir": "required folder on this machine",+ "name": "optional design name (letters, digits, _ -)",+ "title": "optional sheet title",+ "outlineMm": "required [width, height]",+ "fixed": "optional [{ref, deviceset, value?, x, y (mm, board frame), rot?, nets:{pin:net}}]",+ "rules": "optional {clearance, edge, minWidth, minDrill, holeToHole, padRestringRatio, padRestring, viaRestring, copperUm}"+ },+ {+ "schPath": "str",+ "brdPath": "str",+ "fixedParts": "int"+ },+ 60,+ "fusion_get_app_state",+ false,+ {}+ ],+ [+ "fusion_schematic_plan",+ "Plan a grouped schematic from a netlist: one labelled frame per block, the block's parts in a row, every connected pin given a short stub named for its net and a label. Returns the command groups for fusion_schematic_run (one call per group, so the sheet grows block by block on camera). Pins may be named by pad (U1.3) or pin (U1.VIN). Pure computation from the .lbr; nothing in Fusion changes.",+ {+ "libraryPath": "required .lbr on this machine",+ "parts": "required [{ref, deviceset, value?, block?}]",+ "nets": "required {net:[ref.pin or ref.pad]}",+ "columns": "optional frames per row (default 3)"+ },+ {+ "groups": "[{group, parts, commands}]",+ "commandCount": "int",+ "notInParts": "[str]"+ },+ 60,+ "fusion_get_app_state",+ false,+ {}+ ],+ [+ "fusion_remove_pours",+ "Delete pours (all of them, or the ones named by net, layer and outline) so a board can be poured again after a refine. Each DELETE picks the outline point farthest from every pad (refused if none is 1 mm clear), and the readback undoes everything if a part or a track changed.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required",+ "pours": "optional 'all' (default) or [{net, layer, points}]"+ },+ {+ "success": "bool",+ "removed": "int",+ "left": "list",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_board_source",+ "Read the live board as EAGLE XML from a fresh export: parts, copper, vias, pours with Fusion's own computed fill, and the outline. Read-only. Feed it to adom-fields (it reads .brd) for current and heat, or to adom-aiflow, which converts it for its offline checks.",+ {+ "expectDocument": "required exact board name",+ "boardId": "optional"+ },+ {+ "source": "str (EAGLE .brd XML)",+ "boardId": "str",+ "revision": "str"+ },+ 60,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_routing_drc",+ "Run fresh native Autodesk DRC and read UL_BOARD.errors, including approved errors, warnings and airwires. Does not accept or clear any violation.",+ {+ "expectDocument": "required exact board name",+ "boardId": "required",+ "expectedRevision": "required"+ },+ {+ "drc": "{checked,clean,errorCount,warningCount,airwireCount,errors}",+ "revision": "str"+ },+ 120,+ "fusion_routing_state",+ false,+ {}+ ],+ [+ "fusion_preflight_lbr",+ "PRE-ANALYZE a .lbr: will Fusion open it? Offline and instant - no Fusion needed, nothing launched. Runs the named checks the bridge learned from real Fusion rejections: file-readable, size-sane (truncated-transfer corpse detection), xml-parses, root-is-eagle, packages-nonempty (Fusion's silent 'No Components'), symbols-present, devicesets-present (missing ones make EDIT raise Create-new prompts), connects-resolve (dead wiring renders fine and connects nothing). fusion_open_lbr and fusion_create_library run the same gate automatically; call this directly to gate a batch BEFORE staging.",+ {+ "libraryPath": "str (Windows .lbr path)"+ },+ {+ "success": "bool",+ "preflight": "{ok, checks[], errors[]}"+ },+ 10,+ null,+ true,+ {+ "libraryPath": "C:/Temp/PART.lbr"+ }+ ],+ [+ "fusion_install_library_bundle",+ "COMPOSITE, the Fusion twin of kicad_install_library_bundle (#68): ONE call takes a staged Cloud Library bundle (zip of <Lib>.lbr + <Part>.step models, or a bare lbrPath with STEPs beside it), unpacks it safely, places it under ~/Documents/Adom Libraries/<name>/, pairs EVERY deviceset with its STEP by name (deviceset, package, normalised, prefix; a one-part library pairs its single model regardless), lints part numbers (partMetadata: MPN, manufacturer, Mouser/DigiKey/LCSC - reported, never blocking), pre-flights Fusion state (fusion{status}), and starts the same bind -> prove chain fusion_create_library runs. ASYNC BY CONTRACT: returns IMMEDIATELY with runId + statusVerb because a STEP bind is 3-15 minutes and cannot fit a relay window; poll fusion_prove_result (measured percent, four streamed proof frames per part, provedParts[], and an addin_restart_required payload the CALLER turns into the ask). PARTIAL SHIPS: a deviceset with no model is a NAMED skip in unbound[], the rest still bind; partsBound < partsTotal is the signal. Each part is minted on its own single-deviceset library (the Package3D generator loads the FIRST package of the open library, so a merged library would put every chip on part one's footprint), with the STEP placed exactly as published (orient:false, origin trusted), then all urns are bound into the merged library, and after prove the bound library is SAVED TO THE CLOUD under <project>/Adom Libraries so it appears in Fusion's Library Manager (cloudLibrary{saved, fileId, duplicatesBefore} in fusion_prove_result). Per-part scaffolding is deleted; the user is left with one library plus its per-package f3d folder. capture:false only places the files and returns. This is the one contract the wiki CLI (`library install --format fusion`) and the Export button both read; the recipe has one owner.",+ {+ "zipPath": "str (staged bundle zip on THIS machine) - or",+ "lbrPath": "str (staged .lbr, STEP models beside it)",+ "libraryName": "optional str (default: file stem)",+ "capture": "optional bool (default true: bind + prove; false: place only)"+ },+ {+ "installed": "bool",+ "libraryPath": "str",+ "partsTotal": "int",+ "partsToBind": "int",+ "unbound": "[{package, why}]",+ "partMetadata": "{ok, summary, warnings[]}",+ "fusion": "{installed, running, addinReady, status, message}",+ "runId": "str",+ "statusVerb": "fusion_prove_result"+ },+ 60,+ "fusion_prove_result",+ true,+ {+ "zipPath": "C:/Temp/MyLib.zip",+ "libraryName": "MyLib"+ }+ ],+ [+ "fusion_create_library",+ "ONE-CALL library creation for web-control (one call = one consent). EVERY LIBRARY IS MULTI-PART - a single-part library is simply parts:[one entry], and there is no separate single-part verb to choose. Pass parts:[{package, lbrPath, modelPath}] for any number of parts; the older {libraryPath, stepPath} shape still works and is normalised into a one-element parts list, so both run the identical code path and the ETA scales with the part count either way. TWO entry shapes: A) {libraryPath, stepPath} - a ready .lbr plus the 3D; B) {kicadSymbolPath, kicadFootprintPath, stepPath, pinMap?} - KiCad sources; needs adom-lbr, which is Linux-container-only by platform rule, so on Windows/Mac boxes shape B refuses IMMEDIATELY (adom_lbr_unavailable, before any staging or Fusion launch - fusion_readiness reports kicadIngest up front). Convert at AUTHORING time in a container and use shape A. pinMap = explicit {pinName: padName} for when pin numbers do not match pad names (BGA-style). Chains convert -> bind 3D -> prove (four evidence frames + verdict) in the BACKGROUND and returns immediately; poll fusion_prove_result (stage narrates; top-level `verdict` proven/not_proven is the score - `stage:done` only means the chain finished). EVERY PART IS PROVED, not just the first: a 10-component library streams 40 evidence frames, FOUR per component (symbol, footprint, 3d, ganged) in assembly order, each tagged with `part` so a front end can group them as they arrive, and `provedParts[]` reports per-part pass/fail. The library is proven only if EVERY part is - one good part does not vouch for nine unchecked ones. On the FINAL fetch pass {inlineFrames:true} to get each evidence frame as a base64 thumbnailDataUrl a browser can render (plain polls return box paths only). The chain closes its library document on success AND failure - batches need no between-part sweeping. stepPath is required for a PROVEN library - no real 3D body without it.",+ {+ "parts": "optional [{package, lbrPath, modelPath}] - THE canonical shape, any count",+ "libraryPath": "optional str (shape A, or output path for B)",+ "kicadSymbolPath": "optional str",+ "kicadFootprintPath": "optional str",+ "stepPath": "optional str (required for proven)",+ "pinMap": "optional {pinName: padName}",+ "name": "optional str"+ },+ {+ "started": "bool",+ "statusVerb": "str"+ },+ 30,+ "fusion_prove_result",+ true,+ {+ "libraryPath": "C:/Temp/PART.lbr",+ "stepPath": "C:/Temp/PART.step"+ }+ ],+ [+ "fusion_start",+ "Launch Fusion 360 (if needed) and wait for the AdomBridge add-in to be ready.",+ {+ "prove": "optional bool. Default from the CALLER: an AI thread (caller headers set) binds and places only; web control / anonymous callers prove (four evidence frames per part, about 300 s per library). Explicit true/false always wins. From an AI thread, look at one part later with fusion_capture_library_views {packages} (issue #88)",+ "allowRestart": "optional bool (default false). The chain NEVER relaunches Fusion or restarts the add-in on its own: when the add-in does not answer it surfaces addin_restart_required and waits (resumable). allowRestart:true with restartReason lets it restart, recorded in restarts[] on fusion_prove_result (issue #87)",+ "restartReason": "optional str shown to the human when allowRestart is used"+ },+ {+ "success": "bool",+ "addinReady": "bool",+ "status": "str"+ },+ 150,+ null,+ true,+ {}+ ],+ [+ "fusion_stop",+ "Gracefully STOP Fusion 360: close docs cleanly + WM_CLOSE, then wait. NO force-kill - the clean opposite of fusion_start. If a window will not close it returns failure; use fusion_kill then.",+ {+ "skipCleanClose": "optional bool"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_kill",+ "Force-KILL Fusion 360 (taskkill /F) - the desperate path for when fusion_stop cannot close it (stuck modal / wedged process). Closes docs cleanly first when reachable.",+ {+ "skipCleanClose": "optional bool"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_close_window",+ "Close a DIALOG window by hwnd (WM_CLOSE, like clicking X) - for dialogs without Cancel/Escape handling (e.g. Recovered Documents). NOT a document closer; refuses without hwnd. Get the hwnd from a screenshot's dialogs array or desktop_list_windows. (Doc drift caught by the verb test suite 2026-08-14: this was described as 'close the active document' while the handler required hwnd.)",+ {+ "hwnd": "required int (the dialog window)"+ },+ {+ "success": "bool"+ },+ 30,+ null,+ false,+ {+ "hwnd": 123456+ }+ ],+ [+ "fusion_get_app_state",+ "Current app state: running, active document, workspace, isElectronics. The poll/status verb for long-running calls.",+ {},+ {+ "activeDocument": "str",+ "activeWorkspace": "str",+ "isElectronics": "bool"+ },+ 20,+ null,+ false,+ {}+ ],+ [+ "fusion_account",+ "WHO Fusion is signed in as on this machine, and whether this machine currently holds the Autodesk SEAT. One subscription runs ONE active Fusion at a time, so the seat moves between machines; this is the read. Returns the signed-in account (email, name, hub), Autodesk's own licence blob (authorized, trial, expiry, reauthorize time, from Application.LicenseInformation) and holdsSeat. Read-only: never starts Fusion, never signs anybody in or out.",+ {},+ {+ "success": "bool",+ "running": "bool",+ "signedIn": "bool",+ "account": "{email, name, userId, hub}",+ "license": "{authorized, trial, expiresAt, ...}",+ "holdsSeat": "bool",+ "seatDialogOpen": "bool"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_claim_seat",+ "Make THIS machine the active Fusion seat, the first-class way to move a licence between boxes while testing. Starts Fusion if needed, then answers Autodesk's 'Active Sessions Exceeded' modal in the BACKGROUND (Continue): this box takes the seat and the other machine's Fusion suspends RESUMABLY, keeping its documents. Answers needs_signin (never a credential prompt) when the box is not signed in: run fusion_signin first. Confirms with fusion_account and reports the account and licence it ended up with.",+ {+ "profile": "optional str (browser profile to name in the sign-in hint, e.g. edge:[email protected])"+ },+ {+ "success": "bool",+ "holdsSeat": "bool",+ "steps": "[{step, ok}]",+ "account": "obj",+ "license": "obj"+ },+ 300,+ "fusion_readiness",+ false,+ {}+ ],+ [+ "fusion_release_seat",+ "Give up the Autodesk seat from THIS machine so another box can claim it with no modal at all: closes Fusion cleanly (documents are NOT discarded; an unsaved one refuses and says so) and leaves the account signed in, so this box can claim the seat straight back. The counterpart of fusion_claim_seat.",+ {+ "save": "optional bool (default false): save open documents before closing"+ },+ {+ "success": "bool",+ "released": "bool",+ "wasHeldBy": "obj"+ },+ 180,+ null,+ false,+ {}+ ],+ [+ "fusion_prewarm",+ "Warm the bridge ahead of the first real call, WITHOUT starting Fusion: confirms the add-in is synced into every Fusion add-in folder, readies the space-free staging folder, and caches the PCB design-rules catalog from adom/pcb-design-rules. Adom Bridge calls it once per installed version in the background (bridge.json prewarm.verb); safe to call again any time. Launching Fusion is never part of it.",+ {},+ {+ "ok": "bool",+ "steps": "[{step, ok, ...}]",+ "fusionInstalled": "bool",+ "fusionStarted": "bool (always false)"+ },+ 120,+ null,+ false,+ {}+ ],+ [+ "fusion_readiness",+ "FAST readiness check (does NOT launch Fusion): is the Fusion host app installed + running + the bridge ready to drive? ab DETECTS Fusion (never installs it) via bridge.json 'detect', and auto-installs Python if missing (ab >=1.9.47). Call this before driving Fusion; if installed-but-not-running, fusion_start. SELF-HEALS the seat/licensing dialog (background UIA + screenshot-verify) whenever it detects one. Pairs with ab's bridge_readiness.",+ {},+ {+ "installed": "bool",+ "running": "bool",+ "ready": "bool",+ "hostApp": "str",+ "bridgeVersion": "str"+ },+ 15,+ null,+ false,+ {}+ ],+ [+ "fusion_new_electronics_from_eagle",+ "Import a legacy EAGLE .sch (+ paired .brd) into a NEW Fusion electronics design so the parts INSTANTIATE (schematic + populated board, lands in the PCB editor). The ONLY way to author a board from EAGLE source: Document.newDesignFromLocal opens the schematic editor but does NOT instantiate parts, and the Fusion-native .fsch/.fbrd container is opaque binary you can't build offline. This fires Fusion's own ImportSCHAndBRDCmd and drives BOTH native Open dialogs (the .sch then the .brd) in the BACKGROUND via desktop_ui_click by accessible name (no foreground). Stage both files to Windows first (send_files). After: fusion_show_2d_board, RATSNEST + 'AUTO ;' to autoroute, fusion_show_3d_board for 3D. PREFLIGHT (1.10.20): refuses with eagle_files_missing before touching any dialog when either file is not on the Fusion machine; if the Open dialog does not accept the file the bridge cancels the dialog itself (open_dialog_stuck), so nothing is ever left on the user's screen. Prefer fusion_schematic {action:\"open\"}, which picks this route only when a .brd exists next to the .sch. ASYNC by contract (1.10.22): returns {started:true, runId, statusVerb} at once and runs the dialog-driven import on the exe; poll fusion_eagle_import_status {runId}. The record and the final reply carry documentName, partsExpected (elements in the .brd) and partsPlaced (read back from the board); success needs parts on the board (nothing_instantiated otherwise). Pass wait:true only from inside the exe.",+ {+ "schPath": "required str (Windows path to .sch)",+ "brdPath": "optional str (defaults to sibling .brd)"+ },+ {+ "success": "bool",+ "imported": "list"+ },+ 200,+ null,+ false,+ {+ "schPath": "C:/Users/me/adom-lib/MyBoard.sch",+ "brdPath": "C:/Users/me/adom-lib/MyBoard.brd"+ }+ ],+ [+ "fusion_notify_owner",+ "LAST-RESORT human escalation: toast the user's MAIN computer (fans out cross-ab to every peer on the relay, so it reaches them even when this bridge runs on an unattended VM). ONLY for true human walls - password/2FA entry, UAC elevation, a physical step. Exhaust programmatic options first (UIA background clicks, seat auto-resolve, warm-SSO sign-in). After sending, WAIT and poll fusion_readiness; do not re-toast within a few minutes.",+ {+ "title": "optional str",+ "body": "required str",+ "level": "optional str info|warning|error"+ },+ {+ "success": "bool",+ "targets": "list"+ },+ 20,+ null,+ false,+ {+ "title": "Fusion needs you",+ "body": "Please complete the Autodesk 2FA prompt on winvm - everything else is done."+ }+ ],+ [+ "fusion_signin",+ "SELF-DRIVING as of 1.9.32: launches Fusion if needed, clicks Sign In, opens the OAuth in the right profile, TYPES THE EMAIL and advances to the exact remaining wall (password/2FA/handoff), toasting the user at that step only - see signinWall + _hint in the response, and the fusion-autodesk-signin skill. Sign Fusion in through the CORRECT browser profile - the fix for Fusion's dumb OAuth that fires at the OS-DEFAULT browser and lands in the wrong Autodesk account. Fusion opens its sign-in in whatever browser is default (e.g. a personal Chrome), but a user's Autodesk seat often lives in a different profile (work). This verb reads the FULL authorize URL (client_id/PKCE/state/request_id) that Fusion wrote into that wrong browser's HISTORY and re-opens it in the RIGHT profile IN THE BACKGROUND; the URL completes back to the running Fusion via the idmgr/callback + autodesk:// handoff, so the browser no longer has to be the OS default. Pass {profile:'chrome:[email protected]'} to fix + remember your Autodesk profile; else it probes each profile for a live Autodesk session (or asks). Staged: if Fusion hasn't opened the browser yet it returns stage:'click_signin' so you click Fusion's Sign In first. BEST: pass {auto:true} to run the WHOLE chain in ONE server-side call - it clicks Fusion's Sign In, polls the browser history on-box for the fresh authorize URL, and re-opens it in the target profile, all without extra remote round-trips, so it fits inside Fusion's ~2-min OAuth request expiry even on a slow/flaky relay (the manual staged path is the fallback). Fusion's request EXPIRES in ~2 min, so a stale captured URL returns stage:'stale' - restart Fusion (fusion_stop/start) for a fresh request and retry auto PROMPTLY. See the 'fusion-multiprofile-signin' skill.",+ {+ "profile": "optional str (chrome:<email>/edge:<email> - the profile your Autodesk account is in; remembered)",+ "auto": "optional bool (do click+capture+reopen in one on-box call - recommended)",+ "method": "optional str google|apple|microsoft|facebook|password (1.11.1): HOW this Autodesk account signs in. With it the bridge drives the sign-in page itself (clicks the provider, picks the account, clicks Open Product) and REMEMBERS it, so later calls need nothing. Without one and none remembered, the reply is stage method_required with methods[]: ASK THE USER, never guess",+ "account": "optional str email: which account to pick in a provider chooser (e.g. the Google account list); remembered with the method",+ "waitSec": "optional int (server-side poll budget for the fresh URL, default 32)"+ },+ {+ "stage": "str",+ "done": "bool",+ "signinWhere": "str",+ "signinProfile": "str",+ "signinProfileReason": "str",+ "signinWrongBrowser": "str",+ "signinAuthUrl": "str",+ "signinOpenedVia": "str (extension|extension_free)",+ "signinWall": "str|null (twofactor_email_code|credentials|protocol_handoff)",+ "notifyDelivered": "bool",+ "signinWallHint": "str|null",+ "narrate": "str"+ },+ 120,+ "fusion_signin",+ true,+ {}+ ],+ [+ "fusion_mcp_status",+ "Is Autodesk's Fusion MCP server up, and what does it expose? Autodesk + Anthropic ship a LOCAL MCP server at http://127.0.0.1:27182/mcp exposing Fusion's own text-to-CAD surface (read geometry, execute/update features, read Electronics design data). It binds LOOPBACK on the user's machine and was built for Claude Desktop running there, so a CLOUD AI cannot reach it at all - this bridge runs on that machine and proxies it for you. Returns enabled, serverInfo and the live tool list. OFF by default: if it reports enabled:false, call fusion_mcp_enable and the bridge turns it on for the user.",+ {},+ {+ "enabled": "bool",+ "serverInfo": "obj",+ "toolCount": "int",+ "tools": "[{name,description}]"+ },+ 45,+ "fusion_mcp_status",+ false,+ {}+ ],+ [+ "fusion_mcp_enable",+ "Turn Autodesk's Fusion MCP server ON by driving Fusion's Preferences dialog for the user. Autodesk exposes NO API for this toggle, so the UI is the only route: this opens Preferences (Commands.Start PreferencesCommand), expands General, selects API, ticks 'Fusion MCP Server (runs locally on this device)', then clicks Apply and OK. Needs Fusion running; briefly uses the foreground and announces why with an on-screen caption. NEVER ask the user to do this by hand first - do it for them, then tell them it is handled. Note the setting is DISCARDED if Fusion is killed or restarted before Apply is clicked.",+ {},+ {+ "enabled": "bool",+ "alreadyOn": "bool",+ "steps": "list",+ "serverInfo": "obj"+ },+ 180,+ "fusion_mcp_status",+ true,+ {}+ ],+ [+ "fusion_mcp_tools",+ "Full tool list from Autodesk's Fusion MCP server INCLUDING input schemas, so you can construct a valid fusion_mcp_call. These are Autodesk's tools, not this bridge's.",+ {},+ {+ "count": "int",+ "tools": "list"+ },+ 45,+ "fusion_mcp_status",+ false,+ {}+ ],+ [+ "fusion_mcp_call",+ "Call any tool on Autodesk's Fusion MCP server (fusion_mcp_read, fusion_mcp_update, fusion_mcp_execute, fusion_mcp_electronics_read). The bridge handles the MCP streamable-HTTP handshake for you (initialize -> MCP-Session-Id -> notifications/initialized) and re-establishes a dropped session automatically. MCP acts on the ACTIVE Fusion document, so open one first. PREFER a native fusion_* verb when one exists - they are tested here and return richer hints - and reach for MCP for Autodesk's text-to-CAD surface.",+ {+ "tool": "required str (from fusion_mcp_tools)",+ "arguments": "optional obj (per that tool's inputSchema)",+ "timeout": "optional int seconds, default 120"+ },+ {+ "result": "obj",+ "tool": "str"+ },+ 150,+ "fusion_mcp_status",+ true,+ {+ "tool": "fusion_mcp_read",+ "arguments": {+ "queryType": "activeCommand"+ }+ }+ ],+ [+ "fusion_mcp_resources",+ "List Autodesk MCP resources, or read one by uri. These are mostly the Electronics entity schemas (resource://mcp.electronics_schema_*) that describe what fusion_mcp_electronics_read can return.",+ {+ "uri": "optional str (omit to list)"+ },+ {+ "count": "int",+ "resources": "[str]",+ "result": "obj"+ },+ 60,+ "fusion_mcp_status",+ false,+ {}+ ],+ [+ "fusion_prefs_open",+ "Open Fusion's Preferences dialog and optionally jump to a section, then hand back a SCREENSHOT + shotId you can click in. This is how you reach ANY Fusion preference: the Python API exposes only a thin slice (theme/orbit/units, debuggingPort, developer tools) and everything else, including the MCP server toggle, is UI-only. Sections: general, api, design, manufacture, electronics, render, drawing, material, graphics, network, preview features. Child sections under General are lazily rendered by Qt and never appear in the UIA tree, which is why this returns an image to click rather than control names. ALWAYS finish with fusion_prefs_close {save:true} - nothing is saved otherwise, and killing/restarting Fusion first discards the change.",+ {+ "section": "optional str (see knownSections in the response)"+ },+ {+ "hwnd": "int",+ "shotId": "str",+ "screenshot": "str",+ "knownSections": "[str]",+ "steps": "list"+ },+ 120,+ "fusion_get_preferences",+ true,+ {+ "section": "api"+ }+ ],+ [+ "fusion_prefs_close",+ "Apply+OK (save:true, the default) or Cancel Fusion's Preferences dialog. Settings changed via fusion_prefs_open are NOT persisted until this is called with save:true.",+ {+ "save": "optional bool, default true"+ },+ {+ "closed": "bool",+ "saved": "bool"+ },+ 60,+ "fusion_get_preferences",+ false,+ {+ "save": true+ }+ ],+ [+ "fusion_set_auto_update",+ "Turn AUTOMATIC Fusion updating on/off for this user. ON BY DEFAULT, and deliberately INVISIBLE: Fusion ships updates constantly and nags with an 'Update Now / Update Later' panel plus a '14 days until Fusion must update' countdown. Every fusion_readiness call checks for that offer and, if present, the bridge clicks it IN THE BACKGROUND (UIA, no foreground, no caption) so the download starts and the newer build comes up on the next launch. The user should never have to click it. Call with no args to read the current setting; {enabled:false} opts out and the choice is STICKY (~/.adom/fusion-bridge/prefs.json) - once a user opts out, NEVER click their update prompts again. Tell the user this is handled for them rather than asking them to update.",+ {+ "enabled": "optional bool (omit to read current value)"+ },+ {+ "autoUpdateFusion": "bool",+ "narrate": "str"+ },+ 30,+ "fusion_readiness",+ true,+ {+ "enabled": true+ }+ ],+ [+ "fusion_signin_2fa",+ "Submit Autodesk's emailed 6-DIGIT verification code to finish a Fusion sign-in, typed IN THE BACKGROUND (UIA SetValue + Invoke - never steals the user's foreground or moves their cursor). Exists so you can finish a login END TO END for the user instead of parking them on a 2FA screen: if `adom-google` is available in your container, read the code out of their Gmail (`adom-google gmail search 'from:autodesk verification code' --limit 1`), pull the 6 digits, and call this. If adom-google is NOT installed, tell the user that installing it would let you automate logins like this, then let them type it. NEVER ask the user for a code you could read yourself. The bridge ALSO toasts the user's desktop whenever it hits a human wall, so you do not need to ask it to.",+ {+ "code": "required str (the 6 digits; non-digits are stripped)",+ "hwnd": "optional int (the 2FA window; auto-detected)"+ },+ {+ "submitted": "bool",+ "steps": "list",+ "narrate": "str"+ },+ 90,+ "fusion_readiness",+ true,+ {+ "code": "123456"+ }+ ],+ [+ "fusion_demo",+ "FIRST-TIME-USER DEMO in one verb - the thing to run when someone new wants to SEE what this bridge does (HD's installer calls this). Takes them from nothing to a real board: launches Fusion, FINISHES the Autodesk sign-in - it OPENS the sign-in in the user's NATIVE browser IN THE BACKGROUND (never interrupting their work) and returns signinWhere/signinProfile/signinSession so you can tell them exactly where it is waiting, then offer three paths: they finish it, you foreground it, or (with their OK) you drive it. Native browser via ABE/nbrowser_* because that profile is already signed into Autodesk - never pup, which is anonymous, sets up APS cloud search (or explains it if declined) and runs a LIVE sample search so they see 2-second results, then opens an electronics PROJECT and walks SCHEMATIC -> 2D BOARD -> 3D BOARD, screenshotting each view to show them. STAGED + RESUMABLE: every call advances as far as it safely can and returns stage/done/narrate/screenshots plus a _hint with the exact next action; keep calling it until done:true. NEVER leave a first-time user parked on the sign-in screen - that is the failure this verb exists to prevent. See the 'fusion-demo' skill. TOUR MODE: pass {mode:'tour'} for the ASYNC guided ELECTRONICS tour (John, 2026-09-04: Adom is an electronics prototyping company, so the tour shows electronics, never a mechanical part): eight beats over the bundled sample part - the library, the symbol, the footprint, the 3D chip minted from its STEP and bound into the user's hub, then a REAL board from the user's hub (BQ25792, the Adom charger; args.board or args.boardUrn override) in schematic, 2D board and 3D board, falling back to a generated solo board only when the hub has none, and a cloud search; multipart libraries are mentioned in the narration, never shown (a bind is minutes per part). Captions are 32px on one line so they never cover the remote. ab's glass remote (desktop_demo_panel id fusion-tour) drives it: play, pause, next, back, mute, unmute, X = stop, with an instant loopback callback plus a poll backstop, one FIFO for the panel and fusion_demo_control, an ack caption per press; captions narrate every beat and pre-rendered narration audio plays locally (mute is session-only, unmute replays the beat). Every beat is measured before it moves (front, title, painted, stable) and then moves (2D zoom through the add-in, 3D orbit and zoom through Fusion's camera, verified by capture). Returns {demoId, estimatedSec, steps} at once; fusion_demo_progress {demoId} carries step, beatIndex/beatCount, percent, paused, muted, stopping, panel, presses[], captions[], per-step verified/placed/foregrounded/motion, shots[] (one evidence frame per beat), windowsRestored and tourDocsClosed. Fusion is placed on 80% of the primary work area for the show and restored at the end. Pass legacy:true for the previous step-list tour.",+ {+ "query": "optional str (design to demo; else picked from APS search)",+ "stage": "optional str ('skip_aps' to proceed without cloud search)",+ "mode": "optional str ('tour' = the async showcase; poll fusion_demo_progress {demoId})",+ "preset": "optional str ('electronics' = library import, symbol, footprint, 3D chip, ganged component view, schematic, 2D board, 3D board - the eight-stop showcase; omit for the full tour incl. Data Hub, APS, MCP, exports)",+ "remote": "optional bool (tour mode: show ab's floaty glass PLAY/PAUSE/NEXT/BACK/STOP panel on the desktop; its presses drive the same transport flags as fusion_demo_control, so the dashboard buttons and the remote can be mixed)",+ "captions": "optional bool (default true: one desktop caption per stop)",+ "foreground": "optional bool (default false: background envelope, never steals focus)"+ },+ {+ "stage": "str",+ "done": "bool",+ "narrate": "str",+ "screenshots": "[{label,path}]",+ "steps": "[str]",+ "apsSampleSearch": "[{name,project}]"+ },+ 240,+ "fusion_demo",+ true,+ {}+ ],+ [+ "fusion_aps_status",+ "APS state: configured, signed in, token live, never-charge meter. When configured:false the hint sends you to your org's shared app ID on the wiki (adom-wiki settings get <org> autodesk-aps) before anything else; the fusion-aps-org-setup skill covers new boxes and first-time orgs.",+ {},+ {+ "configured": "bool",+ "signedIn": "bool",+ "neverCharge": "bool"+ },+ 20,+ null,+ false,+ {}+ ],+ [+ "fusion_aps_set_client_id",+ "Set the org's APS (PKCE) client id used for cloud search. Get it from your org's members-only wiki settings: adom-wiki settings get <org> autodesk-aps (never from another machine's config file). When the org has none yet, the reply's hint gives the adom-wiki settings set command that shares it, so every other box adopts it in two calls (fusion-aps-org-setup skill). Public identifier, no secret.",+ {+ "clientId": "required str"+ },+ {+ "success": "bool"+ },+ 20,+ null,+ false,+ {+ "clientId": "D5nn...EPAq"+ }+ ],+ [+ "fusion_aps_signin",+ "Open the Autodesk sign-in in the REMEMBERED browser+profile (not the OS default); a background listener captures the token. Pass {exe,profileDir,name} to use+remember a specific browser, or {allowDefaultBrowser:true} to fall back to the OS default. If nothing is remembered, returns needsExtensionOpen so the caller opens authUrl in the user's real browser via nbrowser_open_window.",+ {+ "exe": "optional str (browser binary to launch+remember)",+ "profileDir": "optional str (e.g. 'Default','Profile 2')",+ "name": "optional str",+ "allowDefaultBrowser": "optional bool"+ },+ {+ "success": "bool",+ "authUrl": "str",+ "openedVia": "str",+ "needsExtensionOpen": "bool"+ },+ 30,+ "fusion_aps_status",+ false,+ {}+ ],+ [+ "fusion_aps_set_browser",+ "Remember the browser+profile that authed to Autodesk so every later sign-in reuses it (power users have many browsers/profiles; the OS default is usually the wrong one). Call after a driven sign-in succeeds.",+ {+ "name": "optional str",+ "exe": "str (browser binary) OR how:'extension'",+ "profileDir": "optional str",+ "how": "optional 'extension'|'launch'"+ },+ {+ "success": "bool",+ "browser": "{name,exe,profileDir}"+ },+ 10,+ null,+ false,+ {+ "name": "Edge",+ "exe": "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe",+ "profileDir": "Default"+ }+ ],+ [+ "fusion_aps_get_browser",+ "Show the remembered Autodesk sign-in browser (None until set).",+ {},+ {+ "success": "bool",+ "browser": "{name,exe,profileDir}|null"+ },+ 10,+ null,+ false,+ {}+ ],+ [+ "fusion_aps_forget_browser",+ "Forget the remembered Autodesk sign-in browser (re-detect next time).",+ {},+ {+ "success": "bool",+ "cleared": "bool"+ },+ 10,+ null,+ false,+ {}+ ],+ [+ "fusion_aps_search",+ "Server-indexed search across the whole team hub: about 20-30 s hub-wide, a few seconds with projectId (not a 30-min folder walk). Budget 120 s. A ZERO from the server index is not absence: the reply then carries data.fallback (a name scan of the newest 400 items), data.completeness, and a hint to fusion_aps_browse a known sibling's folder (issue #85).",+ {+ "query": "required str",+ "limit": "optional int (default 50)",+ "hubId": "optional str",+ "projectId": "optional str"+ },+ {+ "count": "int",+ "results": "[{name,id,projectName,lastModified}]"+ },+ 120,+ null,+ false,+ {+ "query": "Molecule",+ "limit": 10+ }+ ],+ [+ "fusion_aps_open",+ "Find a cloud design by name and open it in Fusion (any folder depth). Fire-and-poll.",+ {+ "query": "required str",+ "wait": "optional bool"+ },+ {+ "opening": "bool",+ "match": "{name}",+ "statusVerb": "str"+ },+ 60,+ {+ "$statusDefault": true+ },+ true,+ {+ "query": "BME690 Molecule"+ }+ ],+ [+ "fusion_open_by_urn",+ "Open a cloud ELECTRONICS DESIGN by URN. PCB/ELECTRONICS NAV RULE: a board is NOT a standalone file - the schematic, 2D board and 3D board are VIEWS inside ONE electronics DESIGN. Open the DESIGN document first (fusion_open_cloud_file or fusion_open_by_urn), THEN switch to its schematic and its 2D board (fusion_show_2d_board) and 3D board (fusion_show_3d_board). A Select-Electronics-Design-File picker IS that design list of its schematic + board. An EMPTY 2D board usually means you opened a derivative or the wrong file, or it is out of sync - reopen the parent electronics DESIGN and switch to its board view; do NOT open a .brd or .sch as a standalone file.",+ {+ "urn": "required str",+ "intent": "optional \"mechanical\" | \"electronics\": what you meant to open. A DesignProductType is every mechanical design; the STOP-WRONG-FILE hint now fires only for the 3D leaf of an electronics chain (by name, or intent electronics); intent mechanical confirms the open (issue #86)"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {+ "urn": "urn:adsk.wipprod:fs.file:vf.xxxx?version=1"+ }+ ],+ [+ "fusion_aps_browse",+ "Browse hubs/projects/folders without launching Fusion.",+ {+ "hubId": "optional str",+ "projectId": "optional str",+ "folderId": "optional str"+ },+ {+ "items": "[{name,type,id}]"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_aps_recent",+ "Most-recently-modified designs across the team hub, newest first.",+ {+ "limit": "optional int (default 25)"+ },+ {+ "count": "int",+ "results": "[...]"+ },+ 120,+ null,+ false,+ {+ "limit": 25+ }+ ],+ [+ "fusion_aps_file_info",+ "Version history + who/when/size for a file (tip + recent versions).",+ {+ "query": "str OR projectId+urn"+ },+ {+ "versionCount": "int",+ "tip": "{...}",+ "versions": "[...]"+ },+ 40,+ null,+ false,+ {+ "query": "BME690 Molecule"+ }+ ],+ [+ "fusion_aps_versions",+ "Full (uncapped) version history of a file.",+ {+ "query": "str OR projectId+urn"+ },+ {+ "versionCount": "int",+ "versions": "[...]"+ },+ 40,+ null,+ false,+ {+ "query": "BME690 Molecule"+ }+ ],+ [+ "fusion_aps_download",+ "Download a cloud file to the local machine (no Fusion needed).",+ {+ "query": "str OR projectId+urn",+ "saveDir": "optional str",+ "fileName": "optional str"+ },+ {+ "path": "str",+ "bytes": "int"+ },+ 90,+ null,+ false,+ {+ "query": "BME690 Molecule"+ }+ ],+ [+ "fusion_aps_upload",+ "Upload a local file as a NEW cloud file (free Data Management; needs data:write scope). \u26d4 FOLDER HYGIENE: NEVER pass a project ROOT folderId - the bridge REFUSES it (refused_root_upload). Loose files in a shared root clutter the team's cloud. Create/choose a real subfolder first (fusion_aps_create_folder under an 'Adom AI Workspace' folder), or just use fusion_make_3d_package / fusion_build_library_3d which auto-target a non-root workspace. To RELOCATE an existing file, MOVE it (preserves its urn) - do NOT delete + re-upload (mints a new urn, breaks 3D bindings). See the fusion-cloud-hygiene skill.",+ {+ "projectId": "required str",+ "folderId": "required str (NON-ROOT subfolder)",+ "localPath": "required str",+ "fileName": "optional str"+ },+ {+ "itemUrn": "str",+ "bytes": "int"+ },+ 90,+ null,+ false,+ {+ "projectId": "a.YnVz...",+ "folderId": "urn:...",+ "localPath": "C:/x.f3d"+ }+ ],+ [+ "fusion_aps_create_folder",+ "Create a subfolder in a project (free; needs data:create scope). Use this to make an 'Adom AI Workspace' folder + per-task subfolders so the bridge never dumps loose files in the shared project root. See fusion-cloud-hygiene.",+ {+ "projectId": "required str",+ "parentFolderId": "required str",+ "name": "required str"+ },+ {+ "folderId": "str"+ },+ 50,+ null,+ false,+ {+ "projectId": "a.YnVz...",+ "parentFolderId": "urn:...",+ "name": "Adom AI Workspace"+ }+ ],+ [+ "fusion_aps_get",+ "Raw authenticated GET against a free APS path (dev/verify helper).",+ {+ "path": "required str"+ },+ {+ "status": "int",+ "body": "obj"+ },+ 40,+ null,+ false,+ {+ "path": "/project/v1/hubs"+ }+ ],+ [+ "fusion_walk_cloud_tree",+ "\u26d4 DISABLED (returns an error): the in-app add-in walk took 30+ min and CRASHED Fusion (WinError 10054). It is hard-blocked in the bridge. Use fusion_aps_search / fusion_aps_open. See the 'fusion-aps-search' skill.",+ {},+ {+ "disabled": "bool"+ },+ 15,+ null,+ false,+ {}+ ],+ [+ "fusion_search_cloud_files",+ "\u26d4 DISABLED (returns an error): the in-app add-in search took 30+ min and CRASHED Fusion (WinError 10054). It is hard-blocked in the bridge. Use fusion_aps_search {query} \u2014 server-indexed, seconds, no Fusion. See the 'fusion-aps-search' skill.",+ {+ "query": "required str"+ },+ {+ "disabled": "bool"+ },+ 15,+ null,+ false,+ {+ "query": "Molecule"+ }+ ],+ [+ "fusion_show_schematic",+ "Switch the OPEN electronics design to its SCHEMATIC view (the symmetric partner of fusion_show_2d_board / fusion_show_3d_board, via Fusion's SwitchSchDocCmd). A VIEW of the project, not a standalone file. Drive it for demos with fusion_electron_zoom / _pan / _select.",+ {+ "documentName": "optional str - the open document to show; the bridge activates it first (1.10.28). Pass it whenever more than one tab is open (a board plus its library is the usual pair); without it the verb acts on the ACTIVE document and answers not_an_electronics_design with openDocuments when a library or 3D design is in front",+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30)."+ },+ {+ "success": "bool",+ "activeWorkspace": "str",+ "productType": "str"+ },+ 70,+ null,+ true,+ {}+ ],+ [+ "fusion_show_2d_board",+ "Switch the OPEN electronics design to its 2D PCB Editor (board layout) view. This is a VIEW of the project, not a file to open standalone - if the board is empty, you opened a child/derivative instead of the EcadDesignProductType PROJECT; reopen the project. Drive the view with fusion_electron_run WINDOW commands.",+ {+ "documentName": "optional str - the open document to show; the bridge activates it first (1.10.28). Pass it whenever more than one tab is open (a board plus its library is the usual pair); without it the verb acts on the ACTIVE document and answers not_an_electronics_design with openDocuments when a library or 3D design is in front",+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30)."+ },+ {+ "activeWorkspace": "str"+ },+ 70,+ null,+ true,+ {}+ ],+ [+ "fusion_show_3d_board",+ "Switch the OPEN electronics design to its 3D PCB view (populated board). A VIEW of the project, not a standalone file. Orbit it for demos via fusion_run_modeling_script (app.activeViewport.camera + vp.refresh()).",+ {+ "documentName": "optional str - the open document to show; the bridge activates it first (1.10.28). Pass it whenever more than one tab is open (a board plus its library is the usual pair); without it the verb acts on the ACTIVE document and answers not_an_electronics_design with openDocuments when a library or 3D design is in front",+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30)."+ },+ {+ "activeWorkspace": "str",+ "screenshots": "[...]"+ },+ 70,+ null,+ true,+ {}+ ],+ [+ "fusion_open_by_urn_note",+ "(see fusion_open_by_urn)",+ {},+ {},+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_electronics_query",+ "TYPED electronics read model: rows for one of Autodesk's 49 electronics entity classes (Element, Signal, Net, Layer, Via, Smd, Wire, Pad, Part, Instance, Pin, Sheet, Package, Library, Error, Variant...) over the ACTIVE electronics document, with filters, field projection and pagination. Served by Autodesk's own MCP electronics_read when its server answers (fusion_mcp_enable turns it on), else by the board_info geometry export for Board/Element/Library/Package/Layer/Signal/Wire/Error (coordinates in mm). `source` names which. Replaces reading board_info XML by hand.",+ {+ "entity": "required str (class name, with or without the electronics. prefix)",+ "fields": "optional [str] property names to return",+ "filters": "optional [{property, op: eq|lt|gt, value}] (strings: eq only)",+ "limit": "optional int (default 100)",+ "offset": "optional int",+ "source": "optional auto|mcp|board (default auto)"+ },+ {+ "success": "bool",+ "source": "mcp|board",+ "entity": "str",+ "count": "int",+ "total": "int",+ "rows": "[dict]"+ },+ 120,+ "fusion_get_app_state",+ false,+ {+ "entity": "Element",+ "fields": [+ "name",+ "x",+ "y",+ "angle"+ ]+ }+ ],+ [+ "fusion_view",+ "FIRST-CLASS camera motion. 3D (the active Design viewport, through Fusion's own camera): fit | home | iso | top | front | right | back | left | bottom | orbit {degrees} | zoom {factor, >1 zooms in} | pan {dx,dy} | style {shaded|shaded-edges|wireframe|hidden-edges|wireframe-hidden}; smooth transitions by default. 2D (space:'2d', the active schematic, board or library editor, through Fusion's WINDOW commands): fit | zoom {factor, steps} | pan {x1,y1,x2,y2 in board mm}. The guided tour's motion runs through this verb. Verify by capture (desktop_screenshot_window before and after).",+ {+ "action": "required str",+ "space": "optional '3d' (default) | '2d'",+ "degrees": "orbit: float (default 40)",+ "factor": "zoom: float (>1 in)",+ "dx": "pan: float",+ "dy": "pan: float",+ "style": "style: str",+ "smooth": "optional bool (default true)",+ "fit": "orientations: optional bool fit after (default true)",+ "steps": "2D: frames",+ "x1": "2D pan",+ "y1": "2D pan",+ "x2": "2D pan",+ "y2": "2D pan"+ },+ {+ "action": "str",+ "space": "str",+ "data": "{result}"+ },+ 60,+ null,+ true,+ {}+ ],+ [+ "fusion_interactive",+ "Is Fusion taking input RIGHT NOW? Reads the add-in's busy flag (a long bridge command in flight), Fusion's own hasActiveJobs, and the main thread's latency on a trivial script (probeMainThread:false skips that and costs nothing). interactive:true means drive it; false means a load, a cloud open, or a bind is still running. The guided tour's narrator polls this every 1.5s and stamps fusion-busy / fusion-interactive transitions into the tour record, so a recording can be cut or sped up on them.",+ {+ "probeMainThread": "optional bool (default true)"+ },+ {+ "interactive": "bool",+ "addinUp": "bool",+ "addinBusy": "bool",+ "activeJobs": "bool|null",+ "mainThreadMs": "int|null"+ },+ 20,+ null,+ false,+ {}+ ],+ [+ "fusion_narrate",+ "Play one bundled narration clip on the box now (the guided tour's voice): dock, dashboard, or any <beat>[-a|-b] clip in resources/demo-audio. A driver speaks the dock bar and dashboard lines with it before the tour starts. Returns startedAt (epoch seconds) so a recording can be cut on it; the tour's own narration stops it when a beat begins.",+ {+ "clip": "required str (clip name without .mp3)"+ },+ {+ "clip": "str",+ "startedAt": "float",+ "file": "str"+ },+ 15,+ null,+ false,+ {}+ ],+ [+ "fusion_board_info",+ "Raw board geometry XML (copper/arcs/lines) for the open board.",+ {},+ {+ "rawXml": "str"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_alerts",+ "Fusion's OWN alert toasts, read from its log. Fusion draws error/warning toasts in CEF: they are invisible to Win32 enumeration AND to UIA, so a verb can look successful while Fusion is visibly complaining. This reads them, newest last.",+ {+ "sinceSec": "optional float (default 300)"+ },+ {+ "alerts": "[{at,text}]"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_web_signin",+ "Sign a pup browser window into an Autodesk WEB surface (library.io, the hub portal at <hub>.autodesk360.com, Autodesk Account) via Google SSO. Fusion's DESKTOP app being signed in does NOT sign these in - they are separate web sessions. NEVER guesses a credential: a missing password or a 2FA challenge comes back as a typed stop (human_credential_required / second_factor_required / google_sso_unavailable) naming the one-time command the USER runs. The password never passes through this bridge or the AI - it is stored once with ab's credential_set and filled by pup in the background.",+ {+ "url": "required str (e.g. https://library.io/)",+ "sessionId": "optional str (default autodesk-web)",+ "provider": "optional str google|password (default google)",+ "username": "optional str (for the Google account chooser)"+ },+ {+ "success": "bool",+ "errorCode": "str?",+ "url": "str",+ "steps": "[...]"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {+ "url": "https://library.io/"+ }+ ],+ [+ "fusion_managed_library_create",+ "Create a NEW managed library on library.io FROM the library in front (which must already be saved in a Fusion Hub). Drives MANAGE > LIBRARY.IO > Push, then completes Fusion's Create Managed Library dialog. PITFALL: a managed library created under one Autodesk account is NOT visible to another account until its managed FOLDER is shared on library.io - proven live, so do not assume hub membership shares it.",+ {+ "name": "optional str (defaults to the library's own name)",+ "description": "optional str"+ },+ {+ "success": "bool",+ "library": "str",+ "alerts": "[...]"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_managed_library_link",+ "Link the library IN FRONT to an existing managed library on library.io. With no name, opens Fusion's Select Managed Library picker, returns its rows as records (name/type/version/managedFolder/description) and CANCELS - a safe read-only listing of what this Autodesk account can reach. With name, selects that row and confirms. SAFETY: after linking, Fusion offers to force-update your library FROM the managed one; 'Replace Local Library' would destroy your parts, so this verb answers CANCEL by default - pass onUpdatePrompt to choose deliberately. A managed library owned by ANOTHER Autodesk account does NOT appear until its managed FOLDER is shared with this account on library.io; being in the same Fusion hub is not enough.",+ {+ "name": "optional str (exact library name from the picker; omit to list read-only)",+ "onUpdatePrompt": "optional str cancel|merge|replace (default cancel; replace OVERWRITES the local library)"+ },+ {+ "success": "bool",+ "listedOnly": "bool?",+ "managedLibraries": "[{name,type,version,managedFolder,description}]",+ "linkedTo": "str?",+ "updatePrompt": "obj?",+ "alerts": "[...]"+ },+ 180,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_managed_library_unlink",+ "Unlink the library in front from its managed library on library.io. Fusion greys this out on a library that was never linked, so a silent no-op there is expected.",+ {},+ {+ "success": "bool",+ "library": "str",+ "alerts": "[...]"+ },+ 180,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_managed_library_push",+ "Push a NEW VERSION of the library in front up to its linked managed library on library.io. Clicking the menu item alone does NOT push: Fusion raises a CEF 'Create New Version' confirmation and THAT is what creates the version, so this verb completes it and fails with confirm_missing rather than reporting a false pass. On a library that is not linked yet, Fusion offers Create Managed Library instead and this reports not_linked_yet - use fusion_managed_library_create. NOTE: Library Manager keeps showing the IMPORTED version number after a push, so the row gains an update-available badge instead of incrementing.",+ {+ "onConfirm": "optional str create|cancel (default create)"+ },+ {+ "success": "bool",+ "library": "str",+ "confirmed": "obj",+ "alerts": "[...]"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_managed_library_pull",+ "Pull the newest version FROM library.io into the linked library in front. A pull ends in ONE of two CEF dialogs and BOTH block the add-in until answered: the force-update prompt when content differs (answered MERGE by default, since pull is an explicit request for the managed content - pass onUpdatePrompt:'replace' to overwrite local parts entirely, or 'cancel' to back out), or 'Up to Date' when already current. If neither appears, nothing was pulled and this reports failure rather than a false pass - Fusion greys Pull out on a library that was never linked.",+ {+ "onUpdatePrompt": "optional str merge|replace|cancel (default merge)"+ },+ {+ "success": "bool",+ "library": "str",+ "upToDate": "bool",+ "updatePrompt": "obj?",+ "alerts": "[...]"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_library_manager",+ "Open Fusion's Library Manager and switch to one of its three tabs. Hub Libraries = libraries saved in the Fusion hub (what our bind chain produces, and what Autodesk recommends for sharing). Private Libraries = library.io managed libraries in folders THIS account belongs to. Public Libraries = library.io's public catalogue. PITFALL: the library TABLE is CEF-drawn and exposes NOTHING to UIA, so libraries[] is normally empty and that is not a failure - screenshot the returned hwnd to read the rows.",+ {+ "tab": "optional str hub|public|private (default private)"+ },+ {+ "success": "bool",+ "tab": "str",+ "hwnd": "int",+ "libraries": "[str] (usually empty - see pitfall)",+ "tableReadable": "bool"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {+ "tab": "private"+ }+ ],+ [+ "fusion_open_lbr",+ "Import an EAGLE .lbr library into Fusion's Electronics LIBRARY editor (Content Manager / Electronics Library workspace), not a PCB design. PITFALL: filePath MUST be a WINDOWS-local path (C:/...). The chip-fetcher/adom-lbr pipeline runs in the cloud container, and there is NO container-to-Windows push verb, so STAGE the .lbr onto Windows first (serve it on a proxied port + Invoke-WebRequest via shell_execute), then pass the C:/ path. PITFALL: an adom-lbr .lbr is 2D ONLY - symbol + footprint + a PLACEHOLDER 3D package; the real 3D chip is NOT attached (that needs a Fusion cloud URN). To attach the 3D, see the 'fusion-libraries' skill. Pass verify:true to round-trip-confirm Fusion parsed the deviceset, then check fusion_get_app_state (activeWorkspace 'Electronics Library').",+ {+ "filePath": "required str (.lbr WINDOWS path C:/...; stage from container first)",+ "symbolName": "optional str",+ "verify": "optional bool"+ },+ {+ "success": "bool",+ "postOpenScreenshot": "{savedTo}"+ },+ 50,+ null,+ false,+ {+ "filePath": "C:/Users/<user>/adom-lib/nRF54L15.lbr"+ }+ ],+ [+ "fusion_attach_3d_package",+ "LOW-LEVEL primitive: attaches ONE model to ONE package. Prefer fusion_create_library with parts[]. Attach a real 3D chip model to a library package, end to end: opens the .lbr (library active), runs Electron.Create3DPackage to enter the Package3DEnvironment showing the footprint, imports the STEP + auto-orients it flat on the footprint, then executes Package3DStop (FINISH). This BINDS the 3D onto the deviceset (Content Manager shows the 3D nested under the package; the Packages 'Package' column flips Placeholder->part-name). ONE desktop-side step remains: Fusion pops a modal Save dialog (an OWNED popup) - the response _hint gives the exact desktop_ui_click to confirm it. AFTER: re-grab desktop_screenshot_window and check ownedPopupCount for errors; the 3D preview LAGS a beat before showing the real chip. Both paths (filePath/modelPath) are WINDOWS paths - stage from the container first.",+ {+ "filePath": "required str (.lbr WINDOWS path C:/...)",+ "modelPath": "required str (.step WINDOWS path C:/...)",+ "packageName": "optional str"+ },+ {+ "success": "bool",+ "savePending": "bool",+ "data": "{steps}",+ "_hint": "the Save-dialog click + verify steps"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {+ "filePath": "C:/Users/<user>/adom-lib/ADS8588SIPM.fusion.lbr",+ "modelPath": "C:/Users/<user>/adom-lib/ADS8588SIPM.step",+ "packageName": "ADS8588SIPM"+ }+ ],+ [+ "fusion_install_fusion",+ "Install Fusion 360 FOR the user - downloads Autodesk's official Client Downloader and streams the free trial silently, with NO shell_execute and NO ab approval gate (runs inside the trusted bridge). Elevation-aware: --globalinstall when admin, PER-USER otherwise (a non-elevated globalinstall dies silently on UAC - learned live). Returns promptly; poll fusion_readiness (reports installing:true) until installed:true, then fusion_start. Declared as detect.installVerb so ab's bridge_readiness recommends it.",+ {},+ {+ "success": "bool",+ "installing": "bool",+ "alreadyInstalled": "bool?",+ "mode": "globalinstall|per-user",+ "statusVerb": "str"+ },+ 90,+ {+ "$statusDefault": true+ },+ true,+ {}+ ],+ [+ "fusion_generate_package",+ "Generate an IPC-7351-compliant parametric 3D package via Fusion's BUILT-IN ElectronicsPackageGenerator (EPG) - ~50 package families (chip/soic/qfn/qfp/bga/sot23/dfn/melf/ecap/crystal/headers/...), each a few seconds, ZERO GUI. Optionally LASER-ETCH a marking (MPN / '103') into the body top as REAL cut geometry (survives STEP), and export STEP in the same call - the royalty-free, license-clean path to a whole component library (our own generated output, not vendor models). Proven live: 0603 + '103' etch + STEP in ~2s.",+ {+ "type": "required str (EPG family, e.g. chip|soic|qfn|qfp|bga|sot23|dfn2|melf|ecap|crystal|header_straight - see supportedTypes in the error for the full list)",+ "params": "optional dict (generator dims in MM by default, e.g. chip: {D,E,A,L,L1}; soic: {A,A1,b,D,E,E1,e,L,DPins}; omitted keys use EPG defaults)",+ "unitsCm": "optional bool (params already EPG-native cm)",+ "etch": "optional str (marking text on the chip top: MPN / '103'; multi-line with newline, e.g. MPN+variant - laid along the LONGEST face axis)",+ "etchStyle": "optional str raised|engraved (default raised = thin WHITE positive extrude, silkscreen-style contrast; engraved = sunken cut)",+ "etchDepthMm": "optional float (marking height/depth, default 0.03)",+ "etchHeightMm": "optional float (text height; default auto-fit: top-5%-band face, 10% margin, width-aware)",+ "outputStep": "optional str (WINDOWS path; exports STEP incl. the marking)"+ },+ {+ "success": "bool",+ "bodies": "[{name,vol}]",+ "etched": "str|null",+ "stepPath": "str|null",+ "manifest": "obj (settings+why+bboxes; also written as <step>.manifest.json sidecar for marking refreshes)",+ "manifestPath": "str|null",+ "epgDir": "str"+ },+ 120,+ {+ "$statusDefault": true+ },+ true,+ {+ "type": "chip",+ "params": {+ "D": 1.6,+ "E": 0.8,+ "A": 0.45,+ "L": 0.3,+ "L1": 0.3+ },+ "etch": "103",+ "outputStep": "C:/tmp/ADOM-R0603-103.step"+ }+ ],+ [+ "fusion_make_3d_package",+ "Create a RENDERING component 3D package (FOOTPRINT + chip, aligned) for ONE part, fully programmatically with ZERO GUI dialogs. Opens the .lbr, runs Electron.Create3DPackage to load the package's footprint into a generator doc, imports the STEP onto it, orients it flat, saveAs an .f3d (skips the FINISH Save dialog + the two unbeatable 'Fusion360' CEF modals), uploads the f3d via APS, and returns an fs.file:vf wip_urn to hand-write into the library's <packages3d>. projectId/folderId default to the MAIN-project upload folder. Pass captureLabel to also get a BEFORE (footprint) + AFTER (chip placed) screenshot. PITFALL: a RAW STEP upload binds but renders NOTHING ('Thumbnail download failed') - this verb makes an f3d, which renders. Prefer fusion_build_library_3d for many parts.",+ {+ "lbrPath": "required str (.lbr WINDOWS path; its FIRST package's footprint is loaded)",+ "modelPath": "required str (.step WINDOWS path)",+ "projectId": "optional str (default MAIN-project)",+ "folderId": "optional str (default upload folder)",+ "fileName": "optional str",+ "captureLabel": "optional str (capture before/after)",+ "orient": "optional bool (default true). false = import exactly as authored: NO bounding-box reorientation and NO pin-1 rotation (1.10.8)",+ "placement": "optional {translation:[x,y,z] mm, rotation:[rx,ry,rz] deg (about X, then Y, then Z, extrinsic, about the origin), scale:1} from the manufacturer's authored transform. Bypasses every heuristic; the reply returns the applied 4x4 matrix (mm), verification (verified|mismatch), source {path, sha256, bytes} and warnings. Non-finite values, wrong shapes and any scale other than 1 are refused before Fusion is touched (invalid_placement / unsupported_scale)"+ },+ {+ "success": "bool",+ "wip_urn": "str",+ "dims_mm": "[x,y,z]",+ "f3d": "str",+ "before": "str|null",+ "after": "str|null"+ },+ 200,+ {+ "$statusDefault": true+ },+ true,+ {+ "lbrPath": "C:/tmp/newlib/R_4k7.lbr",+ "modelPath": "C:/tmp/newlib/R_4k7.step",+ "captureLabel": "R_4k7"+ }+ ],+ [+ "fusion_build_library_3d",+ "Build a RENDERING multi-part 3D library in ONE call - the whole programmatic pipeline. For each part it makes the footprint+chip f3d package (no GUI dialogs, optional before/after screenshots) and collects the wip_urn, then injects ALL bindings into the combined .lbr in one pass (no hand XML surgery) and opens the finished library once. This is the verb for a basic-parts sampler / any many-part library; it replaces the per-part make_3d_package loop + manual binding. projectId/folderId default to the MAIN-project upload folder. Each part is independent, so re-run just the failed parts if Fusion resets mid-run.",+ {+ "lbrPath": "required str (combined .lbr WINDOWS path to bind + open)",+ "parts": "required [{package, lbrPath (per-part footprint .lbr), modelPath (.step)}]",+ "outLbrPath": "optional str (default: overwrite lbrPath)",+ "capture": "optional bool (default true)",+ "projectId": "optional str",+ "folderId": "optional str",+ "openWhenDone": "optional bool (default true)"+ },+ {+ "success": "bool",+ "boundLbr": "str",+ "partsBound": "int",+ "partsTotal": "int",+ "parts": "[{package,success,wip_urn,dims_mm,error}]",+ "screenshots": "[{package,stage,path}]",+ "opened": "bool"+ },+ 1800,+ {+ "$statusDefault": true+ },+ true,+ {+ "lbrPath": "C:/tmp/newlib/AdomBasicParts2.lbr",+ "parts": [+ {+ "package": "R_4k7",+ "lbrPath": "C:/tmp/newlib/R_4k7.lbr",+ "modelPath": "C:/tmp/newlib/R_4k7.step"+ }+ ]+ }+ ],+ [+ "fusion_capture_library_views",+ "Capture the LIBRARY-EDITOR views EEs trust: the schematic SYMBOL (full pinout), the FOOTPRINT (pads + layer stack), and the COMPONENT/device view (Content Manager: symbol + the package table with the footprint<->package Mapped check + pin/pad counts). The 3D before/after shots don't show these. Requires the .lbr OPEN in the Electronics Library workspace (fusion_open_lbr first). Runs EDIT <pkg>.sym/.pac/.dev + WINDOW FIT + a background hwnd screenshot per view; returns the PNG paths on the box (C:/tmp/conduit-screenshots - pull with desktop_pull_file). EDIT uses the DEVICESET name (e.g. ESP32-S3FN8).",+ {+ "packages": "required [<deviceset name>] (or 'package': single name)",+ "views": "optional subset of ['symbol','footprint','3d','component'] (default ALL FOUR, in that assembly order - 3d opens the part's BOUND f3d (footprint + chip) by its urn, frames it, captures it and closes it unsaved; needs libraryPath; component is the ganged view last)",+ "libraryPath": "optional str (.lbr on the box; required for the 3d view, defaults to the last library opened)",+ "settle": "optional float secs after each EDIT before capture (default 1.5; raise if a shot shows the PREVIOUS part)"+ },+ {+ "success": "bool",+ "captured": "[{package,view,path,ok}]"+ },+ 300,+ {+ "$statusDefault": true+ },+ true,+ {+ "packages": [+ "ESP32-S3FN8",+ "ATSAMD51J20A-AUT"+ ]+ }+ ],+ [+ "fusion_cleanup_cloud_files",+ "PRECISELY delete a list of cloud files by lineage urn - SAFE cleanup of AI-created clutter. Deletes ONLY the exact fileIds given (never name-guessing), so it can't touch a teammate's file in a shared folder. Loops server-side. Get the ids from fusion_aps_browse (item .id). Use this to remove f3d files the bridge created. A big list takes minutes (relay may time out at ~60s while deletes continue server-side - re-browse to confirm).",+ {+ "fileIds": "required [<lineage urn>]",+ "projectName": "optional str (default active project)",+ "folderPath": "optional str (default root - where the files live)"+ },+ {+ "success": "bool",+ "deletedCount": "int",+ "failedCount": "int",+ "failed": "[{fileId,error}]"+ },+ 1800,+ {+ "$statusDefault": true+ },+ true,+ {+ "fileIds": [+ "urn:adsk.wipprod:dm.lineage:abc123"+ ],+ "projectName": "Adom"+ }+ ],+ [+ "fusion_run_modeling_script",+ "Run an adsk.fusion modeling script in the live session (sketches/extrudes/params). Free programmatic CAD.",+ {+ "script": "required str (Python using adsk; globals: adsk, app, ui, design)"+ },+ {+ "result": "obj",+ "documentName": "str"+ },+ 180,+ null,+ true,+ {+ "script": "import adsk.fusion\n# ...build geometry..."+ }+ ],+ [+ "fusion_assembly_bom",+ "Structured, kit-aware MECHANICAL bill of materials for the active Design assembly (the counterpart to the electronics-only fusion_export_bom). Recurses organizational subassemblies but counts a physical part or a purchased kit/unit ONCE, so hardware modeled inside a kit (a '... with fasteners' bracket, a bearing/pulley) is NOT double-counted the way a flat allOccurrences walk counts it. Matches Fusion's Manage -> BOM quantities. Optionally writes a CSV.",+ {+ "maxSeconds": "optional float (walk budget, default 20; the verb REFUSES fast with bom_walk_budget_exceeded + a fusion_export_bom redirect on electronics 3D PCBs instead of blocking Fusion for minutes - issue #659)",+ "treatAsUnit": "optional [str] name substrings counted as one unit (default ['with fasteners'])",+ "exclude": "optional [str] top-level name prefixes to skip",+ "includePhysicalProperties": "optional bool (adds volume_cm3/mass_kg per line)",+ "outputPath": "optional str (Windows CSV path)"+ },+ {+ "success": "bool",+ "design": "str",+ "partCount": "int",+ "totalInstances": "int",+ "parts": "[{componentName, partNumber, description, material, quantity, bodies}]"+ },+ 120,+ null,+ false,+ {+ "treatAsUnit": [+ "with fasteners"+ ],+ "includePhysicalProperties": true+ }+ ],+ [+ "fusion_physical_properties",+ "Per-component physical properties (volume cm3, mass kg, density, area, center of mass) for the active design. Reads them directly so BOM/costing tools no longer have to run getPhysicalProperties inside a modeling script. Pass names to scope to specific components.",+ {+ "names": "optional [str] component names to measure (default all)",+ "accuracy": "optional low|medium|high|veryhigh (default low)"+ },+ {+ "success": "bool",+ "count": "int",+ "properties": "{name: {volume_cm3, mass_kg, density, area_cm2, center_of_mass}}"+ },+ 120,+ null,+ false,+ {+ "accuracy": "low"+ }+ ],+ [+ "fusion_set_preference",+ "Set Fusion appearance/navigation preferences in the LIVE session - applies immediately, NO restart. Keys: theme (light/darkblue/darkgray/classic/device/dark; some builds only ship LightGray/DarkBlue/Device, failures reported per-key), invertScrollZoom (bool - mouse scroll/zoom direction), orbitScheme (fusion360/alias/inventor/solidworks/tinkercad/powermill), modelingOrientation (yup/zup), gestureNav (bool), cameraPivot (bool), lengthUnit (mm/cm/m/in/ft - active design). Per-key outcome in `applied`, resulting state in `current`.",+ {+ "theme": "optional str",+ "invertScrollZoom": "optional bool",+ "orbitScheme": "optional str",+ "modelingOrientation": "optional str",+ "gestureNav": "optional bool",+ "cameraPivot": "optional bool",+ "lengthUnit": "optional str"+ },+ {+ "applied": "obj",+ "current": "obj"+ },+ 30,+ null,+ true,+ {+ "theme": "dark"+ }+ ],+ [+ "fusion_get_preferences",+ "Read current Fusion appearance/navigation preferences (theme, activeTheme, invertScrollZoom, orbitScheme, modelingOrientation, gestureNav, cameraPivot, lengthUnit) as friendly values - the same keys fusion_set_preference accepts.",+ {},+ {+ "current": "obj"+ },+ 20,+ null,+ false,+ {}+ ],+ [+ "fusion_export_step",+ "Export the active design to STEP (needs the 3D view).",+ {+ "outputPath": "required str"+ },+ {+ "format": "str",+ "fileSizeKB": "int"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/board.step"+ }+ ],+ [+ "fusion_import_step",+ "Import a STEP/.stp (or other native-importable) file into a NEW Fusion design via the native import API. The open-electronics hints redirect .step here. (Was implemented but missing from this catalog until the verb suite's reverse-drift check caught it, 2026-08-14.)",+ {+ "filePath": "required str (WINDOWS path C:/...; stage from container first)"+ },+ {+ "success": "bool",+ "documentName": "str"+ },+ 300,+ null,+ true,+ {+ "filePath": "C:/Temp/part.step"+ }+ ],+ [+ "fusion_open_cloud_file",+ "Open a CLOUD file by name (the front door to every design flow). PCB/ELECTRONICS NAV RULE: open the electronics DESIGN document (EcadDesignProductType), never a child .brd/.sch/3D directly - then switch views with fusion_show_schematic / fusion_show_2d_board / fusion_show_3d_board. LONG-RUNNING: fire it, then poll fusion_get_app_state until activeDocument matches (cloud opens on electronics designs take 1-3 min). A crash-recovery modal can block the open - fusion_dismiss_blocking_dialogs.",+ {+ "fileName": "required str",+ "projectName": "optional str (defaults to active project)",+ "folderPath": "optional str"+ },+ {+ "success": "bool",+ "documentName": "str"+ },+ 240,+ "fusion_get_app_state",+ true,+ {+ "fileName": "BQ25792",+ "projectName": "Main"+ }+ ],+ [+ "fusion_open_design",+ "Open a LOCAL design file (routes through the add-in import). Prefer cloud flows (fusion_open_cloud_file) for team designs; this is for local .f3d/.step style files.",+ {+ "filePath": "required str (WINDOWS path)",+ "intent": "optional \"mechanical\" | \"electronics\" (see fusion_open_by_urn)"+ },+ {+ "success": "bool"+ },+ 240,+ null,+ true,+ {+ "filePath": "C:/Temp/part.f3d"+ }+ ],+ [+ "fusion_close_document",+ "Close ONE document WITHOUT the modal save dialog (save:false discards silently - the automation-safe close). Omit name to close the active document.",+ {+ "name": "optional str (default: active document)",+ "save": "optional bool default false"+ },+ {+ "success": "bool",+ "closed": "str"+ },+ 60,+ null,+ false,+ {+ "save": false+ }+ ],+ [+ "fusion_close_all_documents",+ "Close ALL open documents without save dialogs. DESTRUCTIVE to unsaved user work - confirm with the human before calling on a box you do not own. By default it SKIPS scratch 'Untitled' docs; pass closeUntitled:true to close the UNMODIFIED ones too (page issue #59: the library/bind flow left ~5 per import, 16 after three, and no caller could clear them), and force:true to also discard MODIFIED Untitled docs, which may hold real unsaved work.",+ {+ "save": "optional bool default false",+ "closeUntitled": "optional bool default false - also close UNMODIFIED Untitled scratch docs",+ "force": "optional bool default false - with closeUntitled, also discard MODIFIED Untitled docs"+ },+ {+ "success": "bool",+ "closed": "[str]",+ "wouldPrompt": "[str]|null"+ },+ 60,+ null,+ false,+ {+ "closeUntitled": true+ }+ ],+ [+ "fusion_reset_workspace",+ "Bring Fusion back to a clean slate between runs: closes named documents AND the Untitled scratch the library/bind flow leaves behind (page issue #59). Fusion always keeps ONE blank document alive, so a single remaining Untitled is correct rather than a failure. MODIFIED Untitled docs are left untouched unless force:true, because those can hold real unsaved work.",+ {+ "force": "optional bool default false - also discard MODIFIED Untitled docs"+ },+ {+ "success": "bool",+ "closedByAddin": "list",+ "untitledScratchClosed": "int",+ "remaining": "list"+ },+ 90,+ null,+ false,+ {}+ ],+ [+ "fusion_document_info",+ "Metadata for the ACTIVE document: name, product type, save state, version, parent project.",+ {},+ {+ "success": "bool",+ "name": "str",+ "productType": "str",+ "isSaved": "bool"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_execute_text_command",+ "Run a raw Fusion TEXT COMMAND (app.executeTextCommand) - the escape hatch to Fusion internals (Electron.* electronics commands included). Electron.* commands need an ELECTRONICS document context (schematic/board view active). Guard risky calls with expectDocument.",+ {+ "command": "required str",+ "expectDocument": "optional str (refuses wrong_document if the active doc does not match)"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 60,+ null,+ false,+ {+ "command": "Electron.ImmediateRepaint /full"+ }+ ],+ [+ "fusion_get_design_info",+ "Design-level summary of the active design: components, bodies, sketches, units, root name.",+ {},+ {+ "success": "bool",+ "components": "int",+ "bodies": "int"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_get_parameters",+ "All user + model parameters of the active design (name, expression, value, unit).",+ {},+ {+ "success": "bool",+ "parameters": "list"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_list_cloud_projects",+ "List the cloud PROJECTS visible to the signed-in Fusion session (hub walk - slow on big teams; prefer fusion_aps_search for finding files).",+ {},+ {+ "success": "bool",+ "projects": "list"+ },+ 120,+ null,+ true,+ {}+ ],+ [+ "fusion_list_cloud_files",+ "List files/folders in a cloud project (optionally a subfolder).",+ {+ "projectName": "optional str (defaults to active project)",+ "folderPath": "optional str"+ },+ {+ "success": "bool",+ "files": "list"+ },+ 120,+ null,+ true,+ {+ "projectName": "Main"+ }+ ],+ [+ "fusion_export_f3d",+ "Export the active design as a Fusion archive (.f3d).",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/design.f3d"+ }+ ],+ [+ "fusion_export_fbx",+ "Export to FBX mesh.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.fbx"+ }+ ],+ [+ "fusion_export_sat",+ "Export to SAT (ACIS solid).",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.sat"+ }+ ],+ [+ "fusion_export_skp",+ "Export to SketchUp (.skp).",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.skp"+ }+ ],+ [+ "fusion_show_symbol",+ "Open a schematic SYMBOL in Fusion's library editor - first-class, no hand-built EDIT strings. Pass name + libraryPath (.lbr, opened first; omit libraryPath if a library is already open), OR pass a BARE <symbol> XML fragment as symbolXml and the bridge generates a minimal wrapper library around it (deviceset + gate synthesized) so it shows in the Library Manager. Background-safe: never steals the foreground.",+ {+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30).",+ "name": "str (deviceset/symbol name; optional if symbolXml carries name=)",+ "libraryPath": "optional str (WINDOWS path .lbr)",+ "symbolXml": "optional str (bare <symbol ...>...</symbol>)",+ "foreground": "optional bool - DEFAULT IS BACKGROUND (no focus steal; response carries windowEtiquette:background). true REQUIRES foregroundReason and shows it to the user as a 3s ab caption before any focus change - only when the USER asked to watch",+ "foregroundReason": "required WITH foreground:true - a short user-facing sentence shown as the 3s caption (e.g. 'You asked to watch the 3D board build')"+ },+ {+ "success": "bool",+ "view": "str",+ "screenshot": "str path",+ "wrappedLibrary": "str (when wrapped)"+ },+ 180,+ null,+ true,+ {+ "name": "ADS8588SIPM",+ "libraryPath": "C:/Temp/lib.lbr"+ }+ ],+ [+ "fusion_show_footprint",+ "Open a FOOTPRINT (package) in Fusion's library editor. Same contract as fusion_show_symbol: name + libraryPath, or a bare <package> fragment as packageXml (wrapper library generated).",+ {+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30).",+ "name": "str",+ "libraryPath": "optional str",+ "packageXml": "optional str (bare <package ...>...</package>)",+ "foreground": "optional bool - DEFAULT IS BACKGROUND (no focus steal; response carries windowEtiquette:background). true REQUIRES foregroundReason and shows it to the user as a 3s ab caption before any focus change - only when the USER asked to watch",+ "foregroundReason": "required WITH foreground:true - a short user-facing sentence shown as the 3s caption (e.g. 'You asked to watch the 3D board build')"+ },+ {+ "success": "bool",+ "view": "str",+ "screenshot": "str path",+ "wrappedLibrary": "str (when wrapped)"+ },+ 180,+ null,+ true,+ {+ "name": "ADS8588SIPM",+ "libraryPath": "C:/Temp/lib.lbr"+ }+ ],+ [+ "fusion_show_3d_package",+ "Open the 3D CHIP view (Package3DEnvironment) for a library package - and the RELIABLE way to get a 3D model into a library: pass stepPath and it is attached AFTER the library opens (embedded <packages3d> in hand-built .lbr files is the Fusion quirk that fails; attach-after-open works). stepPath with no library/packageXml auto-generates a minimal 2-pad carrier footprint. Without stepPath it just enters the 3D view of the named package.",+ {+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30).",+ "name": "str",+ "libraryPath": "optional str (.lbr)",+ "packageXml": "optional str (bare <package> fragment)",+ "stepPath": "optional str (WINDOWS path .step to attach)",+ "foreground": "optional bool - DEFAULT IS BACKGROUND (no focus steal; response carries windowEtiquette:background). true REQUIRES foregroundReason and shows it to the user as a 3s ab caption before any focus change - only when the USER asked to watch",+ "foregroundReason": "required WITH foreground:true - a short user-facing sentence shown as the 3s caption (e.g. 'You asked to watch the 3D board build')"+ },+ {+ "success": "bool",+ "view": "str",+ "screenshot": "str path",+ "wrappedLibrary": "str"+ },+ 300,+ null,+ true,+ {+ "name": "MYCHIP",+ "stepPath": "C:/Temp/chip.step"+ }+ ],+ [+ "fusion_demo_progress",+ "Poll a running fusion_demo tour: {percent, elapsedSec, estimatedSec, step, stepLabel, done, failed, shots, shotCount, stepShot}. Poll ~1-2.5s and render a REAL progress bar. LIVE EVIDENCE (issue #30): each frame MAY carry stepShot {step, title, image} - a ~640px base64 capture the BRIDGE took at that step's completion, one per step, riding the first frame after it completes (render these during the run; the page should not guess-snap). shots[] streams too: mid-run it carries paths for every completed step; pass imagesAs:base64 + sinceShot:<count you have> to receive only NEW shots fully encoded. done:true = the full gallery (base64 by default). Finished tours are DISK-SNAPSHOTTED, so the final frame stays pollable even across a bridge respawn.",+ {+ "demoId": "required str (from fusion_demo mode:tour; omitted = the single running tour)",+ "imagesAs": "optional str paths|base64|both",+ "sinceShot": "optional int - shots you already received; response windows to the new ones"+ },+ {+ "percent": "int",+ "step": "str",+ "stepLabel": "str",+ "done": "bool",+ "shots": "list",+ "shotCount": "int",+ "stepShot": "dict|absent"+ },+ 15,+ null,+ false,+ {+ "demoId": "tour-abc123",+ "imagesAs": "base64",+ "sinceShot": 3+ }+ ],+ [+ "fusion_show_attributes",+ "Show a component's METADATA, as data and on screen. Returns the attributes of a deviceset (MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN, DATASHEET, ADOM_WIKI, per variant) read from the library file with full values, in BOTH dialects: EAGLE <technology><attribute> and Fusion's layered <att_values>/<att_set> (1.10.34; Fusion-authored libraries used to read as empty). Opens the DEVICE editor (EDIT <name>.dev: symbol, Packages table with the Mapped check, footprint and 3D previews) with a capture, then opens Fusion's own Variant Attributes table with EAGLE's ATTRIBUTE command (no positioned clicks), reads it through UI Automation, captures the dialog window and Cancels it. Nothing is left on screen. dialog:false skips the table.",+ {+ "deviceset": "required str",+ "libraryPath": "optional str (.lbr on the Fusion machine; opened first and read for the attributes; omit when the library is already the active document)",+ "capture": "optional bool (default true)",+ "dialog": "optional bool (default true): open, read, capture and close Fusion's Variant Attributes table"+ },+ {+ "success": "bool",+ "attributes": "obj (the component's metadata)",+ "screenshot": "str|null (device editor)",+ "variantAttributesDialog": "{opened, closed, title, text, screenshot}"+ },+ 120,+ {+ "$statusDefault": true+ },+ false,+ {+ "libraryPath": "C:/Users/me/Downloads/Adom_ToF.lbr",+ "deviceset": "VL53L8CX"+ }+ ],+ [+ "fusion_make_showcase_project",+ "Put a library's parts on a NEW schematic and board to SHOW THEM OFF: every deviceset in the .lbr (or the ones in devicesets[]) placed in a row on a fresh sheet and a fresh board, no nets, with the library's bound 3D urns carried across so the 3D PCB shows the real bodies. Generated as EAGLE source on the box and opened dialog-free (Document.newDesignFromLocal), so nothing touches the user's screen. This is THE verb for 'make a board with these new parts on it'; fusion_make_test_project is the one-part circuit variant. After it: fusion_show_2d_board / fusion_show_3d_board {capture:true}, fusion_schematic {action:\"show\"}, fusion_save_to_cloud. The name of each part is written on the top silkscreen under its footprint (silkLabels:false turns it off); fusion_make_test_project does the same.",+ {+ "silkLabels": "optional bool (default true): the part name on layer 21 under each footprint",+ "libraryPath": "required str (.lbr on the Fusion machine; a component page's .lbr or a merged bundle library)",+ "devicesets": "optional [str] (default: every deviceset in the library)",+ "name": "optional str document name (default <library>-showcase)"+ },+ {+ "success": "bool",+ "documentName": "str",+ "parts": "[{ref, deviceset, package, symbol}]",+ "partsPlaced": "int (read back from the board)",+ "schPath": "str",+ "brdPath": "str"+ },+ 300,+ {+ "$statusDefault": true+ },+ true,+ {+ "libraryPath": "C:/Users/me/Downloads/Adom_ToF.lbr",+ "devicesets": [+ "VL53L5CX",+ "VL53L7CX",+ "VL53L8CX"+ ]+ }+ ],+ [+ "fusion_eagle_import_status",+ "The run record of a background fusion_new_electronics_from_eagle import: stage (started | done | failed), documentName, partsExpected (elements in the .brd), partsPlaced (read back from the board), placed[], and the final result. Poll it every few seconds after the import returned its runId.",+ {+ "runId": "required str (from fusion_new_electronics_from_eagle)"+ },+ {+ "success": "bool",+ "stage": "str",+ "documentName": "str",+ "partsExpected": "int",+ "partsPlaced": "int",+ "result": "obj"+ },+ 20,+ null,+ false,+ {+ "runId": "1a2b3c"+ }+ ],+ [+ "fusion_make_test_project",+ "Create a NEW electronics test project FROM SCRATCH around a library part - the Web Control demo's PROJECT button, and the answer to 'a customer only has a component page'. Generates a minimal test circuit server-side (the part + a generated 330R series resistor with VCC/GND stubs on a small board) as real EAGLE .sch/.brd, then imports the pair as a new electronics design. NO cloud, NO sign-in, no pre-existing content. After it, fusion_show_schematic / fusion_show_2d_board / fusion_show_3d_board all work on the result. Wiring uses the deviceset's own connects (first two pins), so 2-terminal parts get a real circuit and big ICs get a structurally-valid integration proof.",+ {+ "libraryPath": "required str (WINDOWS path .lbr; stage from container first)",+ "deviceset": "optional str (defaults to the library's first deviceset)",+ "device": "optional str: the DEVICE (package variant) to place, e.g. \"-HV\" (default: the deviceset's first device)"+ },+ {+ "success": "bool",+ "schPath": "str",+ "brdPath": "str",+ "circuit": "str"+ },+ 300,+ null,+ true,+ {+ "libraryPath": "C:/Temp/IN-S42ATR.lbr"+ }+ ],+ [+ "fusion_screenshot_fusion",+ "Background PrintWindow capture of Fusion's MAIN window (largest same-title window; works occluded/bottom-of-z-order, never raises anything) or a specific dialog by hwnd. Returns fullPath/safePath (ab auto-pulls them to the caller as localPath, 1.10.37) plus the older savedTo. (Live since early versions but undescribed until 2026-08-15 - it was invisible to callers AND to the drift check.)",+ {+ "hwnd": "optional int (a dialog; default the main window)"+ },+ {+ "success": "bool",+ "fullPath": "str (auto-pulled by ab, 1.10.37)",+ "safePath": "str",+ "savedTo": "str",+ "sizeKB": "int"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_bind_library_3d",+ "LOW-LEVEL primitive: binds ONE STEP onto one deviceset. Prefer fusion_create_library with parts[] (which handles one part or many through a single path); reach for this only when you are driving a single bind deliberately. The CORRECT library in ONE call (the Library button's real bar: the 3D chip renders in the Content Manager preview): mints the part's 3D as a cloud f3d (make_3d_package), injects the wip_urn binding into the .lbr ON DISK (packages3d + package3dinstances), and reopens the library. Needs a signed-in Fusion session - the one cloud-dependent step in the wiki-to-EE circle. Autodesk's thumbnail preview lags ~2-3 min behind a fresh mint. NOTE: distinct from the older fusion_build_library_3d (multi-part batch pipeline).",+ {+ "libraryPath": "required str (WINDOWS .lbr path)",+ "stepPath": "required str (WINDOWS .step path)",+ "deviceset": "optional str (defaults to the library's first)"+ },+ {+ "success": "bool",+ "wip_urn": "str",+ "bound": "bool",+ "reopened": "bool"+ },+ 480,+ null,+ true,+ {+ "libraryPath": "C:/Temp/PART.lbr",+ "stepPath": "C:/Temp/PART.step"+ }+ ],+ [+ "fusion_show_library",+ "Eight-surfaces contract: the LIBRARY surface. libraryPath (WINDOWS .lbr) opens it; name alone handles the already-open case (symmetric with kicad_show_library). Background; returns a screenshot path.",+ {+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30).",+ "libraryPath": "optional str (WINDOWS .lbr)",+ "name": "optional str (already-open library name)"+ },+ {+ "success": "bool",+ "view": "str",+ "screenshot": "str"+ },+ 240,+ null,+ true,+ {+ "libraryPath": "C:/Temp/PART.lbr"+ }+ ],+ [+ "fusion_show_project",+ "Eight-surfaces contract: bring the PROJECT/design to its top level. No args = activate this session's generated test project (fusion_make_test_project). query = cloud design name (already-open match wins, else fire-and-poll open). urn = open_by_urn passthrough. Background; returns a screenshot path.",+ {+ "capture": "optional bool - ONE call = ONE consent: the bridge settles the surface (waits for the add-in main thread + a paint beat) and returns proof inline as shot:{title,image,thumbnailDataUrl,maxWidth} (base64 frame + a ready-to-use data: URL for BROWSER callers who cannot pull a file; set captureMaxWidth to shrink it - 320 keeps a /command body small, default 640. The bridge encodes PNG; the relay may transcode to WebP, so sniff rather than assume). Use this instead of polling fusion_state after a show - page-side settle polling costs one human consent per poll (issue #30).",+ "query": "optional str (cloud design name)",+ "urn": "optional str",+ "fileName": "alias of query"+ },+ {+ "success": "bool",+ "view": "str",+ "document": "str",+ "screenshot": "str"+ },+ 240,+ "fusion_get_app_state",+ true,+ {+ "query": "BQ25792"+ }+ ],+ [+ "fusion_set_window_sizing",+ "Read/toggle auto-sizing Fusion's WINDOW after launch (STICKY, default ON). Fusion opens at whatever geometry it last had, which after an automated launch is often a small default; the bridge grows it to ~92% of the monitor work area, centered, using SetWindowPos with NOACTIVATE (never ShowWindow/maximize) so focus is never stolen. A window the user maximized, or already sized to >=60% of the work area, is left alone. No args = read.",+ {+ "enabled": "optional bool (omit to read)"+ },+ {+ "success": "bool",+ "sizeFusionWindow": "bool"+ },+ 15,+ "fusion_state",+ false,+ {}+ ],+ [+ "fusion_set_driving_badge",+ "Read/toggle the 'Adom is driving Fusion' TASKBAR OVERLAY BADGE (STICKY per user, default ON). While the bridge drives Fusion, its Windows taskbar button wears a small Adom mark so the user knows at a glance who is in control; it sheds automatically after 5 minutes of driving-verb idle. No args = read. Turning it off clears any badge immediately.",+ {+ "enabled": "optional bool (omit to read)",+ "viewport": "optional str: \"native\" = only the frame Fusion itself renders (activeViewport.saveAsImageFile through the add-in), no window capture",+ "nativeViewport": "optional bool (default true with screenshot): also export the native viewport frame and count bodies; the reply carries nativeViewport {path, ok, bodies, productType}, geometry {bodies} (API truth, independent of pixels) and windowPixels {dominantColorFraction, blank} for the window capture. A blank window capture of a Design viewport is a known WGC artefact: trust nativeViewport, never foreground Fusion for a capture (issue #84)"+ },+ {+ "success": "bool",+ "showDrivingBadge": "bool"+ },+ 15,+ "fusion_state",+ false,+ {}+ ],+ [+ "fusion_resolve_seat_dialog",+ "Readiness EXECUTOR (Rust port, Phase 3): detect + resolve the Autodesk seat/licensing modal ('Active Sessions Exceeded' / 'Suspend Remote Session') in the background, at most 3 UIA clicks per call, screenshot-verified. Idempotent: nothing up answers clicks:0. fusion_readiness calls this itself when it sees the dialog; call it directly only when you are driving the launch by hand.",+ {+ "maxClicks": "optional int (default 3)"+ },+ {+ "clicks": "int",+ "resolved": "bool"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_apply_fusion_update",+ "Readiness EXECUTOR (Rust port, Phase 3): click Fusion's update offer IN THE BACKGROUND when auto-update is on (sticky pref; fusion_set_auto_update). Never the exit-class buttons while a host op is active. Answers {applied, button, why}.",+ {},+ {+ "applied": "bool",+ "button": "str|null",+ "why": "str"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_set_seat_takeover",+ "Read/toggle the mid-session Autodesk seat-takeover sweep (STICKY per user, default ON). When Autodesk pops 'Active Sessions Exceeded' mid-session, the bridge clicks Continue through BOTH dialogs in the background: this machine takes the seat, the other machine's Fusion suspends RESUMABLY, the user gets one toast. No args = read current value. Gates only the passive sweep - a verb-driven fusion_start still grabs the seat (the user asked for Fusion, so the seat is implied).",+ {+ "enabled": "optional bool (omit to read)"+ },+ {+ "success": "bool",+ "autoTakeOverSeat": "bool"+ },+ 15,+ "fusion_readiness",+ false,+ {}+ ],+ [+ "fusion_state",+ "The RENDER-ME verb (kicad_state parity, issues #28/#30): running + window + dialog + busy state PLUS a fresh background screenshot of whatever Fusion is showing - the one verb that makes every background fusion_show_* result visible. SERVER-SIDE ONLY by design: it answers even while the add-in main thread is busy or wedged (activeDocument is best-effort with a short budget and skipped when busy). blockingDialogs carries the CLASSIFIED modal list (cause + resolution). imageAs:base64 inlines the PNG (auto-refused over 4MB - pull the screenshot path via pull_file instead).",+ {+ "screenshot": "optional bool (default true)",+ "imageAs": "optional str path|base64 (default path)"+ },+ {+ "success": "bool",+ "running": "bool",+ "activeDocument": "str",+ "mainThreadBusy": "dict|null",+ "blockingDialogs": "list",+ "focusEvents": "list - the QUIETNESS AUDIT LOG (SDK canonical): every time this bridge took the user's foreground, or refused a bare foreground:true, as {at, verb, outcome: foreground|refused, reason}. Audit how quiet the bridge actually was instead of trusting that it was.",+ "timings": "dict - measured launch history on THIS machine (p50/p90 per phase, cold vs warm)",+ "screenshot": "str path",+ "screenshotBase64": "str (imageAs:base64 only)"+ },+ 60,+ null,+ false,+ {}+ ],+ [+ "fusion_export_iges",+ "Export to IGES.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/board.iges"+ }+ ],+ [+ "fusion_export_stl",+ "Export to STL mesh.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.stl"+ }+ ],+ [+ "fusion_export_3mf",+ "Export to 3MF mesh.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.3mf"+ }+ ],+ [+ "fusion_export_usdz",+ "Export to USDZ (AR / Hydrogen 3D).",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.usdz"+ }+ ],+ [+ "fusion_export_optimized_glb",+ "Fusion board -> wiki-grade optimized GLB. Exports STEP (+ optional silkscreen) and submits it to service-step2glb molecule mode (anchor to MP pins + silk bake + gold pins + join/weld/prune + Draco): ~465KB/~31 draw calls vs a raw ~16MB/~25000 that halts the viewer. Bounded-waits `wait`s (default 90); small boards return complete, big boards return {pending, jobId} - finish with fusion_fetch_optimized_glb. Use for a component page's component.parts.model_3d. STACKUP RULE (John 2026-07-15, see pcb-stackup skill): board bbox = the FR4 body, NEVER the whole assembly (components overhang edges + tower above); each overlay goes at ITS layer's z (copper at FR4-top, silk above mask); copper traces are REAL 35um 3D bodies colored like the FR4 - recolor them + translucent mask in the RAW GLB before optimizing to make routing visible; put the measured stackup table on the board's wiki page. PUBLISH EVERYTHING: a board's wiki page repo must carry EVERY exportable design file (.f3d/.step/.usdz/EAGLE .brd+.sch/Fusion .fbrd+.fsch/gerbers/BOM/CPL/GLBs/renders), not just the 3D - the page exists to share the design.",+ {+ "outputPath": "required str (.glb)",+ "silkscreen": "bool default true",+ "pin": "str medium|large default medium",+ "wait": "int seconds default 15 (keep under the ~60s relay timeout; re-call fetch until complete)",+ "async": "bool - RECOMMENDED true: fires the whole export+optimize pipeline in the background and returns {exportId} instantly (the sync form can outlive the relay window on a cold Fusion session); poll fusion_fetch_optimized_glb {exportId}"+ },+ {+ "glbPath": "str",+ "jobId": "str",+ "pending": "bool",+ "meshesAfter": "int",+ "sizeBytes": "int",+ "moleculeAnchored": "bool",+ "silkscreenApplied": "bool"+ },+ 200,+ null,+ true,+ {+ "outputPath": "C:/out/board.glb"+ }+ ],+ [+ "fusion_fetch_optimized_glb",+ "Finish a fusion_export_optimized_glb job: bounded-poll the optimizer by jobId and write the GLB to outputPath when complete. Re-call until status=complete (big boards tessellate a few minutes). No Fusion needed.",+ {+ "jobId": "str (service job form)",+ "exportId": "str (async form from export_optimized_glb async:true - returns {phase, done, glbPath} instantly per poll)",+ "outputPath": "str (.glb)",+ "wait": "int seconds default 15 (keep under the ~60s relay timeout; re-call fetch until complete)"+ },+ {+ "glbPath": "str",+ "status": "str",+ "pending": "bool",+ "sizeBytes": "int"+ },+ 150,+ null,+ false,+ {+ "jobId": "abc123",+ "outputPath": "C:/out/board.glb"+ }+ ],+ [+ "fusion_board_stackup",+ "Read a board's PHYSICAL fabrication stackup (see the pcb-stackup skill): copper layer count + copper/dielectric thicknesses from the EAGLE design rules (layerSetup/mtCopper/mtIsolate) plus the measured FR4 extent. A PCB is Cu/prepreg/Cu/core/.../Cu - the FR4 is NOT one slab. Use to build the stackup table + real-thickness exploded 3D view, and put a stackup table on every exported board's wiki page.",+ {},+ {+ "layerSetup": "str",+ "copperLayers": "list",+ "copperCount": "int",+ "copperThickness_mm": "list",+ "dielectricBonds": "list (prepreg/core order)",+ "fr4": "{x_mm,y_mm,dielectric_mm}"+ },+ 200,+ null,+ true,+ {}+ ],+ [+ "fusion_export_obj",+ "Export to OBJ mesh.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/out/part.obj"+ }+ ],+ [+ "fusion_export_dxf",+ "Export 2D DXF.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 120,+ null,+ true,+ {+ "outputPath": "C:/out/sketch.dxf"+ }+ ],+ [+ "fusion_export_dwg",+ "Export 2D DWG.",+ {+ "outputPath": "required str"+ },+ {+ "format": "str"+ },+ 120,+ null,+ true,+ {+ "outputPath": "C:/out/sketch.dwg"+ }+ ],+ [+ "fusion_export_gerbers",+ "Run the bundled JLCPCB CAM job (auto 2/4-layer) to produce the gerber + drill ZIP.",+ {+ "outputDir": "optional str (default C:/tmp/adom-gerbers)"+ },+ {+ "fileCount": "int",+ "files": "[{name,size}]",+ "zipPath": "str"+ },+ 180,+ null,+ true,+ {+ "outputDir": "C:/tmp/jlc"+ }+ ],+ [+ "fusion_export_bom",+ "Export a Bill of Materials CSV (grouped by value+package) from the open board.",+ {+ "outputPath": "optional str",+ "grouped": "optional bool (default true)"+ },+ {+ "componentCount": "int",+ "grouped": "bool"+ },+ 60,+ null,+ false,+ {+ "outputPath": "C:/tmp/bom.csv"+ }+ ],+ [+ "fusion_export_cpl",+ "Export the Component Placement List (pick-and-place) CSV.",+ {+ "outputPath": "optional str",+ "side": "optional str (all|top|bottom)"+ },+ {+ "topCount": "int",+ "bottomCount": "int"+ },+ 60,+ null,+ false,+ {+ "outputPath": "C:/tmp/cpl.csv"+ }+ ],+ [+ "fusion_set_design_rules",+ "Load a FAB's design rules (DRC) into the open board. The rule packs live on the wiki page adom/pcb-design-rules (JLCPCB, PCBWay, OSH Park, Seeed, Eurocircuits, Aisler, Elecrow, Advanced Circuits, Sierra, MacroFab, NextPCB, ALLPCB and 3rd party fab; one .edru per vendor/process/layer count, every number citing the vendor's own capabilities page): the bridge fetches the pack, stages it on the box, and the add-in runs `drc load`. {action:'list'} answers with every (fab, process, layers) row so you can offer the user a real choice; no fab means the bundled 3rd party fab rules for the board's layer count (what ab's removed fusion_apply_3rdpartyfab_rules did); druPath loads an .edru already on the Fusion machine; druText/druBase64 loads one that exists only on your side. Layers auto-detects from the open board. ALWAYS confirm with fusion_alerts afterwards: a refused file is an in-canvas toast, never a dialog.",+ {+ "fab": "optional str vendorSlug (jlcpcb|pcbway|osh-park|seeed-fusion|eurocircuits|aisler|elecrow|advanced-circuits-4pcb|sierra-circuits|macrofab|nextpcb|allpcb|adom-3rdpartyfab)",+ "process": "optional str (the vendor's tier: standard|advanced|proto|enig|hasl|...; default standard)",+ "layers": "optional str (auto|2|4|6)",+ "druPath": "optional str .edru/.dru ALREADY on the Fusion machine, loaded as-is",+ "druText": "optional str: the whole .edru/.dru file as text, for rules that exist only on YOUR side (a container). The bridge stages it on the box and loads it (1.10.37; replaces ab's removed fusion_load_design_rules)",+ "druBase64": "optional str: the same, base64-encoded",+ "druName": "optional str: file name for the staged copy",+ "action": "optional str (apply|list|export|show)"+ },+ {+ "activeWorkspace": "str",+ "description": "str",+ "pack": "dict {fab, vendor, process, layers, file, record}"+ },+ 90,+ null,+ false,+ {+ "fab": "jlcpcb",+ "layers": "2"+ }+ ],+ [+ "fusion_detect_layers",+ "Detect 2-layer vs 4-layer board (ULP + CAM comparison).",+ {},+ {+ "layerCount": "int",+ "copperLayers": "[int]"+ },+ 90,+ null,+ false,+ {}+ ],+ [+ "fusion_dismiss_blocking_dialogs",+ "Detect + classify (and optionally dismiss) blocking Fusion dialogs. Answers every one with the safe button (No/Cancel via WM_CLOSE, never Yes, never focus-stolen). {categories:[...]} narrows the sweep to those categories (e.g. [\"crash_report\"], the launch janitor's scope).",+ {+ "categories": "optional [str] dialog categories to act on (default: all blocking dialogs)"+ },+ {+ "dialogs": "[...]",+ "dismissed": "[{title, category, answeredWith, closed}]",+ "count": "int"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_electron_run",+ "Run an EAGLE/Electron command in the open board (the generic extension point, e.g. RUN <ulp>).",+ {+ "command": "required str"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 90,+ null,+ false,+ {+ "command": "set confirm yes;RUN 'C:/tmp/jlcpcb_smta_exporter.ulp' 'C:/tmp/jlc'"+ }+ ],+ [+ "fusion_electron_zoom",+ "Smoothly ZOOM the schematic/2D board for a recording (the whole motion is one call). factor>1 zooms in, <1 out; or fit:true. The loop runs in the add-in with a repaint per frame.",+ {+ "factor": "float (default 2.0)",+ "fit": "optional bool",+ "steps": "optional int (default 16)",+ "frameDelayMs": "optional int (default 35)"+ },+ {+ "success": "bool",+ "output": "str"+ },+ 60,+ null,+ true,+ {+ "factor": 3,+ "steps": 20+ }+ ],+ [+ "fusion_electron_pan",+ "Smoothly PAN + zoom the view to frame a board-coordinate box (mm; get part positions from fusion_board_info). Animates from where the view last was.",+ {+ "x1": "float",+ "y1": "float",+ "x2": "float",+ "y2": "float",+ "steps": "optional int (default 16)",+ "frameDelayMs": "optional int (default 35)"+ },+ {+ "success": "bool",+ "output": "str",+ "box": "[...]"+ },+ 60,+ null,+ true,+ {+ "x1": 0,+ "y1": 0,+ "x2": 10,+ "y2": 8+ }+ ],+ [+ "fusion_electron_select",+ "SELECT a part (by reference designator, or x/y board mm) and surface its properties - the way clicking a part reveals the properties panel. Great for showing life in a recording.",+ {+ "name": "str (refdes, e.g. R1)",+ "x": "optional float",+ "y": "optional float",+ "properties": "optional bool (default true)"+ },+ {+ "success": "bool",+ "output": "str",+ "deviceInfo": "str"+ },+ 30,+ null,+ true,+ {+ "name": "U1"+ }+ ],+ [+ "fusion_prove_result",+ "POLL a background run started by fusion_create_library or the detached fusion_build_library_3d. Returns stage + stageLabel, plan[] with measured per-stage estimates, stagesDone, percent, etaSec, confidence, and evidence[] filling in AS EACH ARTIFACT LANDS (symbol -> footprint -> 3d -> ganged). For a 3D build it carries per-part progress (minting X (3/7)), partsDone/partsTotal and parts[] with each wip_urn. stage:done only means the chain FINISHED - the top-level verdict (proven/not_proven) is the score, and a run that captured zero frames lands stage:failed with blocked_by_dialog (carrying the dialog text) or no_evidence_captured rather than reporting done. Pass inlineFrames:true on the final fetch for base64 thumbnails a browser can render. restarts[] {at, why, kind} lists any restart the chain performed (only with allowRestart). prove.planned / prove.skipped say whether evidence frames were captured and why (AI threads bind only by default).",+ {+ "runId": "optional str (omit for the latest run)",+ "inlineFrames": "optional bool",+ "shots": "optional int",+ "sinceShot": "optional int"+ },+ {+ "stage": "str",+ "verdict": "str",+ "evidence": "[]",+ "percent": "float",+ "etaSec": "float"+ },+ 20,+ null,+ true,+ {+ "runId": "a3f1c2d4e5b6"+ }+ ],+ [+ "fusion_cancel_run",+ "STOP a library import that is in flight (fusion_install_library_bundle / fusion_create_library) - the user's escape hatch from a long run, wired to a Cancel button in web control. Cooperative, not a kill: the run finishes the part it is on (a STEP import cannot be interrupted mid-command without leaving a half-made design, up to ~60s), keeps every 3D package already minted and binds them into the library, closes its scratch documents, and leaves the library open in Fusion (not saved to the cloud). The run then reports stage:cancelled, verdict:cancelled, errorCode cancelled_by_user, cancelledAt (which stage) and how many parts were done, on the same fusion_prove_result poll the caller already makes; cancelRequested:true shows on the very next poll before the boundary is reached. Omit runId to cancel the latest run still in flight. Idempotent; a run that already ended answers alreadyFinished.",+ {+ "runId": "optional str (omit for the latest run in flight)"+ },+ {+ "cancelRequested": "bool",+ "runId": "str",+ "stage": "str at the time of the request",+ "statusVerb": "fusion_prove_result"+ },+ 10,+ "fusion_prove_result",+ true,+ {+ "runId": "a3f1c2d4e5b6"+ }+ ],+ [+ "fusion_addin_status",+ "Is the AdomBridge add-in loaded and answering inside Fusion? Reports addinReady, port and version, plus busy when a long command holds the main thread. If Fusion is running but this says not ready, the add-in was installed while Fusion was open - Fusion loads add-ins only at launch - so call fusion_restart_for_addin (ask the user first when one is present).",+ {},+ {+ "addinReady": "bool",+ "port": "int",+ "version": "str",+ "busy": "bool"+ },+ 15,+ null,+ true,+ {}+ ],+ [+ "fusion_activate_document",+ "Make a named open document the ACTIVE one before driving it. EDIT and most modelling verbs act on whatever is active, so in a batch with several documents open this is how you stop a verb landing in the wrong file (page issue #47). Prefer passing expectDocument on the verb itself, which fails closed instead of merely re-targeting. An electronics design's schematic, board and 3D view are separate tabs with ONE name (type unknown): the reply says so in sameNameDocuments, and fusion_show_schematic / fusion_show_2d_board / fusion_show_3d_board {documentName} reach a specific view.",+ {+ "name": "required str (document name as reported by fusion_get_app_state)"+ },+ {+ "success": "bool",+ "activeDocument": "str"+ },+ 60,+ null,+ false,+ {+ "name": "TJA1050"+ }+ ],+ [+ "fusion_action_ledger",+ "Read the append-only record of what the bridge did in the BACKGROUND on this machine - dialogs it answered, Untitled scratch docs it swept, Fusion auto-starts, add-in restarts. Survives bridge respawns (~/.adom/fusion-bridge/actions.jsonl). This is the audit trail for why something changed on the user screen.",+ {+ "limit": "optional int (default 50)"+ },+ {+ "actions": "[{at, action, detail}]"+ },+ 15,+ null,+ true,+ {+ "limit": 20+ }+ ],+ [+ "fusion_save_to_cloud",+ "Save the ACTIVE document to Autodesk cloud storage with an explicit name and destination. Dialog-free precisely because you supply what the Save box would ask for - use it before closing or restarting when a document has never been saved (fusion_close_all_documents refuses such a document with unsaved_named_document rather than discarding it).",+ {+ "name": "required str",+ "projectName": "optional str",+ "folderPath": "optional str",+ "description": "optional str"+ },+ {+ "success": "bool",+ "urn": "str"+ },+ 180,+ null,+ false,+ {+ "name": "TJA1050",+ "projectName": "Main"+ }+ ],+ [+ "fusion_take_screenshot",+ "Screenshot the Fusion window in the BACKGROUND (no focus steal, reads through occlusion). Use it to VERIFY your own work: geometry at the wrong Z, an empty view, or a Placeholder 3D body all render successfully and only a look at the pixels catches them.",+ {+ "outputPath": "optional str"+ },+ {+ "success": "bool",+ "fullPath": "str (auto-pulled by ab, 1.10.37)",+ "path": "str"+ },+ 60,+ null,+ true,+ {}+ ],+ [+ "fusion_verb_times",+ "This machine MEASURED timings per verb/stage - the same store that paces every progress bar and ETA. Read it to see whether an estimate is measured (this box has run it) or typical (still the seeded literal), and to explain a slow run.",+ {},+ {+ "stages": "{name: {count, p50, p90}}"+ },+ 15,+ null,+ true,+ {}+ ],+ [+ "fusion_library_parts",+ "Every ORDERABLE variant in a .lbr with its part numbers - offline, no Fusion needed. For an EE this is the point of the library: two variants can share ONE symbol, ONE footprint and ONE 3D body and still be different products (an AEC-Q100 automotive part vs the baseline one), and that difference lives ENTIRELY in the metadata. EAGLE spells the orderable identity as deviceset + device + technology: <device> carries the PACKAGE variant, <technology> carries the GRADE/temperature variant, and attributes hang off <technology>. Reports per-variant MPN / MANUFACTURER / MOUSER_PN / DIGIKEY_PN / LCSC_PN (the exact names this bridge's own BOM export reads), plus warnings when variants are indistinguishable, share an MPN, or a deviceset has no description. These warnings never block the library from opening - they say whether an EE could actually order from it.",+ {+ "libraryPath": "required str (also accepts lbrPath/filePath/path)"+ },+ {+ "success": "bool",+ "devicesets": "[{name, description, variants:[{fullName, device, technology, package, attributes, missing}]}]",+ "totals": "{devicesets, variants, withMpn, withDistributor}",+ "metadataOk": "bool",+ "warnings": "[]"+ },+ 15,+ null,+ true,+ {+ "libraryPath": "C:/tmp/TJA1050.lbr"+ }+ ],+ [+ "fusion_plan_library_import",+ "PRE-FLIGHT for a library import: does NO work and changes nothing. Reports whether Fusion is installed, running, or needs its add-in loaded (with a plain-language message you can show the user), plus a per-stage plan with MEASURED per-machine time estimates scaled to the number of parts you are sending - a multi-part library does one STEP import per part, which is the slowest stage, so the estimate grows with the library. Call this FIRST so the wiki can render the summary and the progress bar's steps, then run the import and poll fusion_prove_result, which reports the SAME stage names.",+ {+ "parts": "optional [{package, lbrPath, modelPath}] - the parts you intend to import (drives the estimate)",+ "stepPath": "optional single .step when not passing parts[]",+ "libraryPath": "optional .lbr for context"+ },+ {+ "success": "bool",+ "fusion": "{installed, running, addinReady, status, message}",+ "plan": "[{stage, label, estimatedSec, confidence, needsUserConsent?}]",+ "estimatedSec": "float",+ "estimatedSecIfAlreadyOpen": "float",+ "summary": "str"+ },+ 20,+ null,+ true,+ {+ "parts": [+ {+ "package": "AL8843SP-13",+ "lbrPath": "C:/tmp/al8843.lbr",+ "modelPath": "C:/tmp/al8843.step"+ }+ ]+ }+ ],+ [+ "fusion_live_feed",+ "A ~1 fps look INTO Fusion while the bridge drives it, kept as a BOX-SIDE ring buffer (~10 min). Each tick records the Fusion main window (kind:main - the video) and every owned popup over it (kind:popup - dialogs, Browser/tool panels, the Adom banner; Fusion draws these as separate windows a main capture omits), each a path on this machine tied to its tick. Drain from the container with {action:frames, since:<tick>}, read_file each path, and publish where a human looks - tools/live_feed_drain.py does exactly that into shotlog. Proof frames are NOT here: fusion_prove_result evidence[] carries kind:proof with step labels, so the three kinds are distinguishable at the source. Exists so a human can see open tabs and dialogs during boot or a restart instead of guessing.",+ {+ "action": "start|stop|status|frames",+ "intervalSec": "optional float (default 1.0)",+ "maxSec": "optional float (default 600)",+ "since": "frames only: return ticks newer than this"+ },+ {+ "success": "bool",+ "running": "bool",+ "tick": "int",+ "frames": "[{tick, kind:main|popup, path, title, at}]"+ },+ 15,+ null,+ true,+ {+ "action": "frames",+ "since": 0+ }+ ],+ [+ "fusion_restart_for_addin",+ "ASYNC: returns immediately (started:true) and restarts Fusion in the background, SAVING the user's open documents first; poll fusion_readiness until ready with the new addinVersion (a restart takes 60-120s, longer than the relay budget; pass wait:true for the old blocking form). Finish add-in setup by restarting Fusion. Call this when any verb returns errorCode addin_restart_required (the add-in was installed/updated while Fusion was already open, and Fusion only loads add-ins at launch). ASK THE USER FIRST when a human is present - the failing verb's payload carries userMessage plus openDocuments/unsavedDocuments so you can show them what is open. Refuses with unsaved_named_document rather than discarding a never-saved document.",+ {+ "save": "optional bool (default true) - save open documents before restarting"+ },+ {+ "success": "bool",+ "addinReady": "bool",+ "tookSec": "float",+ "steps": "[{step, ok}]"+ },+ 300,+ null,+ false,+ {+ "save": true+ }+ ],+ [+ "fusion_inspect_bodies",+ "GEOMETRY READ-BACK: what actually got built, in MILLIMETRES. Per body: bbox, sizeMm, volumeMm3, areaMm2, faceCount, cylindricalFaceCount, appearance, material, isVisible. Use this to VERIFY your own modelling - a body at the wrong Z (a double-applied offset, a part buried inside another) renders perfectly and is INVISIBLE in a screenshot, and this work is often matte-black parts on a dark canvas where pixels are a weak check. cylindricalFaceCount is the cheap way to confirm holes were actually cut: a symmetric cut that reaches nothing fails SILENTLY with no exception. Pass worldSpace:true to resolve bodies through their occurrence transforms (assembly placement); optionally filter with occurrence. Fusion's API is centimetres - this converts for you.",+ {+ "worldSpace": "optional bool (resolve through occurrence transforms; default false = root component only)",+ "occurrence": "optional str (substring filter on occurrence name, worldSpace only)"+ },+ {+ "success": "bool",+ "units": "str (mm)",+ "bodyCount": "int",+ "documentName": "str",+ "bodies": "[{name,owner,bbox:{x,y,z},sizeMm,volumeMm3,areaMm2,faceCount,cylindricalFaceCount,appearance,material,isVisible}]"+ },+ 130,+ {+ "$statusDefault": true+ },+ false,+ {+ "worldSpace": true+ }+ ],+ [+ "fusion_uninstall",+ "CASCADE CLEANUP, called by ab's bridge_uninstall BEFORE this bridge's cache is deleted (ab 2.0.35+). Removes the artifacts this bridge planted OUTSIDE its cache: the Fusion ADD-IN in Autodesk's AddIns directories (all three historical locations), plus this bridge's prefs (~/.adom/fusion-bridge) and APS OAuth tokens (~/.adom/fusion-aps). This matters more here than for most bridges: a stale AdomBridge add-in keeps loading on every Fusion launch and binding its port long after the bridge is gone. Fusion itself is never touched. Pass dryRun:true to see exactly what would be removed. If Fusion is RUNNING it holds the add-in files open, so removal may fail - the response says so and names the remedy.",+ {+ "dryRun": "optional bool (report the paths, delete nothing)",+ "cascade": "optional bool (set by ab)",+ "name": "optional str (set by ab)"+ },+ {+ "success": "bool",+ "dryRun": "bool",+ "fusionRunning": "bool",+ "removed": "[{path,kind}]",+ "failed": "[{path,kind,error}]",+ "skipped": "[{path,kind,why}]"+ },+ 60,+ null,+ false,+ {+ "dryRun": true+ }+ ],+ [+ "fusion_open_board",+ "Open a LOCAL legacy EAGLE .brd in Fusion's 2D board editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_2d_board; this verb is for a .brd that exists on the Fusion machine (push it there first). Elements with an embedded library are instantiated as placed parts; embed <packages3d> + per-element package3d_urn for real 3D bodies, then fusion_show_3d_board. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+ {+ "filePath": "required str (WINDOWS path to the .brd, C:/...; must exist on the Fusion machine)"+ },+ {+ "success": "bool",+ "filePath": "str",+ "fileType": "str",+ "activeWorkspace": "str",+ "activeDocument": "str",+ "nextSteps": "[str]",+ "postOpenCheck": "{required, steps}",+ "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"+ },+ 60,+ null,+ true,+ {+ "filePath": "C:/Temp/TJA1050.brd"+ }+ ],+ [+ "fusion_schematic",+ "START HERE for a schematic. ONE verb, three actions. action:\"open\" lands in the schematic editor from whatever names the design: fileName (+projectName) or urn or query for a CLOUD design (opens it, then switches to the schematic view), schPath for a local EAGLE .sch (its sibling .brd is imported with it so parts instantiate, unless withBoard:false; a .sch alone opens dialog-free), or filePath for a Fusion-native .fsch. action:\"create\" writes a blank EAGLE schematic on the box and opens it as a NEW local electronics design with the schematic editor active, no dialog anywhere. action:\"show\" switches the already-open design to its schematic view. Every reply says which underlying verb it used (via). Remember: a schematic is a VIEW of an electronics design, not a file of its own, which is why there is no verb called open_a_schematic_file. To put a library's parts on a NEW schematic and board for showing them off, use fusion_make_showcase_project instead.",+ {+ "action": "required str: open | create | show",+ "fileName": "cloud design name (open)",+ "projectName": "optional str (open, with fileName)",+ "urn": "cloud lineage urn (open)",+ "query": "find-and-open by name (open)",+ "schPath": "local EAGLE .sch on the Fusion machine (open)",+ "brdPath": "optional local .brd (open; defaults to the sibling)",+ "withBoard": "optional bool (open; false = schematic only, dialog-free)",+ "filePath": "local .fsch (open)",+ "name": "optional str (create)",+ "capture": "optional bool: inline screenshot proof after the switch"+ },+ {+ "success": "bool",+ "via": "str: the verb that did the work",+ "documentName": "str (create)",+ "schPath": "str (create)"+ },+ 240,+ {+ "$statusDefault": true+ },+ true,+ {+ "action": "open",+ "fileName": "BQ25792 Assembly",+ "projectName": "Main"+ }+ ],+ [+ "fusion_open_schematic",+ "Open a LOCAL legacy EAGLE .sch in Fusion's Schematic Editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_schematic; this verb is for a .sch that exists on the Fusion machine (push it there first). Drive the opened sheet with fusion_electron_run (WINDOW FIT, DISPLAY ALL). The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+ {+ "filePath": "required str (WINDOWS path to the .sch, C:/...; must exist on the Fusion machine)"+ },+ {+ "success": "bool",+ "filePath": "str",+ "fileType": "str",+ "activeWorkspace": "str",+ "activeDocument": "str",+ "nextSteps": "[str]",+ "postOpenCheck": "{required, steps}",+ "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"+ },+ 60,+ null,+ true,+ {+ "filePath": "C:/Temp/TJA1050.sch"+ }+ ],+ [+ "fusion_open_electronics",+ "Read whether an ELECTRONICS editor (schematic, board or library) is the active workspace, so you know if Electron.* text commands and fusion_electron_run will work. With filePath, and ONLY when an electronics editor is already active, it also issues Electron.run EDIT on that file; otherwise it just reports the workspace. Prefer fusion_open_schematic / fusion_open_board / fusion_open_lbr to open files. The schematic, 2D board and 3D board are views of one electronics design.",+ {+ "type": "optional str (\"status\", the default; other values are reserved)",+ "filePath": "optional str (WINDOWS path to a .sch/.brd/.lbr; only acted on when an electronics editor is already active)"+ },+ {+ "success": "bool",+ "output": "str",+ "isElectronics": "bool",+ "activeWorkspace": "str",+ "activeDocument": "{name,type}",+ "productType": "str",+ "result": "str (Electron.run output, filePath form only)"+ },+ 30,+ null,+ false,+ {}+ ],+ [+ "fusion_import_electronics",+ "Import a Fusion-NATIVE electronics file (.fsch schematic, .fbrd board, .flbr library; NOT legacy EAGLE .sch/.brd/.lbr) from the Fusion machine as a NEW local document via Document.newDesignFromLocal. The document is unsaved: fusion_save_to_cloud persists it, fusion_close_document discards it. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+ {+ "filePath": "required str (WINDOWS path to a .fsch, .fbrd or .flbr; must exist on the Fusion machine)"+ },+ {+ "success": "bool",+ "filePath": "str",+ "fileType": "str",+ "extension": "str",+ "activeWorkspace": "str",+ "activeDocument": "str",+ "nextSteps": "[str]",+ "postOpenCheck": "{required, steps}",+ "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"+ },+ 60,+ null,+ true,+ {+ "filePath": "C:/Temp/TJA1050.fbrd"+ }+ ],+ [+ "fusion_export_source",+ "Export the ACTIVE electronics document in Fusion's native source format via Document.CopyToDesktop: .fbrd (board), .fsch (schematic) or .flbr (library); the outputPath extension picks the format. The container holds whichever editor is ACTIVE, so since 1.10.35 the bridge switches to it first: the Schematic Editor for a .fsch, the PCB Editor for a .fbrd (reply carries switchedView). A .flbr still needs the library open (fusion_open_lbr). For plain EAGLE XML use fusion_export_eagle_source.",+ {+ "outputPath": "required str (WINDOWS path ending in .fsch, .fbrd or .flbr)"+ },+ {+ "success": "bool",+ "savedTo": "str",+ "sizeBytes": "int",+ "format": "str (fsch|fbrd|flbr)",+ "activeDocument": "str",+ "activeWorkspace": "str"+ },+ 60,+ null,+ false,+ {+ "outputPath": "C:/Temp/TJA1050.fbrd"+ }+ ],+ [+ "fusion_export_eagle_source",+ "Export the ACTIVE electronics document as plain EAGLE XML (.sch or .brd; the outputPath extension picks the format). Fusion's .fsch/.fbrd are ZIP containers with the EAGLE XML inside; this exports the container via Document.CopyToDesktop, extracts the inner XML, writes it to outputPath and deletes the intermediate file. The result opens in standalone EAGLE, imports into KiCad, and parses with any XML tool. The container holds whichever editor is ACTIVE, so since 1.10.35 the bridge switches to it first (Schematic Editor for .sch, PCB Editor for .brd; reply carries switchedView) instead of answering 'No .sch file found inside .fsch ZIP container' (page issue #95).",+ {+ "outputPath": "required str (WINDOWS path ending in .sch or .brd)"+ },+ {+ "success": "bool",+ "savedTo": "str",+ "sizeBytes": "int",+ "format": "str (sch|brd)",+ "innerZipEntry": "str",+ "activeDocument": "str",+ "activeWorkspace": "str"+ },+ 60,+ null,+ false,+ {+ "outputPath": "C:/Temp/TJA1050.brd"+ }+ ],+ [+ "fusion_export_lbr",+ "Export the electronics LIBRARY in front as an EAGLE .scr script via Electron.run EXPORT SCRIPT: a text dump of every symbol, package and device, the round-trip check that a library loaded correctly. Requires an electronics editor to be active (fusion_open_lbr puts the library in front). Returns the path, size and the first 2000 characters as a preview; pull the file to read the rest.",+ {+ "outputPath": "optional str (WINDOWS path for the .scr; default a temp file on the Fusion machine)"+ },+ {+ "success": "bool",+ "outputPath": "str",+ "fileSize": "int",+ "preview": "str (first 2000 chars)"+ },+ 60,+ null,+ false,+ {+ "outputPath": "C:/Temp/TJA1050.scr"+ }+ ],+ [+ "fusion_export_board_image",+ "Render the OPEN board (or schematic) to a PNG via EAGLE's EXPORT IMAGE with a layer preset: all, top_copper, bottom_copper, top_silkscreen, bottom_silkscreen, top_soldermask, bottom_soldermask, top_paste, bottom_paste, board_outline, drill, assembly_top, assembly_bottom, fabrication (or explicit EAGLE layer numbers). Requires an electronics editor to be active (fusion_show_2d_board or fusion_open_board first). Silkscreen presets fit the view to the board outline so the PNG maps onto the board bbox. Layer visibility is restored (DISPLAY ALL) afterwards. listPresets:true returns the preset table instead of exporting.",+ {+ "outputPath": "optional str (WINDOWS path; default C:/tmp/adom-board.png)",+ "dpi": "optional int (default 300, max 600)",+ "preset": "optional str (default all)",+ "layers": "optional [int] (EAGLE layer numbers; overrides preset)",+ "monochrome": "optional bool (default false)",+ "mirror": "optional bool (default false; accepted but not applied by the add-in today, the bottom-side mirror is done container-side)",+ "listPresets": "optional bool (return the presets instead of exporting)"+ },+ {+ "success": "bool",+ "outputPath": "str",+ "dpi": "int",+ "preset": "str (custom when layers given)",+ "presetDescription": "str",+ "fileSize": "int",+ "fileSizeKB": "int",+ "monochrome": "bool",+ "activeWorkspace": "str",+ "nextSteps": "[str]",+ "presets": "{name: description} (listPresets form only)"+ },+ 60,+ null,+ true,+ {+ "outputPath": "C:/Temp/board-assembly-top.png",+ "preset": "assembly_top",+ "dpi": 300+ }+ ],+ [+ "fusion_set_parameter",+ "Set one parameter's expression by name in the ACTIVE 3D Design document (user parameters first, then model parameters). MUTATES the design: the model regenerates and the result carries the post-op dialog array. Requires a Design document to be active (a 2D board or library editor refuses). Read names and current expressions with fusion_get_parameters; units must match the parameter (\"10 mm\", \"5 deg\").",+ {+ "name": "required str (parameter name as listed by fusion_get_parameters)",+ "expression": "required str (new expression, e.g. \"10 mm\")"+ },+ {+ "success": "bool",+ "name": "str",+ "expression": "str",+ "value": "float (internal units)",+ "unit": "str"+ },+ 30,+ null,+ false,+ {+ "name": "board_thickness",+ "expression": "1.6 mm"+ }+ ],+ [+ "fusion_list_text_commands",+ "List Fusion's internal TEXT COMMANDS (TextCommands.List) whose name contains filter, case-insensitive; the discovery tool for fusion_execute_text_command. Returns the first 50 matches plus the total count. Works best with an electronics editor active (the Electron.* family is what the default filter finds).",+ {+ "filter": "optional str (substring, case-insensitive; default \"Electron\")"+ },+ {+ "success": "bool",+ "commands": "[str] (first 50 matches)",+ "total": "int"+ },+ 30,+ null,+ false,+ {+ "filter": "Electron"+ }+ ],+ [+ "fusion_create_cloud_folder",+ "Create a subfolder in a cloud project through the signed-in Fusion session's Data API (no APS needed). Idempotent: an existing folder of that name is returned with alreadyExisted:true instead of a duplicate. Folder names are matched case-insensitively. For an APS-side create without Fusion running, use fusion_aps_create_folder.",+ {+ "folderName": "required str",+ "projectName": "optional str (default the active project)",+ "parentPath": "optional str (parent folder path; default the project root)"+ },+ {+ "success": "bool",+ "folderName": "str",+ "folderId": "str",+ "project": "str",+ "parentFolder": "str",+ "alreadyExisted": "bool (only when it already existed)"+ },+ 60,+ null,+ false,+ {+ "folderName": "AI-Scratch",+ "projectName": "Main"+ }+ ],+ [+ "fusion_delete_cloud_file",+ "DESTRUCTIVE: delete ONE cloud file through the signed-in Fusion session's Data API. Looks in exactly one folder (projectName + folderPath, no recursion) for an exact case-insensitive name match, or for the lineage urn when fileId is given (the precise form; prefer it in shared folders). Refuses without fileName or fileId. Large folders time out on the scan; give a precise folderPath. Use fusion_cleanup_cloud_files to delete a LIST of urns with dryRun support.",+ {+ "fileName": "required str unless fileId is given (exact name match in one folder)",+ "fileId": "optional str (lineage urn for a precise delete; lineageUrn is accepted as an alias)",+ "projectName": "optional str (default the active project)",+ "folderPath": "optional str (default the project root)"+ },+ {+ "success": "bool",+ "fileName": "str",+ "fileId": "str",+ "project": "str",+ "folder": "str"+ },+ 60,+ null,+ false,+ {+ "fileName": "verbtest-scratch",+ "projectName": "Main",+ "folderPath": "AI-Scratch"+ }+ ],+ [+ "fusion_export_cloud_file",+ "Export the ACTIVE Fusion Design document to a local file on the Fusion machine in one of step, stl, f3d, iges, sat or smt (despite the name it does not fetch a cloud file by name; open the document first with fusion_open_cloud_file). Requires a Design document to be active. For the per-format verbs with their own timeouts see fusion_export_step and friends; this is the one-verb form with a format switch. Pull the file back with pull_file.",+ {+ "outputPath": "required str (WINDOWS path on the Fusion machine)",+ "format": "optional str (default step): step|stl|f3d|iges|sat|smt"+ },+ {+ "success": "bool",+ "outputPath": "str",+ "format": "str",+ "fileSize": "int",+ "documentName": "str"+ },+ 300,+ null,+ true,+ {+ "outputPath": "C:/Temp/TJA1050.step",+ "format": "step"+ }+ ],+ [+ "fusion_check_recovery",+ "Ask whether a cloud file has a crash-recovery document waiting, which would raise Fusion's recovery modal on open. BEST-EFFORT: Fusion's Python API does not reliably expose this (apiReliable reports whether the property existed), so a false negative is possible; the dependable signal is an open that times out, and fusion_dismiss_blocking_dialogs clears the modal. Finds the file by exact name in one project folder.",+ {+ "fileName": "required str",+ "projectName": "optional str (default the active project)",+ "folderPath": "optional str (default the project root)"+ },+ {+ "success": "bool",+ "fileName": "str",+ "fileId": "str",+ "project": "str",+ "hasRecovery": "bool",+ "apiReliable": "bool"+ },+ 60,+ null,+ false,+ {+ "fileName": "BQ25792",+ "projectName": "Main",+ "folderPath": "Molecules/XRP/Power"+ }+ ],+ [+ "fusion_describe",+ "Self-describe every verb the bridge exposes (this list) for ab's Verbs tab + runner. The reply carries `contribute` (source, mirror, issue and PR commands, the fusion-contributing skill); every failing reply carries `_contribute` with the same pointer.",+ {},+ {+ "success": "bool",+ "verbs": "[{name,summary,input,output,timeoutSeconds,statusVerb,longRunning,example}]"+ },+ 20,+ null,+ false,+ {}+ ]+ ]+}
native-rust/tools/contract-authoring/data/mechanical-schema.jsonadded+6993@@ -0,0 +1,6993 @@+{+ "inspect": {+ "type": "object",+ "required": [+ "op"+ ],+ "properties": {},+ "description": "Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health."+ },+ "inspect_entity": {+ "type": "object",+ "required": [+ "op",+ "target",+ "entity"+ ],+ "properties": {+ "entity": {+ "type": "object",+ "description": "Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards."+ }+ }+ },+ "new_design": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "box": {+ "type": "object",+ "required": [+ "width",+ "height",+ "depth"+ ],+ "additionalProperties": false,+ "properties": {+ "width": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "height": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "depth": {+ "type": "number",+ "exclusiveMinimum": 0+ }+ }+ }+ },+ "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."+ },+ "parameter_set": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ }+ },+ "description": "Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction."+ },+ "parameter_create": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression",+ "unit"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ },+ "comment": {+ "type": "string"+ }+ }+ },+ "health": {+ "type": "object",+ "required": [+ "op",+ "target"+ ],+ "properties": {+ "recompute": {+ "type": "boolean",+ "default": false+ }+ },+ "description": "Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId."+ },+ "export": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "outputPath"+ ],+ "properties": {+ "format": {+ "enum": [+ "step",+ "stl",+ "3mf",+ "f3d",+ "iges",+ "sat",+ "smt",+ "usdz",+ "fbx",+ "skp"+ ],+ "default": "step"+ },+ "outputPath": {+ "type": "string"+ },+ "overwrite": {+ "type": "boolean",+ "default": false+ },+ "refinement": {+ "enum": [+ "low",+ "medium",+ "high"+ ],+ "default": "medium"+ }+ },+ "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."+ },+ "transaction_probe": {+ "type": "object",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "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."+ },+ "sketch_create": {+ "type": "object",+ "properties": {+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "description": "Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm."+ },+ "sketch_geometry": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "items": {+ "type": "array",+ "items": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "point"+ ]+ },+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ }+ },+ "required": [+ "type",+ "position"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "line"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rectangle"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "circle"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "radius"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "arc"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "sweep": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "start",+ "sweep"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "polygon"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "sides": {+ "type": "integer",+ "minimum": 3,+ "maximum": 128+ },+ "angle": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "radius",+ "sides"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "slot"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "width": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end",+ "width"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "spline"+ ]+ },+ "points": {+ "type": "array",+ "items": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "minItems": 2,+ "maxItems": 128+ },+ "closed": {+ "type": "boolean"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "points"+ ],+ "additionalProperties": false+ }+ ]+ },+ "minItems": 1,+ "maxItems": 128+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "items"+ ],+ "description": "Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg."+ },+ "sketch_constraint": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "type": {+ "enum": [+ "horizontal",+ "vertical",+ "coincident",+ "parallel",+ "perpendicular",+ "tangent",+ "equal",+ "concentric",+ "collinear",+ "midpoint",+ "symmetry",+ "fix"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities"+ ],+ "description": "Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed."+ },+ "sketch_dimension": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "type": {+ "enum": [+ "distance",+ "horizontal",+ "vertical",+ "radius",+ "diameter",+ "angle"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "expression": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "parameterName": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities",+ "expression",+ "position"+ ],+ "description": "Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg."+ },+ "sketch_project": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entities"+ ],+ "description": "Project selected topology into a sketch with Fusion associative projection."+ },+ "sketch_edit": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "changes": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ },+ "fixed": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entity",+ "changes"+ ],+ "description": "Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation."+ },+ "plane_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "offset",+ "angle"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "description": "Create offset plane (offset in mm) or angled plane around axis (angle in deg).",+ "oneOf": [+ {+ "type": "object",+ "required": [+ "type",+ "offset"+ ],+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "type": {+ "enum": [+ "offset"+ ]+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "additionalProperties": false+ },+ {+ "type": "object",+ "required": [+ "type",+ "axis",+ "angle"+ ],+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "type": {+ "enum": [+ "angle"+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "additionalProperties": false+ }+ ]+ },+ "feature_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "extrude",+ "revolve",+ "fillet",+ "chamfer",+ "shell",+ "hole",+ "loft",+ "sweep",+ "combine",+ "split",+ "move",+ "mirror",+ "rectangular_pattern",+ "circular_pattern",+ "draft",+ "thread"+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {},+ "distance": {},+ "direction": {},+ "taper": {},+ "bodies": {},+ "operation": {},+ "axis": {},+ "angle": {},+ "edges": {},+ "radius": {},+ "tangentChain": {},+ "faces": {},+ "thickness": {},+ "points": {},+ "diameter": {},+ "depth": {},+ "path": {},+ "body": {},+ "tools": {},+ "keepTools": {},+ "plane": {},+ "extend": {},+ "translation": {},+ "origin": {},+ "count": {},+ "spacing": {},+ "axis2": {},+ "count2": {},+ "spacing2": {},+ "internal": {},+ "threadType": {},+ "designation": {},+ "threadClass": {},+ "modeled": {}+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "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": [+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "extrude"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "direction": {+ "enum": [+ "positive",+ "negative",+ "symmetric"+ ]+ },+ "taper": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "distance"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "revolve"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "axis",+ "angle"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "fillet"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "edges": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "radius": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "edges",+ "radius"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "chamfer"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "edges": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "edges",+ "distance"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "shell"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "thickness": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "thickness"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "hole"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "points": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "diameter": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "depth": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "type",+ "points",+ "diameter",+ "depth",+ "bodies"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "loft"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "sweep"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "path": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "path"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "combine"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "body": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "tools": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "join",+ "cut",+ "intersect"+ ]+ },+ "keepTools": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "body",+ "tools",+ "operation"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "split"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "extend": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "move"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "translation": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ },+ "origin": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ }+ },+ "required": [+ "type",+ "bodies"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "mirror"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rectangular_pattern"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count": {+ "type": "integer",+ "minimum": 2,+ "maximum": 1000+ },+ "spacing": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis2": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count2": {+ "type": "integer",+ "minimum": 1,+ "maximum": 1000+ },+ "spacing2": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count",+ "spacing"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "circular_pattern"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count": {+ "type": "integer",+ "minimum": 2,+ "maximum": 1000+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "draft"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "plane",+ "angle"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "thread"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "internal": {+ "type": "boolean"+ },+ "threadType": {+ "type": "string"+ },+ "designation": {+ "type": "string"+ },+ "threadClass": {+ "type": "string"+ },+ "modeled": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "internal",+ "threadType",+ "designation",+ "threadClass"+ ],+ "additionalProperties": false+ }+ ]+ },+ "feature_edit": {+ "type": "object",+ "properties": {+ "feature": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "parameters": {+ "type": "object",+ "additionalProperties": {+ "type": "string"+ }+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "feature"+ ],+ "description": "Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors."+ },+ "entity_delete": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity"+ ],+ "description": "Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded."+ },+ "parameter_batch": {+ "type": "object",+ "properties": {+ "changes": {+ "type": "array",+ "items": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "create"+ ]+ },+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ },+ "comment": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression",+ "unit"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "set"+ ]+ },+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "delete"+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name"+ ],+ "additionalProperties": false+ }+ ]+ },+ "minItems": 1,+ "maxItems": 128+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "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."+ },+ "component_create": {+ "type": "object",+ "properties": {+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "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."+ },+ "metadata": {+ "type": "object",+ "properties": {+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "description": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "asPurchased": {+ "type": "boolean"+ },+ "excludeFromBom": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name"+ ],+ "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."+ },+ "occurrence_insert": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "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."+ },+ "independentCopy": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "component"+ ],+ "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."+ },+ "occurrence_update": {+ "type": "object",+ "properties": {+ "occurrence": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "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."+ },+ "grounded": {+ "type": "boolean"+ },+ "groundedToParent": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "description": "Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery."+ },+ "occurrence_delete": {+ "type": "object",+ "properties": {+ "occurrence": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "description": "Delete one selected occurrence through the shared transaction executor."+ },+ "component_metadata": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "changes": {+ "type": "object",+ "properties": {+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "description": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "asPurchased": {+ "type": "boolean"+ },+ "excludeFromBom": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "description": "Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata."+ },+ "joint_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type",+ "occurrenceOne",+ "occurrenceTwo"+ ],+ "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": [+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "rigid"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "type"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "revolute"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "slider"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "cylindrical"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "pin_slot"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "planar"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "ball"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ }+ ]+ },+ "joint_edit": {+ "type": "object",+ "properties": {+ "joint": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "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."+ },+ "joint_delete": {+ "type": "object",+ "properties": {+ "joint": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "description": "Delete one selected Joint or AsBuiltJoint with recovery verification."+ },+ "interference": {+ "type": "object",+ "properties": {+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "minItems": 2,+ "maxItems": 256+ },+ "includeTouching": {+ "type": "boolean"+ },+ "volumeTolerance": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [+ "op",+ "target",+ "entities"+ ],+ "description": "Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies."+ },+ "bom": {+ "type": "object",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "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."+ },+ "bom_export": {+ "type": "object",+ "properties": {+ "filename": {+ "type": "string"+ },+ "overwrite": {+ "type": "boolean"+ },+ "explodePurchased": {+ "type": "boolean"+ },+ "mode": {+ "enum": [+ "flat",+ "structured"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename"+ ],+ "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."+ },+ "cad_import": {+ "type": "object",+ "properties": {+ "filename": {+ "type": "string"+ },+ "sha256": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "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."+ },+ "provenance": {+ "type": "object",+ "properties": {+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "description": {+ "type": "string"+ }+ },+ "required": [+ "supplier",+ "supplierPartNumber",+ "sourceUrl"+ ],+ "additionalProperties": false+ },+ "asPurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename",+ "provenance"+ ],+ "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."+ },+ "mcmaster_discover": {+ "type": "object",+ "properties": {},+ "required": [+ "op"+ ],+ "description": "Discover Fusion native Insert McMaster-Carr command and requirements in the active design."+ },+ "mcmaster_open": {+ "type": "object",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "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."+ },+ "material_list": {+ "type": "object",+ "properties": {+ "libraryId": {+ "type": "string"+ },+ "query": {+ "type": "string"+ },+ "limit": {+ "type": "integer",+ "minimum": 1,+ "maximum": 1000+ }+ },+ "required": [+ "op",+ "target"+ ],+ "description": "List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials."+ },+ "material_assign": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "libraryId": {+ "type": "string"+ },+ "materialId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity",+ "materialId"+ ],+ "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."+ },+ "rigid_group_create": {+ "type": "object",+ "properties": {+ "occurrences": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "minItems": 2,+ "maxItems": 256+ },+ "includeChildren": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "occurrences"+ ],+ "description": "Create a native rigid group from exact occurrence instances; includeChildren defaults true."+ },+ "rigid_group_edit": {+ "type": "object",+ "properties": {+ "group": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "description": "Rename or suppress an exact rigid group with transaction recovery."+ },+ "rigid_group_delete": {+ "type": "object",+ "properties": {+ "group": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "description": "Delete an exact rigid group with transaction recovery."+ },+ "assembly_properties": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "target"+ ],+ "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."+ },+ "geometry_query": {+ "type": "object",+ "properties": {+ "body": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "kind": {+ "enum": [+ "faces",+ "edges",+ "vertices"+ ]+ },+ "space": {+ "enum": [+ "root",+ "component"+ ]+ },+ "selection": {+ "enum": [+ "one",+ "many"+ ]+ },+ "filters": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "Plane",+ "Cylinder",+ "Cone",+ "Sphere",+ "Torus",+ "NurbsSurface",+ "Line3D",+ "Arc3D",+ "Circle3D",+ "Ellipse3D",+ "EllipticalArc3D",+ "NurbsCurve3D",+ "Point3D",+ "degenerate"+ ]+ },+ "area": {+ "type": "object",+ "properties": {+ "min": {+ "type": "number",+ "minimum": 0+ },+ "max": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "length": {+ "type": "object",+ "properties": {+ "min": {+ "type": "number",+ "minimum": 0+ },+ "max": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "radius": {+ "type": "object",+ "properties": {+ "min": {+ "type": "number",+ "minimum": 0+ },+ "max": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "near": {+ "type": "object",+ "properties": {+ "point": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "tolerance": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [+ "point",+ "tolerance"+ ],+ "additionalProperties": false+ },+ "direction": {+ "type": "object",+ "properties": {+ "vector": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "tolerance": {+ "type": "number",+ "minimum": 0,+ "maximum": 90+ },+ "orientation": {+ "enum": [+ "same",+ "parallel"+ ]+ }+ },+ "required": [+ "vector"+ ],+ "additionalProperties": false+ }+ },+ "required": [],+ "additionalProperties": false+ },+ "maxResults": {+ "type": "integer",+ "minimum": 1,+ "maximum": 1024+ }+ },+ "required": [+ "op",+ "target",+ "body",+ "kind",+ "space"+ ],+ "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."+ },+ "measure": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "distance",+ "angle"+ ]+ },+ "space": {+ "enum": [+ "root"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "minItems": 2,+ "maxItems": 3+ }+ },+ "required": [+ "op",+ "target",+ "type",+ "space",+ "entities"+ ],+ "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."+ },+ "sketch_curve_edit": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "curve": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "action": {+ "enum": [+ "trim",+ "extend",+ "split",+ "break"+ ]+ },+ "pick": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "createConstraints": {+ "type": "boolean"+ },+ "allowDelete": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "sketch",+ "curve",+ "action",+ "pick"+ ],+ "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."+ },+ "sketch_offset": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "curves": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "topologyMatched": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "sketch",+ "curves",+ "distance"+ ],+ "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."+ },+ "construction_axis": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "type": {+ "enum": [+ "edge",+ "circular_face",+ "two_planes",+ "two_points"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "minItems": 1,+ "maxItems": 2+ },+ "creationOccurrence": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "type",+ "entities"+ ],+ "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."+ },+ "sketch_diagnostics": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Current guarded entity reference; root-space child geometry requires its exact occurrence context."+ }+ },+ "required": [+ "op",+ "target",+ "sketch"+ ],+ "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."+ },+ "joint_origin_create": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string",+ "minLength": 1,+ "maxLength": 120+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "flipped": {+ "type": "boolean"+ },+ "xAxisEntity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "zAxisEntity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetX": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetY": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetZ": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "geometry"+ ],+ "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)."+ },+ "joint_origin_edit": {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string",+ "minLength": 1,+ "maxLength": 120+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "flipped": {+ "type": "boolean"+ },+ "xAxisEntity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "zAxisEntity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetX": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetY": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetZ": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "origin"+ ],+ "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."+ },+ "joint_origin_delete": {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "origin"+ ],+ "description": "Delete a native joint origin; unhealthy downstream joints cause transaction rollback."+ },+ "regular_joint_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "name": {+ "type": "string"+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometryOne": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "origin"+ ],+ "additionalProperties": false+ }+ ]+ },+ "geometryTwo": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "origin"+ ],+ "additionalProperties": false+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "flipped": {+ "type": "boolean"+ },+ "locked": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type",+ "geometryOne",+ "geometryTwo"+ ],+ "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."+ },+ "regular_joint_edit": {+ "type": "object",+ "properties": {+ "joint": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "geometryOne": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "origin"+ ],+ "additionalProperties": false+ }+ ]+ },+ "geometryTwo": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ },+ "edge": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "origin": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "origin"+ ],+ "additionalProperties": false+ }+ ]+ },+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetX": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "offsetY": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "flipped": {+ "type": "boolean"+ },+ "locked": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "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."+ },+ "motion_link_create": {+ "type": "object",+ "properties": {+ "jointOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "jointTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string",+ "minLength": 1,+ "maxLength": 120+ },+ "motionOne": {+ "enum": [+ "rotation",+ "slide",+ "primarySlide",+ "secondarySlide",+ "pitch",+ "roll",+ "yaw"+ ]+ },+ "motionTwo": {+ "enum": [+ "rotation",+ "slide",+ "primarySlide",+ "secondarySlide",+ "pitch",+ "roll",+ "yaw"+ ]+ },+ "valueOne": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "valueTwo": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "reversed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "jointOne",+ "motionOne",+ "motionTwo",+ "valueOne",+ "valueTwo"+ ],+ "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."+ },+ "motion_link_edit": {+ "type": "object",+ "properties": {+ "link": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "suppressed": {+ "type": "boolean"+ },+ "name": {+ "type": "string",+ "minLength": 1,+ "maxLength": 120+ },+ "motionOne": {+ "enum": [+ "rotation",+ "slide",+ "primarySlide",+ "secondarySlide",+ "pitch",+ "roll",+ "yaw"+ ]+ },+ "motionTwo": {+ "enum": [+ "rotation",+ "slide",+ "primarySlide",+ "secondarySlide",+ "pitch",+ "roll",+ "yaw"+ ]+ },+ "valueOne": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "valueTwo": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string",+ "minLength": 1,+ "maxLength": 512+ }+ ],+ "description": "Number in mm (angle in deg), or a dimensionally valid Fusion parameter expression."+ },+ "reversed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "link"+ ],+ "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."+ },+ "motion_link_delete": {+ "type": "object",+ "properties": {+ "link": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "link"+ ],+ "description": "Delete a root-owned motion link under the same transaction/recovery contract."+ },+ "configuration_inspect": {+ "type": "object",+ "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"+ ]+ },+ "render_scene_inspect": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "target"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "maxEnvironments": {+ "type": "integer",+ "minimum": 0,+ "maximum": 32+ },+ "camera": {+ "oneOf": [+ {+ "type": "object",+ "required": [+ "type",+ "space",+ "unit",+ "eye",+ "target",+ "upVector",+ "extents"+ ],+ "additionalProperties": false,+ "properties": {+ "type": {+ "type": "string",+ "enum": [+ "orthographic"+ ]+ },+ "space": {+ "type": "string",+ "enum": [+ "world"+ ]+ },+ "unit": {+ "type": "string",+ "enum": [+ "mm"+ ]+ },+ "eye": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "target": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "upVector": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "extents": {+ "type": "array",+ "minItems": 2,+ "maxItems": 2,+ "items": {+ "type": "number",+ "minimum": 1e-06,+ "maximum": 1000000000.0+ }+ }+ }+ },+ {+ "type": "object",+ "required": [+ "type",+ "space",+ "unit",+ "eye",+ "target",+ "upVector",+ "perspectiveAngle",+ "angleUnit"+ ],+ "additionalProperties": false,+ "properties": {+ "type": {+ "type": "string",+ "enum": [+ "perspective"+ ]+ },+ "space": {+ "type": "string",+ "enum": [+ "world"+ ]+ },+ "unit": {+ "type": "string",+ "enum": [+ "mm"+ ]+ },+ "eye": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "target": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "upVector": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "perspectiveAngle": {+ "type": "number",+ "exclusiveMinimum": 0,+ "maximum": 179.999999999+ },+ "angleUnit": {+ "type": "string",+ "enum": [+ "deg"+ ]+ }+ }+ }+ ]+ }+ },+ "description": "Guarded main-thread read of current viewport camera, render settings and up to 32 environments. Optional detached world-mm camera is constructed and read back without viewport assignment. Missing fields return PARTIAL; observationComplete covers only bounded available scope. sceneWitnessComplete and renderQualified remain false. No rendering, workspace activation or scene writes."+ },+ "exploded_view_plan": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "target",+ "unit",+ "steps"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "unit": {+ "type": "string",+ "enum": [+ "mm"+ ]+ },+ "steps": {+ "type": "array",+ "minItems": 1,+ "maxItems": 32,+ "items": {+ "type": "object",+ "required": [+ "durationSeconds",+ "moves"+ ],+ "additionalProperties": false,+ "properties": {+ "title": {+ "type": "string"+ },+ "durationSeconds": {+ "type": "number",+ "exclusiveMinimum": 0,+ "maximum": 3600+ },+ "moves": {+ "type": "array",+ "minItems": 1,+ "maxItems": 128,+ "items": {+ "type": "object",+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "additionalProperties": false,+ "properties": {+ "occurrence": {+ "type": "object",+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct."+ },+ "direction": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "distance": {+ "type": "number",+ "exclusiveMinimum": 0,+ "maximum": 1000000.0+ },+ "frame": {+ "type": "string",+ "enum": [+ "world",+ "parent",+ "local"+ ]+ }+ }+ }+ },+ "instruction": {+ "type": "string"+ }+ }+ }+ },+ "sampleTimes": {+ "type": "array",+ "maxItems": 62,+ "items": {+ "type": "number",+ "minimum": 0,+ "maximum": 3600+ }+ },+ "playback": {+ "type": "string",+ "enum": [+ "explode",+ "assemble"+ ]+ }+ },+ "description": "Read-only source-bound exploded assembly plan. Normalized translation directions in immutable home world/parent/local axes; simultaneous moves within ordered steps. Descendants inherit ancestor translations once, plus own moves. Bounded deterministic sample matrices and exact home reverse endpoint. No native moves, graphics, BOM quantity changes, render/video or storyboard creation. Complete configuration identity required."+ },+ "exploded_preview_create": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sourceTarget",+ "creationOperationId",+ "expectedPlanId",+ "planner"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "sourceTarget": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "creationOperationId": {+ "type": "string"+ },+ "expectedPlanId": {+ "type": "string"+ },+ "planner": {+ "type": "object",+ "required": [+ "unit",+ "steps"+ ],+ "additionalProperties": false,+ "properties": {+ "unit": {+ "type": "string",+ "enum": [+ "mm"+ ]+ },+ "steps": {+ "type": "array",+ "minItems": 1,+ "maxItems": 32,+ "items": {+ "type": "object",+ "required": [+ "durationSeconds",+ "moves"+ ],+ "additionalProperties": false,+ "properties": {+ "title": {+ "type": "string"+ },+ "durationSeconds": {+ "type": "number",+ "exclusiveMinimum": 0,+ "maximum": 3600+ },+ "moves": {+ "type": "array",+ "minItems": 1,+ "maxItems": 128,+ "items": {+ "type": "object",+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "additionalProperties": false,+ "properties": {+ "occurrence": {+ "type": "object",+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct."+ },+ "direction": {+ "type": "array",+ "minItems": 3,+ "maxItems": 3,+ "items": {+ "type": "number",+ "minimum": -1000000000.0,+ "maximum": 1000000000.0+ }+ },+ "distance": {+ "type": "number",+ "exclusiveMinimum": 0,+ "maximum": 1000000.0+ },+ "frame": {+ "type": "string",+ "enum": [+ "world",+ "parent",+ "local"+ ]+ }+ }+ }+ },+ "instruction": {+ "type": "string"+ }+ }+ }+ },+ "sampleTimes": {+ "type": "array",+ "maxItems": 62,+ "items": {+ "type": "number",+ "minimum": 0,+ "maximum": 3600+ }+ },+ "playback": {+ "type": "string",+ "enum": [+ "explode",+ "assemble"+ ]+ }+ }+ }+ },+ "description": "Create finite copied solid-BRep presentation graphics in the exact active blank unsaved Design proven by a committed current-session new_design result. Regenerates the guarded source plan; leaves source active. Exclusive session lease, no source moves/visibility writes, no model transaction, automatic document close, render or capture. Live capability and native backend qualification are separate from durable operation receipts."+ },+ "exploded_preview_sample": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration",+ "sampleIndex"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "previewId": {+ "type": "string"+ },+ "expectedGeneration": {+ "type": "integer",+ "minimum": 0,+ "maximum": 1000000000+ },+ "sampleIndex": {+ "type": "integer",+ "minimum": 0,+ "maximum": 63+ }+ },+ "description": "Apply one server-stored absolute sample to exact-owned graphics; preserve active document. Source must remain unchanged. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound."+ },+ "exploded_preview_show": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "previewId": {+ "type": "string"+ },+ "expectedGeneration": {+ "type": "integer",+ "minimum": 0,+ "maximum": 1000000000+ }+ },+ "description": "Explicitly activate the exact-owned presentation in Fusion; refuse an intervening foreign active document. No OS foreground, camera change or capture. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound."+ },+ "exploded_preview_dispose": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ }+ },+ "previewId": {+ "type": "string"+ },+ "expectedGeneration": {+ "type": "integer",+ "minimum": 0,+ "maximum": 1000000000+ }+ },+ "description": "Delete only the exact retained graphics tree and leave the blank document open for caller. Supports a narrowly proven cleanup after unresolved terminal storage without rewriting that history; no global Undo or close. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound."+ },+ "exploded_preview_inspect": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "previewId"+ ],+ "properties": {+ "sessionId": {+ "type": "string"+ },+ "previewId": {+ "type": "string"+ }+ },+ "description": "Main-thread live preview ownership/geometry/history observation. Cached operation receipts do not establish current graphics liveness. Old-session history remains separately readable through mech_operation_status; no native reference adoption or lifecycle repair is provided here."+ }+}
native-rust/tools/contract-authoring/evidence/BASELINE.jsonadded+33@@ -0,0 +1,33 @@+[+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/runtime-dev9-build-r1/source/describe.py",+ "archived": "evidence/baseline/describe.py",+ "sha256": "d03c128566455226bca6b7535a2690577f39c2ac851cc71982f7afae8e1fcc35"+ },+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/runtime-dev9-build-r1/source/contracts/describe.json",+ "archived": "evidence/baseline/describe.json",+ "sha256": "70f3e2d8f2d4ffb6603c8a62478f149593f6ca19aa9a910dc26a02b607d0b7ba"+ },+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/runtime-dev9-build-r1/source/addin/AdomBridge/commands/mechanical/schema.json",+ "archived": "evidence/baseline/mechanical-schema.json",+ "sha256": "6f704e05de031fa8ef329dc7be0b02d3a2b167eeb2fbc44ec6c2d933af4f7b48"+ },+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/runtime-dev9-build-r1/source/bridge.json",+ "archived": "evidence/baseline/bridge.json",+ "sha256": "6c7d4e063ab4078d610f22d80e0d39b8dac55959f398558a2ff00257174fe11a"+ },+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/runtime-dev9-build-r1/source/rust/core/src/contract.rs",+ "archived": "evidence/baseline/legacy-contract.rs",+ "sha256": "69ca49c4469c323887efecb10333b51ad9f6813fc450422c155f9983238acd26"+ },+ {+ "path": "/home/adom/project/research/fusion-roadmap-build-2026-10-02/exploded-preview-preparation/publication-oct7/published-readback/tools/freeze-contract.py",+ "archived": "evidence/baseline/freeze-contract.py",+ "sha256": "82f51090a79c57adf2f41c27229a860acdc75598aa4ead16893126cd7c848886",+ "scope": "Separate published source; dev9 snapshot contains no tools/freeze-contract.py"+ }+]
native-rust/tools/contract-authoring/evidence/baseline/bridge.jsonadded+318@@ -0,0 +1,318 @@+{+ "manifest_version": 1,+ "name": "fusion360",+ "displayName": "Autodesk Fusion 360",+ "version": "1.12.0-dev.9",+ "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.",+ "homepage": "https://wiki.adom.inc/adom/fusion-bridge",+ "author": "Adom Inc.",+ "license": "MIT",+ "spawn": {+ "kind": "exe",+ "entrypoint": "adom-fusion-bridge.exe",+ "port": 0,+ "healthEndpoint": "/status",+ "stopMethod": "kill",+ "killImageName": "adom-fusion-bridge.exe",+ "persistent": true,+ "_hint": "spawn.kind exe: one sha256-verified binary, no interpreter provisioning. The Python bridge left the package in Phase 4 of the Rust port (2026-09); an owner pref of \"sidecar\" in ~/.adom/fusion-bridge/prefs.json is honoured only where server.py still sits beside the exe."+ },+ "verbPrefixes": [+ "fusion_"+ ],+ "verbs": [+ "fusion_account",+ "fusion_action_ledger",+ "fusion_activate_document",+ "fusion_addin_status",+ "fusion_alerts",+ "fusion_apply_fusion_update",+ "fusion_apply_pours",+ "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_bom",+ "fusion_board_info",+ "fusion_board_seed",+ "fusion_board_source",+ "fusion_board_stackup",+ "fusion_build_library_3d",+ "fusion_cancel_run",+ "fusion_capture_library_views",+ "fusion_change_pours",+ "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_move_parts",+ "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_place_vias",+ "fusion_plan_library_import",+ "fusion_plan_route",+ "fusion_pour_state",+ "fusion_preflight_lbr",+ "fusion_prefs_close",+ "fusion_prefs_open",+ "fusion_prewarm",+ "fusion_prove_result",+ "fusion_readiness",+ "fusion_release_seat",+ "fusion_remove_pours",+ "fusion_reset_workspace",+ "fusion_resolve_seat_dialog",+ "fusion_restart_for_addin",+ "fusion_ripup_nets",+ "fusion_route_net",+ "fusion_routing_drc",+ "fusion_routing_state",+ "fusion_run_modeling_script",+ "fusion_save_to_cloud",+ "fusion_schematic",+ "fusion_schematic_plan",+ "fusion_schematic_run",+ "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"+ ],+ "dependencies": {},+ "category": "CAD",+ "tags": [+ "fusion360",+ "autodesk",+ "cad",+ "exports",+ "aps",+ "modeling"+ ],+ "docs": "https://wiki.adom.inc/adom/fusion-bridge",+ "platforms": {+ "windows": {+ "supported": true+ },+ "macos": {+ "supported": true,+ "reason": "Fusion 360 runs on macOS; bridge + add-in install paths handled by fusion_detect.py."+ },+ "linux": {+ "supported": false,+ "reason": "Autodesk doesn't ship Fusion 360 for Linux, so there's no host app for the add-in to attach to."+ }+ },+ "languages": [+ "Python"+ ],+ "hero": "https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/screenshots/hero.png",+ "releasedAt": "2026-06-26T06:00:00Z",+ "statusVerb": "fusion_get_app_state",+ "updateManifestUrl": "https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/adom-bridge-fusion-manifest.json",+ "detect": {+ "hostApp": "Fusion 360",+ "paths": {+ "windows": [+ "%LOCALAPPDATA%\\Autodesk\\webdeploy\\production\\*\\FusionLauncher.exe",+ "%ProgramFiles%\\Autodesk\\webdeploy\\production\\*\\FusionLauncher.exe",+ "%ProgramFiles(x86)%\\Autodesk\\webdeploy\\production\\*\\FusionLauncher.exe"+ ],+ "macos": [+ "/Applications/Autodesk Fusion.app",+ "/Applications/Autodesk Fusion 360.app"+ ]+ },+ "hostAppOptionalVerbs": [+ "readiness",+ "describe",+ "get_app_state",+ "status",+ "addin_status",+ "aps_status",+ "aps_search",+ "aps_browse",+ "aps_recent",+ "install_fusion",+ "set_design_rules"+ ],+ "installVerb": "fusion_install_fusion"+ },+ "prewarm": {+ "verb": "fusion_prewarm",+ "requiresHostApp": true,+ "assets": [+ "AdomBridge add-in sync",+ "PCB design-rules catalog cache"+ ]+ },+ "timeouts": {+ "default": 60,+ "verbs": {+ "export_step": 360,+ "export_iges": 360,+ "export_sat": 360,+ "export_stl": 360,+ "export_3mf": 360,+ "export_usdz": 360,+ "export_obj": 360,+ "export_f3d": 360,+ "export_fbx": 360,+ "export_skp": 360,+ "export_dxf": 150,+ "export_dwg": 150,+ "export_gerbers": 210,+ "export_bom": 90,+ "export_cpl": 90,+ "export_board_image": 90,+ "close_all_documents": 90,+ "walk_cloud_tree": 620,+ "search_cloud_files": 200,+ "aps_open": 150,+ "run_modeling_script": 180,+ "generate_package": 120,+ "make_3d_package": 200,+ "build_library_3d": 1800,+ "capture_library_views": 600,+ "start": 90,+ "install_fusion": 90,+ "set_preference": 40,+ "get_preferences": 25,+ "demo": 300,+ "signin": 150,+ "prewarm": 120,+ "aps_search": 120,+ "aps_recent": 120+ },+ "prefixes": [+ {+ "prefix": "open",+ "seconds": 150+ }+ ]+ },+ "uninstall": "fusion_uninstall",+ "insidersManifestUrl": "https://wiki.adom.inc/api/v1/pages/insiders/files/fusion-bridge/version.json"+}
native-rust/tools/contract-authoring/evidence/baseline/describe.jsonadded+13522@@ -0,0 +1,17492 @@+{+ "contract": "fusion-bridge verb catalog",+ "frozen": "2026-10-06",+ "note": "The Python bridge and the Rust bridge must both serve this catalog byte-for-byte in meaning: same names, same args, same result shapes, same timeouts. Regenerate ONLY from describe.py and diff in CI.",+ "source": "describe.py",+ "verbs": [+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_account",+ "output": {+ "account": "{email, name, userId, hub}",+ "holdsSeat": "bool",+ "license": "{authorized, trial, expiresAt, ...}",+ "running": "bool",+ "seatDialogOpen": "bool",+ "signedIn": "bool",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "WHO Fusion is signed in as on this machine, and whether this machine currently holds the Autodesk SEAT. One subscription runs ONE active Fusion at a time, so the seat moves between machines; this is the read. Returns the signed-in account (email, name, hub), Autodesk's own licence blob (authorized, trial, expiry, reauthorize time, from Application.LicenseInformation) and holdsSeat. Read-only: never starts Fusion, never signs anybody in or out.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "limit": 20+ },+ "input": {+ "limit": "optional int (default 50)"+ },+ "longRunning": true,+ "name": "fusion_action_ledger",+ "output": {+ "actions": "[{at, action, detail}]"+ },+ "statusVerb": null,+ "summary": "Read the append-only record of what the bridge did in the BACKGROUND on this machine - dialogs it answered, Untitled scratch docs it swept, Fusion auto-starts, add-in restarts. Survives bridge respawns (~/.adom/fusion-bridge/actions.jsonl). This is the audit trail for why something changed on the user screen.",+ "timeoutSeconds": 15+ },+ {+ "example": {+ "name": "TJA1050"+ },+ "input": {+ "name": "required str (document name as reported by fusion_get_app_state)"+ },+ "longRunning": false,+ "name": "fusion_activate_document",+ "output": {+ "activeDocument": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Make a named open document the ACTIVE one before driving it. EDIT and most modelling verbs act on whatever is active, so in a batch with several documents open this is how you stop a verb landing in the wrong file (page issue #47). Prefer passing expectDocument on the verb itself, which fails closed instead of merely re-targeting. An electronics design's schematic, board and 3D view are separate tabs with ONE name (type unknown): the reply says so in sameNameDocuments, and fusion_show_schematic / fusion_show_2d_board / fusion_show_3d_board {documentName} reach a specific view.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_addin_status",+ "output": {+ "addinReady": "bool",+ "busy": "bool",+ "port": "int",+ "version": "str"+ },+ "statusVerb": null,+ "summary": "Is the AdomBridge add-in loaded and answering inside Fusion? Reports addinReady, port and version, plus busy when a long command holds the main thread. If Fusion is running but this says not ready, the add-in was installed while Fusion was open - Fusion loads add-ins only at launch - so call fusion_restart_for_addin (ask the user first when one is present).",+ "timeoutSeconds": 15+ },+ {+ "example": {},+ "input": {+ "sinceSec": "optional float (default 300)"+ },+ "longRunning": false,+ "name": "fusion_alerts",+ "output": {+ "alerts": "[{at,text}]"+ },+ "statusVerb": null,+ "summary": "Fusion's OWN alert toasts, read from its log. Fusion draws error/warning toasts in CEF: they are invisible to Win32 enumeration AND to UIA, so a verb can look successful while Fusion is visibly complaining. This reads them, newest last.",+ "timeoutSeconds": 30+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_apply_fusion_update",+ "output": {+ "applied": "bool",+ "button": "str|null",+ "why": "str"+ },+ "statusVerb": null,+ "summary": "Readiness EXECUTOR (Rust port, Phase 3): click Fusion's update offer IN THE BACKGROUND when auto-update is on (sticky pref; fusion_set_auto_update). Never the exit-class buttons while a host op is active. Answers {applied, button, why}.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "boardId": "required",+ "expectDocument": "required exact board name",+ "expectedRevision": "required",+ "pours": "required [{net, layer, points:[[x,y]...], isolate (mm, default 0.25), rank (default 1), width (mm, default 0.25), thermals (default true), orphans (default false)}]"+ },+ "longRunning": false,+ "name": "fusion_apply_pours",+ "output": {+ "added": "[net]",+ "filledAreaByLayerMm2": "{layer:mm2}",+ "kept": "[net]",+ "pours": "[{net,layer,outline,filledMm2,islands,filled}]",+ "revision": "str",+ "success": "bool",+ "verified": "bool"+ },+ "statusVerb": "fusion_routing_state",+ "summary": "Draw copper pours from a plan: POLYGON per pour (net, layer 1 or 16, outline points, isolate, rank 1..6, width, thermals, orphans), skipping any already on the board with the same net, layer and outline, then RATSNEST fills them. The reply carries Fusion's own fill per pour (filledMm2, islands) and per layer. Removing a pour is not done here.",+ "timeoutSeconds": 120+ },+ {+ "example": {},+ "input": {+ "folderId": "optional str",+ "hubId": "optional str",+ "projectId": "optional str"+ },+ "longRunning": false,+ "name": "fusion_aps_browse",+ "output": {+ "items": "[{name,type,id}]"+ },+ "statusVerb": null,+ "summary": "Browse hubs/projects/folders without launching Fusion.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "name": "Adom AI Workspace",+ "parentFolderId": "urn:...",+ "projectId": "a.YnVz..."+ },+ "input": {+ "name": "required str",+ "parentFolderId": "required str",+ "projectId": "required str"+ },+ "longRunning": false,+ "name": "fusion_aps_create_folder",+ "output": {+ "folderId": "str"+ },+ "statusVerb": null,+ "summary": "Create a subfolder in a project (free; needs data:create scope). Use this to make an 'Adom AI Workspace' folder + per-task subfolders so the bridge never dumps loose files in the shared project root. See fusion-cloud-hygiene.",+ "timeoutSeconds": 50+ },+ {+ "example": {+ "query": "BME690 Molecule"+ },+ "input": {+ "fileName": "optional str",+ "query": "str OR projectId+urn",+ "saveDir": "optional str"+ },+ "longRunning": false,+ "name": "fusion_aps_download",+ "output": {+ "bytes": "int",+ "path": "str"+ },+ "statusVerb": null,+ "summary": "Download a cloud file to the local machine (no Fusion needed).",+ "timeoutSeconds": 90+ },+ {+ "example": {+ "query": "BME690 Molecule"+ },+ "input": {+ "query": "str OR projectId+urn"+ },+ "longRunning": false,+ "name": "fusion_aps_file_info",+ "output": {+ "tip": "{...}",+ "versionCount": "int",+ "versions": "[...]"+ },+ "statusVerb": null,+ "summary": "Version history + who/when/size for a file (tip + recent versions).",+ "timeoutSeconds": 40+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_aps_forget_browser",+ "output": {+ "cleared": "bool",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Forget the remembered Autodesk sign-in browser (re-detect next time).",+ "timeoutSeconds": 10+ },+ {+ "example": {+ "path": "/project/v1/hubs"+ },+ "input": {+ "path": "required str"+ },+ "longRunning": false,+ "name": "fusion_aps_get",+ "output": {+ "body": "obj",+ "status": "int"+ },+ "statusVerb": null,+ "summary": "Raw authenticated GET against a free APS path (dev/verify helper).",+ "timeoutSeconds": 40+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_aps_get_browser",+ "output": {+ "browser": "{name,exe,profileDir}|null",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Show the remembered Autodesk sign-in browser (None until set).",+ "timeoutSeconds": 10+ },+ {+ "example": {+ "query": "BME690 Molecule"+ },+ "input": {+ "query": "required str",+ "wait": "optional bool"+ },+ "longRunning": true,+ "name": "fusion_aps_open",+ "output": {+ "match": "{name}",+ "opening": "bool",+ "statusVerb": "str"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Find a cloud design by name and open it in Fusion (any folder depth). Fire-and-poll.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "limit": 25+ },+ "input": {+ "limit": "optional int (default 25)"+ },+ "longRunning": false,+ "name": "fusion_aps_recent",+ "output": {+ "count": "int",+ "results": "[...]"+ },+ "statusVerb": null,+ "summary": "Most-recently-modified designs across the team hub, newest first.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "limit": 10,+ "query": "Molecule"+ },+ "input": {+ "hubId": "optional str",+ "limit": "optional int (default 50)",+ "projectId": "optional str",+ "query": "required str"+ },+ "longRunning": false,+ "name": "fusion_aps_search",+ "output": {+ "count": "int",+ "results": "[{name,id,projectName,lastModified}]"+ },+ "statusVerb": null,+ "summary": "Server-indexed search across the whole team hub: about 20-30 s hub-wide, a few seconds with projectId (not a 30-min folder walk). Budget 120 s. A ZERO from the server index is not absence: the reply then carries data.fallback (a name scan of the newest 400 items), data.completeness, and a hint to fusion_aps_browse a known sibling's folder (issue #85).",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "exe": "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe",+ "name": "Edge",+ "profileDir": "Default"+ },+ "input": {+ "exe": "str (browser binary) OR how:'extension'",+ "how": "optional 'extension'|'launch'",+ "name": "optional str",+ "profileDir": "optional str"+ },+ "longRunning": false,+ "name": "fusion_aps_set_browser",+ "output": {+ "browser": "{name,exe,profileDir}",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Remember the browser+profile that authed to Autodesk so every later sign-in reuses it (power users have many browsers/profiles; the OS default is usually the wrong one). Call after a driven sign-in succeeds.",+ "timeoutSeconds": 10+ },+ {+ "example": {+ "clientId": "D5nn...EPAq"+ },+ "input": {+ "clientId": "required str"+ },+ "longRunning": false,+ "name": "fusion_aps_set_client_id",+ "output": {+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Set the org's APS (PKCE) client id used for cloud search. Get it from your org's members-only wiki settings: adom-wiki settings get <org> autodesk-aps (never from another machine's config file). When the org has none yet, the reply's hint gives the adom-wiki settings set command that shares it, so every other box adopts it in two calls (fusion-aps-org-setup skill). Public identifier, no secret.",+ "timeoutSeconds": 20+ },+ {+ "example": {},+ "input": {+ "allowDefaultBrowser": "optional bool",+ "exe": "optional str (browser binary to launch+remember)",+ "name": "optional str",+ "profileDir": "optional str (e.g. 'Default','Profile 2')"+ },+ "longRunning": false,+ "name": "fusion_aps_signin",+ "output": {+ "authUrl": "str",+ "needsExtensionOpen": "bool",+ "openedVia": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_aps_status",+ "summary": "Open the Autodesk sign-in in the REMEMBERED browser+profile (not the OS default); a background listener captures the token. Pass {exe,profileDir,name} to use+remember a specific browser, or {allowDefaultBrowser:true} to fall back to the OS default. If nothing is remembered, returns needsExtensionOpen so the caller opens authUrl in the user's real browser via nbrowser_open_window.",+ "timeoutSeconds": 30+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_aps_status",+ "output": {+ "configured": "bool",+ "neverCharge": "bool",+ "signedIn": "bool"+ },+ "statusVerb": null,+ "summary": "APS state: configured, signed in, token live, never-charge meter. When configured:false the hint sends you to your org's shared app ID on the wiki (adom-wiki settings get <org> autodesk-aps) before anything else; the fusion-aps-org-setup skill covers new boxes and first-time orgs.",+ "timeoutSeconds": 20+ },+ {+ "example": {+ "folderId": "urn:...",+ "localPath": "C:/x.f3d",+ "projectId": "a.YnVz..."+ },+ "input": {+ "fileName": "optional str",+ "folderId": "required str (NON-ROOT subfolder)",+ "localPath": "required str",+ "projectId": "required str"+ },+ "longRunning": false,+ "name": "fusion_aps_upload",+ "output": {+ "bytes": "int",+ "itemUrn": "str"+ },+ "statusVerb": null,+ "summary": "Upload a local file as a NEW cloud file (free Data Management; needs data:write scope). \u26d4 FOLDER HYGIENE: NEVER pass a project ROOT folderId - the bridge REFUSES it (refused_root_upload). Loose files in a shared root clutter the team's cloud. Create/choose a real subfolder first (fusion_aps_create_folder under an 'Adom AI Workspace' folder), or just use fusion_make_3d_package / fusion_build_library_3d which auto-target a non-root workspace. To RELOCATE an existing file, MOVE it (preserves its urn) - do NOT delete + re-upload (mints a new urn, breaks 3D bindings). See the fusion-cloud-hygiene skill.",+ "timeoutSeconds": 90+ },+ {+ "example": {+ "query": "BME690 Molecule"+ },+ "input": {+ "query": "str OR projectId+urn"+ },+ "longRunning": false,+ "name": "fusion_aps_versions",+ "output": {+ "versionCount": "int",+ "versions": "[...]"+ },+ "statusVerb": null,+ "summary": "Full (uncapped) version history of a file.",+ "timeoutSeconds": 40+ },+ {+ "example": {+ "includePhysicalProperties": true,+ "treatAsUnit": [+ "with fasteners"+ ]+ },+ "input": {+ "exclude": "optional [str] top-level name prefixes to skip",+ "includePhysicalProperties": "optional bool (adds volume_cm3/mass_kg per line)",+ "maxSeconds": "optional float (walk budget, default 20; the verb REFUSES fast with bom_walk_budget_exceeded + a fusion_export_bom redirect on electronics 3D PCBs instead of blocking Fusion for minutes - issue #659)",+ "outputPath": "optional str (Windows CSV path)",+ "treatAsUnit": "optional [str] name substrings counted as one unit (default ['with fasteners'])"+ },+ "longRunning": false,+ "name": "fusion_assembly_bom",+ "output": {+ "design": "str",+ "partCount": "int",+ "parts": "[{componentName, partNumber, description, material, quantity, bodies}]",+ "success": "bool",+ "totalInstances": "int"+ },+ "statusVerb": null,+ "summary": "Structured, kit-aware MECHANICAL bill of materials for the active Design assembly (the counterpart to the electronics-only fusion_export_bom). Recurses organizational subassemblies but counts a physical part or a purchased kit/unit ONCE, so hardware modeled inside a kit (a '... with fasteners' bracket, a bearing/pulley) is NOT double-counted the way a flat allOccurrences walk counts it. Matches Fusion's Manage -> BOM quantities. Optionally writes a CSV.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "filePath": "C:/Users/<user>/adom-lib/ADS8588SIPM.fusion.lbr",+ "modelPath": "C:/Users/<user>/adom-lib/ADS8588SIPM.step",+ "packageName": "ADS8588SIPM"+ },+ "input": {+ "filePath": "required str (.lbr WINDOWS path C:/...)",+ "modelPath": "required str (.step WINDOWS path C:/...)",+ "packageName": "optional str"+ },+ "longRunning": true,+ "name": "fusion_attach_3d_package",+ "output": {+ "_hint": "the Save-dialog click + verify steps",+ "data": "{steps}",+ "savePending": "bool",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "LOW-LEVEL primitive: attaches ONE model to ONE package. Prefer fusion_create_library with parts[]. Attach a real 3D chip model to a library package, end to end: opens the .lbr (library active), runs Electron.Create3DPackage to enter the Package3DEnvironment showing the footprint, imports the STEP + auto-orients it flat on the footprint, then executes Package3DStop (FINISH). This BINDS the 3D onto the deviceset (Content Manager shows the 3D nested under the package; the Packages 'Package' column flips Placeholder->part-name). ONE desktop-side step remains: Fusion pops a modal Save dialog (an OWNED popup) - the response _hint gives the exact desktop_ui_click to confirm it. AFTER: re-grab desktop_screenshot_window and check ownedPopupCount for errors; the 3D preview LAGS a beat before showing the real chip. Both paths (filePath/modelPath) are WINDOWS paths - stage from the container first.",+ "timeoutSeconds": 240+ },+ {+ "example": {+ "libraryPath": "C:/Temp/PART.lbr",+ "stepPath": "C:/Temp/PART.step"+ },+ "input": {+ "deviceset": "optional str (defaults to the library's first)",+ "libraryPath": "required str (WINDOWS .lbr path)",+ "stepPath": "required str (WINDOWS .step path)"+ },+ "longRunning": true,+ "name": "fusion_bind_library_3d",+ "output": {+ "bound": "bool",+ "reopened": "bool",+ "success": "bool",+ "wip_urn": "str"+ },+ "statusVerb": null,+ "summary": "LOW-LEVEL primitive: binds ONE STEP onto one deviceset. Prefer fusion_create_library with parts[] (which handles one part or many through a single path); reach for this only when you are driving a single bind deliberately. The CORRECT library in ONE call (the Library button's real bar: the 3D chip renders in the Content Manager preview): mints the part's 3D as a cloud f3d (make_3d_package), injects the wip_urn binding into the .lbr ON DISK (packages3d + package3dinstances), and reopens the library. Needs a signed-in Fusion session - the one cloud-dependent step in the wiki-to-EE circle. Autodesk's thumbnail preview lags ~2-3 min behind a fresh mint. NOTE: distinct from the older fusion_build_library_3d (multi-part batch pipeline).",+ "timeoutSeconds": 480+ },+ {+ "example": {},+ "input": {+ "expectDocument": "required exact board name",+ "outputDir": "optional folder on this machine for bom.csv + bom-jlcpcb.csv"+ },+ "longRunning": false,+ "name": "fusion_board_bom",+ "output": {+ "boardOnly": "[str]",+ "csv": "str",+ "files": "{name:path}",+ "jlcpcbCsv": "str",+ "lines": "[{designators,quantity,value,package,mpn,manufacturer,mouser,digikey,lcsc}]",+ "missingPartNumbers": "{mouser,digikey,lcsc:[str]}"+ },+ "statusVerb": "fusion_routing_state",+ "summary": "The bill of materials from the live board's own part attributes: one line per MPN with designators, quantity, value, package, manufacturer and the Mouser, DigiKey and LCSC numbers, plus the JLCPCB form (Comment, Designator, Footprint, LCSC). Board-only parts (test pads) are listed as such, and any part missing a distributor number is named. Read-only; with outputDir it also writes bom.csv and bom-jlcpcb.csv there.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_board_info",+ "output": {+ "rawXml": "str"+ },+ "statusVerb": null,+ "summary": "Raw board geometry XML (copper/arcs/lines) for the open board.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "fixed": "optional [{ref, deviceset, value?, x, y (mm, board frame), rot?, nets:{pin:net}}]",+ "libraryPath": "required .lbr on this machine",+ "name": "optional design name (letters, digits, _ -)",+ "outDir": "required folder on this machine",+ "outlineMm": "required [width, height]",+ "rules": "optional {clearance, edge, minWidth, minDrill, holeToHole, padRestringRatio, padRestring, viaRestring, copperUm}",+ "title": "optional sheet title"+ },+ "longRunning": false,+ "name": "fusion_board_seed",+ "output": {+ "brdPath": "str",+ "fixedParts": "int",+ "schPath": "str"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Write the design a new board starts from, as EAGLE source on this machine: the board outline, the fab's design rules (Fusion's own rules block with your clearance, edge distance, minimum width and drill, hole-to-hole, pad and via restring and copper weight; Fusion's defaults are 0.35 mm drill, 1 mm to the edge and a 25 % pad restring, wrong for most fabs), the fixed parts at their places with their nets, and the library they come from. Then fusion_new_electronics_from_eagle imports it as a linked schematic and board.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "boardId": "optional",+ "expectDocument": "required exact board name"+ },+ "longRunning": false,+ "name": "fusion_board_source",+ "output": {+ "boardId": "str",+ "revision": "str",+ "source": "str (EAGLE .brd XML)"+ },+ "statusVerb": "fusion_routing_state",+ "summary": "Read the live board as EAGLE XML from a fresh export: parts, copper, vias, pours with Fusion's own computed fill, and the outline. Read-only. Feed it to adom-fields (it reads .brd) for current and heat, or to adom-aiflow, which converts it for its offline checks.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_board_stackup",+ "output": {+ "copperCount": "int",+ "copperLayers": "list",+ "copperThickness_mm": "list",+ "dielectricBonds": "list (prepreg/core order)",+ "fr4": "{x_mm,y_mm,dielectric_mm}",+ "layerSetup": "str"+ },+ "statusVerb": null,+ "summary": "Read a board's PHYSICAL fabrication stackup (see the pcb-stackup skill): copper layer count + copper/dielectric thicknesses from the EAGLE design rules (layerSetup/mtCopper/mtIsolate) plus the measured FR4 extent. A PCB is Cu/prepreg/Cu/core/.../Cu - the FR4 is NOT one slab. Use to build the stackup table + real-thickness exploded 3D view, and put a stackup table on every exported board's wiki page.",+ "timeoutSeconds": 200+ },+ {+ "example": {+ "lbrPath": "C:/tmp/newlib/AdomBasicParts2.lbr",+ "parts": [+ {+ "lbrPath": "C:/tmp/newlib/R_4k7.lbr",+ "modelPath": "C:/tmp/newlib/R_4k7.step",+ "package": "R_4k7"+ }+ ]+ },+ "input": {+ "capture": "optional bool (default true)",+ "folderId": "optional str",+ "lbrPath": "required str (combined .lbr WINDOWS path to bind + open)",+ "openWhenDone": "optional bool (default true)",+ "outLbrPath": "optional str (default: overwrite lbrPath)",+ "parts": "required [{package, lbrPath (per-part footprint .lbr), modelPath (.step)}]",+ "projectId": "optional str"+ },+ "longRunning": true,+ "name": "fusion_build_library_3d",+ "output": {+ "boundLbr": "str",+ "opened": "bool",+ "parts": "[{package,success,wip_urn,dims_mm,error}]",+ "partsBound": "int",+ "partsTotal": "int",+ "screenshots": "[{package,stage,path}]",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Build a RENDERING multi-part 3D library in ONE call - the whole programmatic pipeline. For each part it makes the footprint+chip f3d package (no GUI dialogs, optional before/after screenshots) and collects the wip_urn, then injects ALL bindings into the combined .lbr in one pass (no hand XML surgery) and opens the finished library once. This is the verb for a basic-parts sampler / any many-part library; it replaces the per-part make_3d_package loop + manual binding. projectId/folderId default to the MAIN-project upload folder. Each part is independent, so re-run just the failed parts if Fusion resets mid-run.",+ "timeoutSeconds": 1800+ },+ {+ "example": {+ "runId": "a3f1c2d4e5b6"+ },+ "input": {+ "runId": "optional str (omit for the latest run in flight)"+ },+ "longRunning": true,+ "name": "fusion_cancel_run",+ "output": {+ "cancelRequested": "bool",+ "runId": "str",+ "stage": "str at the time of the request",+ "statusVerb": "fusion_prove_result"+ },+ "statusVerb": "fusion_prove_result",+ "summary": "STOP a library import that is in flight (fusion_install_library_bundle / fusion_create_library) - the user's escape hatch from a long run, wired to a Cancel button in web control. Cooperative, not a kill: the run finishes the part it is on (a STEP import cannot be interrupted mid-command without leaving a half-made design, up to ~60s), keeps every 3D package already minted and binds them into the library, closes its scratch documents, and leaves the library open in Fusion (not saved to the cloud). The run then reports stage:cancelled, verdict:cancelled, errorCode cancelled_by_user, cancelledAt (which stage) and how many parts were done, on the same fusion_prove_result poll the caller already makes; cancelRequested:true shows on the very next poll before the boundary is reached. Omit runId to cancel the latest run still in flight. Idempotent; a run that already ended answers alreadyFinished.",+ "timeoutSeconds": 10+ },+ {+ "example": {+ "packages": [+ "ESP32-S3FN8",+ "ATSAMD51J20A-AUT"+ ]+ },+ "input": {+ "libraryPath": "optional str (.lbr on the box; required for the 3d view, defaults to the last library opened)",+ "packages": "required [<deviceset name>] (or 'package': single name)",+ "settle": "optional float secs after each EDIT before capture (default 1.5; raise if a shot shows the PREVIOUS part)",+ "views": "optional subset of ['symbol','footprint','3d','component'] (default ALL FOUR, in that assembly order - 3d opens the part's BOUND f3d (footprint + chip) by its urn, frames it, captures it and closes it unsaved; needs libraryPath; component is the ganged view last)"+ },+ "longRunning": true,+ "name": "fusion_capture_library_views",+ "output": {+ "captured": "[{package,view,path,ok}]",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Capture the LIBRARY-EDITOR views EEs trust: the schematic SYMBOL (full pinout), the FOOTPRINT (pads + layer stack), and the COMPONENT/device view (Content Manager: symbol + the package table with the footprint<->package Mapped check + pin/pad counts). The 3D before/after shots don't show these. Requires the .lbr OPEN in the Electronics Library workspace (fusion_open_lbr first). Runs EDIT <pkg>.sym/.pac/.dev + WINDOW FIT + a background hwnd screenshot per view; returns the PNG paths on the box (C:/tmp/conduit-screenshots - pull with desktop_pull_file). EDIT uses the DEVICESET name (e.g. ESP32-S3FN8).",+ "timeoutSeconds": 300+ },+ {+ "example": {},+ "input": {+ "boardId": "required",+ "expectDocument": "required exact board name",+ "expectedRevision": "required",+ "pours": "required [{net, layer, points:[[x,y]...], width? (mm), isolate? (mm)}]"+ },+ "longRunning": false,+ "name": "fusion_change_pours",+ "output": {+ "changes": "[{net,layer,width:[before,after],isolate:[before,after],filledMm2:[before,after]}]",+ "revision": "str",+ "success": "bool",+ "verified": "bool"+ },+ "statusVerb": "fusion_routing_state",+ "summary": "Change existing pours in place: the pen width (the narrowest copper the fill can reach; a pen wider than a throat leaves it empty) and the isolation. Each pour is named by net, layer and outline, picked on the midpoint of its longest edge, then RATSNEST refills. The readback proves each pour took its new width/isolate and that no track or via changed, and reports the filled area before and after.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "fileName": "BQ25792",+ "folderPath": "Molecules/XRP/Power",+ "projectName": "Main"+ },+ "input": {+ "fileName": "required str",+ "folderPath": "optional str (default the project root)",+ "projectName": "optional str (default the active project)"+ },+ "longRunning": false,+ "name": "fusion_check_recovery",+ "output": {+ "apiReliable": "bool",+ "fileId": "str",+ "fileName": "str",+ "hasRecovery": "bool",+ "project": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Ask whether a cloud file has a crash-recovery document waiting, which would raise Fusion's recovery modal on open. BEST-EFFORT: Fusion's Python API does not reliably expose this (apiReliable reports whether the property existed), so a false negative is possible; the dependable signal is an open that times out, and fusion_dismiss_blocking_dialogs clears the modal. Finds the file by exact name in one project folder.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "profile": "optional str (browser profile to name in the sign-in hint, e.g. edge:[email protected])"+ },+ "longRunning": false,+ "name": "fusion_claim_seat",+ "output": {+ "account": "obj",+ "holdsSeat": "bool",+ "license": "obj",+ "steps": "[{step, ok}]",+ "success": "bool"+ },+ "statusVerb": "fusion_readiness",+ "summary": "Make THIS machine the active Fusion seat, the first-class way to move a licence between boxes while testing. Starts Fusion if needed, then answers Autodesk's 'Active Sessions Exceeded' modal in the BACKGROUND (Continue): this box takes the seat and the other machine's Fusion suspends RESUMABLY, keeping its documents. Answers needs_signin (never a credential prompt) when the box is not signed in: run fusion_signin first. Confirms with fusion_account and reports the account and licence it ended up with.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "fileIds": [+ "urn:adsk.wipprod:dm.lineage:abc123"+ ],+ "projectName": "Adom"+ },+ "input": {+ "fileIds": "required [<lineage urn>]",+ "folderPath": "optional str (default root - where the files live)",+ "projectName": "optional str (default active project)"+ },+ "longRunning": true,+ "name": "fusion_cleanup_cloud_files",+ "output": {+ "deletedCount": "int",+ "failed": "[{fileId,error}]",+ "failedCount": "int",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "PRECISELY delete a list of cloud files by lineage urn - SAFE cleanup of AI-created clutter. Deletes ONLY the exact fileIds given (never name-guessing), so it can't touch a teammate's file in a shared folder. Loops server-side. Get the ids from fusion_aps_browse (item .id). Use this to remove f3d files the bridge created. A big list takes minutes (relay may time out at ~60s while deletes continue server-side - re-browse to confirm).",+ "timeoutSeconds": 1800+ },+ {+ "example": {+ "closeUntitled": true+ },+ "input": {+ "closeUntitled": "optional bool default false - also close UNMODIFIED Untitled scratch docs",+ "force": "optional bool default false - with closeUntitled, also discard MODIFIED Untitled docs",+ "save": "optional bool default false"+ },+ "longRunning": false,+ "name": "fusion_close_all_documents",+ "output": {+ "closed": "[str]",+ "success": "bool",+ "wouldPrompt": "[str]|null"+ },+ "statusVerb": null,+ "summary": "Close ALL open documents without save dialogs. DESTRUCTIVE to unsaved user work - confirm with the human before calling on a box you do not own. By default it SKIPS scratch 'Untitled' docs; pass closeUntitled:true to close the UNMODIFIED ones too (page issue #59: the library/bind flow left ~5 per import, 16 after three, and no caller could clear them), and force:true to also discard MODIFIED Untitled docs, which may hold real unsaved work.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "save": false+ },+ "input": {+ "name": "optional str (default: active document)",+ "save": "optional bool default false"+ },+ "longRunning": false,+ "name": "fusion_close_document",+ "output": {+ "closed": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Close ONE document WITHOUT the modal save dialog (save:false discards silently - the automation-safe close). Omit name to close the active document.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "hwnd": 123456+ },+ "input": {+ "hwnd": "required int (the dialog window)"+ },+ "longRunning": false,+ "name": "fusion_close_window",+ "output": {+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Close a DIALOG window by hwnd (WM_CLOSE, like clicking X) - for dialogs without Cancel/Escape handling (e.g. Recovered Documents). NOT a document closer; refuses without hwnd. Get the hwnd from a screenshot's dialogs array or desktop_list_windows. (Doc drift caught by the verb test suite 2026-08-14: this was described as 'close the active document' while the handler required hwnd.)",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "folderName": "AI-Scratch",+ "projectName": "Main"+ },+ "input": {+ "folderName": "required str",+ "parentPath": "optional str (parent folder path; default the project root)",+ "projectName": "optional str (default the active project)"+ },+ "longRunning": false,+ "name": "fusion_create_cloud_folder",+ "output": {+ "alreadyExisted": "bool (only when it already existed)",+ "folderId": "str",+ "folderName": "str",+ "parentFolder": "str",+ "project": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Create a subfolder in a cloud project through the signed-in Fusion session's Data API (no APS needed). Idempotent: an existing folder of that name is returned with alreadyExisted:true instead of a duplicate. Folder names are matched case-insensitively. For an APS-side create without Fusion running, use fusion_aps_create_folder.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "libraryPath": "C:/Temp/PART.lbr",+ "stepPath": "C:/Temp/PART.step"+ },+ "input": {+ "kicadFootprintPath": "optional str",+ "kicadSymbolPath": "optional str",+ "libraryPath": "optional str (shape A, or output path for B)",+ "name": "optional str",+ "parts": "optional [{package, lbrPath, modelPath}] - THE canonical shape, any count",+ "pinMap": "optional {pinName: padName}",+ "stepPath": "optional str (required for proven)"+ },+ "longRunning": true,+ "name": "fusion_create_library",+ "output": {+ "started": "bool",+ "statusVerb": "str"+ },+ "statusVerb": "fusion_prove_result",+ "summary": "ONE-CALL library creation for web-control (one call = one consent). EVERY LIBRARY IS MULTI-PART - a single-part library is simply parts:[one entry], and there is no separate single-part verb to choose. Pass parts:[{package, lbrPath, modelPath}] for any number of parts; the older {libraryPath, stepPath} shape still works and is normalised into a one-element parts list, so both run the identical code path and the ETA scales with the part count either way. TWO entry shapes: A) {libraryPath, stepPath} - a ready .lbr plus the 3D; B) {kicadSymbolPath, kicadFootprintPath, stepPath, pinMap?} - KiCad sources; needs adom-lbr, which is Linux-container-only by platform rule, so on Windows/Mac boxes shape B refuses IMMEDIATELY (adom_lbr_unavailable, before any staging or Fusion launch - fusion_readiness reports kicadIngest up front). Convert at AUTHORING time in a container and use shape A. pinMap = explicit {pinName: padName} for when pin numbers do not match pad names (BGA-style). Chains convert -> bind 3D -> prove (four evidence frames + verdict) in the BACKGROUND and returns immediately; poll fusion_prove_result (stage narrates; top-level `verdict` proven/not_proven is the score - `stage:done` only means the chain finished). EVERY PART IS PROVED, not just the first: a 10-component library streams 40 evidence frames, FOUR per component (symbol, footprint, 3d, ganged) in assembly order, each tagged with `part` so a front end can group them as they arrive, and `provedParts[]` reports per-part pass/fail. The library is proven only if EVERY part is - one good part does not vouch for nine unchecked ones. On the FINAL fetch pass {inlineFrames:true} to get each evidence frame as a base64 thumbnailDataUrl a browser can render (plain polls return box paths only). The chain closes its library document on success AND failure - batches need no between-part sweeping. stepPath is required for a PROVEN library - no real 3D body without it.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "fileName": "verbtest-scratch",+ "folderPath": "AI-Scratch",+ "projectName": "Main"+ },+ "input": {+ "fileId": "optional str (lineage urn for a precise delete; lineageUrn is accepted as an alias)",+ "fileName": "required str unless fileId is given (exact name match in one folder)",+ "folderPath": "optional str (default the project root)",+ "projectName": "optional str (default the active project)"+ },+ "longRunning": false,+ "name": "fusion_delete_cloud_file",+ "output": {+ "fileId": "str",+ "fileName": "str",+ "folder": "str",+ "project": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "DESTRUCTIVE: delete ONE cloud file through the signed-in Fusion session's Data API. Looks in exactly one folder (projectName + folderPath, no recursion) for an exact case-insensitive name match, or for the lineage urn when fileId is given (the precise form; prefer it in shared folders). Refuses without fileName or fileId. Large folders time out on the scan; give a precise folderPath. Use fusion_cleanup_cloud_files to delete a LIST of urns with dryRun support.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "captions": "optional bool (default true: one desktop caption per stop)",+ "foreground": "optional bool (default false: background envelope, never steals focus)",+ "mode": "optional str ('tour' = the async showcase; poll fusion_demo_progress {demoId})",+ "preset": "optional str ('electronics' = library import, symbol, footprint, 3D chip, ganged component view, schematic, 2D board, 3D board - the eight-stop showcase; omit for the full tour incl. Data Hub, APS, MCP, exports)",+ "query": "optional str (design to demo; else picked from APS search)",+ "remote": "optional bool (tour mode: show ab's floaty glass PLAY/PAUSE/NEXT/BACK/STOP panel on the desktop; its presses drive the same transport flags as fusion_demo_control, so the dashboard buttons and the remote can be mixed)",+ "stage": "optional str ('skip_aps' to proceed without cloud search)"+ },+ "longRunning": true,+ "name": "fusion_demo",+ "output": {+ "apsSampleSearch": "[{name,project}]",+ "done": "bool",+ "narrate": "str",+ "screenshots": "[{label,path}]",+ "stage": "str",+ "steps": "[str]"+ },+ "statusVerb": "fusion_demo",+ "summary": "FIRST-TIME-USER DEMO in one verb - the thing to run when someone new wants to SEE what this bridge does (HD's installer calls this). Takes them from nothing to a real board: launches Fusion, FINISHES the Autodesk sign-in - it OPENS the sign-in in the user's NATIVE browser IN THE BACKGROUND (never interrupting their work) and returns signinWhere/signinProfile/signinSession so you can tell them exactly where it is waiting, then offer three paths: they finish it, you foreground it, or (with their OK) you drive it. Native browser via ABE/nbrowser_* because that profile is already signed into Autodesk - never pup, which is anonymous, sets up APS cloud search (or explains it if declined) and runs a LIVE sample search so they see 2-second results, then opens an electronics PROJECT and walks SCHEMATIC -> 2D BOARD -> 3D BOARD, screenshotting each view to show them. STAGED + RESUMABLE: every call advances as far as it safely can and returns stage/done/narrate/screenshots plus a _hint with the exact next action; keep calling it until done:true. NEVER leave a first-time user parked on the sign-in screen - that is the failure this verb exists to prevent. See the 'fusion-demo' skill. TOUR MODE: pass {mode:'tour'} for the ASYNC guided ELECTRONICS tour (John, 2026-09-04: Adom is an electronics prototyping company, so the tour shows electronics, never a mechanical part): eight beats over the bundled sample part - the library, the symbol, the footprint, the 3D chip minted from its STEP and bound into the user's hub, then a REAL board from the user's hub (BQ25792, the Adom charger; args.board or args.boardUrn override) in schematic, 2D board and 3D board, falling back to a generated solo board only when the hub has none, and a cloud search; multipart libraries are mentioned in the narration, never shown (a bind is minutes per part). Captions are 32px on one line so they never cover the remote. ab's glass remote (desktop_demo_panel id fusion-tour) drives it: play, pause, next, back, mute, unmute, X = stop, with an instant loopback callback plus a poll backstop, one FIFO for the panel and fusion_demo_control, an ack caption per press; captions narrate every beat and pre-rendered narration audio plays locally (mute is session-only, unmute replays the beat). Every beat is measured before it moves (front, title, painted, stable) and then moves (2D zoom through the add-in, 3D orbit and zoom through Fusion's camera, verified by capture). Returns {demoId, estimatedSec, steps} at once; fusion_demo_progress {demoId} carries step, beatIndex/beatCount, percent, paused, muted, stopping, panel, presses[], captions[], per-step verified/placed/foregrounded/motion, shots[] (one evidence frame per beat), windowsRestored and tourDocsClosed. Fusion is placed on 80% of the primary work area for the show and restored at the end. Pass legacy:true for the previous step-list tour.",+ "timeoutSeconds": 240+ },+ {+ "example": {+ "demoId": "tour-abc123",+ "imagesAs": "base64",+ "sinceShot": 3+ },+ "input": {+ "demoId": "required str (from fusion_demo mode:tour; omitted = the single running tour)",+ "imagesAs": "optional str paths|base64|both",+ "sinceShot": "optional int - shots you already received; response windows to the new ones"+ },+ "longRunning": false,+ "name": "fusion_demo_progress",+ "output": {+ "done": "bool",+ "percent": "int",+ "shotCount": "int",+ "shots": "list",+ "step": "str",+ "stepLabel": "str",+ "stepShot": "dict|absent"+ },+ "statusVerb": null,+ "summary": "Poll a running fusion_demo tour: {percent, elapsedSec, estimatedSec, step, stepLabel, done, failed, shots, shotCount, stepShot}. Poll ~1-2.5s and render a REAL progress bar. LIVE EVIDENCE (issue #30): each frame MAY carry stepShot {step, title, image} - a ~640px base64 capture the BRIDGE took at that step's completion, one per step, riding the first frame after it completes (render these during the run; the page should not guess-snap). shots[] streams too: mid-run it carries paths for every completed step; pass imagesAs:base64 + sinceShot:<count you have> to receive only NEW shots fully encoded. done:true = the full gallery (base64 by default). Finished tours are DISK-SNAPSHOTTED, so the final frame stays pollable even across a bridge respawn.",+ "timeoutSeconds": 15+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_describe",+ "output": {+ "success": "bool",+ "verbs": "[{name,summary,input,output,timeoutSeconds,statusVerb,longRunning,example}]"+ },+ "statusVerb": null,+ "summary": "Self-describe every verb the bridge exposes (this list) for ab's Verbs tab + runner. The reply carries `contribute` (source, mirror, issue and PR commands, the fusion-contributing skill); every failing reply carries `_contribute` with the same pointer.",+ "timeoutSeconds": 20+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_detect_layers",+ "output": {+ "copperLayers": "[int]",+ "layerCount": "int"+ },+ "statusVerb": null,+ "summary": "Detect 2-layer vs 4-layer board (ULP + CAM comparison).",+ "timeoutSeconds": 90+ },+ {+ "example": {},+ "input": {+ "categories": "optional [str] dialog categories to act on (default: all blocking dialogs)"+ },+ "longRunning": false,+ "name": "fusion_dismiss_blocking_dialogs",+ "output": {+ "count": "int",+ "dialogs": "[...]",+ "dismissed": "[{title, category, answeredWith, closed}]"+ },+ "statusVerb": null,+ "summary": "Detect + classify (and optionally dismiss) blocking Fusion dialogs. Answers every one with the safe button (No/Cancel via WM_CLOSE, never Yes, never focus-stolen). {categories:[...]} narrows the sweep to those categories (e.g. [\"crash_report\"], the launch janitor's scope).",+ "timeoutSeconds": 30+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_document_info",+ "output": {+ "isSaved": "bool",+ "name": "str",+ "productType": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Metadata for the ACTIVE document: name, product type, save state, version, parent project.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "runId": "1a2b3c"+ },+ "input": {+ "runId": "required str (from fusion_new_electronics_from_eagle)"+ },+ "longRunning": false,+ "name": "fusion_eagle_import_status",+ "output": {+ "documentName": "str",+ "partsExpected": "int",+ "partsPlaced": "int",+ "result": "obj",+ "stage": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "The run record of a background fusion_new_electronics_from_eagle import: stage (started | done | failed), documentName, partsExpected (elements in the .brd), partsPlaced (read back from the board), placed[], and the final result. Poll it every few seconds after the import returned its runId.",+ "timeoutSeconds": 20+ },+ {+ "example": {+ "x1": 0,+ "x2": 10,+ "y1": 0,+ "y2": 8+ },+ "input": {+ "frameDelayMs": "optional int (default 35)",+ "steps": "optional int (default 16)",+ "x1": "float",+ "x2": "float",+ "y1": "float",+ "y2": "float"+ },+ "longRunning": true,+ "name": "fusion_electron_pan",+ "output": {+ "box": "[...]",+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Smoothly PAN + zoom the view to frame a board-coordinate box (mm; get part positions from fusion_board_info). Animates from where the view last was.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "command": "set confirm yes;RUN 'C:/tmp/jlcpcb_smta_exporter.ulp' 'C:/tmp/jlc'"+ },+ "input": {+ "command": "required str"+ },+ "longRunning": false,+ "name": "fusion_electron_run",+ "output": {+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Run an EAGLE/Electron command in the open board (the generic extension point, e.g. RUN <ulp>).",+ "timeoutSeconds": 90+ },+ {+ "example": {+ "name": "U1"+ },+ "input": {+ "name": "str (refdes, e.g. R1)",+ "properties": "optional bool (default true)",+ "x": "optional float",+ "y": "optional float"+ },+ "longRunning": true,+ "name": "fusion_electron_select",+ "output": {+ "deviceInfo": "str",+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "SELECT a part (by reference designator, or x/y board mm) and surface its properties - the way clicking a part reveals the properties panel. Great for showing life in a recording.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "factor": 3,+ "steps": 20+ },+ "input": {+ "factor": "float (default 2.0)",+ "fit": "optional bool",+ "frameDelayMs": "optional int (default 35)",+ "steps": "optional int (default 16)"+ },+ "longRunning": true,+ "name": "fusion_electron_zoom",+ "output": {+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Smoothly ZOOM the schematic/2D board for a recording (the whole motion is one call). factor>1 zooms in, <1 out; or fit:true. The loop runs in the add-in with a repaint per frame.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "entity": "Element",+ "fields": [+ "name",+ "x",+ "y",+ "angle"+ ]+ },+ "input": {+ "entity": "required str (class name, with or without the electronics. prefix)",+ "fields": "optional [str] property names to return",+ "filters": "optional [{property, op: eq|lt|gt, value}] (strings: eq only)",+ "limit": "optional int (default 100)",+ "offset": "optional int",+ "source": "optional auto|mcp|board (default auto)"+ },+ "longRunning": false,+ "name": "fusion_electronics_query",+ "output": {+ "count": "int",+ "entity": "str",+ "rows": "[dict]",+ "source": "mcp|board",+ "success": "bool",+ "total": "int"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "TYPED electronics read model: rows for one of Autodesk's 49 electronics entity classes (Element, Signal, Net, Layer, Via, Smd, Wire, Pad, Part, Instance, Pin, Sheet, Package, Library, Error, Variant...) over the ACTIVE electronics document, with filters, field projection and pagination. Served by Autodesk's own MCP electronics_read when its server answers (fusion_mcp_enable turns it on), else by the board_info geometry export for Board/Element/Library/Package/Layer/Signal/Wire/Error (coordinates in mm). `source` names which. Replaces reading board_info XML by hand.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "command": "Electron.ImmediateRepaint /full"+ },+ "input": {+ "command": "required str",+ "expectDocument": "optional str (refuses wrong_document if the active doc does not match)"+ },+ "longRunning": false,+ "name": "fusion_execute_text_command",+ "output": {+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Run a raw Fusion TEXT COMMAND (app.executeTextCommand) - the escape hatch to Fusion internals (Electron.* electronics commands included). Electron.* commands need an ELECTRONICS document context (schematic/board view active). Guard risky calls with expectDocument.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/out/part.3mf"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_3mf",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to 3MF mesh.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "dpi": 300,+ "outputPath": "C:/Temp/board-assembly-top.png",+ "preset": "assembly_top"+ },+ "input": {+ "dpi": "optional int (default 300, max 600)",+ "layers": "optional [int] (EAGLE layer numbers; overrides preset)",+ "listPresets": "optional bool (return the presets instead of exporting)",+ "mirror": "optional bool (default false; accepted but not applied by the add-in today, the bottom-side mirror is done container-side)",+ "monochrome": "optional bool (default false)",+ "outputPath": "optional str (WINDOWS path; default C:/tmp/adom-board.png)",+ "preset": "optional str (default all)"+ },+ "longRunning": true,+ "name": "fusion_export_board_image",+ "output": {+ "activeWorkspace": "str",+ "dpi": "int",+ "fileSize": "int",+ "fileSizeKB": "int",+ "monochrome": "bool",+ "nextSteps": "[str]",+ "outputPath": "str",+ "preset": "str (custom when layers given)",+ "presetDescription": "str",+ "presets": "{name: description} (listPresets form only)",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Render the OPEN board (or schematic) to a PNG via EAGLE's EXPORT IMAGE with a layer preset: all, top_copper, bottom_copper, top_silkscreen, bottom_silkscreen, top_soldermask, bottom_soldermask, top_paste, bottom_paste, board_outline, drill, assembly_top, assembly_bottom, fabrication (or explicit EAGLE layer numbers). Requires an electronics editor to be active (fusion_show_2d_board or fusion_open_board first). Silkscreen presets fit the view to the board outline so the PNG maps onto the board bbox. Layer visibility is restored (DISPLAY ALL) afterwards. listPresets:true returns the preset table instead of exporting.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/tmp/bom.csv"+ },+ "input": {+ "grouped": "optional bool (default true)",+ "outputPath": "optional str"+ },+ "longRunning": false,+ "name": "fusion_export_bom",+ "output": {+ "componentCount": "int",+ "grouped": "bool"+ },+ "statusVerb": null,+ "summary": "Export a Bill of Materials CSV (grouped by value+package) from the open board.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "format": "step",+ "outputPath": "C:/Temp/TJA1050.step"+ },+ "input": {+ "format": "optional str (default step): step|stl|f3d|iges|sat|smt",+ "outputPath": "required str (WINDOWS path on the Fusion machine)"+ },+ "longRunning": true,+ "name": "fusion_export_cloud_file",+ "output": {+ "documentName": "str",+ "fileSize": "int",+ "format": "str",+ "outputPath": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Export the ACTIVE Fusion Design document to a local file on the Fusion machine in one of step, stl, f3d, iges, sat or smt (despite the name it does not fetch a cloud file by name; open the document first with fusion_open_cloud_file). Requires a Design document to be active. For the per-format verbs with their own timeouts see fusion_export_step and friends; this is the one-verb form with a format switch. Pull the file back with pull_file.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/tmp/cpl.csv"+ },+ "input": {+ "outputPath": "optional str",+ "side": "optional str (all|top|bottom)"+ },+ "longRunning": false,+ "name": "fusion_export_cpl",+ "output": {+ "bottomCount": "int",+ "topCount": "int"+ },+ "statusVerb": null,+ "summary": "Export the Component Placement List (pick-and-place) CSV.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/out/sketch.dwg"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_dwg",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export 2D DWG.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "outputPath": "C:/out/sketch.dxf"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_dxf",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export 2D DXF.",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "outputPath": "C:/Temp/TJA1050.brd"+ },+ "input": {+ "outputPath": "required str (WINDOWS path ending in .sch or .brd)"+ },+ "longRunning": false,+ "name": "fusion_export_eagle_source",+ "output": {+ "activeDocument": "str",+ "activeWorkspace": "str",+ "format": "str (sch|brd)",+ "innerZipEntry": "str",+ "savedTo": "str",+ "sizeBytes": "int",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Export the ACTIVE electronics document as plain EAGLE XML (.sch or .brd; the outputPath extension picks the format). Fusion's .fsch/.fbrd are ZIP containers with the EAGLE XML inside; this exports the container via Document.CopyToDesktop, extracts the inner XML, writes it to outputPath and deletes the intermediate file. The result opens in standalone EAGLE, imports into KiCad, and parses with any XML tool. The container holds whichever editor is ACTIVE, so since 1.10.35 the bridge switches to it first (Schematic Editor for .sch, PCB Editor for .brd; reply carries switchedView) instead of answering 'No .sch file found inside .fsch ZIP container' (page issue #95).",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/out/design.f3d"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_f3d",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export the active design as a Fusion archive (.f3d).",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/out/part.fbx"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_fbx",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to FBX mesh.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputDir": "C:/tmp/jlc"+ },+ "input": {+ "outputDir": "optional str (default C:/tmp/adom-gerbers)"+ },+ "longRunning": true,+ "name": "fusion_export_gerbers",+ "output": {+ "fileCount": "int",+ "files": "[{name,size}]",+ "zipPath": "str"+ },+ "statusVerb": null,+ "summary": "Run the bundled JLCPCB CAM job (auto 2/4-layer) to produce the gerber + drill ZIP.",+ "timeoutSeconds": 180+ },+ {+ "example": {+ "outputPath": "C:/out/board.iges"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_iges",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to IGES.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/Temp/TJA1050.scr"+ },+ "input": {+ "outputPath": "optional str (WINDOWS path for the .scr; default a temp file on the Fusion machine)"+ },+ "longRunning": false,+ "name": "fusion_export_lbr",+ "output": {+ "fileSize": "int",+ "outputPath": "str",+ "preview": "str (first 2000 chars)",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Export the electronics LIBRARY in front as an EAGLE .scr script via Electron.run EXPORT SCRIPT: a text dump of every symbol, package and device, the round-trip check that a library loaded correctly. Requires an electronics editor to be active (fusion_open_lbr puts the library in front). Returns the path, size and the first 2000 characters as a preview; pull the file to read the rest.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/out/part.obj"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_obj",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to OBJ mesh.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/out/board.glb"+ },+ "input": {+ "async": "bool - RECOMMENDED true: fires the whole export+optimize pipeline in the background and returns {exportId} instantly (the sync form can outlive the relay window on a cold Fusion session); poll fusion_fetch_optimized_glb {exportId}",+ "outputPath": "required str (.glb)",+ "pin": "str medium|large default medium",+ "silkscreen": "bool default true",+ "wait": "int seconds default 15 (keep under the ~60s relay timeout; re-call fetch until complete)"+ },+ "longRunning": true,+ "name": "fusion_export_optimized_glb",+ "output": {+ "glbPath": "str",+ "jobId": "str",+ "meshesAfter": "int",+ "moleculeAnchored": "bool",+ "pending": "bool",+ "silkscreenApplied": "bool",+ "sizeBytes": "int"+ },+ "statusVerb": null,+ "summary": "Fusion board -> wiki-grade optimized GLB. Exports STEP (+ optional silkscreen) and submits it to service-step2glb molecule mode (anchor to MP pins + silk bake + gold pins + join/weld/prune + Draco): ~465KB/~31 draw calls vs a raw ~16MB/~25000 that halts the viewer. Bounded-waits `wait`s (default 90); small boards return complete, big boards return {pending, jobId} - finish with fusion_fetch_optimized_glb. Use for a component page's component.parts.model_3d. STACKUP RULE (John 2026-07-15, see pcb-stackup skill): board bbox = the FR4 body, NEVER the whole assembly (components overhang edges + tower above); each overlay goes at ITS layer's z (copper at FR4-top, silk above mask); copper traces are REAL 35um 3D bodies colored like the FR4 - recolor them + translucent mask in the RAW GLB before optimizing to make routing visible; put the measured stackup table on the board's wiki page. PUBLISH EVERYTHING: a board's wiki page repo must carry EVERY exportable design file (.f3d/.step/.usdz/EAGLE .brd+.sch/Fusion .fbrd+.fsch/gerbers/BOM/CPL/GLBs/renders), not just the 3D - the page exists to share the design.",+ "timeoutSeconds": 200+ },+ {+ "example": {+ "outputPath": "C:/out/part.sat"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_sat",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to SAT (ACIS solid).",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/out/part.skp"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_skp",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to SketchUp (.skp).",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/Temp/TJA1050.fbrd"+ },+ "input": {+ "outputPath": "required str (WINDOWS path ending in .fsch, .fbrd or .flbr)"+ },+ "longRunning": false,+ "name": "fusion_export_source",+ "output": {+ "activeDocument": "str",+ "activeWorkspace": "str",+ "format": "str (fsch|fbrd|flbr)",+ "savedTo": "str",+ "sizeBytes": "int",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Export the ACTIVE electronics document in Fusion's native source format via Document.CopyToDesktop: .fbrd (board), .fsch (schematic) or .flbr (library); the outputPath extension picks the format. The container holds whichever editor is ACTIVE, so since 1.10.35 the bridge switches to it first: the Schematic Editor for a .fsch, the PCB Editor for a .fbrd (reply carries switchedView). A .flbr still needs the library open (fusion_open_lbr). For plain EAGLE XML use fusion_export_eagle_source.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "outputPath": "C:/out/board.step"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_step",+ "output": {+ "fileSizeKB": "int",+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export the active design to STEP (needs the 3D view).",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/out/part.stl"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_stl",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to STL mesh.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "outputPath": "C:/out/part.usdz"+ },+ "input": {+ "outputPath": "required str"+ },+ "longRunning": true,+ "name": "fusion_export_usdz",+ "output": {+ "format": "str"+ },+ "statusVerb": null,+ "summary": "Export to USDZ (AR / Hydrogen 3D).",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "jobId": "abc123",+ "outputPath": "C:/out/board.glb"+ },+ "input": {+ "exportId": "str (async form from export_optimized_glb async:true - returns {phase, done, glbPath} instantly per poll)",+ "jobId": "str (service job form)",+ "outputPath": "str (.glb)",+ "wait": "int seconds default 15 (keep under the ~60s relay timeout; re-call fetch until complete)"+ },+ "longRunning": false,+ "name": "fusion_fetch_optimized_glb",+ "output": {+ "glbPath": "str",+ "pending": "bool",+ "sizeBytes": "int",+ "status": "str"+ },+ "statusVerb": null,+ "summary": "Finish a fusion_export_optimized_glb job: bounded-poll the optimizer by jobId and write the GLB to outputPath when complete. Re-call until status=complete (big boards tessellate a few minutes). No Fusion needed.",+ "timeoutSeconds": 150+ },+ {+ "example": {+ "etch": "103",+ "outputStep": "C:/tmp/ADOM-R0603-103.step",+ "params": {+ "A": 0.45,+ "D": 1.6,+ "E": 0.8,+ "L": 0.3,+ "L1": 0.3+ },+ "type": "chip"+ },+ "input": {+ "etch": "optional str (marking text on the chip top: MPN / '103'; multi-line with newline, e.g. MPN+variant - laid along the LONGEST face axis)",+ "etchDepthMm": "optional float (marking height/depth, default 0.03)",+ "etchHeightMm": "optional float (text height; default auto-fit: top-5%-band face, 10% margin, width-aware)",+ "etchStyle": "optional str raised|engraved (default raised = thin WHITE positive extrude, silkscreen-style contrast; engraved = sunken cut)",+ "outputStep": "optional str (WINDOWS path; exports STEP incl. the marking)",+ "params": "optional dict (generator dims in MM by default, e.g. chip: {D,E,A,L,L1}; soic: {A,A1,b,D,E,E1,e,L,DPins}; omitted keys use EPG defaults)",+ "type": "required str (EPG family, e.g. chip|soic|qfn|qfp|bga|sot23|dfn2|melf|ecap|crystal|header_straight - see supportedTypes in the error for the full list)",+ "unitsCm": "optional bool (params already EPG-native cm)"+ },+ "longRunning": true,+ "name": "fusion_generate_package",+ "output": {+ "bodies": "[{name,vol}]",+ "epgDir": "str",+ "etched": "str|null",+ "manifest": "obj (settings+why+bboxes; also written as <step>.manifest.json sidecar for marking refreshes)",+ "manifestPath": "str|null",+ "stepPath": "str|null",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Generate an IPC-7351-compliant parametric 3D package via Fusion's BUILT-IN ElectronicsPackageGenerator (EPG) - ~50 package families (chip/soic/qfn/qfp/bga/sot23/dfn/melf/ecap/crystal/headers/...), each a few seconds, ZERO GUI. Optionally LASER-ETCH a marking (MPN / '103') into the body top as REAL cut geometry (survives STEP), and export STEP in the same call - the royalty-free, license-clean path to a whole component library (our own generated output, not vendor models). Proven live: 0603 + '103' etch + STEP in ~2s.",+ "timeoutSeconds": 120+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_get_app_state",+ "output": {+ "activeDocument": "str",+ "activeWorkspace": "str",+ "isElectronics": "bool"+ },+ "statusVerb": null,+ "summary": "Current app state: running, active document, workspace, isElectronics. The poll/status verb for long-running calls.",+ "timeoutSeconds": 20+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_get_design_info",+ "output": {+ "bodies": "int",+ "components": "int",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Design-level summary of the active design: components, bodies, sketches, units, root name.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_get_parameters",+ "output": {+ "parameters": "list",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "All user + model parameters of the active design (name, expression, value, unit).",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_get_preferences",+ "output": {+ "current": "obj"+ },+ "statusVerb": null,+ "summary": "Read current Fusion appearance/navigation preferences (theme, activeTheme, invertScrollZoom, orbitScheme, modelingOrientation, gestureNav, cameraPivot, lengthUnit) as friendly values - the same keys fusion_set_preference accepts.",+ "timeoutSeconds": 20+ },+ {+ "example": {+ "filePath": "C:/Temp/TJA1050.fbrd"+ },+ "input": {+ "filePath": "required str (WINDOWS path to a .fsch, .fbrd or .flbr; must exist on the Fusion machine)"+ },+ "longRunning": true,+ "name": "fusion_import_electronics",+ "output": {+ "activeDocument": "str",+ "activeWorkspace": "str",+ "extension": "str",+ "filePath": "str",+ "fileType": "str",+ "nextSteps": "[str]",+ "postOpenCheck": "{required, steps}",+ "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Import a Fusion-NATIVE electronics file (.fsch schematic, .fbrd board, .flbr library; NOT legacy EAGLE .sch/.brd/.lbr) from the Fusion machine as a NEW local document via Document.newDesignFromLocal. The document is unsaved: fusion_save_to_cloud persists it, fusion_close_document discards it. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+ "timeoutSeconds": 60+ },+ {+ "example": {+ "filePath": "C:/Temp/part.step"+ },+ "input": {+ "filePath": "required str (WINDOWS path C:/...; stage from container first)"+ },+ "longRunning": true,+ "name": "fusion_import_step",+ "output": {+ "documentName": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Import a STEP/.stp (or other native-importable) file into a NEW Fusion design via the native import API. The open-electronics hints redirect .step here. (Was implemented but missing from this catalog until the verb suite's reverse-drift check caught it, 2026-08-14.)",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "worldSpace": true+ },+ "input": {+ "occurrence": "optional str (substring filter on occurrence name, worldSpace only)",+ "worldSpace": "optional bool (resolve through occurrence transforms; default false = root component only)"+ },+ "longRunning": false,+ "name": "fusion_inspect_bodies",+ "output": {+ "bodies": "[{name,owner,bbox:{x,y,z},sizeMm,volumeMm3,areaMm2,faceCount,cylindricalFaceCount,appearance,material,isVisible}]",+ "bodyCount": "int",+ "documentName": "str",+ "success": "bool",+ "units": "str (mm)"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "GEOMETRY READ-BACK: what actually got built, in MILLIMETRES. Per body: bbox, sizeMm, volumeMm3, areaMm2, faceCount, cylindricalFaceCount, appearance, material, isVisible. Use this to VERIFY your own modelling - a body at the wrong Z (a double-applied offset, a part buried inside another) renders perfectly and is INVISIBLE in a screenshot, and this work is often matte-black parts on a dark canvas where pixels are a weak check. cylindricalFaceCount is the cheap way to confirm holes were actually cut: a symmetric cut that reaches nothing fails SILENTLY with no exception. Pass worldSpace:true to resolve bodies through their occurrence transforms (assembly placement); optionally filter with occurrence. Fusion's API is centimetres - this converts for you.",+ "timeoutSeconds": 130+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_install_fusion",+ "output": {+ "alreadyInstalled": "bool?",+ "installing": "bool",+ "mode": "globalinstall|per-user",+ "statusVerb": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Install Fusion 360 FOR the user - downloads Autodesk's official Client Downloader and streams the free trial silently, with NO shell_execute and NO ab approval gate (runs inside the trusted bridge). Elevation-aware: --globalinstall when admin, PER-USER otherwise (a non-elevated globalinstall dies silently on UAC - learned live). Returns promptly; poll fusion_readiness (reports installing:true) until installed:true, then fusion_start. Declared as detect.installVerb so ab's bridge_readiness recommends it.",+ "timeoutSeconds": 90+ },+ {+ "example": {+ "libraryName": "MyLib",+ "zipPath": "C:/Temp/MyLib.zip"+ },+ "input": {+ "capture": "optional bool (default true: bind + prove; false: place only)",+ "lbrPath": "str (staged .lbr, STEP models beside it)",+ "libraryName": "optional str (default: file stem)",+ "zipPath": "str (staged bundle zip on THIS machine) - or"+ },+ "longRunning": true,+ "name": "fusion_install_library_bundle",+ "output": {+ "fusion": "{installed, running, addinReady, status, message}",+ "installed": "bool",+ "libraryPath": "str",+ "partMetadata": "{ok, summary, warnings[]}",+ "partsToBind": "int",+ "partsTotal": "int",+ "runId": "str",+ "statusVerb": "fusion_prove_result",+ "unbound": "[{package, why}]"+ },+ "statusVerb": "fusion_prove_result",+ "summary": "COMPOSITE, the Fusion twin of kicad_install_library_bundle (#68): ONE call takes a staged Cloud Library bundle (zip of <Lib>.lbr + <Part>.step models, or a bare lbrPath with STEPs beside it), unpacks it safely, places it under ~/Documents/Adom Libraries/<name>/, pairs EVERY deviceset with its STEP by name (deviceset, package, normalised, prefix; a one-part library pairs its single model regardless), lints part numbers (partMetadata: MPN, manufacturer, Mouser/DigiKey/LCSC - reported, never blocking), pre-flights Fusion state (fusion{status}), and starts the same bind -> prove chain fusion_create_library runs. ASYNC BY CONTRACT: returns IMMEDIATELY with runId + statusVerb because a STEP bind is 3-15 minutes and cannot fit a relay window; poll fusion_prove_result (measured percent, four streamed proof frames per part, provedParts[], and an addin_restart_required payload the CALLER turns into the ask). PARTIAL SHIPS: a deviceset with no model is a NAMED skip in unbound[], the rest still bind; partsBound < partsTotal is the signal. Each part is minted on its own single-deviceset library (the Package3D generator loads the FIRST package of the open library, so a merged library would put every chip on part one's footprint), with the STEP placed exactly as published (orient:false, origin trusted), then all urns are bound into the merged library, and after prove the bound library is SAVED TO THE CLOUD under <project>/Adom Libraries so it appears in Fusion's Library Manager (cloudLibrary{saved, fileId, duplicatesBefore} in fusion_prove_result). Per-part scaffolding is deleted; the user is left with one library plus its per-package f3d folder. capture:false only places the files and returns. This is the one contract the wiki CLI (`library install --format fusion`) and the Export button both read; the recipe has one owner.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {+ "probeMainThread": "optional bool (default true)"+ },+ "longRunning": false,+ "name": "fusion_interactive",+ "output": {+ "activeJobs": "bool|null",+ "addinBusy": "bool",+ "addinUp": "bool",+ "interactive": "bool",+ "mainThreadMs": "int|null"+ },+ "statusVerb": null,+ "summary": "Is Fusion taking input RIGHT NOW? Reads the add-in's busy flag (a long bridge command in flight), Fusion's own hasActiveJobs, and the main thread's latency on a trivial script (probeMainThread:false skips that and costs nothing). interactive:true means drive it; false means a load, a cloud open, or a bind is still running. The guided tour's narrator polls this every 1.5s and stamps fusion-busy / fusion-interactive transitions into the tour record, so a recording can be cut or sped up on them.",+ "timeoutSeconds": 20+ },+ {+ "example": {},+ "input": {+ "skipCleanClose": "optional bool"+ },+ "longRunning": false,+ "name": "fusion_kill",+ "output": {+ "output": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Force-KILL Fusion 360 (taskkill /F) - the desperate path for when fusion_stop cannot close it (stuck modal / wedged process). Closes docs cleanly first when reachable.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "tab": "private"+ },+ "input": {+ "tab": "optional str hub|public|private (default private)"+ },+ "longRunning": true,+ "name": "fusion_library_manager",+ "output": {+ "hwnd": "int",+ "libraries": "[str] (usually empty - see pitfall)",+ "success": "bool",+ "tab": "str",+ "tableReadable": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Open Fusion's Library Manager and switch to one of its three tabs. Hub Libraries = libraries saved in the Fusion hub (what our bind chain produces, and what Autodesk recommends for sharing). Private Libraries = library.io managed libraries in folders THIS account belongs to. Public Libraries = library.io's public catalogue. PITFALL: the library TABLE is CEF-drawn and exposes NOTHING to UIA, so libraries[] is normally empty and that is not a failure - screenshot the returned hwnd to read the rows.",+ "timeoutSeconds": 240+ },+ {+ "example": {+ "libraryPath": "C:/tmp/TJA1050.lbr"+ },+ "input": {+ "libraryPath": "required str (also accepts lbrPath/filePath/path)"+ },+ "longRunning": true,+ "name": "fusion_library_parts",+ "output": {+ "devicesets": "[{name, description, variants:[{fullName, device, technology, package, attributes, missing}]}]",+ "metadataOk": "bool",+ "success": "bool",+ "totals": "{devicesets, variants, withMpn, withDistributor}",+ "warnings": "[]"+ },+ "statusVerb": null,+ "summary": "Every ORDERABLE variant in a .lbr with its part numbers - offline, no Fusion needed. For an EE this is the point of the library: two variants can share ONE symbol, ONE footprint and ONE 3D body and still be different products (an AEC-Q100 automotive part vs the baseline one), and that difference lives ENTIRELY in the metadata. EAGLE spells the orderable identity as deviceset + device + technology: <device> carries the PACKAGE variant, <technology> carries the GRADE/temperature variant, and attributes hang off <technology>. Reports per-variant MPN / MANUFACTURER / MOUSER_PN / DIGIKEY_PN / LCSC_PN (the exact names this bridge's own BOM export reads), plus warnings when variants are indistinguishable, share an MPN, or a deviceset has no description. These warnings never block the library from opening - they say whether an EE could actually order from it.",+ "timeoutSeconds": 15+ },+ {+ "example": {+ "projectName": "Main"+ },+ "input": {+ "folderPath": "optional str",+ "projectName": "optional str (defaults to active project)"+ },+ "longRunning": true,+ "name": "fusion_list_cloud_files",+ "output": {+ "files": "list",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "List files/folders in a cloud project (optionally a subfolder).",+ "timeoutSeconds": 120+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_list_cloud_projects",+ "output": {+ "projects": "list",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "List the cloud PROJECTS visible to the signed-in Fusion session (hub walk - slow on big teams; prefer fusion_aps_search for finding files).",+ "timeoutSeconds": 120+ },+ {+ "example": {+ "filter": "Electron"+ },+ "input": {+ "filter": "optional str (substring, case-insensitive; default \"Electron\")"+ },+ "longRunning": false,+ "name": "fusion_list_text_commands",+ "output": {+ "commands": "[str] (first 50 matches)",+ "success": "bool",+ "total": "int"+ },+ "statusVerb": null,+ "summary": "List Fusion's internal TEXT COMMANDS (TextCommands.List) whose name contains filter, case-insensitive; the discovery tool for fusion_execute_text_command. Returns the first 50 matches plus the total count. Works best with an electronics editor active (the Electron.* family is what the default filter finds).",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "action": "frames",+ "since": 0+ },+ "input": {+ "action": "start|stop|status|frames",+ "intervalSec": "optional float (default 1.0)",+ "maxSec": "optional float (default 600)",+ "since": "frames only: return ticks newer than this"+ },+ "longRunning": true,+ "name": "fusion_live_feed",+ "output": {+ "frames": "[{tick, kind:main|popup, path, title, at}]",+ "running": "bool",+ "success": "bool",+ "tick": "int"+ },+ "statusVerb": null,+ "summary": "A ~1 fps look INTO Fusion while the bridge drives it, kept as a BOX-SIDE ring buffer (~10 min). Each tick records the Fusion main window (kind:main - the video) and every owned popup over it (kind:popup - dialogs, Browser/tool panels, the Adom banner; Fusion draws these as separate windows a main capture omits), each a path on this machine tied to its tick. Drain from the container with {action:frames, since:<tick>}, read_file each path, and publish where a human looks - tools/live_feed_drain.py does exactly that into shotlog. Proof frames are NOT here: fusion_prove_result evidence[] carries kind:proof with step labels, so the three kinds are distinguishable at the source. Exists so a human can see open tabs and dialogs during boot or a restart instead of guessing.",+ "timeoutSeconds": 15+ },+ {+ "example": {+ "captureLabel": "R_4k7",+ "lbrPath": "C:/tmp/newlib/R_4k7.lbr",+ "modelPath": "C:/tmp/newlib/R_4k7.step"+ },+ "input": {+ "captureLabel": "optional str (capture before/after)",+ "fileName": "optional str",+ "folderId": "optional str (default upload folder)",+ "lbrPath": "required str (.lbr WINDOWS path; its FIRST package's footprint is loaded)",+ "modelPath": "required str (.step WINDOWS path)",+ "orient": "optional bool (default true). false = import exactly as authored: NO bounding-box reorientation and NO pin-1 rotation (1.10.8)",+ "placement": "optional {translation:[x,y,z] mm, rotation:[rx,ry,rz] deg (about X, then Y, then Z, extrinsic, about the origin), scale:1} from the manufacturer's authored transform. Bypasses every heuristic; the reply returns the applied 4x4 matrix (mm), verification (verified|mismatch), source {path, sha256, bytes} and warnings. Non-finite values, wrong shapes and any scale other than 1 are refused before Fusion is touched (invalid_placement / unsupported_scale)",+ "projectId": "optional str (default MAIN-project)"+ },+ "longRunning": true,+ "name": "fusion_make_3d_package",+ "output": {+ "after": "str|null",+ "before": "str|null",+ "dims_mm": "[x,y,z]",+ "f3d": "str",+ "success": "bool",+ "wip_urn": "str"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Create a RENDERING component 3D package (FOOTPRINT + chip, aligned) for ONE part, fully programmatically with ZERO GUI dialogs. Opens the .lbr, runs Electron.Create3DPackage to load the package's footprint into a generator doc, imports the STEP onto it, orients it flat, saveAs an .f3d (skips the FINISH Save dialog + the two unbeatable 'Fusion360' CEF modals), uploads the f3d via APS, and returns an fs.file:vf wip_urn to hand-write into the library's <packages3d>. projectId/folderId default to the MAIN-project upload folder. Pass captureLabel to also get a BEFORE (footprint) + AFTER (chip placed) screenshot. PITFALL: a RAW STEP upload binds but renders NOTHING ('Thumbnail download failed') - this verb makes an f3d, which renders. Prefer fusion_build_library_3d for many parts.",+ "timeoutSeconds": 200+ },+ {+ "example": {+ "devicesets": [+ "VL53L5CX",+ "VL53L7CX",+ "VL53L8CX"+ ],+ "libraryPath": "C:/Users/me/Downloads/Adom_ToF.lbr"+ },+ "input": {+ "devicesets": "optional [str] (default: every deviceset in the library)",+ "libraryPath": "required str (.lbr on the Fusion machine; a component page's .lbr or a merged bundle library)",+ "name": "optional str document name (default <library>-showcase)",+ "silkLabels": "optional bool (default true): the part name on layer 21 under each footprint"+ },+ "longRunning": true,+ "name": "fusion_make_showcase_project",+ "output": {+ "brdPath": "str",+ "documentName": "str",+ "parts": "[{ref, deviceset, package, symbol}]",+ "partsPlaced": "int (read back from the board)",+ "schPath": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Put a library's parts on a NEW schematic and board to SHOW THEM OFF: every deviceset in the .lbr (or the ones in devicesets[]) placed in a row on a fresh sheet and a fresh board, no nets, with the library's bound 3D urns carried across so the 3D PCB shows the real bodies. Generated as EAGLE source on the box and opened dialog-free (Document.newDesignFromLocal), so nothing touches the user's screen. This is THE verb for 'make a board with these new parts on it'; fusion_make_test_project is the one-part circuit variant. After it: fusion_show_2d_board / fusion_show_3d_board {capture:true}, fusion_schematic {action:\"show\"}, fusion_save_to_cloud. The name of each part is written on the top silkscreen under its footprint (silkLabels:false turns it off); fusion_make_test_project does the same.",+ "timeoutSeconds": 300+ },+ {+ "example": {+ "libraryPath": "C:/Temp/IN-S42ATR.lbr"+ },+ "input": {+ "device": "optional str: the DEVICE (package variant) to place, e.g. \"-HV\" (default: the deviceset's first device)",+ "deviceset": "optional str (defaults to the library's first deviceset)",+ "libraryPath": "required str (WINDOWS path .lbr; stage from container first)"+ },+ "longRunning": true,+ "name": "fusion_make_test_project",+ "output": {+ "brdPath": "str",+ "circuit": "str",+ "schPath": "str",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Create a NEW electronics test project FROM SCRATCH around a library part - the Web Control demo's PROJECT button, and the answer to 'a customer only has a component page'. Generates a minimal test circuit server-side (the part + a generated 330R series resistor with VCC/GND stubs on a small board) as real EAGLE .sch/.brd, then imports the pair as a new electronics design. NO cloud, NO sign-in, no pre-existing content. After it, fusion_show_schematic / fusion_show_2d_board / fusion_show_3d_board all work on the result. Wiring uses the deviceset's own connects (first two pins), so 2-terminal parts get a real circuit and big ICs get a structurally-valid integration proof.",+ "timeoutSeconds": 300+ },+ {+ "example": {},+ "input": {+ "description": "optional str",+ "name": "optional str (defaults to the library's own name)"+ },+ "longRunning": true,+ "name": "fusion_managed_library_create",+ "output": {+ "alerts": "[...]",+ "library": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Create a NEW managed library on library.io FROM the library in front (which must already be saved in a Fusion Hub). Drives MANAGE > LIBRARY.IO > Push, then completes Fusion's Create Managed Library dialog. PITFALL: a managed library created under one Autodesk account is NOT visible to another account until its managed FOLDER is shared on library.io - proven live, so do not assume hub membership shares it.",+ "timeoutSeconds": 240+ },+ {+ "example": {},+ "input": {+ "name": "optional str (exact library name from the picker; omit to list read-only)",+ "onUpdatePrompt": "optional str cancel|merge|replace (default cancel; replace OVERWRITES the local library)"+ },+ "longRunning": true,+ "name": "fusion_managed_library_link",+ "output": {+ "alerts": "[...]",+ "linkedTo": "str?",+ "listedOnly": "bool?",+ "managedLibraries": "[{name,type,version,managedFolder,description}]",+ "success": "bool",+ "updatePrompt": "obj?"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Link the library IN FRONT to an existing managed library on library.io. With no name, opens Fusion's Select Managed Library picker, returns its rows as records (name/type/version/managedFolder/description) and CANCELS - a safe read-only listing of what this Autodesk account can reach. With name, selects that row and confirms. SAFETY: after linking, Fusion offers to force-update your library FROM the managed one; 'Replace Local Library' would destroy your parts, so this verb answers CANCEL by default - pass onUpdatePrompt to choose deliberately. A managed library owned by ANOTHER Autodesk account does NOT appear until its managed FOLDER is shared with this account on library.io; being in the same Fusion hub is not enough.",+ "timeoutSeconds": 180+ },+ {+ "example": {},+ "input": {+ "onUpdatePrompt": "optional str merge|replace|cancel (default merge)"+ },+ "longRunning": true,+ "name": "fusion_managed_library_pull",+ "output": {+ "alerts": "[...]",+ "library": "str",+ "success": "bool",+ "upToDate": "bool",+ "updatePrompt": "obj?"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Pull the newest version FROM library.io into the linked library in front. A pull ends in ONE of two CEF dialogs and BOTH block the add-in until answered: the force-update prompt when content differs (answered MERGE by default, since pull is an explicit request for the managed content - pass onUpdatePrompt:'replace' to overwrite local parts entirely, or 'cancel' to back out), or 'Up to Date' when already current. If neither appears, nothing was pulled and this reports failure rather than a false pass - Fusion greys Pull out on a library that was never linked.",+ "timeoutSeconds": 240+ },+ {+ "example": {},+ "input": {+ "onConfirm": "optional str create|cancel (default create)"+ },+ "longRunning": true,+ "name": "fusion_managed_library_push",+ "output": {+ "alerts": "[...]",+ "confirmed": "obj",+ "library": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Push a NEW VERSION of the library in front up to its linked managed library on library.io. Clicking the menu item alone does NOT push: Fusion raises a CEF 'Create New Version' confirmation and THAT is what creates the version, so this verb completes it and fails with confirm_missing rather than reporting a false pass. On a library that is not linked yet, Fusion offers Create Managed Library instead and this reports not_linked_yet - use fusion_managed_library_create. NOTE: Library Manager keeps showing the IMPORTED version number after a push, so the row gains an update-available badge instead of incrementing.",+ "timeoutSeconds": 240+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_managed_library_unlink",+ "output": {+ "alerts": "[...]",+ "library": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_get_app_state",+ "summary": "Unlink the library in front from its managed library on library.io. Fusion greys this out on a library that was never linked, so a silent no-op there is expected.",+ "timeoutSeconds": 180+ },+ {+ "example": {+ "arguments": {+ "queryType": "activeCommand"+ },+ "tool": "fusion_mcp_read"+ },+ "input": {+ "arguments": "optional obj (per that tool's inputSchema)",+ "timeout": "optional int seconds, default 120",+ "tool": "required str (from fusion_mcp_tools)"+ },+ "longRunning": true,+ "name": "fusion_mcp_call",+ "output": {+ "result": "obj",+ "tool": "str"+ },+ "statusVerb": "fusion_mcp_status",+ "summary": "Call any tool on Autodesk's Fusion MCP server (fusion_mcp_read, fusion_mcp_update, fusion_mcp_execute, fusion_mcp_electronics_read). The bridge handles the MCP streamable-HTTP handshake for you (initialize -> MCP-Session-Id -> notifications/initialized) and re-establishes a dropped session automatically. MCP acts on the ACTIVE Fusion document, so open one first. PREFER a native fusion_* verb when one exists - they are tested here and return richer hints - and reach for MCP for Autodesk's text-to-CAD surface.",+ "timeoutSeconds": 150+ },+ {+ "example": {},+ "input": {},+ "longRunning": true,+ "name": "fusion_mcp_enable",+ "output": {+ "alreadyOn": "bool",+ "enabled": "bool",+ "serverInfo": "obj",+ "steps": "list"+ },+ "statusVerb": "fusion_mcp_status",+ "summary": "Turn Autodesk's Fusion MCP server ON by driving Fusion's Preferences dialog for the user. Autodesk exposes NO API for this toggle, so the UI is the only route: this opens Preferences (Commands.Start PreferencesCommand), expands General, selects API, ticks 'Fusion MCP Server (runs locally on this device)', then clicks Apply and OK. Needs Fusion running; briefly uses the foreground and announces why with an on-screen caption. NEVER ask the user to do this by hand first - do it for them, then tell them it is handled. Note the setting is DISCARDED if Fusion is killed or restarted before Apply is clicked.",+ "timeoutSeconds": 180+ },+ {+ "example": {},+ "input": {+ "uri": "optional str (omit to list)"+ },+ "longRunning": false,+ "name": "fusion_mcp_resources",+ "output": {+ "count": "int",+ "resources": "[str]",+ "result": "obj"+ },+ "statusVerb": "fusion_mcp_status",+ "summary": "List Autodesk MCP resources, or read one by uri. These are mostly the Electronics entity schemas (resource://mcp.electronics_schema_*) that describe what fusion_mcp_electronics_read can return.",+ "timeoutSeconds": 60+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_mcp_status",+ "output": {+ "enabled": "bool",+ "serverInfo": "obj",+ "toolCount": "int",+ "tools": "[{name,description}]"+ },+ "statusVerb": "fusion_mcp_status",+ "summary": "Is Autodesk's Fusion MCP server up, and what does it expose? Autodesk + Anthropic ship a LOCAL MCP server at http://127.0.0.1:27182/mcp exposing Fusion's own text-to-CAD surface (read geometry, execute/update features, read Electronics design data). It binds LOOPBACK on the user's machine and was built for Claude Desktop running there, so a CLOUD AI cannot reach it at all - this bridge runs on that machine and proxies it for you. Returns enabled, serverInfo and the live tool list. OFF by default: if it reports enabled:false, call fusion_mcp_enable and the bridge turns it on for the user.",+ "timeoutSeconds": 45+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_mcp_tools",+ "output": {+ "count": "int",+ "tools": "list"+ },+ "statusVerb": "fusion_mcp_status",+ "summary": "Full tool list from Autodesk's Fusion MCP server INCLUDING input schemas, so you can construct a valid fusion_mcp_call. These are Autodesk's tools, not this bridge's.",+ "timeoutSeconds": 45+ },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_mech_capabilities",+ "output": {+ "idempotency": "object",+ "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"+ },+ "exploded_preview_create": {+ "description": "Create finite copied solid-BRep presentation graphics in the exact active blank unsaved Design proven by a committed current-session new_design result. Regenerates the guarded source plan; leaves source active. Exclusive session lease, no source moves/visibility writes, no model transaction, automatic document close, render or capture. Live capability and native backend qualification are separate from durable operation receipts.",+ "properties": {+ "creationOperationId": {+ "type": "string"+ },+ "expectedPlanId": {+ "type": "string"+ },+ "planner": {+ "additionalProperties": false,+ "properties": {+ "playback": {+ "enum": [+ "explode",+ "assemble"+ ],+ "type": "string"+ },+ "sampleTimes": {+ "items": {+ "maximum": 3600,+ "minimum": 0,+ "type": "number"+ },+ "maxItems": 62,+ "type": "array"+ },+ "steps": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "durationSeconds": {+ "exclusiveMinimum": 0,+ "maximum": 3600,+ "type": "number"+ },+ "instruction": {+ "type": "string"+ },+ "moves": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "direction": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "distance": {+ "exclusiveMinimum": 0,+ "maximum": 1000000.0,+ "type": "number"+ },+ "frame": {+ "enum": [+ "world",+ "parent",+ "local"+ ],+ "type": "string"+ },+ "occurrence": {+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct.",+ "type": "object"+ }+ },+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "type": "object"+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "title": {+ "type": "string"+ }+ },+ "required": [+ "durationSeconds",+ "moves"+ ],+ "type": "object"+ },+ "maxItems": 32,+ "minItems": 1,+ "type": "array"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ }+ },+ "required": [+ "unit",+ "steps"+ ],+ "type": "object"+ },+ "sessionId": {+ "type": "string"+ },+ "sourceTarget": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sourceTarget",+ "creationOperationId",+ "expectedPlanId",+ "planner"+ ],+ "type": "object"+ },+ "exploded_preview_dispose": {+ "description": "Delete only the exact retained graphics tree and leave the blank document open for caller. Supports a narrowly proven cleanup after unresolved terminal storage without rewriting that history; no global Undo or close. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "type": "object"+ },+ "exploded_preview_inspect": {+ "description": "Main-thread live preview ownership/geometry/history observation. Cached operation receipts do not establish current graphics liveness. Old-session history remains separately readable through mech_operation_status; no native reference adoption or lifecycle repair is provided here.",+ "properties": {+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "previewId"+ ],+ "type": "object"+ },+ "exploded_preview_sample": {+ "description": "Apply one server-stored absolute sample to exact-owned graphics; preserve active document. Source must remain unchanged. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sampleIndex": {+ "maximum": 63,+ "minimum": 0,+ "type": "integer"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration",+ "sampleIndex"+ ],+ "type": "object"+ },+ "exploded_preview_show": {+ "description": "Explicitly activate the exact-owned presentation in Fusion; refuse an intervening foreign active document. No OS foreground, camera change or capture. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "type": "object"+ },+ "exploded_view_plan": {+ "description": "Read-only source-bound exploded assembly plan. Normalized translation directions in immutable home world/parent/local axes; simultaneous moves within ordered steps. Descendants inherit ancestor translations once, plus own moves. Bounded deterministic sample matrices and exact home reverse endpoint. No native moves, graphics, BOM quantity changes, render/video or storyboard creation. Complete configuration identity required.",+ "properties": {+ "playback": {+ "enum": [+ "explode",+ "assemble"+ ],+ "type": "string"+ },+ "sampleTimes": {+ "items": {+ "maximum": 3600,+ "minimum": 0,+ "type": "number"+ },+ "maxItems": 62,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "steps": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "durationSeconds": {+ "exclusiveMinimum": 0,+ "maximum": 3600,+ "type": "number"+ },+ "instruction": {+ "type": "string"+ },+ "moves": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "direction": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "distance": {+ "exclusiveMinimum": 0,+ "maximum": 1000000.0,+ "type": "number"+ },+ "frame": {+ "enum": [+ "world",+ "parent",+ "local"+ ],+ "type": "string"+ },+ "occurrence": {+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct.",+ "type": "object"+ }+ },+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "type": "object"+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "title": {+ "type": "string"+ }+ },+ "required": [+ "durationSeconds",+ "moves"+ ],+ "type": "object"+ },+ "maxItems": 32,+ "minItems": 1,+ "type": "array"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "target",+ "unit",+ "steps"+ ],+ "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"+ },+ "render_scene_inspect": {+ "description": "Guarded main-thread read of current viewport camera, render settings and up to 32 environments. Optional detached world-mm camera is constructed and read back without viewport assignment. Missing fields return PARTIAL; observationComplete covers only bounded available scope. sceneWitnessComplete and renderQualified remain false. No rendering, workspace activation or scene writes.",+ "properties": {+ "camera": {+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "extents": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": 1e-06,+ "type": "number"+ },+ "maxItems": 2,+ "minItems": 2,+ "type": "array"+ },+ "eye": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "space": {+ "enum": [+ "world"+ ],+ "type": "string"+ },+ "target": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "type": {+ "enum": [+ "orthographic"+ ],+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ },+ "upVector": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [+ "type",+ "space",+ "unit",+ "eye",+ "target",+ "upVector",+ "extents"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angleUnit": {+ "enum": [+ "deg"+ ],+ "type": "string"+ },+ "eye": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "perspectiveAngle": {+ "exclusiveMinimum": 0,+ "maximum": 179.999999999,+ "type": "number"+ },+ "space": {+ "enum": [+ "world"+ ],+ "type": "string"+ },+ "target": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "type": {+ "enum": [+ "perspective"+ ],+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ },+ "upVector": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [+ "type",+ "space",+ "unit",+ "eye",+ "target",+ "upVector",+ "perspectiveAngle",+ "angleUnit"+ ],+ "type": "object"+ }+ ]+ },+ "maxEnvironments": {+ "maximum": 32,+ "minimum": 0,+ "type": "integer"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "target"+ ],+ "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"+ }+ },+ "sessionId": "str",+ "success": "bool",+ "transactions": "object"+ },+ "statusVerb": null,+ "summary": "Discover typed mechanical operations, exact input schemas, units, recovery limitations and current add-in session ID.",+ "timeoutSeconds": 30+ },+ {+ "example": {},+ "input": {+ "operationId": "required str",+ "sessionId": "required str"+ },+ "longRunning": false,+ "name": "fusion_mech_operation_status",+ "output": {+ "currentSessionId": "str",+ "historical": "bool",+ "history": "durable identity/phase/timestamps",+ "observedResult": "bounded unconfirmed current-session result or null",+ "phase": "admitted|dispatched|executing|succeeded|failed|not_executed",+ "reconciliationRequired": "bool",+ "result": "recorded terminal result or null",+ "state": "running|succeeded|failed|interrupted|reconciliation_required",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Read durable typed-operation history by recorded sessionId and operationId, including after HTTP timeout or add-in restart. Returns the recorded request digest, source version, target identity, phase/timestamps and terminal result. Historical nonterminal work is interrupted/unknown and never replayed. Admission without a durable dispatch claim or uncertain persistence requires reconciliation. Missing history never proves no execution. This observational route bypasses lifecycle repair, window etiquette and the CAD queue; it never starts/restarts Fusion or dismisses dialogs. An unavailable add-in returns operation_status_unavailable with unknown outcome. SQLite recovery may repair only the app-owned journal. A native call monopolizing Python's GIL can still delay responses.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "op": "inspect"+ },+ "input": {+ "op": "required enum: inspect|inspect_entity|new_design|parameter_set|parameter_create|health|export|transaction_probe|sketch_create|sketch_geometry|sketch_constraint|sketch_dimension|sketch_project|sketch_edit|plane_create|feature_create|feature_edit|entity_delete|parameter_batch|component_create|occurrence_insert|occurrence_update|occurrence_delete|component_metadata|joint_create|joint_edit|joint_delete|interference|bom|bom_export|cad_import|mcmaster_discover|mcmaster_open|material_list|material_assign|rigid_group_create|rigid_group_edit|rigid_group_delete|assembly_properties|geometry_query|measure|sketch_curve_edit|sketch_offset|construction_axis|sketch_diagnostics|joint_origin_create|joint_origin_edit|joint_origin_delete|regular_joint_create|regular_joint_edit|motion_link_create|motion_link_edit|motion_link_delete|configuration_inspect|render_scene_inspect|exploded_view_plan|exploded_preview_create|exploded_preview_sample|exploded_preview_show|exploded_preview_dispose|exploded_preview_inspect",+ "operationId": "required unique write ID; reuse unchanged for retry",+ "operationSchemas": {+ "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"+ },+ "exploded_preview_create": {+ "description": "Create finite copied solid-BRep presentation graphics in the exact active blank unsaved Design proven by a committed current-session new_design result. Regenerates the guarded source plan; leaves source active. Exclusive session lease, no source moves/visibility writes, no model transaction, automatic document close, render or capture. Live capability and native backend qualification are separate from durable operation receipts.",+ "properties": {+ "creationOperationId": {+ "type": "string"+ },+ "expectedPlanId": {+ "type": "string"+ },+ "planner": {+ "additionalProperties": false,+ "properties": {+ "playback": {+ "enum": [+ "explode",+ "assemble"+ ],+ "type": "string"+ },+ "sampleTimes": {+ "items": {+ "maximum": 3600,+ "minimum": 0,+ "type": "number"+ },+ "maxItems": 62,+ "type": "array"+ },+ "steps": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "durationSeconds": {+ "exclusiveMinimum": 0,+ "maximum": 3600,+ "type": "number"+ },+ "instruction": {+ "type": "string"+ },+ "moves": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "direction": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "distance": {+ "exclusiveMinimum": 0,+ "maximum": 1000000.0,+ "type": "number"+ },+ "frame": {+ "enum": [+ "world",+ "parent",+ "local"+ ],+ "type": "string"+ },+ "occurrence": {+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct.",+ "type": "object"+ }+ },+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "type": "object"+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "title": {+ "type": "string"+ }+ },+ "required": [+ "durationSeconds",+ "moves"+ ],+ "type": "object"+ },+ "maxItems": 32,+ "minItems": 1,+ "type": "array"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ }+ },+ "required": [+ "unit",+ "steps"+ ],+ "type": "object"+ },+ "sessionId": {+ "type": "string"+ },+ "sourceTarget": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sourceTarget",+ "creationOperationId",+ "expectedPlanId",+ "planner"+ ],+ "type": "object"+ },+ "exploded_preview_dispose": {+ "description": "Delete only the exact retained graphics tree and leave the blank document open for caller. Supports a narrowly proven cleanup after unresolved terminal storage without rewriting that history; no global Undo or close. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "type": "object"+ },+ "exploded_preview_inspect": {+ "description": "Main-thread live preview ownership/geometry/history observation. Cached operation receipts do not establish current graphics liveness. Old-session history remains separately readable through mech_operation_status; no native reference adoption or lifecycle repair is provided here.",+ "properties": {+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "previewId"+ ],+ "type": "object"+ },+ "exploded_preview_sample": {+ "description": "Apply one server-stored absolute sample to exact-owned graphics; preserve active document. Source must remain unchanged. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sampleIndex": {+ "maximum": 63,+ "minimum": 0,+ "type": "integer"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration",+ "sampleIndex"+ ],+ "type": "object"+ },+ "exploded_preview_show": {+ "description": "Explicitly activate the exact-owned presentation in Fusion; refuse an intervening foreign active document. No OS foreground, camera change or capture. Requires the current controller capability, presentation target, generation and a durable operation ID. Old-session native resources are never rebound.",+ "properties": {+ "expectedGeneration": {+ "maximum": 1000000000,+ "minimum": 0,+ "type": "integer"+ },+ "previewId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "previewId",+ "expectedGeneration"+ ],+ "type": "object"+ },+ "exploded_view_plan": {+ "description": "Read-only source-bound exploded assembly plan. Normalized translation directions in immutable home world/parent/local axes; simultaneous moves within ordered steps. Descendants inherit ancestor translations once, plus own moves. Bounded deterministic sample matrices and exact home reverse endpoint. No native moves, graphics, BOM quantity changes, render/video or storyboard creation. Complete configuration identity required.",+ "properties": {+ "playback": {+ "enum": [+ "explode",+ "assemble"+ ],+ "type": "string"+ },+ "sampleTimes": {+ "items": {+ "maximum": 3600,+ "minimum": 0,+ "type": "number"+ },+ "maxItems": 62,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "steps": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "durationSeconds": {+ "exclusiveMinimum": 0,+ "maximum": 3600,+ "type": "number"+ },+ "instruction": {+ "type": "string"+ },+ "moves": {+ "items": {+ "additionalProperties": false,+ "properties": {+ "direction": {+ "items": {+ "maximum": 1000000000.0,+ "minimum": -1000000000.0,+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "distance": {+ "exclusiveMinimum": 0,+ "maximum": 1000000.0,+ "type": "number"+ },+ "frame": {+ "enum": [+ "world",+ "parent",+ "local"+ ],+ "type": "string"+ },+ "occurrence": {+ "description": "Exact guarded occurrence reference from inspect; every repeated/nested instance is distinct.",+ "type": "object"+ }+ },+ "required": [+ "occurrence",+ "direction",+ "distance",+ "frame"+ ],+ "type": "object"+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "title": {+ "type": "string"+ }+ },+ "required": [+ "durationSeconds",+ "moves"+ ],+ "type": "object"+ },+ "maxItems": 32,+ "minItems": 1,+ "type": "array"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "unit": {+ "enum": [+ "mm"+ ],+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "target",+ "unit",+ "steps"+ ],+ "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": {