Control Rig
Every Control Rig command in CodeFizz Editor Agent, with parameters and examples.
Every Control Rig command in CodeFizz Editor Agent, with parameters and examples.
127 commands. Each shows its parameters and an example, and has a copyable deep link, so you (or an AI agent) can jump straight to one.
create_control_rigCreate a new empty Control Rig Blueprint
Creates a UControlRigBlueprint at the given path via UControlRigBlueprintFactory. Works for any skeleton; import bones separately or use create_control_rig_from_skeleton.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Content path for the new asset |
| modular | bool | No | Create as a modular Control Rig |
cfa create_control_rig --asset-path /Game/Rigs/CR_Spidercreate_control_rig_from_skeletonCreate a Control Rig and import a skeleton (any skeleton)
Creates a Control Rig then imports the whole bone hierarchy (and optionally curves) in one call. Human, quadruped, snake, vehicle, any skeleton works. REQUIRES a USkeletalMesh: a USkeleton asset is REJECTED with a clear error, because a Skeleton has no geometry and the rig would have no visible preview. To import bones from a Skeleton into an EXISTING rig, use import_rig_skeleton instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Content path for the new asset |
| skeleton_path | string | Yes | USkeletalMesh to import from (a USkeleton is rejected, its icon must say 'Skeletal Mesh') |
| import_curves | bool | No | Also import skeleton curves |
| modular | bool | No | Create as a modular Control Rig |
cfa create_control_rig_from_skeleton --asset-path /Game/Rigs/CR_Wolf --skeleton-path /Game/Wolf/SKM_Wolfimport_rig_skeletonImport a skeleton's bones into an existing rig
| Parameter | Type | Required | Description |
|---|---|---|---|
| skeleton_path | string | Yes | USkeleton or USkeletalMesh to import |
| namespace | string | No | Namespace prefix for imported bones |
| replace_existing | bool | No | Replace existing bones |
| remove_obsolete | bool | No | Remove bones not in the skeleton |
| import_curves | bool | No | Also import skeleton curves |
cfa import_rig_skeleton --asset-path /Game/Rigs/CR_Wolf --skeleton-path /Game/Wolf/SK_Wolfadd_rig_boneAdd a bone to the rig hierarchy
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New bone name |
| parent | string | No | Parent element name (empty = top-level) |
| parent_type | string | No | Parent type: bone|null|control|socket |
| transform | json | No | {location,rotation,scale} |
| space | string | No | global|local |
| bone_type | string | No | imported|user |
cfa add_rig_bone --asset-path /Game/Rigs/CR_X --name spine_01 --parent rootadd_rig_nullAdd a null (space) to the rig hierarchy
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New null name |
| parent | string | No | Parent element name |
| parent_type | string | No | Parent type |
| transform | json | No | {location,rotation,scale} |
| space | string | No | global|local |
cfa add_rig_null --asset-path /Game/Rigs/CR_X --name hand_ik_nulladd_rig_controlAdd an animation control of any type
Adds a control (transform/float/bool/vector2d/position/scale/rotator/eulertransform/...). Shape/color/limits and any further FRigControlSettings fields come from cosmetic params or the settings JSON object.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New control name |
| parent | string | No | Parent element name |
| parent_type | string | No | Parent type |
| control_type | string | Yes | bool|float|integer|vector2d|position|scale|rotator|transform|eulertransform|transformnoscale|scalefloat |
| value | json | No | Initial value (shape depends on control_type) |
| offset_from_bone | string | No | PREFERRED: bone to sit on, the offset is computed in the correct parent-relative space for you |
| offset_transform | json | No | {location,rotation,scale}, PARENT-RELATIVE (see offset_space) |
| offset_space | string | No | Space of offset_transform: parent (default) or global (converted for you) |
| display_name | string | No | Display name |
| shape_name | string | No | Gizmo shape name (see list_rig_control_shapes) |
| shape_color | json | No | {r,g,b,a} 0..1 (any case), array, or struct string |
| shape_transform | json | No | Gizmo transform {location,rotation,scale}, sizes/positions the visual |
| settings | json | No | Extra FRigControlSettings fields (LimitEnabled, bDrawLimits, PreferredRotationOrder...) |
cfa add_rig_control --asset-path /Game/Rigs/CR_X --name hand_r_ctrl --control-type transform --parent hand_radd_rig_curveAdd a named curve element
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New curve name |
| value | float | No | Initial value |
cfa add_rig_curve --asset-path /Game/Rigs/CR_X --name jaw_openadd_rig_socketAdd a socket under a parent bone/null
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New socket name |
| parent | string | No | Parent element name |
| parent_type | string | No | Parent type |
| transform | json | No | {location,rotation,scale} |
| space | string | No | global|local |
| color | json | No | {r,g,b,a} 0..1 |
| description | string | No | Socket description |
cfa add_rig_socket --asset-path /Game/Rigs/CR_X --name weapon_socket --parent hand_radd_rig_connectorDeclare a connector on a Control Rig MODULE asset
Declares the socket a modular rig binds this module by. A module has exactly ONE primary connector; secondary ones may be optional and/or arrays. Without connection rules a connector accepts anything, so auto_connect_rig_modules cannot resolve it, add rules with add_rig_connection_rule, or pass --default-rules for the engine's Socket-only rule.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New connector name |
| type | string | No | primary | secondary (default primary) |
| optional | bool | No | May stay unresolved. SECONDARY only, the engine rejects an optional primary |
| is_array | bool | No | Accepts multiple targets. SECONDARY only, force-cleared on a primary |
| post_construction | bool | No | Defer to the post-construction event. SECONDARY only, engine 5.7+ |
| description | string | No | Description shown in the connector UI |
| default_rules | bool | No | Install the engine default rule set (one Type rule restricting targets to Socket) |
cfa add_rig_connector --asset-path /Game/Rigs/CR_Module --name Root --type primary --default-rulesset_rig_connector_settingsChange an existing connector's type, flags or description
Omitted flags are left unchanged. Primary connectors cannot be optional or arrays, the command refuses rather than writing state the engine silently drops.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Existing connector name |
| type | string | No | primary | secondary. Omit to leave unchanged |
| optional | string | No | true | false. Omit to leave unchanged |
| is_array | string | No | true | false. Omit to leave unchanged |
| post_construction | string | No | true | false (5.7+). Omit to leave unchanged |
| description | string | No | Omit to leave unchanged |
| clear_rules | bool | No | Drop every connection rule before applying the rest |
cfa set_rig_connector_settings --asset-path /Game/Rigs/CR_Module --name Parent --type secondary --optional trueadd_rig_connection_ruleAdd a connection rule restricting what a connector may bind to
Rules are what let the rule manager auto-resolve a connector. Rule properties are Unreal struct text. The available rule set DIFFERS BY ENGINE, run list_rig_connection_rule_types first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| connector | string | Yes | Connector to add the rule to |
| rule | string | Yes | Rule struct or short name, e.g. RigTypeConnectionRule or Type |
| properties | string | No | Unreal struct text, e.g. "(ElementType=Socket)" or "(Tag=\"Spine\")" |
cfa add_rig_connection_rule --asset-path /Game/Rigs/CR_Module --connector Root --rule Type --properties "(ElementType=Socket)"list_rig_connection_rule_typesList the connection rule types this engine ships
The set is version dependent: FRigOnChainRule exists on 5.6/5.7 only, FRigArraySizeConnectionRule on 5.8 only. Discovered by reflection, so it is always what THIS engine actually has.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on struct or display name |
cfa list_rig_connection_rule_typescreate_control_rig_moduleCreate a Control Rig MODULE asset
Creates a building block for a Modular Rig. This is NOT create_control_rig --modular, which creates the modular rig CONTAINER. Import the skeleton via --skeleton-path in the same call: conversion rebuilds the hierarchy and a module may otherwise only hold bones, curves and connectors. When the hierarchy has no connector yet, the engine spawns a primary connector plus matching socket automatically.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Content path for the new module asset |
| skeleton_path | string | No | USkeleton or USkeletalMesh the module is authored against |
| auto_convert_hierarchy | bool | No | Let the engine convert a non-conforming hierarchy instead of refusing (default true) |
| display_name | string | No | Module name in the Module Assets browser (defaults to the asset name) |
| category | string | No | Browser category, e.g. Biped or Physics |
| keywords | string | No | Search keywords |
| description | string | No | Tooltip description |
cfa create_control_rig_module --asset-path /Game/Rigs/CFA_ChainLimited --skeleton-path /Game/Chars/SK_Hero --category Physicsget_rig_module_settingsRead a Control Rig's module identity and metadata
cfa get_rig_module_settings --asset-path /Game/Rigs/CFA_ChainLimitedset_rig_module_settingsWrite a module's identity and library metadata
display_name IS the module identifier, an asset is a module precisely because that field is non-empty. Everything else is browser metadata.
| Parameter | Type | Required | Description |
|---|---|---|---|
| display_name | string | No | Module identifier name |
| module_type | string | No | Module kind, e.g. Arm |
| category | string | No | Browser category |
| keywords | string | No | Search keywords |
| description | string | No | Tooltip description |
| icon | string | No | Content path of a Texture2D icon |
cfa set_rig_module_settings --asset-path /Game/Rigs/CFA_ChainLimited --category Physics --keywords "jiggle,dangle"create_rig_variableAdd an asset-level member variable to a Control Rig
public=true is what makes the variable appear as per-instance module CONFIG in a Modular Rig: it clears CPF_DisableEditOnInstance, which is exactly what the modular rig tests for. Struct and array types need a CPP type PATH, a bare struct name asserts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Variable name |
| cpp_type | string | Yes | CPP type path, e.g. float, bool, FName, TArray</Script/ControlRig.RigElementKey> |
| public | bool | No | Instance editable, makes it module config (default true) |
| read_only | bool | No | Blueprint read only. A read-only variable is rejected by the module config writer |
| default_value | string | No | Default value as Unreal text |
cfa create_rig_variable --asset-path /Game/Rigs/CFA_ChainLimited --name ConeAngle --cpp-type float --default-value 20.0create_rig_variablesAdd MANY member variables to a Control Rig with a single compile
Use this instead of calling create_rig_variable in a loop. Each singular call runs a FULL blueprint compile (class reinstancing + garbage collection), so a few in a row crash the editor. This adds every variable skeleton-only and compiles once at the end. Flags match the singular command exactly, so public=true still yields module config.
| Parameter | Type | Required | Description |
|---|---|---|---|
| variables | string | Yes | JSON array: [{"name":"X","cpp_type":"float","public":true,"read_only":false,"default_value":"1.0"}] |
cfa create_rig_variables --asset-path /Game/Rigs/CFA_ChainLimited --variables '[{"name":"ConeAngleDeg","cpp_type":"float","default_value":"20.0"},{"name":"SquishCm","cpp_type":"float","default_value":"3.0"},{"name":"Bones","cpp_type":"TArray</Script/ControlRig.RigElementKey>"}]'list_rig_variablesList a Control Rig's member variables and their config flags
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on the variable name |
cfa list_rig_variables --asset-path /Game/Rigs/CFA_ChainLimitedremove_rig_variableRemove an asset-level member variable from a Control Rig
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Variable name to remove |
cfa remove_rig_variable --asset-path /Game/Rigs/CFA_ChainLimited --name ConeAngleadd_rig_animation_channelAdd an animation channel under a control
Adds an animation channel. ALWAYS pass minimum/maximum for a scalar channel: without them the channel is created with Min=Max=0, and the details panel and Sequencer feed the spin box straight from those values with no limit check, so SSpinBox clamps every drag commit to 0, the slider looks alive and always returns 0. minimum/maximum fix the slider; limit_enabled additionally hard-clamps typed values.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New channel name |
| parent_control | string | Yes | Parent control name |
| control_type | string | Yes | bool|float|integer|vector2d|position|scale|rotator |
| minimum | float | No | Slider minimum (scalar types), omit and the slider is stuck at 0 |
| maximum | float | No | Slider maximum, e.g. 1 for an alpha, 50 for a multiplier |
| limit_enabled | bool | No | Also hard-clamp values to the range, not just the slider |
cfa add_rig_animation_channel --asset-path /Game/Rigs/CR_X --name HairGravity --parent-control root_ctrl --control-type float --minimum 0 --maximum 50set_rig_element_parentReparent an element
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Child element name |
| type | string | No | Child type |
| parent | string | Yes | New parent name |
| parent_type | string | No | New parent type |
| maintain_global | bool | No | Keep global transform |
cfa set_rig_element_parent --asset-path /Game/Rigs/CR_X --name hand_ctrl --parent arm_nullset_rig_control_settingsUpdate a control's settings (reflection)
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Control name |
| settings | json | Yes | FRigControlSettings fields |
cfa set_rig_control_settings --asset-path /Game/Rigs/CR_X --name hand_ctrl --settings '{"ShapeName":"Box"}'set_rig_control_valueSet a control's initial or current value
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Control name |
| control_type | string | No | Override type (else use declared) |
| value | json | Yes | Value (shape depends on control type) |
| value_type | string | No | initial|current|minimum|maximum (min/max set the control's limits) |
| preview | bool | No | Write to the open editor's DEBUG rig (module-spawned controls/channels like 'Simulation Mode'); not persisted, re-apply after compile |
cfa set_rig_control_value --asset-path /Game/Rigs/CR_X --name switch_ctrl --value truemove_rig_controlMove a control like dragging its gizmo (select + SetControlGlobalTransform + evaluate), report bones moved
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Control name (module-qualified on a modular rig, e.g. Root/global_ctrl) |
| transform | json | Yes | Target GLOBAL transform {location, rotation, scale} |
| relative | bool | No | Treat transform as a delta on the control's current global transform |
| select | bool | No | Select the control first, as clicking it in the Rig Hierarchy does |
| fix_euler_flips | bool | No | Compensate Euler flips on rotation controls |
| report_bones | bool | No | Report which bones the move actually displaced |
| max_bones | int | No | Max bones listed, largest movement first |
cfa move_rig_control --asset-path /Game/Rigs/CR_X --name global_ctrl --transform '{"location":{"x":0,"y":0,"z":50}}' --relativeselect_rig_elementsSelect/deselect rig elements through the engine controller
| Parameter | Type | Required | Description |
|---|---|---|---|
| names | stringlist | Yes | Element names to select |
| type | string | No | bone|null|control|socket|connector|curve |
| select | bool | No | False deselects instead |
| clear_selection | bool | No | Clear existing selection first |
cfa select_rig_elements --asset-path /Game/Rigs/CR_X --names global_ctrl,hips_ctrlset_rig_control_offsetSet a control's offset transform
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Control name |
| transform | json | Yes | {location,rotation,scale} |
| initial | bool | No | Apply to the initial offset |
cfa set_rig_control_offset --asset-path /Game/Rigs/CR_X --name hand_ctrl --transform '{"location":{"x":0,"y":0,"z":10}}'set_rig_element_transformSet an element's transform
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Element name |
| type | string | No | Element type |
| transform | json | Yes | {location,rotation,scale} |
| space | string | No | global|local |
| initial | bool | No | Set the initial (setup) transform |
cfa set_rig_element_transform --asset-path /Game/Rigs/CR_X --name spine_01 --transform '{"location":{"x":0,"y":0,"z":100}}'remove_rig_elementRemove an element from the rig hierarchy
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Element name |
| type | string | No | Element type |
cfa remove_rig_element --asset-path /Game/Rigs/CR_X --name hand_ctrlrename_rig_elementRename an element
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Current element name |
| type | string | No | Element type |
| new_name | string | Yes | New element name |
cfa rename_rig_element --asset-path /Game/Rigs/CR_X --name ctrl_a --new-name hand_l_ctrlbuild_rig_hierarchyAtomically build a whole hierarchy
Builds bones/nulls/controls/curves/sockets from an elements[] array in one call, validated before mutation. Each element: {type,name,parent,parent_type,transform,control_type,value...}. For controls prefer "offset_from_bone":"<bone>" over a raw offset_transform, a control's offset is PARENT-RELATIVE, so feeding a bone's global transform to a parented control compounds every ancestor offset (the build refuses it and tells you the correct value).
| Parameter | Type | Required | Description |
|---|---|---|---|
| clear_existing | bool | No | Remove existing elements first |
| elements | json | No | Array of element definitions (prefer --json) |
cfa build_rig_hierarchy --asset-path /Game/Rigs/CR_X --json '{"elements":[...]}'get_rig_hierarchyRead the rig hierarchy as a tree
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on element name (case-insensitive). Composes with type_filter, without it a 311-bone rig returns all 311 |
| max_results | int | No | Cap returned elements; reports matched + truncated |
| type_filter | string | No | bone|null|control|curve|socket|connector |
| include_transforms | bool | No | Include local + global transforms |
| live | bool | No | Read the DEBUGGED instance, required to see a modular rig's construction-spawned controls (needs the asset editor open) |
cfa get_rig_hierarchy --asset-path /Game/Rigs/CR_X --include-transformsget_rig_elementRead one element
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Element name |
| type | string | No | Element type |
cfa get_rig_element --asset-path /Game/Rigs/CR_X --name hand_ctrllist_rig_control_typesList valid control + element types
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter |
cfa list_rig_control_typessearch_rig_vm_nodesSearch RigVM graph node types
Fuzzy-searches available RigVM node types (template notations + unit structs) and returns the top-N ranked, like search_nodes for blueprints.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Fuzzy filter |
| max_results | int | No | Max results (1..200) |
| include_units | bool | No | Include unit structs too |
cfa search_rig_vm_nodes --filter "get transform"list_rig_vm_node_typesList registered RigVM template notations
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter |
| max_results | int | No | Max results (0 = unlimited) |
cfa list_rig_vm_node_types --filter Mathget_rig_vm_node_type_infoDescribe one or many RigVM node types' pins
Returns inputs/outputs for a node type. Single: --type-name. Batch: --type-names "A,B,C" (or a JSON array via --json) describes each in one call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| type_name | string | No | Single template notation or unit struct name/path |
| type_names | string | No | Batch: comma-separated list (or JSON array via --json) |
cfa get_rig_vm_node_type_info --type-names "RigVMFunction_MathFloatAdd,RigVMFunction_MathFloatMul"get_rig_vm_graph_nodesRead a RigVM graph's nodes
| Parameter | Type | Required | Description |
|---|---|---|---|
| verbosity | string | No | summary|connections|full |
| type_filter | string | No | Filter on node class/title |
cfa get_rig_vm_graph_nodes --asset-path /Game/Rigs/CR_Xdescribe_rig_vm_nodeDescribe one RigVM node in a graph
| Parameter | Type | Required | Description |
|---|---|---|---|
| node_name | string | Yes | Node name |
cfa describe_rig_vm_node --asset-path /Game/Rigs/CR_X --node-name GetTransformadd_rig_vm_nodeAdd a node to a RigVM graph
Adds a unit/template/variable/reroute/comment node. Unit: node_type = struct name/path. Template: node_type = notation. Variable: variable_name + cpp_type + is_getter.
| Parameter | Type | Required | Description |
|---|---|---|---|
| node_kind | string | No | unit|template|variable|reroute|comment|branch|if|select|invoke_entry|enum|constant |
| node_type | string | No | Unit struct name/path or template notation |
| method_name | string | No | Unit method name |
| node_name | string | No | Explicit node name (empty = auto) |
| pos_x | float | No | Editor X position |
| pos_y | float | No | Editor Y position |
| variable_name | string | No | Variable node: variable name |
| cpp_type | string | No | CPP type for variable/reroute/if/select/constant (float, FVector, FTransform) |
| cpp_type_object | string | No | CPP type object path for struct/enum types (e.g. /Script/CoreUObject.Transform) |
| is_getter | bool | No | Variable node: getter vs setter |
| comment_text | string | No | Comment node text |
| entry_name | string | No | invoke_entry: the entry/event name to invoke |
| default_value | string | No | constant: the constant's default value |
| defaults | json | No | Inline pin defaults {pin: value} applied at creation (dotted sub-pins ok). Pass via --json |
cfa add_rig_vm_node --asset-path /Game/Rigs/CR_X --node-type RigVMFunction_MathFloatAdd --pos-x 100connect_rig_vm_nodesConnect an output pin to an input pin
| Parameter | Type | Required | Description |
|---|---|---|---|
| source_node | string | Yes | Source node name |
| source_pin | string | Yes | Source (output) pin |
| target_node | string | Yes | Target node name |
| target_pin | string | Yes | Target (input) pin |
cfa connect_rig_vm_nodes --asset-path /Game/Rigs/CR_X --source-node A --source-pin Result --target-node B --target-pin Valuedisconnect_rig_vm_nodesBreak a link, or all links on a pin
| Parameter | Type | Required | Description |
|---|---|---|---|
| source_node | string | No | Specific link: source node |
| source_pin | string | No | Specific link: source pin |
| target_node | string | No | Specific link: target node |
| target_pin | string | No | Specific link: target pin |
| node | string | No | Break-all: node name |
| pin | string | No | Break-all: pin name |
| is_input | bool | No | Break-all: treat pin as input |
cfa disconnect_rig_vm_nodes --asset-path /Game/Rigs/CR_X --node B --pin Valueset_rig_vm_pin_defaultSet a node pin's default value
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Pin name |
| value | string | Yes | Default value string |
cfa set_rig_vm_pin_default --asset-path /Game/Rigs/CR_X --node Add --pin A --value 2.0set_rig_vm_node_positionSet a RigVM node's position
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pos_x | float | Yes | Editor X |
| pos_y | float | Yes | Editor Y |
cfa set_rig_vm_node_position --asset-path /Game/Rigs/CR_X --node Add --pos-x 400 --pos-y 100remove_rig_vm_nodeRemove a node from a RigVM graph
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
cfa remove_rig_vm_node --asset-path /Game/Rigs/CR_X --node Addbuild_rig_vm_graphAtomically build a RigVM graph
Adds nodes[] and connections[] in one undo bracket, with optional auto-layout. Connection endpoints are node indices (into nodes[]) or explicit node names.
| Parameter | Type | Required | Description |
|---|---|---|---|
| auto_layout | bool | No | Auto-arrange the new nodes |
| clear_existing | bool | No | Remove existing non-event nodes first (clean rebuild) |
| nodes | json | No | Array of node definitions (prefer --json) |
| connections | json | No | Array of connections (prefer --json) |
cfa build_rig_vm_graph --asset-path /Game/Rigs/CR_X --json '{"nodes":[...],"connections":[...]}'layout_rig_vm_graphAuto-arrange a RigVM graph
| Parameter | Type | Required | Description |
|---|---|---|---|
| spacing_x | float | No | Horizontal spacing between layers |
| spacing_y | float | No | Vertical spacing within a layer |
| add_reroutes | bool | No | Route long/backward data wires through reroute knots |
| all_graphs | bool | No | Arrange EVERY graph on the asset, local functions, collapse sub-graphs and a module's construction/forwards graphs, not just the main one. Mutually exclusive with graph_name |
| extract_shared | bool | No | Refactor shared pure computations to their usage sites: multi-node groups become named library functions called per site, trivial getters are duplicated; reports dead_end_nodes |
cfa layout_rig_vm_graph --asset-path /Game/Rigs/CR_Xset_rig_vm_pin_defaultsBatch-set many node pin defaults in one call
Applies an array of {node, pin, value} in one undo bracket. The efficient way to assign bones/values across many nodes (vs one set_rig_vm_pin_default per pin).
| Parameter | Type | Required | Description |
|---|---|---|---|
| pins | json | No | Array of {node,pin,value} (prefer --json) |
cfa set_rig_vm_pin_defaults --asset-path /Game/Rigs/CR_X --json '{"pins":[{"node":"AddNode","pin":"A","value":"5.0"}]}'list_rig_control_shapesList available gizmo shape names
Lists the shape names a rig can use (from its shape libraries; falls back to the engine default library). Use these for --shape-name on add_rig_control / set_rig_control_shape.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | No | Rig asset (empty = engine default library) |
| filter | string | No | Substring filter on shape names |
cfa list_rig_control_shapes --asset-path /Game/Rigs/CR_Xset_rig_control_shapeSet a control's shape / color / visibility / gizmo transform
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Control name (single form; omit with --controls) |
| type | string | No | Element type |
| shape_name | string | No | Gizmo shape name (see list_rig_control_shapes) |
| shape_color | json | No | {r,g,b,a} 0..1 (any case), array, or struct string |
| shape_visible | bool | No | Gizmo visibility |
| shape_transform | json | No | Gizmo transform {location,rotation,scale} (persists: sets initial+current) |
| controls | json | No | Batch: array of {name, shape_name, shape_color, shape_visible, shape_transform}, one recompile+save total |
cfa set_rig_control_shape --asset-path /Game/Rigs/CR_X --name hand_l_ik_ctrl --shape-name Box --shape-color '{"r":1,"g":0,"b":0}'validate_rig_gizmosGizmo gate, fails the rig when controls are unfitted, buried, or wrongly shaped
Owns the gizmo pass/fail verdict so callers cannot write the gate wrong. Errors: shape_transform_identity (fit_rig_control_shapes never ran), gizmo_inside_mesh (buried, unclickable). Warnings: default_shape_name, gizmo_oversized. Animation-channel and bool controls are skipped, not flagged, they cannot own a shape (FRigControlSettings::SupportsShape), and are counted in 'non_shape_controls_skipped'. Read 'verdict', pass or fail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | No | Skeletal mesh to measure against (empty = the rig's preview mesh) |
| max_results | int | No | Maximum issues to return |
| live | bool | No | Gate the DEBUGGED instance (auto-on for modular rigs, whose blueprint holds zero controls) |
cfa validate_rig_gizmos --asset-path /Game/Rigs/CR_Xfit_rig_control_shapesSize/orient control gizmos from the mesh's real skinned cross-section (no guessed scales)
| Parameter | Type | Required | Description |
|---|---|---|---|
| controls | string | No | Comma-separated control names (empty = every visible transform control) |
| margin | float | No | Gizmo radius = mesh cross-section radius x margin |
| dry_run | bool | No | Report computed fits without applying |
| mesh_path | string | No | Skeletal mesh to measure (empty = the rig's preview mesh) |
| orient | bool | No | Align each gizmo's plane perpendicular to the bone's long axis |
| live | bool | No | Fit the DEBUGGED instance (auto-on for modular rigs, fitting their blueprint fits nothing) |
cfa fit_rig_control_shapes --asset-path /Game/Rigs/CR_X --margin 1.25set_rig_vm_node_colorSet a RigVM node's tint color
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| color | json | Yes | {r,g,b,a} 0..1 (any case), array, or struct string |
cfa set_rig_vm_node_color --asset-path /Game/Rigs/CR_X --node AddNode --color '{"r":0.2,"g":0.4,"b":1}'set_rig_vm_node_sizeSet a RigVM node's size (comment/collapse boxes)
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| width | float | Yes | Node width |
| height | float | Yes | Node height |
cfa set_rig_vm_node_size --asset-path /Game/Rigs/CR_X --node NoteNode --width 500 --height 300set_rig_vm_commentSet a comment node's text/font/bubble
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Comment node name |
| text | string | Yes | Comment text |
| font_size | int | No | Font size |
| bubble_visible | bool | No | Show the comment bubble |
| color_bubble | bool | No | Tint the bubble with the node color |
cfa set_rig_vm_comment --asset-path /Game/Rigs/CR_X --node NoteNode --text "Leg IK" --font-size 24rename_rig_vm_nodeRename a RigVM node
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Current node name |
| new_name | string | Yes | New node name |
cfa rename_rig_vm_node --asset-path /Game/Rigs/CR_X --node RigVMFunction_MathFloatAdd --new-name LegBlendset_rig_vm_pin_expansionExpand/collapse a struct/array pin
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Pin name |
| expanded | bool | No | Expanded (true) or collapsed |
cfa set_rig_vm_pin_expansion --asset-path /Game/Rigs/CR_X --node SetTransform --pin Value --expanded=trueset_rig_vm_pin_watchToggle a pin's debug watch
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Pin name to watch |
| watched | bool | No | Watch (true) or unwatch |
cfa set_rig_vm_pin_watch --asset-path /Game/Rigs/CR_X --node SetTransform --pin Valueresolve_rig_vm_wildcard_pinLock a wildcard/template pin to a concrete type
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Wildcard pin name |
| cpp_type | string | Yes | Concrete type (float, FVector, FTransform) |
| cpp_type_object | string | No | Type object path for struct/enum types |
cfa resolve_rig_vm_wildcard_pin --asset-path /Game/Rigs/CR_X --node MakeArray --pin Values --cpp-type FVectorset_rig_vm_array_pin_sizeSet an array pin's element count
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Array pin name |
| size | int | Yes | Element count |
| default_value | string | No | Default for new elements |
cfa set_rig_vm_array_pin_size --asset-path /Game/Rigs/CR_X --node SelectNode --pin Values --size 3add_rig_vm_aggregate_pinAdd exec output pin(s) to a Sequence node so the graph can fan out
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node to grow (e.g. a Sequence) |
| count | int | No | How many pins to add (default 1) |
| pin_name | string | No | Explicit name; empty = engine picks the next letter |
| default_value | string | No | Default value for the new pin |
cfa add_rig_vm_aggregate_pin --asset-path /Game/Rigs/CR_X --node SequenceNode --count 3bind_rig_vm_pin_to_variableBind a pin directly to a variable
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Pin name |
| variable | string | Yes | Variable path to bind to |
cfa bind_rig_vm_pin_to_variable --asset-path /Game/Rigs/CR_X --node SetTransform --pin Weight --variable IKWeightunbind_rig_vm_pin_from_variableRemove a pin's variable binding
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Node name |
| pin | string | Yes | Pin name to unbind |
cfa unbind_rig_vm_pin_from_variable --asset-path /Game/Rigs/CR_X --node SetTransform --pin Weightcreate_rig_vm_functionDefine a new function in the function library
Creates a reusable function in the rig's function library. Edit its body by passing its name as graph_name to add_rig_vm_node / build_rig_vm_graph, and define its interface with add_rig_vm_exposed_pin.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Function name (also its graph_name) |
| mutable | bool | No | Has execute pins (mutable). false = pure data function |
| is_public | bool | No | Usable from other rigs |
cfa create_rig_vm_function --asset-path /Game/Rigs/CR_X --name TwoBoneLeg --mutable=trueremove_rig_vm_functionRemove a library function
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Function name to remove |
cfa remove_rig_vm_function --asset-path /Game/Rigs/CR_X --name TwoBoneLegrename_rig_vm_functionRename a library function
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Current function name |
| new_name | string | Yes | New function name |
cfa rename_rig_vm_function --asset-path /Game/Rigs/CR_X --name TwoBoneLeg --new-name IKLegset_rig_vm_function_accessSet a function public/private and/or pure/mutable
Toggles a function's visibility and/or purity. is_pure requires UE 5.8+. Pass only the flags you want to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Function name |
| is_public | string | No | 'true' or 'false' (empty = unchanged) |
| is_pure | string | No | 'true' = pure/no-exec (empty = unchanged). UE 5.8+ |
cfa set_rig_vm_function_access --asset-path /Game/Rigs/CR_X --name IKLeg --is-public truelist_rig_vm_functionsList library functions with their I/O
cfa list_rig_vm_functions --asset-path /Game/Rigs/CR_Xadd_rig_vm_function_nodePlace a call to a library function
| Parameter | Type | Required | Description |
|---|---|---|---|
| function_name | string | Yes | Library function to call |
| node_name | string | No | Optional explicit node name |
| pos_x | float | No | Editor X position |
| pos_y | float | No | Editor Y position |
cfa add_rig_vm_function_node --asset-path /Game/Rigs/CR_X --function-name IKLegadd_rig_vm_exposed_pinAdd an input/output pin to a function/collapse graph
Adds an interface pin to a function or collapse sub-graph. Pass the function name as graph_name. Direction is input|output|io. For struct/enum types set cpp_type_object to the type's object path.
| Parameter | Type | Required | Description |
|---|---|---|---|
| graph_name | string | Yes | Function/collapse name (its contained graph) |
| pin_name | string | Yes | New pin name |
| direction | string | Yes | input | output | io |
| cpp_type | string | Yes | float, int32, bool, FVector, FTransform, FRigElementKey... |
| cpp_type_object | string | No | Type object path for struct/enum types |
| default_value | string | No | Pin default value |
cfa add_rig_vm_exposed_pin --asset-path /Game/Rigs/CR_X --graph-name IKLeg --pin-name Weight --direction input --cpp-type floatremove_rig_vm_exposed_pinRemove an input/output pin from a function/collapse graph
| Parameter | Type | Required | Description |
|---|---|---|---|
| graph_name | string | Yes | Function/collapse name |
| pin_name | string | Yes | Exposed pin to remove |
cfa remove_rig_vm_exposed_pin --asset-path /Game/Rigs/CR_X --graph-name IKLeg --pin-name Weightrename_rig_vm_exposed_pinRename an input/output pin on a function/collapse graph
| Parameter | Type | Required | Description |
|---|---|---|---|
| graph_name | string | Yes | Function/collapse name |
| pin_name | string | Yes | Current pin name |
| new_name | string | Yes | New pin name |
cfa rename_rig_vm_exposed_pin --asset-path /Game/Rigs/CR_X --graph-name IKLeg --pin-name Weight --new-name Alphacollapse_rig_vm_nodesCollapse nodes into a sub-graph
Collapses the given nodes into a single collapse node with its own contained graph. Edit that sub-graph by passing the collapse node's name as graph_name. Promote it to a reusable library function with promote_rig_vm_node.
| Parameter | Type | Required | Description |
|---|---|---|---|
| node_names | string | Yes | Comma-separated node names (or JSON array via --json) |
| collapse_name | string | No | Name for the resulting collapse node/sub-graph |
cfa collapse_rig_vm_nodes --asset-path /Game/Rigs/CR_X --node-names get_leg,solve_leg,set_leg --collapse-name LegBlockexpand_rig_vm_nodeExpand a collapse/function node back inline
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Collapse/function node to expand |
cfa expand_rig_vm_node --asset-path /Game/Rigs/CR_X --node LegBlockpromote_rig_vm_nodePromote collapse<->function
to_function turns a collapse node into a reusable library function (+ a reference to it). to_collapse turns a function reference back into an inline collapse node.
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | Yes | Collapse or function-reference node |
| direction | string | No | to_function | to_collapse |
cfa promote_rig_vm_node --asset-path /Game/Rigs/CR_X --node LegBlock --direction to_functionadd_rig_vm_local_variableAdd a graph-scoped local variable
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Variable name |
| cpp_type | string | Yes | float, int32, bool, FVector, FTransform... |
| cpp_type_object | string | No | Type object path for struct/enum types |
| default_value | string | No | Default value string |
cfa add_rig_vm_local_variable --asset-path /Game/Rigs/CR_X --name IKWeight --cpp-type float --default-value 1.0remove_rig_vm_local_variableRemove a graph-scoped local variable
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Variable name to remove |
cfa remove_rig_vm_local_variable --asset-path /Game/Rigs/CR_X --name IKWeightlist_rig_vm_local_variablesList a graph's local variables
cfa list_rig_vm_local_variables --asset-path /Game/Rigs/CR_Xunresolve_rig_vm_nodeReset a template node's pins to wildcard
Inverse of resolve_rig_vm_wildcard_pin — resets one or more template nodes back to their wildcard state so their type can be re-inferred from new connections.
| Parameter | Type | Required | Description |
|---|---|---|---|
| node | string | No | Single template node |
| nodes | string | No | Multiple nodes: comma-separated (or JSON array via --json) |
cfa unresolve_rig_vm_node --asset-path /Game/Rigs/CR_X --node MakeArrayadd_rig_vm_eventAdd a solve event node by friendly name
Adds a Control Rig solve event: construction (setup), forward (Forwards Solve, the per-frame solve), backward (Backwards Solve), preforward, postforward, or interaction.
| Parameter | Type | Required | Description |
|---|---|---|---|
| event | string | Yes | construction|forward|backward|preforward|postforward|interaction |
| node_name | string | No | Optional explicit node name |
| pos_x | float | No | Editor X position |
| pos_y | float | No | Editor Y position |
cfa add_rig_vm_event --asset-path /Game/Rigs/CR_X --event backwardlist_rig_vm_graphsList every graph in the rig
Lists all graphs — top models (Forwards/Construction/Backwards live here), the function library, each function, and each collapse sub-graph — with the graph_name to pass to other commands and its kind + node count.
cfa list_rig_vm_graphs --asset-path /Game/Rigs/CR_Xstart_rig_motion_captureSample the live preview rig per frame
Starts capturing every rendered frame's bone transforms from the OPEN asset editor's preview rig instance. Measures what screenshots cannot: frame-to-frame jitter, oscillation, and frame-dt spikes. Fetch results with get_rig_motion_report.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bones | stringlist | No | Bone names to sample (empty = every bone) |
| frames | int | No | Frames to capture (10-2000) |
cfa start_rig_motion_capture --asset-path /Game/Rigs/CR_X --frames 120get_rig_motion_reportPer-bone jitter/motion statistics
Returns the capture report: per-bone RMS frame-to-frame position delta, direction-flip ratio, amplitude, rotation deltas, and a jittering/swinging/moving/stable verdict — worst offenders first — plus frame-dt stats. Poll until complete=true.
| Parameter | Type | Required | Description |
|---|---|---|---|
| max_bones | int | No | Max bones in the report (worst first) |
cfa get_rig_motion_reportstart_rig_physics_probeTHE physics alive-gate: shake a control, freeze it, measure residual jiggle
Drives one control through a sine shake on the OPEN asset editor's preview instance, freezes it, then keeps sampling. Residual bone motion AFTER the driver stops IS jiggle: a pure-FK bone stops dead with its control, a simulated bone keeps decaying. This is the only gate that separates a calm rig from a DEAD one - a body census, a solver count and a 'healthy' verdict all read identical on a rig where nothing simulates. Needs no animation asset. Fetch results with get_rig_physics_probe_report.
| Parameter | Type | Required | Description |
|---|---|---|---|
| control | string | No | Control to shake (empty = root-most control, which excites every chain). Modular rigs use module-qualified names, e.g. Root/global_ctrl |
| drive_bone | string | No | Bone to shake instead of a control - use on a physics-only rig with no controls. Takes precedence over --control |
| shake_cm | float | No | Shake amplitude in cm |
| shake_frames | int | No | Frames to shake (one full sine period) |
| settle_frames | int | No | Frames sampled after the control freezes - the measurement window |
| bones | stringlist | No | Bone names to sample (empty = every bone) |
cfa start_rig_physics_probe --asset-path /Game/Rigs/CR_X --shake-cm 30get_rig_physics_probe_reportPer-bone residual jiggle after the driver stopped
Returns the probe report: per-bone LINEAR and ANGULAR residual measured only in the settle window, worst first, plus how far the shake actually moved each bone. Judge only rows with excited=true - a bone the shake never reached carries no verdict. residual_rms_deg is what catches flesh and hair, which rotate about their own origin and barely translate, so a linear-only reading calls a visibly jiggling chain dead. verdict is one of physics_alive, no_physics_response (bones moved then stopped dead) or inconclusive (the shake excited nothing). Poll until complete=true.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | No | Optional guard: error instead of returning another asset's stored probe. The probe is global state |
| residual_threshold_cm | float | No | Per-frame linear residual RMS above which a bone counts as responding |
| residual_threshold_deg | float | No | Per-frame angular residual RMS (degrees) above which a bone counts as responding - the threshold that catches flesh and hair |
| excitation_floor_cm | float | No | Minimum travel during the shake for a bone to be judged at all |
| excitation_floor_deg | float | No | Minimum rotation during the shake for a bone to be judged at all |
| max_bones | int | No | Max bones in the report (worst first) |
cfa get_rig_physics_probe_reportset_rig_preview_meshSet an existing rig's preview skeletal mesh
Sets the skeletal mesh a Control Rig previews on (UControlRigBlueprint::SetPreviewMesh — the same engine path as the editor's Preview Settings mesh picker). create_control_rig_from_skeleton sets this automatically; use this to change it afterwards or on rigs created empty.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | Yes | Content path of the USkeletalMesh to preview on |
cfa set_rig_preview_mesh --asset-path /Game/Rigs/CR_X --mesh-path /Game/Chars/SK_Heroadd_rig_moduleAdd a Rig Module to a Modular Rig
Adds a Rig Module instance to a Modular Rig — the same engine path as the editor's drag-and-drop Module workflow. Epic ships a module library under /ControlRigModules/Modules (Arm, Leg, Spine, Neck, Shoulder, Foot, Finger, Chain...). Returns the new module's connectors so you can bind them next.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Name for the new module instance (e.g. Arm_l) |
| module_asset_path | string | Yes | Rig Module asset path (e.g. /ControlRigModules/Modules/Arm) |
| parent_module | string | No | Parent module to nest under (empty = root) |
cfa add_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_l --module-asset-path /ControlRigModules/Modules/Armconnect_rig_module_connectorBind a module connector to an element
Connects a module's connector (primary or secondary, e.g. "Arm_l/Root") to a hierarchy element. Pre-validates with the engine's CanConnectConnectorToElement so failures explain WHY; other connectors auto-resolve where possible.
| Parameter | Type | Required | Description |
|---|---|---|---|
| connector | string | Yes | Connector element name (Module/Connector) |
| target_name | string | No | Element to bind to (single target) |
| target_names | stringlist | No | Multiple targets for ARRAY connectors (e.g. Twist Bones); overrides target_name |
| target_type | string | No | bone|control|null|socket |
cfa connect_rig_module_connector --asset-path /Game/Rigs/MR_X --connector "Arm_l/Root" --target-name upperarm_lauto_connect_rig_modulesAuto-resolve module connectors
Runs the engine's modular-rig rule manager to auto-resolve connectors for the given modules (all modules when omitted) — the same logic as the editor's auto-resolve. Returns every connector with its resolved targets.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_names | stringlist | No | Modules to resolve (empty = all) |
| replace_existing | bool | No | Replace already-resolved connections |
cfa auto_connect_rig_modules --asset-path /Game/Rigs/MR_Xget_rig_module_connector_candidatesList engine-valid targets for a module connector
Queries Unreal's Modular Rig rule manager for one connector. Returns compatible targets in engine order with default/possible state, parent and transforms; optionally includes rejected targets with the engine's reason. Use this before choosing primary sockets or correcting secondary auto-resolution on arbitrary skeletons.
| Parameter | Type | Required | Description |
|---|---|---|---|
| connector | string | Yes | Connector element name (Module/Connector) |
| filter | string | No | Substring filter for candidate target names |
| max_results | int | No | Maximum compatible candidates (1-200) |
| include_excluded | bool | No | Include rejected targets and engine rejection reasons |
cfa get_rig_module_connector_candidates --asset-path /Game/Rigs/MR_X --connector "Spine/Spine Primary"list_rig_modulesList a Modular Rig's modules
Lists every module instance in a Modular Rig with its module class, parent module, each connector's resolved targets (plus primary/optional/array flags), warnings (required-but-unconnected connectors, outdated module assets — the editor's red triangles), and config-override/binding counts.
cfa list_rig_modules --asset-path /Game/Rigs/MR_Xremove_rig_moduleDelete a module from a Modular Rig
Deletes a module instance (and its elements) from a Modular Rig.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance to delete |
cfa remove_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_llist_rig_module_assetsQuery the Rig Module asset library
The editor's Module Assets browser as a command: scans the asset registry (no asset loads) for every Rig Module asset and returns name, category, connectors summary and variant tags (Epic/Physics/Stable/...). Assets whose tags mark them deprecated are excluded by default, matching the editor's 'Exclude Outdated' filter. --detailed adds keywords, description and the full connector list (the module's documentation, e.g. ChainPhysics' options).
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Text matched against asset name, module name, category, keywords, description |
| path | string | No | Scope to a content path (e.g. /ControlRigModules) |
| tag | string | No | Only modules carrying this variant tag (e.g. Physics) |
| include_outdated | bool | No | Include deprecated/outdated modules |
| detailed | bool | No | Add description, keywords and per-connector details |
| max_results | int | No | Maximum modules to return after filtering (1-200) |
cfa list_rig_module_assets --filter Chain --detailedget_rig_module_configRead a module instance's config
Lists a module instance's config variables: name, type, read-only flag and bindings, plus active overrides. Use --filter and --max-results for compact discovery, --include-defaults for full Unreal-text defaults, and --variable for possible binding sources.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance name (see list_rig_modules) |
| variable | string | No | Also list possible binding sources for this variable |
| filter | string | No | Case-insensitive variable name/type filter |
| include_defaults | bool | No | Include full Unreal-text default values |
| max_results | int | No | Maximum variables to return after filtering (1-200) |
cfa get_rig_module_config --asset-path /Game/Rigs/MR_X --module-name Arm_lset_rig_module_configSet or reset a module config value
Sets a config value on a module instance (recorded as an override, exactly like editing the Details panel). Paths can address nested members with '->' (e.g. "Settings->Strength"). --reset clears the override so the module default applies again. Values use Unreal text syntax: 2.5, true, (X=1,Y=0,Z=0).
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance name |
| path | string | Yes | Config variable path ('->' for nested members) |
| value | string | No | New value as Unreal text (required unless --reset) |
| reset | bool | No | Clear the override instead of setting a value |
cfa set_rig_module_config --asset-path /Game/Rigs/MR_X --module-name Tail --path Control_Count --value 8bind_rig_module_variableBind a module variable to another module's variable
Binds a module's variable to a source variable in another module (or the rig itself), so the value flows through at runtime. Pre-validates with the engine and, on failure, lists the valid binding sources. Empty --source-path unbinds.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance name |
| variable | string | Yes | Module variable to bind |
| source_path | string | No | Source variable path (empty = unbind) |
cfa bind_rig_module_variable --asset-path /Game/Rigs/MR_X --module-name Arm_l --variable Speed --source-path "Spine.Speed"rename_rig_moduleRename a module instance
Renames a module instance with engine validation (CanRenameModule) — all namespaced element names update automatically.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Current module instance name |
| new_name | string | Yes | New module instance name |
cfa rename_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_l --new-name LeftArmreparent_rig_moduleReparent a module instance
Moves a module under a new parent module in the module hierarchy. Empty --new-parent-module makes it a root module.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance name |
| new_parent_module | string | No | New parent module (empty = root) |
cfa reparent_rig_module --asset-path /Game/Rigs/MR_X --module-name Hand_l --new-parent-module Arm_lreorder_rig_moduleReorder a module among its siblings (5.7+)
Changes a module's index among its siblings in the module hierarchy. Requires UE 5.7+ (the engine API does not exist on 5.6).
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance name |
| index | int | Yes | New 0-based sibling index |
cfa reorder_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_l --index 0mirror_rig_moduleMirror a module (e.g. left arm to right arm)
Creates a mirrored copy of a module — the editor's Mirror action. Connector targets and config values are mirrored across the axis, with element names rewritten via search/replace (e.g. "_l" to "_r"). Returns the new module and its connectors.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance to mirror |
| mirror_axis | string | No | Axis to mirror against: X|Y|Z |
| axis_to_flip | string | No | Axis to flip for rotations: X|Y|Z |
| search | string | No | Substring to replace in element names (e.g. _l) |
| replace | string | No | Replacement substring (e.g. _r) |
cfa mirror_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_l --search _l --replace _rswap_rig_moduleSwap a module's source asset
Replaces the Rig Module asset behind a module instance (e.g. upgrade a module flagged outdated by list_rig_modules), keeping connections where the connectors are compatible.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | Module instance to swap |
| new_module_asset_path | string | Yes | Replacement Rig Module asset path |
cfa swap_rig_module --asset-path /Game/Rigs/MR_X --module-name Arm_l --new-module-asset-path /ControlRigModules/Modules/Armlist_rig_socketsList rig sockets with placement hints and claimed state
Lists every socket with its parent bone, placement hint (the schematic's 'Place the leg module here' text authored by modules) and whether a module connector already claims it. With the asset editor open it reads the DEBUG hierarchy, where module-spawned placement sockets live, the workflow: query --only-empty, place the suggested module on each hinted socket, re-query (new sockets appear as modules spawn them), repeat until none are empty.
| Parameter | Type | Required | Description |
|---|---|---|---|
| only_empty | bool | No | Only sockets with no connector bound (placement hints) |
| filter | string | No | Substring filter on socket name/hint |
cfa list_rig_sockets --asset-path /Game/Rigs/MR_X --only-emptylist_rig_componentsList hierarchy components (physics solvers/bodies/joints)
Lists every hierarchy component with its type and owning element. Construction-spawned components (RigPhysics solver/body/joint components from ChainPhysics etc.) only exist on the DEBUG instance, open the asset editor first. An empty list with physics modules present means their construction did not build physics.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on component name/type/element |
cfa list_rig_components --asset-path /Game/Rigs/MR_X --filter Solverget_rig_poseNumeric live pose: current vs rest per bone, worst deviation first
Reads the LIVE debug instance's bone positions and compares each to the rest pose. A large deviation means the rig is visibly broken (fallen physics bodies, bad IK) regardless of jitter stats. Works on modular and manual-graph rigs. open_asset first so a debug instance exists.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bones | string | No | Comma-separated bone names (empty = all bones) |
| threshold_cm | float | No | Only report bones displaced at least this far from rest |
| max_bones | int | No | Max bones in the report |
cfa get_rig_pose --asset-path /Game/Rigs/MR_X --threshold-cm 5validate_rig_deformationDetect melted / twisted / inside-out skinning on the preview mesh
Reads the real GPU skinning matrices for every bone (RefBasesInv * ComponentSpaceTransform, which is the IDENTITY at rest) and reports the three things that visibly wreck a character but are invisible to a bone-position check: non-unit scale (melted or inflated), a sheared basis (smeared skin), and a mirrored basis with negative determinant (renders inside-out). Also reports plain displacement from rest for context. Needs the asset OPEN so the debug instance exists; if component-space transforms are not ready it refuses to report rather than hand back bind-pose inverses that would make every bone look broken.
| Parameter | Type | Required | Description |
|---|---|---|---|
| scale_tolerance | float | No | Axis scale deviation from 1.0 treated as melted |
| shear_tolerance_deg | float | No | Degrees off square between basis axes treated as shear |
| translation_tolerance_cm | float | No | Bone displacement from rest that gets reported |
| max_bones | int | No | Max worst-bone rows returned |
cfa validate_rig_deformation --asset-path /Game/Rigs/CR_Xvalidate_rig_physicsPhysics invariant checks: unjointed bodies, free joints, conflicts, drift
Validates the LIVE rig's physics: dynamic bodies without joints (they FREE-FALL and stretch their bones to the floor), joints left FULLY UNCONSTRAINED (Swing1, Swing2 and Twist all ACM_Free - the engine's default for an unedited joint, under which the Swing/Twist limit degrees are ignored entirely) WHOSE BONE POINTS ACROSS GRAVITY, reported with the roll angle each will take to hang below its pivot; free joints on bones that already hang along gravity are at equilibrium and are reported as info, not as a defect, because that is the normal and correct state of a hair chain. Also elements carrying multiple bodies (cross-module conflict that breaks joint resolution), solver count, and bones currently displaced from rest. Run after every physics change; healthy=true means no issues. If joints exist but their limits could not be read, rollover_joints is omitted and an issue says the check did not run - never read a missing field as zero.
| Parameter | Type | Required | Description |
|---|---|---|---|
| deviation_threshold_cm | float | No | Bone displacement treated as broken |
| rollover_threshold_deg | float | No | Predicted roll above which an unconstrained joint is reported - the prediction is the angle between the bone's lever and gravity |
cfa validate_rig_physics --asset-path /Game/Rigs/MR_Xanalyze_rig_module_assetInspect a module asset's internal graphs (any module, incl. custom)
Summarizes what a rig module actually does: per-graph node counts, node-type histogram, and the config variables its graph reads. Accepts Control Rig Blueprint modules on every version and 5.8 runtime-asset modules (ChainPhysics etc.).
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_asset_path | string | Yes | Module asset path |
| graph_filter | string | No | Substring filter on graph name |
| include_nodes | bool | No | Include the per-node list |
| trace_variable | string | No | Trace a config variable to every pin that consumes it, what the config actually drives |
| include_links | bool | No | Include every link (src.pin -> dst.pin) per graph; combine with graph_filter |
| include_pin_defaults | bool | No | Append each node's literal pin values, e.g. [Connector=Solver Bone]. Requires include_nodes. This is what tells you WHICH connector a ResolveConnector resolves, structure alone cannot |
cfa analyze_rig_module_asset --module-asset-path /ControlRigModules/Modules58/ChainPhysicsset_rig_autosaveToggle per-command disk saves for rig commands (default off)
By default rig mutations only mark the asset dirty, a full disk save per command costs 2-3s on big rigs and made long build sessions crawl. Persist explicitly with save_asset/save_all at your validation gates. Pass --enabled to restore save-every-command behavior for this editor session.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | Yes | true = save to disk on every rig command; false = mark dirty only |
cfa set_rig_autosave --enabled=falsefit_rig_chain_collisionSize a ChainPhysics module's collision from the real skinned mesh
Derives collision from get_skeletal_bone_bounds instead of guessing: dynamic links get ONE median-fitted shape (ChainPhysics applies the same collision to every link, the per-bone spread is reported so the compromise is visible) and every kinematic bone gets its own mesh-true capsule via ExtraCollisionSettings (indexed in Kinematic order). Requests a construction pass so the live instance picks it up. Gate after: dump_rig_components, measure_mesh_penetration, validate_rig_physics.
| Parameter | Type | Required | Description |
|---|---|---|---|
| module_name | string | Yes | ChainPhysics-style module instance to fit |
| margin_cm | float | No | Clearance added on top of fitted radii |
| shape | string | No | Dynamic-link shape: sphere or capsule |
| apply | bool | No | false = dry-run report only |
| mesh_path | string | No | Explicit skeletal mesh (default: the rig's preview mesh) |
cfa fit_rig_chain_collision --asset-path /Game/Rigs/MR_X --module-name Braid --shape sphere --margin-cm 0.5create_rig_body_collider_moduleGenerate a kinematic body-collider rig module asset
Creates a module whose config Bones[] + Colliders[] spawn one KINEMATIC physics body per bone at construction, auto-joins the solver on the root bone and collides with every chain in that solver. This solves the disjoint-bones deadlock: cover glutes/hips/thighs with mesh-true shapes WITHOUT putting colliders on any chain's Start/anchor bone. After creating: add_rig_module it, connect its Root connector to any bone, then set Bones/Colliders config sized from get_skeletal_bone_bounds.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Content path for the new module asset |
cfa create_rig_body_collider_module --asset-path /Game/CFA_Modules/CFA_BodyCollidersmeasure_mesh_penetrationMesh-vs-mesh clip depth: cloth/hair vertices inside body volume
CPU-skins the rig's preview mesh at the live (or rest) pose and reports how deep chain-side vertices (hair/braid/dress, selected by chain_filter) sit inside per-bone body volumes, worst chain-vs-body bone pairs with depth in cm. Bone motion stats CANNOT see mesh clip: a rig can be 'stable' while the braid rests inside the glutes. Gate contact quality on this command after any collision change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| chain_filter | string | Yes | Comma-separated bone-name substrings for the cloth/hair side |
| body_filter | string | No | Comma-separated substrings for the body side (default: every non-chain bone) |
| pose | string | No | 'current' (live debug pose) or 'rest' |
| mesh_path | string | No | Explicit skeletal mesh (default: the rig's preview mesh) |
| margin_cm | float | No | Depth beyond this counts as a clip |
| max_results | int | No | Worst pairs reported |
cfa measure_mesh_penetration --asset-path /Game/Rigs/MR_X --chain-filter hair_braid,dress --body-filter pelvis,thigh,spine,buttget_skeletal_bone_boundsReal per-bone geometry from skinned vertices + physics asset
Computes each bone's actual geometric bounds from the mesh's skinned vertices: axis-aligned box, a fitted capsule (axis/radius/half-length), and 'fit_oriented', Epic's own primitive fit (covariance -> dominant eigenvector -> OBB in that frame, the same math Create Physics Asset uses) giving radius, CYLINDER-ONLY length and a ready-to-paste capsule TM whose rotation puts local +Z on the measured long axis. Plus the physics asset's authored shapes. weight_mode 'dominant' answers 'how thick is THIS bone's flesh'; 'any' answers 'all skin this bone can move', the right question for a collider. Size physics collision from this instead of guessing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | Yes | Skeletal mesh content path |
| filter | string | No | Substring filter on bone name |
| max_bones | int | No | Max bones in the report |
| include_physics_asset | bool | No | Include physics asset shapes |
| weight_mode | string | No | dominant | any, Epic's EVW_DominantWeight / EVW_AnyWeight |
cfa get_skeletal_bone_bounds --mesh-path /Game/Chars/SKM_Hero --filter butt --weight-mode anyplace_rig_pole_vectorPlace a pole control out in the bend plane, and verify it moved
A pole control left ON its joint gives the IK solver a degenerate bend plane: it ROLLS the limb instead of bending it, and the visible symptom is the hips/shoulders twisting. This derives the bend direction from the limb's own geometry (never a hardcoded axis), pushes the control out along it, and VERIFIES the resulting world position, set_rig_control_offset takes a PARENT-RELATIVE transform, so a world position written straight into it silently leaves the control where it was. If the limb is STRAIGHT in the rest pose the bend vector is numerical noise and the command refuses to guess: supply facing_bone_a + facing_bone_b (a measured direction, e.g. ankle -> toe) or fallback_direction, and use invert for joints that bend away from it (an elbow vs a knee).
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Control Rig asset path |
| control | string | Yes | Pole-vector control to place |
| root_bone | string | Yes | Chain root bone (hip/shoulder) |
| mid_bone | string | Yes | Mid joint that bends (knee/elbow) |
| end_bone | string | Yes | Chain end bone (ankle/wrist) |
| offset_factor | float | No | Epic's PV Offset Factor (default 3.0) = mid + perpendicular bend * factor |
| distance | float | No | Explicit distance in cm (0 = use offset_factor); floored at 25% of limb length |
| fallback_direction | string | No | 'X,Y,Z' world direction, straight limbs only |
| facing_bone_a | string | No | Measured facing pair, bone A (preferred over fallback_direction) |
| facing_bone_b | string | No | Measured facing pair, bone B |
| invert | bool | No | Negate the direction (elbow bends away from facing, knee toward) |
| dry_run | bool | No | Report the placement without writing it |
cfa place_rig_pole_vector --asset-path /Game/Rigs/CR_X --control PV_leg_l_ctrl --root-bone thigh_l --mid-bone calf_l --end-bone foot_l --facing-bone-a foot_l --facing-bone-b ball_lremove_rig_componentsPurge persisted components from the blueprint hierarchy
Removes components matching a type/name substring from the BLUEPRINT hierarchy. Construction-spawned physics components must never persist in the asset, stale saved copies duplicate on every rebuild (auto-renamed) and silently break joint resolution. Run 'validate_rig_physics' after to confirm one body per bone.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | Yes | Substring of component type/name to remove |
cfa remove_rig_components --asset-path /Game/Rigs/MR_X --filter Physicsdump_rig_componentsFull field dump of live hierarchy components via reflection
Dumps EVERY reflected field of live components (physics solver/body/joint: BodyData.MovementType, Collision shape dims, joint Parent/ChildBodyComponentKey, DriveData, KinematicTarget...) from the running debug instance. On UE 5.8 physics bodies also include live_state: the simulated transform, linear/angular velocity and speed, the direct answer to 'is this body actually moving/jiggling' and 'why does it rest offset'. Scope with --element or --fields to keep output small.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on component name/type/element |
| element | string | No | Exact owning element (bone) name to scope to |
| fields | json | No | JSON array of top-level field names to include (empty = all) |
| max_results | int | No | Max components dumped |
cfa dump_rig_components --asset-path /Game/Rigs/MR_X --element butt_l --fields '["BodyData","Dynamics"]'list_rig_channelsList animation channels with hosts and live values
Lists every animation channel (module config such as Gravity Multiplier / Simulation Mode is exposed as channels) with its host control, value type, and live current + initial values from the running instance. The live 'current' value is what the graph actually reads each frame, config variables only seed channels at first construction.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Substring filter on channel or host name |
cfa list_rig_channels --asset-path /Game/Rigs/MR_X --filter Gravityset_rig_channel_valueWrite animation channel values on the running instance
Sets Bool/Float/Integer animation channel CURRENT values on the running debug instance, the sim reads them next tick, no reconstruction. This is the correct way to live-tune module physics. Pass --set-initial to also persist through re-construction. Exact or unambiguous-suffix channel names accepted. Batch: --channels '[{"channel":"butt_l/Stiffness","value":"1"},{"channel":"butt_r/Stiffness","value":"1"}]'.
| Parameter | Type | Required | Description |
|---|---|---|---|
| channel | string | No | Channel name from list_rig_channels (single form) |
| value | string | No | New value: '1.5', 'true', '3' (single form) |
| channels | json | No | Batch form: JSON array of {channel, value} |
| set_initial | bool | No | Also write the initial value (survives re-construction) |
| persist | bool | No | Mirror into the blueprint hierarchy (initial+current) so the value survives recompiles |
cfa set_rig_channel_value --asset-path /Game/Rigs/MR_X --channel "butt_l/GravityScale" --value 2.0play_rig_preview_animationPlay an animation on the rig's asset-editor preview
Plays an animation asset as the preview's source pose. Default solve mode 'backwards_and_forwards' runs Backwards Solve (animation -> control values) then Forwards Solve each frame, so the animation actually DRIVES the rig and physics reacts to the motion, combine with start_rig_motion_capture to measure real jiggle amplitude headless. A rig without a Backwards Solve event gets a clear warning (module-driven bones would hold the control pose).
| Parameter | Type | Required | Description |
|---|---|---|---|
| anim_path | string | Yes | Animation asset content path |
| solve_mode | string | No | backwards_and_forwards | forwards |
| play_rate | float | No | Playback rate |
| loop | bool | No | Loop playback |
cfa play_rig_preview_animation --asset-path /Game/Rigs/MR_X --anim-path /Game/Anims/Walkstop_rig_preview_animationStop the preview animation and restore forwards-only solve
Stops playback, clears the preview animation, restores the Forwards Solve event queue and resets the pose to initial.
cfa stop_rig_preview_animation --asset-path /Game/Rigs/MR_Xadd_rig_jiggle_bobOne-shot soft-tissue jiggle setup (tip bone + rebind + tune)
Jiggle amplitude comes from lever geometry, not spring values: a leaf flesh bone (butt, belly) has no swinging mass, so it reads rigid at any softness. This command adds an unskinned tip bone placed along the flesh bone's REAL skinned-vertex protrusion direction (furthest vertex + margin), rebinds the ChainPhysics module's 'End Bone' connector to it, optionally sets Strength/MinSize, reconstructs and verifies bodies exist on the tip. The tip is the pendulum bob whose momentum makes the flesh visibly wobble, the same mechanism as a breast/nipple chain.
| Parameter | Type | Required | Description |
|---|---|---|---|
| flesh_bone | string | Yes | Flesh bone that should jiggle |
| module_name | string | No | ChainPhysics module whose End Bone gets rebound (empty = tip only) |
| tip_name | string | No | Tip bone name (default <flesh_bone>_tip) |
| lever_margin_cm | float | No | Extra distance past the furthest skinned vertex |
| strength | float | No | Also set module Strength config (0 = leave) |
| min_size | float | No | Also set module MinSize config (0 = leave) |
| mesh_path | string | No | Skeletal mesh for skin analysis (default: rig preview mesh) |
cfa add_rig_jiggle_bob --asset-path /Game/Rigs/MR_X --flesh-bone butt_l --module-name Butt_l --strength 1.5 --min-size 5validate_rig_controlsFlag dead controls and undriven bones from live VM truth
Uses the engine's own VM dependency map (built from the rig's actual instruction read/write records) to flag controls that influence NOTHING, no instruction reads them, no hierarchy children, no hosted channels, no proxy drives, never referenced in any graph pin, plus bones nothing animates (no VM write up the parent chain, no physics body). Every flagged control carries a CURE suggestion: 'connect' when a bone name-matches (spine_02_ctrl -> spine_02, with the exact wiring recipe), 'review' when it sits on a bone without a name match, 'delete' (with the remove_rig_element line) when nothing plausible exists. Works WITHOUT the asset editor: falls back to a private headless instance and runs the forward solve with bool channels forced true so gated branches record; with the editor open it reads the live debug instance instead (source field says which).
| Parameter | Type | Required | Description |
|---|---|---|---|
| include_bones | bool | No | Also flag undriven bones |
| max_results | int | No | Max flagged items per category |
cfa validate_rig_controls --asset-path /Game/Rigs/CR_Xvalidate_rig_graphGraph red-squiggle report: bad refs, missing channels, dead exec, runtime log
The CLI-side equivalent of the editor's red node errors. Static pass over every graph: FRigElementKey pins referencing bones/controls that don't exist, animation-channel units whose Control/Channel can't resolve (with the available channel list), unresolved wildcard pins (whose defaults are silently dropped), mutable nodes with no incoming execute link (dead code), If nodes whose True and False hold the same unlinked constant (the Condition changes nothing, how an IK/FK switch ships stuck at weight 0), and visible controls that no node reads (dragging them moves nothing). With the asset editor open it also reads the running instance's RigVM log and maps every runtime warning/error back to the node that raised it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| graph_name | string | No | Restrict to one model graph (empty = all) |
| include_runtime_log | bool | No | Read the debugged instance's RigVM runtime log |
| check_unused_controls | bool | No | Report visible controls no node reads (whole-rig, non-modular runs only) |
| max_results | int | No | Max issues reported |
cfa validate_rig_graph --asset-path /Game/Rigs/CR_Xanalyze_rig_ioGround-truth rig I/O: events, AnimBP pins, control reads, measured bone writes, safety verdict
Answers 'how will this rig behave in an AnimBP?' with hard data instead of guessing. Static pass: which solve events exist, which pins the Control Rig anim node would expose (public variables, animatable controls, animation channels with hosts), and which controls the Forwards Solve reads (pose controls vs safe channels). Measured pass: runs a PRIVATE headless instance on a perturbed pose and diffs which bones the forward solve overrides, once with channels at authored defaults and once with every bool channel forced true, so gated branches (IK weights, grounding, physics toggles) are exercised. Verdicts: pass_through | gated_writes | writes_bones | overrides_animation (the last means the rig will stomp incoming animation in an AnimBP).
| Parameter | Type | Required | Description |
|---|---|---|---|
| frames | int | No | Forward frames per measured pass (physics needs a few ticks) |
| delta_time | float | No | Delta time per measured frame |
| max_results | int | No | Max bones listed per written-bones table |
cfa analyze_rig_io --asset-path /Game/Rigs/CR_X_Physicsprofile_rigHeadless rig performance report: solve ms, hot nodes, physics census, red flags
Answers 'why is this rig slow?' with numbers. Runs the forward solve on a PRIVATE headless instance (5-frame warmup, then N timed frames) and reports: wall-clock avg/max ms and % of a 60fps frame budget, the hottest nodes from the engine's own RigVM instruction profiling (per-node ms, module cost attributed to the invoking instruction), a physics census (solvers, bodies, joints, per-solver body distribution), and red flags with the fix spelled out, multiple solvers (the ChainPhysics 'Solver Bone' trap: every bound Solver Bone CREATES an independent Chaos sim; unbound chains auto-join the one shared solver), construction re-requested every frame, over-budget averages, excessive body counts. Bool channels are forced true by default so gated physics/IK is included in the cost.
| Parameter | Type | Required | Description |
|---|---|---|---|
| frames | int | No | Timed forward frames (after 5-frame warmup) |
| delta_time | float | No | Delta time per frame |
| enable_channels | bool | No | Force bool channels true so gated branches are included |
| top_nodes | int | No | Rows in the hot-node table |
cfa profile_rig --asset-path /Game/Rigs/CR_Xanalyze_rig_control_impactWhich controls actually MOVE bones, empirical connectivity map
Answers "if I grab this control in the viewport and move it, does anything happen?" by DOING it: every animatable control is nudged on a PRIVATE headless instance and the resulting bone movement is measured. Static checks cannot answer this, validate_rig_controls only asks whether some VM instruction READS the control, and a control can be read and still have zero effect (the IK/blend weight feeding it is 0, it sits on a branch that never executes, or a later stage overwrites those bones). Each control gets a verdict: drives_bones, weak_effect, no_effect, or undetermined (the control itself could not be moved, position-only controls cannot rotate, so nothing can be concluded). Rotation and translation are probed separately (rotation_verdict/translation_verdict) because FK controls are ROTATED while IK effectors are MOVED. Read-only: nothing is saved.
| Parameter | Type | Required | Description |
|---|---|---|---|
| controls | string | No | Comma-separated control names to probe (empty = every animatable pose control) |
| offset_cm | float | No | How far to nudge each control |
| settle_frames | int | No | Solve frames to settle before and after the nudge (raise for physics-heavy rigs) |
| max_bones | int | No | Most-affected bones listed per control |
| bind_world | bool | No | Bind the editor world so ground-trace units resolve |
cfa analyze_rig_control_impact --asset-path /Game/Rigs/CR_Xsimulate_rigHeadless N-frame simulation: anim input, limb crossing, ground clipping, deviation, NaN checks
Runs the rig's forward solve on a PRIVATE instance for N frames, independent of any open editor window, feeding a real AnimSequence frame-by-frame as the input pose (bones matched by name), with real delta time so physics actually simulates. Reports: minimum segment-to-segment distance per requested bone-segment pair with a crossing flag (catches crossed/crushed legs numerically), every bone dipping below --ground-z, per-bone deviation from the input animation (what the rig changed), NaN/explosion instability, and optional per-frame trajectories for named bones. By default the rig is bound to the editor world so SphereTrace/world-collision units hit level geometry. Also reports bones_moved_by_rig, the WORLD-space displacement the rig added on top of the input pose, which is the number to read for 'did anything move' (bones_modified_by_rig counts local overrides only and collapses a driven chain onto its root). Pass --shake-bone to run the physics alive-gate: the input pose is oscillated then FROZEN, and any remaining motion is reported as residual RMS per bone with bones_responding / physics_alive.
| Parameter | Type | Required | Description |
|---|---|---|---|
| anim_sequence | string | No | AnimSequence content path fed as the input pose (empty = hold initial pose) |
| start_time | float | No | Animation start time in seconds |
| frames | int | No | Forward-solve frames to run |
| delta_time | float | No | Delta time per frame (advances the anim sample time too) |
| channels | json | No | Channel values applied before frame 0: {"foot_grounding":"true","leg_l_ik":"1.0"} |
| segment_pairs | json | No | Bone-segment pairs checked for crossing: [{"a":["thigh_l","calf_l"],"b":["thigh_r","calf_r"]}] |
| crossing_threshold_cm | float | No | Pairs closer than this are flagged as crossing |
| ground_z | string | No | Component-space ground plane Z in cm; bones below it are reported (omit to skip) |
| track_bones | string | No | Comma-separated bone names to report per-frame positions for |
| bind_world | bool | No | Outer the rig to the editor world so trace units hit level geometry |
| max_results | int | No | Max rows per report table |
| check_mobility | bool | No | After the frame loop, offset the root control 50cm and report bones that do not follow (stuck FK/IK chains) |
| mobility_control | string | No | Control to offset for the mobility check (empty = auto: root-most transform control) |
| shake_bone | string | No | PHYSICS ALIVE-GATE: oscillate this bone of the input pose, then freeze it and measure residual motion. Needs no controls and no open editor |
| shake_cm | float | No | Shake amplitude in cm |
| shake_frames | int | No | Frames to shake before freezing the pose (default: frames/3) |
| residual_threshold_cm | float | No | Per-frame RMS travel above which a bone counts as responding |
cfa simulate_rig --asset-path /Game/Rigs/CR_X_Physics --anim-sequence /Game/Anims/Walk --frames 90 --channels '{"foot_grounding":"true"}' --segment-pairs '[{"a":["thigh_l","calf_l"],"b":["thigh_r","calf_r"]}]'disconnect_rig_module_connectorClear a module connector's binding
Disconnects a module connector from its target(s). --disconnect-sub-modules also clears connectors of nested modules that depended on it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| connector | string | Yes | Connector element name (Module/Connector) |
| disconnect_sub_modules | bool | No | Also disconnect dependent sub-module connectors |
cfa disconnect_rig_module_connector --asset-path /Game/Rigs/MR_X --connector "Arm_l/Root"export_control_rigExport a complete Control Rig to JSON
Writes a complete JSON description of a Control Rig to Saved/CodeFizzEditorAgent/Exports/<name>_<stamp>/<name>.controlrig.json: every graph (models, functions, collapse sub-graphs) with full nodes/pins/defaults/links, the function library, local + blueprint variables, the compiled execution stack (VM event entries in order), the curve container, and the full hierarchy — bones/nulls/curves/sockets/connectors plus controls with reflection-complete settings, offset and shape transforms (initial + current), and initial/current/minimum/maximum values. Returns a compact summary; pass --inline to also get the document in the response.
| Parameter | Type | Required | Description |
|---|---|---|---|
| inline | bool | No | Also return the full document inline |
cfa export_control_rig --asset-path /Game/Rigs/CR_X