{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://simplecad.local/schemas/planetary-joint-sop-v2.schema.json", "title": "SimpleCAD planetary-joint executable SOP V2", "type": "object", "additionalProperties": false, "required": [ "schema", "design_id", "units", "axis_convention", "assembly_layout", "definitions", "instances", "expected_definition_counts", "assembly_root_instance_id", "assembly_relations", "transmission", "public_connectors", "interference_contract", "verification", "runtime_policy" ], "properties": { "schema": {"const": "simplecad.std.planetary_joint.sop.v2"}, "design_id": {"type": "string", "minLength": 1}, "units": {"const": "millimetre_degree"}, "axis_convention": { "type": "object", "additionalProperties": false, "required": ["main_axis", "radial_plane", "right_handed"], "properties": { "main_axis": {"enum": ["x", "y", "z"]}, "radial_plane": {"enum": ["xy", "yz", "zx"]}, "right_handed": {"const": true} } }, "assembly_layout": { "type": "object", "additionalProperties": false, "required": ["method", "calibration_role", "rules"], "properties": { "method": {"const": "semantic_axial_orbit"}, "calibration_role": {"const": "offline_dimensions_only"}, "rules": { "type": "array", "minItems": 16, "items": {"$ref": "#/$defs/layout_rule"} } } }, "definitions": { "type": "array", "minItems": 16, "maxItems": 16, "items": {"$ref": "#/$defs/definition"} }, "instances": { "type": "array", "minItems": 22, "maxItems": 22, "items": {"$ref": "#/$defs/instance"} }, "expected_definition_counts": { "type": "array", "minItems": 16, "maxItems": 16, "items": { "type": "object", "additionalProperties": false, "required": ["definition_id", "count"], "properties": { "definition_id": {"type": "string", "minLength": 1}, "count": {"type": "integer", "minimum": 1} } } }, "assembly_root_instance_id": {"type": "string", "minLength": 1}, "assembly_relations": { "type": "array", "minItems": 1, "items": {"$ref": "#/$defs/relation"} }, "transmission": {"$ref": "#/$defs/transmission"}, "public_connectors": { "type": "array", "minItems": 3, "maxItems": 3, "items": { "type": "object", "additionalProperties": false, "required": ["id", "source"], "properties": { "id": {"type": "string", "minLength": 1}, "source": {"$ref": "#/$defs/endpoint"} } } }, "interference_contract": { "type": "object", "additionalProperties": false, "required": ["policy", "volume_tolerance_mm3", "motion_samples_degrees", "designed_interference_fits"], "properties": { "policy": {"const": "no_unlisted_positive_volume"}, "volume_tolerance_mm3": {"type": "number", "minimum": 0}, "motion_samples_degrees": { "type": "array", "minItems": 2, "uniqueItems": true, "items": {"type": "number"} }, "designed_interference_fits": { "type": "array", "items": {"$ref": "#/$defs/interference_fit"} } } }, "verification": { "type": "object", "additionalProperties": false, "required": ["default_geometry", "assembly", "motion", "parameter_sweeps"], "properties": { "default_geometry": {"enum": ["strict_brep", "numeric_per_solid", "interface_only"]}, "assembly": {"const": "connector_residuals_and_collision"}, "motion": {"const": "willis_residual_and_interference_sweep"}, "parameter_sweeps": {"type": "integer", "minimum": 2} } }, "runtime_policy": { "type": "object", "additionalProperties": false, "required": ["teacher_geometry_allowed", "absolute_matrix_replay_allowed", "source_cad_required", "checksum_locked_cots_step_allowed"], "properties": { "teacher_geometry_allowed": {"const": false}, "absolute_matrix_replay_allowed": {"const": false}, "source_cad_required": {"const": false}, "checksum_locked_cots_step_allowed": {"const": true} } } }, "$defs": { "layout_rule": { "type": "object", "additionalProperties": false, "required": ["selector", "mode"], "properties": { "selector": {"type": "string", "pattern": "^(instance|definition):[^:]+$"}, "mode": {"enum": ["root", "coaxial", "orbit"]}, "axial_mm": {"type": "number"}, "radial_mm": {"type": "number", "minimum": 0}, "radial_angle_degrees": {"type": "number"}, "orbit_phase_degrees": {"type": "number"}, "local_axis": {"enum": ["x", "y", "z"]}, "axis_direction": {"enum": [-1, 1]}, "clock_degrees": {"type": "number"}, "clock_step_degrees": {"type": "number"} }, "allOf": [ { "if": {"properties": {"mode": {"const": "root"}}}, "then": {"required": ["selector", "mode"]}, "else": {"required": ["axial_mm", "local_axis", "axis_direction", "clock_degrees"]} }, { "if": {"properties": {"mode": {"const": "orbit"}}}, "then": {"required": ["orbit_phase_degrees", "clock_step_degrees"]} } ] }, "connector": { "type": "object", "additionalProperties": false, "required": ["id", "kind"], "properties": { "id": {"type": "string", "minLength": 1}, "kind": {"enum": ["frame", "revolute_axis", "mount", "gear_axis", "bearing_seat", "shaft_hub"]} } }, "definition": { "type": "object", "additionalProperties": false, "required": ["id", "family", "generator", "source_mode", "maturity", "connectors"], "properties": { "id": {"type": "string", "minLength": 1}, "family": {"type": "string", "minLength": 1}, "generator": {"type": "string", "pattern": "^simplecadapi\\.std\\."}, "source_mode": {"enum": ["formula_std", "cots_step"]}, "maturity": {"enum": ["formula_verified", "formula_provisional", "cots_step_verified"]}, "cots_asset": {"$ref": "#/$defs/cots_asset"}, "connectors": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/connector"}} }, "allOf": [ { "if": {"properties": {"source_mode": {"const": "cots_step"}}}, "then": {"required": ["cots_asset"], "properties": {"maturity": {"const": "cots_step_verified"}}}, "else": {"not": {"required": ["cots_asset"]}} } ] }, "cots_asset": { "type": "object", "additionalProperties": false, "required": ["path", "sha256", "solid_count", "geometry_editability"], "properties": { "path": {"type": "string", "pattern": "^[^/].*\\.step$"}, "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"}, "solid_count": {"type": "integer", "minimum": 1}, "geometry_editability": {"const": "immutable"} } }, "instance": { "type": "object", "additionalProperties": false, "required": ["id", "definition_id"], "properties": { "id": {"type": "string", "minLength": 1}, "definition_id": {"type": "string", "minLength": 1}, "pattern_index": {"type": "integer", "minimum": 0} } }, "endpoint": { "type": "object", "additionalProperties": false, "required": ["instance_id", "connector_id"], "properties": { "instance_id": {"type": "string", "minLength": 1}, "connector_id": {"type": "string", "minLength": 1} } }, "relation": { "type": "object", "additionalProperties": false, "required": ["id", "type", "a", "b"], "properties": { "id": {"type": "string", "minLength": 1}, "type": {"enum": ["fixed", "revolute", "bearing_support", "shaft_hub", "coaxial"]}, "a": {"$ref": "#/$defs/endpoint"}, "b": {"$ref": "#/$defs/endpoint"}, "motion_role": {"enum": ["input", "output", "planet_spin", "free"]}, "phase_offset_degrees": {"type": "number"} } }, "interference_fit": { "type": "object", "additionalProperties": false, "required": ["id", "a", "b", "type", "target_volume_mm3", "volume_tolerance_mm3", "evidence"], "properties": { "id": {"type": "string", "minLength": 1}, "a": {"type": "string", "minLength": 1}, "b": {"type": "string", "minLength": 1}, "type": {"const": "source_matched_press_fit"}, "target_volume_mm3": {"type": "number", "exclusiveMinimum": 0}, "volume_tolerance_mm3": {"type": "number", "minimum": 0}, "evidence": {"type": "string", "minLength": 1} } }, "mesh": { "type": "object", "additionalProperties": false, "required": ["id", "type", "a", "b", "backlash_mm"], "properties": { "id": {"type": "string", "minLength": 1}, "type": {"enum": ["external", "internal"]}, "a": {"type": "string", "minLength": 1}, "b": {"type": "string", "minLength": 1}, "backlash_mm": {"type": "number", "minimum": 0} } }, "transmission": { "type": "object", "additionalProperties": false, "required": ["type", "module_mm", "pressure_angle_deg", "teeth", "planet_count", "center_radius_mm", "center_tolerance_mm", "fixed_member", "input_member", "output_member", "fixed_ring_ratio", "ratio_tolerance", "meshes"], "properties": { "type": {"const": "simple_planetary"}, "module_mm": {"type": "number", "exclusiveMinimum": 0}, "pressure_angle_deg": {"type": "number", "exclusiveMinimum": 0, "exclusiveMaximum": 90}, "teeth": { "type": "object", "additionalProperties": false, "required": ["sun", "planet", "ring"], "properties": { "sun": {"type": "integer", "minimum": 6}, "planet": {"type": "integer", "minimum": 6}, "ring": {"type": "integer", "minimum": 12} } }, "planet_count": {"type": "integer", "minimum": 2}, "center_radius_mm": {"type": "number", "exclusiveMinimum": 0}, "center_tolerance_mm": {"type": "number", "minimum": 0}, "fixed_member": {"const": "ring_gear"}, "input_member": {"const": "sun_gear"}, "output_member": {"const": "carrier"}, "fixed_ring_ratio": {"type": "number", "exclusiveMinimum": 1}, "ratio_tolerance": {"type": "number", "minimum": 0}, "meshes": {"type": "array", "minItems": 6, "maxItems": 6, "items": {"$ref": "#/$defs/mesh"}} } } } }