git.lucas.co / hou-control
SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git

otls-audit.md (40.1K)

  1 # otls audit
  2 
  3 Audit of every HDA in `otls/`, run 2026-09-14 against Houdini 22.0.429 (Indie) with `hython`. Every library was loaded, every definition was instantiated with its contents unlocked, and every SOP was cooked once with a 10x10 polygon grid on each required input. The audit script and raw JSON are not in the repo; the method and its limits are at the end.
  4 
  5 > **Status after the audit.** The 20 hollow files were deleted (`d3d8cb3`). The dummy children in section 2 were replaced with their current types in 29 assets (`aef363e`, `28dfa29`); the five `l_s_galante::im_cull` uses now point at a rebuilt `im_cull_pieces` asset; what remains are the SideFX Labs nodes and the `lucas::dev::` children in `im_bevel` and `im_relax`. The four VEX compile failures in section 3 are fixed. Sections 4 to 7 are untouched.
  6 >
  7 > **Consolidation (2026-09-16).** Every `developer_float_*` / `developer_vector_*` pair is now one type-agnostic node that reads the attribute's size at cook time, and the vector-only nodes were merged by function. Breaking changes to an HDA now get a new minor version; a type that is removed outright is simply deleted. `otls/` holds 194 files and 194 definitions (186 SOP, 6 COP, 2 Object); 10 definitions carry help.
  8 >
  9 > | old | new | commit |
 10 > |---|---|---|
 11 > | `developer_float_diffuse 1.1` | `developer_diffuse 1.0` | `b29b966` |
 12 > | `developer_float_initialize`, `developer_vector_initialize` | `developer_attribute_initialize 1.0` (one tab per attribute) | `10edab3` |
 13 > | `developer_float_concentrate`, `developer_vector_concentrate` | `developer_concentrate 1.0` | `8b1f499` |
 14 > | `developer_float_migrate 1.1`, `developer_vector_migrate 1.1` | `developer_migrate 1.2` (push, not average) | `e492c1c`, `67a644d` |
 15 > | `developer_float_bleed` | `developer_bleed 1.0` | `46fde3d` |
 16 > | `developer_vector_conform`, `developer_vector_direct`, `developer_vector_unify` | `developer_align 1.0` (a list of targets) | `95abc44` |
 17 > | `developer_vector_from_scalar` | `developer_gradient 1.0` | `95abc44` |
 18 > | `developer_vector_rotate` | `developer_rotate 1.0` | `95abc44` |
 19 >
 20 > `developer_visualize` (2026-09-17) does the drawing for a solver's Vis tabs wherever it sits in the chain; a new `developer_solver` has one before OUT and no longer composites at its own output.
 21 >
 22 > `developer_attribute_initialize 1.1` (2026-09-18) makes one attribute per node -- the Attributes list of 1.0 became the node's own parameters, and Enable went with it since the bypass flag does that job. 1.0 stays for hips that hold several attributes in one node.
 23 >
 24 > `developer_panel` is removed (2026-09-17): its tabs live on `developer_solver`'s Visualize folder, where Color tabs are composited into `Cd` by a wrangle after the simulation (several at once, with blend and opacity) and Marker tabs keep a Houdini marker visualizer on the solver node.
 25 >
 26 > `developer_surface_detangle`'s Shapeshifter algorithm is built: a point repulsion over Iterations passes with Thickness in edge lengths and a Neighbour Rings exclusion, replacing the Not Implemented error. Section 4 now lists only the empty shells.
 27 >
 28 > `developer_attribute_remap`'s Class (point, primitive, detail) and Type (float, vector) and `developer_normalize`'s Method (summation, maximum, range) are real menus now.
 29 >
 30 > `developer_attribute_clip` is built (an Attribute field and a clamp to Range); `developer_attribute_constant`'s Class and `developer_surface_remesh 1.0`'s Transfer Method drive their switches, which were fixed at input 0. What is left in section 4 is single-entry menus, empty shells and the unimplemented Detangle algorithm.
 31 >
 32 > `developer_embryo` reads Source (internal sphere or the second input, which was wired to the first input's connector) and Base Resolution (default now 50, the value the sphere was fixed at).
 33 >
 34 > `developer_metamax` resets at the first frame of Frame Range, tracks inside it, and Read End of Range (the Shift toggle) time-shifts the input to the range's last frame.
 35 >
 36 > `developer_attribute_combine` multiplies each attribute by its Weight before the operation.
 37 >
 38 > `developer_analysis` gained a working Class Edge (edge-length statistics into `edges_info`) and Element folder (change, direction and previous value against the second input); the audit's Analysis rows are updated.
 39 >
 40 > `developer_select 1.1` reads the random Variation, its seed and Multiplier, builds Random Vector and drops the `newparameter` placeholder; `developer_surface_suture` fuses points past Fusion Threshold within Distance Threshold; `developer_time` and `developer_time_ramp` honour the start of Range.
 41 >
 42 > `developer_lead 1.1` takes its radius from a parameter in edge lengths and blends by Amount; 1.0 had a fixed 0.05 radius and ignored Amount.
 43 >
 44 > `developer_vitality 1.1` counts into `_age0..2` to match `developer_attribute_initialize`; 1.0 stays for hips that read `_age1..3`.
 45 >
 46 > Alongside: `developer_attribute_composite` gained vector and further scalar operations (`ffd6c75`), `developer_analysis` writes its statistics into the `<attr>_info` dictionary that `developer_attribute_initialize` creates, whose range is one vector2 key (`8e87ec2`, `43ba011`). No hip in the repo used any removed type; hips elsewhere that did will load those nodes as empty placeholders.
 47 
 48 | | count |
 49 |---|---|
 50 | `.hdalc` files | 218 |
 51 | definitions that load | 198 (190 SOP, 6 COP, 2 Object) |
 52 | hollow files (index only, no definition) | 20 |
 53 | nodes containing dummy children of a missing type | 33 |
 54 | SOPs that fail to cook on a plain grid | 6 |
 55 | SOPs with parameters nothing reads | 81 |
 56 | nodes with bypassed children | 18 |
 57 | nodes with embedded help | 1 |
 58 
 59 ## 1. Hollow files are rename leftovers, not lost work
 60 
 61 All 20 hollow files are 83 bytes: an `INDX` header and nothing else. That is what Houdini leaves behind when a definition is moved to a new library file with **Save As / Copy to new file**, and every one of them has a successor on disk. The `developer_*` files were already hollow in the first commit (2025-12-09); the backups in `otls/backup/` show the originals were renamed on 2025-04-24 between 16:25 and 16:43. The three `im_*` files were hollowed by commits `1e159f7` (2025-12-12) and `75e0c07` (2025-12-31), which also touched the consolidated `im_cull` and `im_count`.
 62 
 63 Successor found by matching the backup's parameter set against live definitions (exact match unless noted):
 64 
 65 | hollow file | latest backup | successor |
 66 |---|---|---|
 67 | `developer_clip` | bak2 | `developer_attribute_clip` |
 68 | `developer_combine` | bak3 | `developer_attribute_combine` |
 69 | `developer_composite` | bak2 | `developer_attribute_composite` |
 70 | `developer_constant` | bak2 | `developer_attribute_constant` |
 71 | `developer_promote` | bak1 | `developer_attribute_promote` |
 72 | `developer_concentrate` | bak3 | `developer_vector_concentrate` |
 73 | `developer_diffuse (1.0 and 1.1)` | 1.1_bak4 | `developer_float_diffuse 1.1` |
 74 | `developer_direct` | bak10 | `developer_vector_direct` |
 75 | `developer_detangle` | bak3 | `developer_surface_detangle` |
 76 | `developer_remesh` | bak3 | `developer_surface_remesh 1.0` |
 77 | `developer_subdivide` | bak1 | `developer_surface_subdivide` |
 78 | `developer_initialize` | bak3 | `developer_attribute_initialize (identical), itself later split` |
 79 | `developer_attribute_initialize` | bak12 | `developer_float_initialize + developer_vector_initialize (split, half the parms each)` |
 80 | `developer_migrate 1.1` | bak2 | `developer_float_migrate 1.1 + developer_vector_migrate 1.1 (split)` |
 81 | `developer_map` | bak3 | `developer_attribute_remap (by function: attribute + domain in/out ranges)` |
 82 | `developer_miasma` | bak1 | `developer_volume_miasma (backup had no parms)` |
 83 | `im_count_primitives` | git f3872bf | `im_count (consolidated)` |
 84 | `im_cull_points` | git 23c1076 | `im_cull (consolidated)` |
 85 | `im_cull_primitives` | git 23c1076 | `im_cull (consolidated)` |
 86 
 87 No live node embeds any of the hollow type names, so deleting the 20 files loses nothing. Two side notes: `.gitignore` lists `*otls/backup`, but 277 backup files were committed before that rule and are still tracked. And `otls/` holds two `im_soft_transform.1.1.hdalc.bak.*` files plus a stray `sop_l_s_galante.matcap_shader.1.0.hdalc.hda *.otl` (a mangled filename that still contains a valid `im_soft_transform 1.1` definition, duplicating the real file).
 88 
 89 ## 2. 33 nodes contain dummy children whose type no longer exists
 90 
 91 This is the finding that matters. When an HDA's child refers to a type Houdini cannot find, it creates an **Embedded dummy**: a node with the right name and parameters but no contents. It raises no error and no warning. It just outputs nothing, so everything downstream of it inside the asset is fed empty geometry. The HDAs carry fallback paths to the libraries the types came from, but all of them point at repos that no longer exist (`/Users/lucas/src/hou-immutable-methods`, `/Users/lsgalante/src/houdini-studio-utils`, `/home/lsgalante/src/houdini-studio-utils`, `/Users/lucas/src/hou-developer`), and SideFX Labs is not installed in this Houdini.
 92 
 93 Missing types, how many child nodes use them, and the current node that replaces them:
 94 
 95 | missing type | uses | replacement on disk |
 96 |---|---|---|
 97 | `im_delete::1.0` | 23 | lsgalante::im_delete::1.1 |
 98 | `l_s_galante::im_delete::1.1` | 8 | lsgalante::im_delete::1.1 |
 99 | `im_ramp_color::1.0` | 5 | lsgalante::im_color_ramp::1.1 (probably) |
100 | `l_s_galante::im_cull::1.0` | 5 | lsgalante::im_cull::1.0 |
101 | `im_orient::1.0` | 4 | lsgalante::im_orient::1.1 |
102 | `im_normal::1.0` | 3 | lsgalante::im_normal::1.0 |
103 | `im_reindex::1.0` | 3 | lsgalante::im_reindex::1.0 |
104 | `labs::edge_smooth::1.0` | 2 | none: SideFX Labs |
105 | `im_ramp_scalar::1.0` | 2 | lsgalante::im_float_ramp::1.0 or im_ramp_float (probably) |
106 | `im_grid::1.0` | 2 | lsgalante::im_grid::1.0 |
107 | `labs::attribute_normalize_vector::1.0` | 1 | none: SideFX Labs |
108 | `l_s_galante::im_sort::1.0` | 1 | lsgalante::im_sort::1.1 |
109 | `shapeshifter_time_switch::1.0` | 1 | lsgalante::developer_time_switch::1.0 |
110 | `shapeshifter_detangle::1.0` | 1 | lsgalante::developer_surface_detangle::1.0 |
111 | `lsg::dev::IMMMinvertmesh::1.0` | 1 | none found |
112 | `im_skeletonize::1.0` | 1 | lsgalante::im_skeletonize::1.0 |
113 | `lucas::dev::mycurve::1.0` | 1 | none found |
114 | `lucas::dev::morphorotatevec::1.0` | 1 | none found |
115 | `labs::quickmaterial::2.2` | 1 | none: SideFX Labs |
116 | `im_best_fit::1.0` | 1 | none found |
117 | `lucas::dev::imguide::1.0` | 1 | lsgalante::im_guide::1.1 (probably) |
118 | `lucas::dev::imnearpoints::1.0` | 1 | none found (im_neighbours?) |
119 
120 Affected nodes and the dummy children inside them:
121 
122 | node | dummy children |
123 |---|---|
124 | `gem_mold_flange::1.0` | `/im_delete1` (im_delete::1.0), `/im_delete2` (im_delete::1.0), `/isolate_largest` (l_s_galante::im_cull::1.0), `/leading_edge_refine/leading_edge_smooth` (labs::edge_smooth::1.0), `/leading_edge_refine/im_cull2` (l_s_galante::im_cull::1.0), `/extract_longest` (l_s_galante::im_cull::1.0), `/im_delete3` (im_delete::1.0), `/im_delete5` (im_delete::1.0), `/im_delete6` (im_delete::1.0), `/im_sort` (l_s_galante::im_sort::1.0) |
125 | `im_layout::1.0` | `/im_reindex1` (im_reindex::1.0), `/im_grid1` (im_grid::1.0), `/im_orient1` (im_orient::1.0), `/im_delete1` (l_s_galante::im_delete::1.1), `/im_orient2` (im_orient::1.0), `/im_reindex2` (im_reindex::1.0), `/im_grid2` (im_grid::1.0), `/im_orient3` (im_orient::1.0) |
126 | `gem_mold_preprocess::1.0` | `/smooth_partition_boundary` (labs::edge_smooth::1.0), `/im_normal1` (im_normal::1.0), `/edge_collapse/im_normal1` (im_normal::1.0), `/im_reindex1` (im_reindex::1.0), `/im_delete1` (im_delete::1.0) |
127 | `gem_mold_solver::1.0` | `/dopnet1/sopsolver1/im_normal1` (im_normal::1.0), `/dopnet1/sopsolver1/shapeshifter_time_switch1` (shapeshifter_time_switch::1.0), `/dopnet1/sopsolver1/shapeshifter_detangle1` (shapeshifter_detangle::1.0), `/im_delete1` (im_delete::1.0) |
128 | `gem_skeleprep::1.0` | `/straight_skeleton_3d1` (im_skeletonize::1.0), `/im_delete1` (im_delete::1.0), `/im_delete2` (im_delete::1.0) |
129 | `im_line::1.0` | `/im_ramp_color1` (im_ramp_color::1.0), `/im_delete1` (l_s_galante::im_delete::1.1), `/im_delete2` (l_s_galante::im_delete::1.1) |
130 | `gem_flange_merge::1.0` | `/im_cull2` (l_s_galante::im_cull::1.0), `/im_delete1` (im_delete::1.0) |
131 | `gem_halo_merge::1.0` | `/im_cull2` (l_s_galante::im_cull::1.0), `/im_delete1` (im_delete::1.0) |
132 | `gem_mold_shell::1.0` | `/curvature_to_thickness` (im_ramp_scalar::1.0), `/im_delete1` (im_delete::1.0) |
133 | `gem_sprue::1.0` | `/im_delete1` (im_delete::1.0), `/im_delete2` (im_delete::1.0) |
134 | `gem_sprue_cut::1.0` | `/im_delete1` (im_delete::1.0), `/im_delete2` (im_delete::1.0) |
135 | `gem_sprue_select::1.1` | `/im_delete1` (im_delete::1.0), `/im_delete2` (im_delete::1.0) |
136 | `im_attractor::1.0` | `/im_ramp_color1` (im_ramp_color::1.0), `/im_ramp_scalar1` (im_ramp_scalar::1.0) |
137 | `im_bevel::1.0` | `/mycurve1` (lucas::dev::mycurve::1.0), `/morphorotatevec1` (lucas::dev::morphorotatevec::1.0) |
138 | `im_split::1.0` | `/im_delete1` (l_s_galante::im_delete::1.1), `/im_delete2` (l_s_galante::im_delete::1.1) |
139 | `developer_surface_remesh::1.0` | `/subnet1/im_ramp_color1` (im_ramp_color::1.0) |
140 | `gem_mold_root::1.0` | `/im_delete4` (im_delete::1.0) |
141 | `gem_mold_structure::1.0` | `/im_orient1` (im_orient::1.0) |
142 | `gem_partition::1.0` | `/IMMMinvertmesh1` (lsg::dev::IMMMinvertmesh::1.0) |
143 | `gem_sprue_funnel::1.0` | `/im_delete2` (im_delete::1.0) |
144 | `gem_sprue_select::1.0` | `/im_delete1` (im_delete::1.0) |
145 | `gem_support::1.0` | `/volume_blast/im_delete1` (im_delete::1.0) |
146 | `im_distrubution::1.0` | `/im_ramp_color1` (im_ramp_color::1.0) |
147 | `im_onion::1.0` | `/quickmaterial1` (labs::quickmaterial::2.2) |
148 | `im_orient::1.0` | `/im_best_fit1` (im_best_fit::1.0) |
149 | `im_permutate::1.0` | `/im_delete1` (l_s_galante::im_delete::1.1) |
150 | `im_point_proximity::1.0` | `/imguide1` (lucas::dev::imguide::1.0) |
151 | `im_promote::1.0` | `/im_delete1` (l_s_galante::im_delete::1.1) |
152 | `im_relax::1.0` | `/imnearpoints1` (lucas::dev::imnearpoints::1.0) |
153 | `im_sort::1.0` | `/im_delete1` (im_delete::1.0) |
154 | `im_stain::1.0` | `/im_ramp_color1` (im_ramp_color::1.0) |
155 | `im_twist::1.0` | `/im_delete1` (l_s_galante::im_delete::1.1) |
156 
157 The fix is manual: open each asset, replace the dummy with the current type (parameters and wiring have to be carried over by hand, since the dummy keeps the old parameter values), and save. The whole `gem_mold_*` chain, `im_layout` and `im_line 1.0` are the worst hit.
158 
159 ## 3. Cook failures
160 
161 Four `developer_*` nodes fail regardless of input because a VOP inside them does not compile. These are real breaks, not a consequence of the test input:
162 
163 - `developer_attribute_composite::1.0`: `composite/attribvop1`: Reference to undefined variable: op_start
164 - `developer_float_migrate::1.1`: `proximity/attribvop1`: Reference to undefined variable: fval
165 - `developer_vector_direct::1.0`: `multiplier/attribvop1`: No matching function for vector chs(string). Candidates are: string chs(string), string chs(string; float)
166 - `developer_vector_from_scalar::1.0`: `near_pts/attribvop1`: Reference to undefined variable: P
167 
168 Since then `developer_float_migrate`, `developer_vector_direct` and `developer_vector_from_scalar` have been replaced by `developer_migrate`, `developer_align` and `developer_gradient`, and `developer_attribute_composite` was rewritten; all four cook.
169 
170 `im_pose` and `im_sample` also fail, but only because they need a second input the test did not supply. Eight GEM and IM nodes warn that a for-each block has no pieces, which is expected on a plain grid. Nothing else errored or warned.
171 
172 ## 4. Parameters nothing reads
173 
174 For each top-level parameter the audit looked for a channel reference from any child parameter, a textual reference (`ch("../name")`, `chs`, `chramp`, the tuple component names such as `rangex`) in any child parameter or expression, or a button callback. 215 parameters on 81 SOPs matched none of those. Some may be read only by a `hidewhen` rule or a menu script, which this check does not count, so treat the list as candidates. Names like `newparameter` (4 nodes) and the `rnd_float_*` set on `developer_select`, where the wrangle reads `floatcov` instead, are clearly stale.
175 
176 | node | unreferenced parameters |
177 |---|---|
178 | `developer_charge::1.0` | `release`, `amount` (empty shell) |
179 | `developer_expire::1.0` | `attr` (empty shell) |
180 | `developer_lead::1.0` | `amt` |
181 | `developer_select::1.0` | `rnd_float_variation`, `rnd_float_variation_seed`, `rnd_float_multiplier`, `newparameter` (all read or removed in 1.1) |
182 | `developer_surface_suture::1.0` | none since the thresholds drive the fuse |
183 | `developer_weight::1.0` | `attr`, `multiplier` (empty shell) |
184 | `gem_build_area::1.0` | `machine`, `dimensions` |
185 | `gem_mold_solver::1.0` | `thickness`, `frame` |
186 | `gem_orient::1.0` | `group`, `start_dir` |
187 | `gem_partition::1.0` | `filecachename` |
188 | `gem_partition::1.1` | `filecachename` |
189 | `gem_positioner::1.0` | `selection` |
190 | `gem_prim_painter::1.1` | `sel_method` |
191 | `gem_prim_painter::1.2` | `sel_method` |
192 | `gem_screw::1.0` | `metric_length`, `unit_per_mm` |
193 | `gem_sprue_select::1.0` | `mode` |
194 | `gem_support::1.0` | `group_avoid` |
195 | `im_arrow::1.0` | `attr`, `origin` |
196 | `im_attractor::0.9` | `falloff_x`, `falloff_y`, `falloff_z`, `bias` |
197 | `im_attractor::1.1` | `bias`, `falloff_x`, `falloff_y`, `falloff_z` |
198 | `im_attribute_adjust::1.0` | `class`, `type` |
199 | `im_bounds::1.0` | `ndivs` |
200 | `im_bounds::1.1` | `boundsgeogrp`, `ndivs` |
201 | `im_cache::1.0` | `ids`, `version`, `versions` |
202 | `im_color::1.0` | `attr_out`, `l`, `a`, `b` |
203 | `im_color_ramp::1.1` | `outputattrib`, `encoding`, `amt_a`, `chg_a`, `amt_b`, `chg_b`, `amt_c`, `chg_c` |
204 | `im_connectivity::1.0` | `piece_attr`, `geo_class`, `gate` |
205 | `im_count::1.0` | `elemattribtoggle`, `elemattrib`, `detailattribtoggle` |
206 | `im_curl::1.0` | `axis_method`, `axis_preset`, `axis_attr` |
207 | `im_curl::1.1` | `axis_method`, `axis_preset`, `axis_attr` |
208 | `im_curl::1.2` | `axis_method`, `axis_preset`, `axis_attr` |
209 | `im_distance::1.0` | `dir_attr` |
210 | `im_distrubution::1.0` | `attrib`, `resolution` |
211 | `im_float_ramp::1.0` | `component` |
212 | `im_gate::1.0` | `attr_out` |
213 | `im_group::1.0` | `promote` |
214 | `im_guide::1.1` | `shape`, `origin_attr`, `dir_attr` |
215 | `im_line::1.0` | `length`, `scale` |
216 | `im_line::1.1` | `boundsscale`, `ramp`, `preset`, `add_preset`, `rm_preset` |
217 | `im_membership::1.0` | `attr` |
218 | `im_neighbours::1.0` | `method`, `normal_filter_toggle`, `normal_filter_tol` |
219 | `im_normal::1.0` | `docompute` |
220 | `im_number_generator::1.0` | `number` |
221 | `im_onion::1.0` | `frame` |
222 | `im_orient::1.0` | `partition_attr`, `source_vector_group_class`, `analysis_method_method` |
223 | `im_permutate::1.0` | `class`, `type` |
224 | `im_point::1.0` | `newparameter` |
225 | `im_prim_distance::1.0` | `group`, `startpts`, `transferattributes`, `transfergroups` |
226 | `im_ramp_float::1.0` | `component` |
227 | `im_random_walk::1.0` | `component` |
228 | `im_reindex::1.0` | `class` |
229 | `im_relax::1.0` | `size`, `to`, `dense`, `seed` |
230 | `im_remap::1.1` | `orangei`, `nrangei`, `rename`, `newname`, `keeporiginal` |
231 | `im_sample::1.0` | `group`, `newparameter` |
232 | `im_shadowbox::1.0` | `side_0`, `side_1`, `side_2`, `side_3`, `side_4`, `side_5` |
233 | `im_sharpen::1.0` | `rad` |
234 | `im_shrink::1.1` | `curvedir` |
235 | `im_sort::1.0` | `start_method`, `output` |
236 | `im_sort::1.1` | `method`, `start_method`, `output` |
237 | `im_stain::1.0` | `enable`, `attr`, `coloring`, `coloring_attr`, `color`, `length`, `ramp`, `presets`, `new`, `remove`, `colors`, `randomize`, `encoding`, `handles`, `labelparm`, `l`, `l_change`, `labelparm2`, `a`, `a_change`, `labelparm3`, `b`, `b_change` |
238 | `im_star::1.0` | `len_attr` |
239 | `im_transfer::1.0` | `pt_attrs`, `newparameter` |
240 | `im_valence::1.0` | `nbr_attr_name` |
241 | `im_vdb_visualize_intersections::1.0` | `help` |
242 
243 The two Object assets (`gem_build_area`, `im_cam`) are excluded: their unreferenced parameters are the standard object transform and render pages.
244 
245 Rows for the types removed by the consolidation are gone; their replacements read every parameter they expose.
246 
247 ## 5. Bypassed children
248 
249 Bypassed nodes inside a locked asset are usually experiments that were never removed:
250 
251 - `developer_metamax::1.0`: `/timeshift1`
252 - `developer_surface_remesh::1.0`: `/subnet1/tridivide1`
253 - `developer_volume_miasma::1.0`: `/isooffset1`
254 - `gem_mold_flange::1.0`: `/collapse_suite/P_avg1`
255 - `gem_mold_preprocess::1.0`: `/remove_stray_prims1`
256 - `gem_mold_root::1.0`: `/root_shape/group2`, `/root_shape/dissolve1`
257 - `gem_mold_shell::1.0`: `/polyreduce1`
258 - `gem_sprue::1.0`: `/blast4`
259 - `gem_sprue_preprocess::1.0`: `/compile_end1`, `/compile_begin1`, `/color1`
260 - `im_attractor::0.9`: `/attribwrangle4`, `/im_remap1`
261 - `im_attractor::1.1`: `/attribwrangle4`, `/im_remap1`
262 - `im_neighbours::1.0`: `/groupcombine3`
263 - `im_relax::1.0`: `/attribwrangle1`
264 - `im_remap::1.1`: `/attribdelete1`
265 - `im_shadowbox::1.0`: `/triangulate1`
266 - `im_sharpen::1.0`: `/attribblur1`
267 - `im_valence::1.0`: `/group1`
268 
269 ## 6. Versions, names, menus, help
270 
271 - **15 types ship more than one version**, all marked current, so the tab menu offers every one of them: `developer_surface_remesh` (1.0, 1.1), `gem_partition` (1.0, 1.1), `gem_prim_painter` (1.0, 1.1, 1.2), `gem_sprue_select` (1.0, 1.1), `im_attractor` (0.9, 1.0, 1.1), `im_bounds` (1.0, 1.1), `im_curl` (1.0, 1.1, 1.2), `im_line` (1.0, 1.1), `im_orient` (1.0, 1.1), `im_remap` (1.0, 1.1), `im_select` (1.0, 2.0), `im_shrink` (1.0, 1.1), `im_soft_transform` (1.0, 1.1), `im_sort` (1.0, 1.1), `im_transfer` (1.0, 1.1). `im_attractor` goes 0.9, 1.0, 1.1. Old versions that no scene needs can be removed, or hidden from the tab menu.
272 - `im_grid` and `gem_build_area` each exist in two categories (COP and SOP; Object and SOP). That is legal, just easy to confuse.
273 - **Typo**: `im_distrubution`.
274 - **Labels**: `im_cam` is labelled `im_cam` and `im_blaster` is `IM  Blaster` with two spaces. Every other label matches its type name.
275 - **Tab menu**: `im_vdb_visualize_intersections` has no submenu, so it lands at the top level of the tab menu. Everything else sorts into `Immutable Methods/*`, `Developer/*` or `GEM`; two nodes sit in bare `Immutable Methods` and 27 in bare `Developer` (the consolidated nodes sit there rather than in `Developer/Float` or `Developer/Vector`).
276 - **Help**: at the audit only `gem_orient` had embedded help. Ten definitions have it now: `gem_orient`, `im_cull_pieces` and the eight consolidated or rewritten `developer_*` nodes (`align`, `attribute_composite`, `attribute_initialize`, `bleed`, `concentrate`, `gradient`, `migrate`, `rotate`). The other 184 have none.
277 - **Icons**: 8 nodes carry their own SVG (`im_bounds`, `im_box`, `im_count`, `im_cull`, `im_grid`, `im_line 1.1`, `im_skeletonize`, `im_wave`); the rest use the generic subnet icon.
278 - **Hardcoded paths**: `im_multistain` reads two preset JSON files from `/Users/lucas/src/hou-immutable-methods/presets/`, which does not exist on this machine. Separately, 29 nodes carry fallback library paths to the old repos listed in section 2; those are informational and only consulted when a type is missing.
279 - **Event scripts**: all 23 `PythonModule` sections and the three Python `OnCreated`/`OnUpdated` handlers compile. `developer_solver` and `gem_mold_solver` have HScript `OnCreated` handlers, correctly flagged as non-Python.
280 - **Saved with**: every asset's embedded fallbacks reference `/opt/hfs21.0`, i.e. they were last saved from Houdini 21.0.
281 
282 ## 7. developer.md is out of date
283 
284 The operator list in `developer.md` uses **Scalar** names (`Scalar Diffuse`, `Scalar Migrate`, …) while the nodes on disk were `developer_float_*` (since merged into type-agnostic `developer_*` nodes, see the status block), and it still lists `Subdivide`, `Remesh`, `Detangle`, `Combine`, `Constant` under their pre-rename names. 34 of its 55 items match no node, and 30 of the 51 `developer_*` nodes on disk at the time (47 now) are not in the document, including the whole `developer_attribute_*` family, `developer_time_analysis`, `developer_charge` and `developer_release`.
285 
286 ## Method and limits
287 
288 - Loaded with `hou.hda.definitionsInFile` and `installFile`, then instantiated in `/obj`, `/img` and a scratch geo. Locked HDAs in `hython` load their contents lazily, so each instance was unlocked with `allowEditingOfContents()` before inspection. Nothing was saved.
289 - Dummy children were identified by `type().definition().libraryFilePath() == "Embedded"`.
290 - Cooking used a 10x10 grid on each required input at frame 1. The appendix rows for the consolidated nodes were re-run on 2026-09-16 the same way. Nodes built for the SOP solver were cooked standalone, so an error there means the VEX does not compile, not that the node misbehaves in a sim. Nothing was cooked on real input data.
291 - The parameter-usage check is textual and channel-reference based. It does not follow `hidewhen`, menu scripts, or Python that builds a parameter name at runtime.
292 - Viewer states, handles, and anything needing `hou.ui` were not exercised.
293 
294 ## Appendix: every definition
295 
296 | type | ver | category | submenu | inputs | parms | unread | dummies | bypassed | cook |
297 |---|---|---|---|---|---|---|---|---|---|
298 | `developer_align` | 1.0 | Sop | Developer | 1-1 | 11 | 0 | 0 | 0 | ok |
299 | `developer_analysis` | 1.0 | Sop | Developer | 1-2 | 13 | 0 | 0 | 0 | ok |
300 | `developer_attribute_clip` | 1.0 | Sop | Developer/Attribute | 0-1 | 1 | 1 | 0 | 0 | ok |
301 | `developer_attribute_combine` | 1.0 | Sop | Developer/Attribute | 1-2 | 18 | 12 | 0 | 0 | ok |
302 | `developer_attribute_composite` | 1.0 | Sop | Developer/Attribute | 1-2 | 5 | 0 | 0 | 0 | ok |
303 | `developer_attribute_constant` | 1.0 | Sop | Developer/Attribute | 0-1 | 5 | 1 | 0 | 0 | ok |
304 | `developer_attribute_initialize` | 1.0 | Sop | Developer/Attribute | 0-1 | 15 | 0 | 0 | 0 | ok |
305 | `developer_attribute_promote` | 1.0 | Sop | Developer/Attribute | 1-1 | 4 | 0 | 0 | 0 | ok |
306 | `developer_attribute_remap` | 1.0 | Sop | Developer/Attribute | 0-1 | 9 | 2 | 0 | 0 | ok |
307 | `developer_bleed` | 1.0 | Sop | Developer | 0-1 | 2 | 0 | 0 | 0 | ok |
308 | `developer_charge` | 1.0 | Sop | Developer | 0-1 | 2 | 2 | 0 | 0 | ok |
309 | `developer_concentrate` | 1.0 | Sop | Developer | 1-1 | 9 | 0 | 0 | 0 | ok |
310 | `developer_core` | 1.0 | Sop | Developer/Volume | 0-1 | 0 | 0 | 0 | 0 | ok |
311 | `developer_cull` | 1.0 | Sop | Developer | 1-1 | 2 | 0 | 0 | 0 | ok |
312 | `developer_develop` | 1.0 | Sop | Developer | 1-1 | 4 | 0 | 0 | 0 | ok |
313 | `developer_diffuse` | 1.0 | Sop | Developer | 1-1 | 8 | 0 | 0 | 0 | ok |
314 | `developer_embryo` | 1.0 | Sop | Developer | 0-2 | 14 | 1 | 0 | 0 | ok |
315 | `developer_expire` | 1.0 | Sop | Developer | 1-1 | 1 | 1 | 0 | 0 | ok |
316 | `developer_gradient` | 1.0 | Sop | Developer | 1-1 | 8 | 0 | 0 | 0 | ok |
317 | `developer_id` | 1.0 | Sop | Developer | 1-1 | 1 | 0 | 0 | 0 | ok |
318 | `developer_lead` | 1.0 | Sop | Developer | 1-1 | 3 | 1 | 0 | 0 | ok |
319 | `developer_lead` | 1.1 | Sop | Developer | 1-1 | 4 | 0 | 0 | 0 | ok |
320 | `developer_measure` | 1.0 | Sop | Developer | 1-1 | 36 | 0 | 0 | 0 | ok |
321 | `developer_metamax` | 1.0 | Sop | Developer | 1-1 | 3 | 0 | 0 | 1 | ok |
322 | `developer_migrate` | 1.2 | Sop | Developer | 1-1 | 13 | 0 | 0 | 0 | ok |
323 | `developer_normalize` | 1.0 | Sop | Developer | 1-1 | 4 | 2 | 0 | 0 | ok |
324 | `developer_region_center` | 1.0 | Sop | Developer | 1-1 | 3 | 0 | 0 | 0 | ok |
325 | `developer_release` | 1.0 | Sop | Developer | 0-1 | 0 | 0 | 0 | 0 | ok |
326 | `developer_rotate` | 1.0 | Sop | Developer | 0-1 | 8 | 0 | 0 | 0 | ok |
327 | `developer_select` | 1.0 | Sop | Developer | 1-1 | 31 | 6 | 0 | 0 | ok |
328 | `developer_select` | 1.1 | Sop | Developer | 1-1 | 35 | 0 | 0 | 0 | ok |
329 | `developer_solver` | 1.0 | Sop | Developer | 0-1 | 8 | 0 | 0 | 0 | ok |
330 | `developer_submute_begin` | 1.0 | Sop | Developer | 1-1 | 2 | 0 | 0 | 0 | ok |
331 | `developer_submute_end` | 1.0 | Sop | Developer | 2-2 | 2 | 0 | 0 | 0 | ok |
332 | `developer_surface_adapt` | 1.0 | Sop | Developer/Surface | 1-1 | 8 | 0 | 0 | 0 | ok |
333 | `developer_surface_detangle` | 1.0 | Sop | Developer/Surface | 1-3 | 4 | 1 | 0 | 0 | ok |
334 | `developer_surface_open` | 1.0 | Sop | Developer/Surface | 1-1 | 0 | 0 | 0 | 0 | ok |
335 | `developer_surface_remesh` | 1.0 | Sop | Developer/Surface | 1-1 | 60 | 1 | 1 | 1 | ok |
336 | `developer_surface_remesh` | 1.1 | Sop | Developer/Surface | 1-1 | 59 | 0 | 0 | 0 | ok |
337 | `developer_surface_subdivide` | 1.0 | Sop | Developer/Surface | 1-1 | 3 | 0 | 0 | 0 | ok |
338 | `developer_surface_suture` | 1.0 | Sop | Developer/Surface | 2-2 | 2 | 2 | 0 | 0 | ok |
339 | `developer_time` | 1.0 | Sop | Developer/Time | 0-0 | 2 | 0 | 0 | 0 | ok |
340 | `developer_time_analysis` | 1.0 | Sop | Developer/Time | 1-1 | 2 | 0 | 0 | 0 | ok |
341 | `developer_time_ramp` | 1.0 | Sop | Developer/Time | 0-0 | 3 | 0 | 0 | 0 | ok |
342 | `developer_time_switch` | 1.0 | Sop | Developer/Time | 1-2 | 4 | 0 | 0 | 0 | ok |
343 | `developer_visualize` | 1.0 | Sop | Developer | 1-1 | 1 | 0 | 0 | 0 | ok |
344 | `developer_vitality` | 1.0 | Sop | Developer | 1-2 | 1 | 0 | 0 | 0 | ok |
345 | `developer_vitality` | 1.1 | Sop | Developer | 1-2 | 1 | 0 | 0 | 0 | ok |
346 | `developer_volume_miasma` | 1.0 | Sop | Developer/Volume | 0-1 | 0 | 0 | 0 | 1 | ok |
347 | `developer_weight` | 1.0 | Sop | Developer | 0-1 | 2 | 2 | 0 | 0 | ok |
348 | `gem_border` | 1.0 | Cop | GEM | 0-1 | 0 | 0 | 0 | 0 | - |
349 | `gem_build_area` | 1.0 | Object | GEM | 0-1 | 77 | 74 | 0 | 0 | - |
350 | `gem_build_area` | 1.0 | Sop | GEM | 0-1 | 3 | 2 | 0 | 0 | ok |
351 | `gem_flange_merge` | 1.0 | Sop | GEM | 2-2 | 3 | 0 | 2 | 0 | ok |
352 | `gem_flange_monoid` | 1.0 | Sop | GEM | 1-1 | 0 | 0 | 0 | 0 | ok |
353 | `gem_graph` | 1.0 | Cop | GEM | 0-2 | 29 | 4 | 0 | 0 | - |
354 | `gem_grid` | 1.0 | Cop | GEM | 0-1 | 6 | 0 | 0 | 0 | - |
355 | `gem_halo_merge` | 1.0 | Sop | GEM | 2-2 | 3 | 0 | 2 | 0 | ok |
356 | `gem_mold_flange` | 1.0 | Sop | GEM | 1-1 | 8 | 0 | 10 | 1 | ok |
357 | `gem_mold_preprocess` | 1.0 | Sop | GEM | 1-1 | 3 | 0 | 5 | 1 | ok |
358 | `gem_mold_root` | 1.0 | Sop | GEM | 1-2 | 4 | 0 | 1 | 2 | ok |
359 | `gem_mold_shell` | 1.0 | Sop | GEM | 1-1 | 4 | 0 | 2 | 1 | ok |
360 | `gem_mold_solver` | 1.0 | Sop | GEM | 0-1 | 12 | 2 | 4 | 0 | ok |
361 | `gem_mold_structure` | 1.0 | Sop | GEM | 1-1 | 0 | 0 | 1 | 0 | ok |
362 | `gem_orient` | 1.0 | Sop | GEM | 1-1 | 5 | 2 | 0 | 0 | ok |
363 | `gem_page` | 1.0 | Cop | GEM | 0-0 | 3 | 0 | 0 | 0 | - |
364 | `gem_partition` | 1.0 | Sop | GEM | 1-1 | 6 | 1 | 1 | 0 | ok |
365 | `gem_partition` | 1.1 | Sop | GEM | 1-1 | 7 | 1 | 0 | 0 | ok |
366 | `gem_positioner` | 1.0 | Sop | GEM | 1-1 | 2 | 1 | 0 | 0 | ok |
367 | `gem_prim_painter` | 1.0 | Sop | GEM | 0-1 | 4 | 0 | 0 | 0 | ok |
368 | `gem_prim_painter` | 1.1 | Sop | GEM | 0-1 | 9 | 1 | 0 | 0 | ok |
369 | `gem_prim_painter` | 1.2 | Sop | GEM | 0-1 | 9 | 1 | 0 | 0 | ok |
370 | `gem_scale` | 1.0 | Sop | GEM | 0-1 | 0 | 0 | 0 | 0 | ok |
371 | `gem_screw` | 1.0 | Sop | GEM | 0-1 | 4 | 2 | 0 | 0 | ok |
372 | `gem_skeleprep` | 1.0 | Sop | GEM | 1-1 | 0 | 0 | 3 | 0 | ok |
373 | `gem_sprue` | 1.0 | Sop | GEM | 1-1 | 3 | 0 | 2 | 1 | ok |
374 | `gem_sprue_cut` | 1.0 | Sop | GEM | 1-1 | 3 | 0 | 2 | 0 | ok |
375 | `gem_sprue_funnel` | 1.0 | Sop | GEM | 1-2 | 3 | 0 | 1 | 0 | ok |
376 | `gem_sprue_preprocess` | 1.0 | Sop | GEM | 1-2 | 0 | 0 | 0 | 3 | ok |
377 | `gem_sprue_select` | 1.0 | Sop | GEM | 1-1 | 2 | 1 | 1 | 0 | ok |
378 | `gem_sprue_select` | 1.1 | Sop | GEM | 1-1 | 7 | 0 | 2 | 0 | ok |
379 | `gem_sprue_shell` | 1.0 | Sop | GEM | 1-2 | 3 | 0 | 0 | 0 | ok |
380 | `gem_support` | 1.0 | Sop | GEM | 0-1 | 8 | 1 | 1 | 0 | ok |
381 | `gem_text_box` | 1.0 | Cop | GEM | 0-1 | 24 | 0 | 0 | 0 | - |
382 | `im_arrow` | 1.0 | Sop | Immutable Methods/Utility | 0-1 | 2 | 2 | 0 | 0 | ok |
383 | `im_attractor` | 0.9 | Sop | Immutable Methods/Deform | 1-1 | 11 | 4 | 0 | 2 | ok |
384 | `im_attractor` | 1.0 | Sop | Immutable Methods/Deform | 0-2 | 21 | 0 | 2 | 0 | ok |
385 | `im_attractor` | 1.1 | Sop | Immutable Methods/Move | 1-2 | 11 | 4 | 0 | 2 | ok |
386 | `im_attribute_adjust` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 4 | 2 | 0 | 0 | ok |
387 | `im_bend` | 1.0 | Sop | Immutable Methods/Move | 0-1 | 0 | 0 | 0 | 0 | ok |
388 | `im_bevel` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 0 | 0 | 2 | 0 | ok |
389 | `im_blaster` | 1.0 | Sop | Immutable Methods/Layout | 1-1 | 9 | 0 | 0 | 0 | ok |
390 | `im_bounds` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 14 | 1 | 0 | 0 | ok |
391 | `im_bounds` | 1.1 | Sop | Immutable Methods/Analysis | 0-1 | 14 | 2 | 0 | 0 | ok |
392 | `im_box` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 11 | 0 | 0 | 0 | ok |
393 | `im_cache` | 1.0 | Sop | Immutable Methods/IO | 0-1 | 14 | 3 | 0 | 0 | ok |
394 | `im_cam` | 1.0 | Object | Immutable Methods | 0-1 | 65 | 63 | 0 | 0 | - |
395 | `im_clip` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 4 | 0 | 0 | 0 | ok |
396 | `im_color` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 9 | 4 | 0 | 0 | ok |
397 | `im_color_ramp` | 1.1 | Sop | Immutable Methods/Attribute | 0-1 | 15 | 8 | 0 | 0 | ok |
398 | `im_connectivity` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 3 | 3 | 0 | 0 | ok |
399 | `im_constant` | 1.0 | Sop | Immutable Methods/Attribute | 0-0 | 3 | 0 | 0 | 0 | ok |
400 | `im_copy` | 1.0 | Sop | Immutable Methods/Layout | 0-2 | 2 | 0 | 0 | 0 | ok |
401 | `im_count` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 6 | 3 | 0 | 0 | ok |
402 | `im_cull` | 1.0 | Sop | Immutable Methods/Filter | 1-1 | 7 | 0 | 0 | 0 | ok |
403 | `im_curl` | 1.0 | Sop | Immutable Methods/Deform | 0-1 | 5 | 3 | 0 | 0 | ok |
404 | `im_curl` | 1.1 | Sop | Immutable Methods/Deform | 0-1 | 5 | 3 | 0 | 0 | ok |
405 | `im_curl` | 1.2 | Sop | Immutable Methods/Move | 0-1 | 5 | 3 | 0 | 0 | ok |
406 | `im_delete` | 1.1 | Sop | Immutable Methods/Attribute | 1-1 | 12 | 0 | 0 | 0 | ok |
407 | `im_diagnostic` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 2 | 0 | 0 | 0 | ok |
408 | `im_direction` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 2 | 0 | 0 | 0 | ok |
409 | `im_dissolve` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 2 | 0 | 0 | 0 | ok |
410 | `im_dissolve_point` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 1 | 0 | 0 | 0 | ok |
411 | `im_distance` | 1.0 | Sop | Immutable Methods/Analysis | 0-2 | 4 | 1 | 0 | 0 | ok |
412 | `im_distrubution` | 1.0 | Sop | Immutable Methods/Analysis | 1-2 | 20 | 2 | 1 | 0 | ok |
413 | `im_dot` | 1.0 | Sop | Immutable Methods/Utility | 0-1 | 1 | 0 | 0 | 0 | ok |
414 | `im_endpoints` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 4 | 0 | 0 | 0 | ok |
415 | `im_evaluate_curve` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 5 | 0 | 0 | 0 | ok |
416 | `im_extrude` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 8 | 0 | 0 | 0 | ok |
417 | `im_fast_clip` | 1.0 | Sop | Immutable Methods/Visualize | 1-1 | 3 | 0 | 0 | 0 | ok |
418 | `im_float_ramp` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 5 | 1 | 0 | 0 | ok |
419 | `im_gate` | 1.0 | Sop | Immutable Methods/Filter | 0-1 | 12 | 1 | 0 | 0 | ok |
420 | `im_gem` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 0 | 0 | 0 | 0 | ok |
421 | `im_grid` | 1.0 | Cop | Immutable Methods | 0-1 | 6 | 0 | 0 | 0 | - |
422 | `im_grid` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 9 | 0 | 0 | 0 | ok |
423 | `im_group` | 1.0 | Sop | Immutable Methods/Filter | 1-2 | 10 | 1 | 0 | 0 | ok |
424 | `im_group_split` | 1.0 | Sop | Immutable Methods/Filter | 0-1 | 2 | 0 | 0 | 0 | ok |
425 | `im_guide` | 1.1 | Sop | Immutable Methods/Visualize | 0-1 | 9 | 3 | 0 | 0 | ok |
426 | `im_inline` | 1.0 | Sop | Immutable Methods/Filter | 0-1 | 0 | 0 | 0 | 0 | ok |
427 | `im_invert_mesh` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 0 | 0 | 0 | 0 | ok |
428 | `im_layout` | 1.0 | Sop | Immutable Methods/Layout | 0-1 | 10 | 0 | 8 | 0 | ok |
429 | `im_line` | 1.0 | Sop | Immutable Methods/Create | 0-2 | 14 | 2 | 3 | 0 | ok |
430 | `im_line` | 1.1 | Sop | Immutable Methods/Create | 0-2 | 15 | 5 | 0 | 0 | ok |
431 | `im_lop` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 0 | 0 | 0 | 0 | ok |
432 | `im_manipulator` | 1.0 | Sop | Immutable Methods/Move | 1-1 | 0 | 0 | 0 | 0 | ok |
433 | `im_matcap` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 15 | 0 | 0 | 0 | ok |
434 | `im_membership` | 1.0 | Sop | Immutable Methods/Analysis | 1-1 | 1 | 1 | 0 | 0 | ok |
435 | `im_midpoint` | 1.0 | Sop | Immutable Methods/Analysis | 1-1 | 1 | 0 | 0 | 0 | ok |
436 | `im_multistain` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 2 | 0 | 0 | 0 | ok |
437 | `im_neighbours` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 12 | 3 | 0 | 1 | ok |
438 | `im_normal` | 1.0 | Sop | Immutable Methods/Attribute | 1-1 | 48 | 1 | 0 | 0 | ok |
439 | `im_notebook` | 1.0 | Sop | Immutable Methods/Utility | 0-1 | 1 | 0 | 0 | 0 | ok |
440 | `im_number_generator` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 3 | 1 | 0 | 0 | ok |
441 | `im_onion` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 6 | 1 | 1 | 0 | ok |
442 | `im_orient` | 1.0 | Sop | Immutable Methods/Layout | 0-1 | 7 | 3 | 1 | 0 | ok |
443 | `im_orient` | 1.1 | Sop | Immutable Methods/Layout | 0-1 | 2 | 0 | 0 | 0 | ok |
444 | `im_permutate` | 1.0 | Sop | Immutable Methods/Attribute | 1-1 | 3 | 2 | 1 | 0 | ok |
445 | `im_plane` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 3 | 0 | 0 | 0 | ok |
446 | `im_point` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 4 | 1 | 0 | 0 | ok |
447 | `im_point_mover` | 1.0 | Sop | Immutable Methods/Move | 0-1 | 0 | 0 | 0 | 0 | ok |
448 | `im_point_proximity` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 6 | 0 | 1 | 0 | ok |
449 | `im_pose` | 1.0 | Sop | Immutable Methods/Layout | 1-1 | 0 | 0 | 0 | 0 | failed |
450 | `im_prim_distance` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 4 | 4 | 0 | 0 | ok |
451 | `im_prim_proximity` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 3 | 0 | 0 | 0 | ok |
452 | `im_promote` | 1.0 | Sop | Immutable Methods/Attribute | 1-1 | 6 | 0 | 1 | 0 | ok |
453 | `im_ramp_float` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 5 | 1 | 0 | 0 | ok |
454 | `im_random_walk` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 4 | 1 | 0 | 0 | ok |
455 | `im_range` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 0 | 0 | 0 | 0 | ok |
456 | `im_reindex` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 3 | 1 | 0 | 0 | ok |
457 | `im_relax` | 1.0 | Sop | Immutable Methods/Move | 1-1 | 5 | 4 | 1 | 1 | ok |
458 | `im_remap` | 1.0 | Sop | Immutable Methods/Attribute | 0-1 | 13 | 0 | 0 | 0 | ok |
459 | `im_remap` | 1.1 | Sop | Immutable Methods/Attribute | 0-1 | 18 | 5 | 0 | 1 | ok |
460 | `im_remesh` | 1.0 | Sop | Immutable Methods/Topology | 0-1 | 3 | 0 | 0 | 0 | ok |
461 | `im_ruler` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 0 | 0 | 0 | 0 | ok |
462 | `im_sample` | 1.0 | Sop | Immutable Methods/Analysis | 0-2 | 8 | 2 | 0 | 0 | failed |
463 | `im_scaffold` | 1.0 | Sop | Immutable Methods/Layout | 0-1 | 0 | 0 | 0 | 0 | ok |
464 | `im_scatter` | 1.0 | Sop | Immutable Methods/Layout | 0-1 | 0 | 0 | 0 | 0 | ok |
465 | `im_select` | 1.0 | Sop | Immutable Methods/Filter | 1-1 | 29 | 0 | 0 | 0 | ok |
466 | `im_select` | 2.0 | Sop | Immutable Methods/Filter | 1-1 | 29 | 0 | 0 | 0 | ok |
467 | `im_select_points` | 1.0 | Sop | Immutable Methods/Filter | 1-1 | 31 | 0 | 0 | 0 | ok |
468 | `im_select_primitives` | 1.0 | Sop | Immutable Methods/Filter | 1-1 | 29 | 0 | 0 | 0 | ok |
469 | `im_shadowbox` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 16 | 6 | 0 | 1 | ok |
470 | `im_sharpen` | 1.0 | Sop | Immutable Methods/Move | 1-1 | 6 | 1 | 0 | 1 | ok |
471 | `im_shortest_path` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 3 | 0 | 0 | 0 | ok |
472 | `im_shrink` | 1.0 | Sop | Immutable Methods/Deform | 1-1 | 8 | 0 | 0 | 0 | ok |
473 | `im_shrink` | 1.1 | Sop | Immutable Methods/Move | 1-1 | 9 | 1 | 0 | 0 | ok |
474 | `im_skeletonize` | 1.0 | Sop | Immutable Methods/Analysis | 1-1 | 4 | 0 | 0 | 0 | ok |
475 | `im_soft_transform` | 1.0 | Sop | Immutable Methods/Move | 1-2 | 1 | 0 | 0 | 0 | ok |
476 | `im_soft_transform` | 1.1 | Sop | Immutable Methods/Move | 1-2 | 12 | 0 | 0 | 0 | ok |
477 | `im_sort` | 1.0 | Sop | Immutable Methods/Analysis | 0-1 | 4 | 2 | 1 | 0 | ok |
478 | `im_sort` | 1.1 | Sop | Immutable Methods/Topology | 0-1 | 4 | 3 | 0 | 0 | ok |
479 | `im_special_square` | 1.0 | Sop | Immutable Methods/Create | 0-0 | 22 | 0 | 0 | 0 | ok |
480 | `im_split` | 1.0 | Sop | Immutable Methods/Utility | 1-1 | 0 | 0 | 2 | 0 | ok |
481 | `im_square` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 4 | 0 | 0 | 0 | ok |
482 | `im_stain` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 26 | 23 | 1 | 0 | ok |
483 | `im_star` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 6 | 1 | 0 | 0 | ok |
484 | `im_switch` | 1.0 | Sop | Immutable Methods/Utility | 0-1 | 0 | 0 | 0 | 0 | ok |
485 | `im_transfer` | 1.0 | Sop | Immutable Methods/Attribute | 0-2 | 2 | 2 | 0 | 0 | ok |
486 | `im_transfer` | 1.1 | Sop | Immutable Methods/Attribute | 0-2 | 4 | 0 | 0 | 0 | ok |
487 | `im_transform` | 1.0 | Sop | Immutable Methods/Move | 0-1 | 4 | 0 | 0 | 0 | ok |
488 | `im_triangle` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 1 | 0 | 0 | 0 | ok |
489 | `im_twist` | 1.0 | Sop | Immutable Methods/Move | 0-1 | 2 | 0 | 1 | 0 | ok |
490 | `im_valence` | 1.0 | Sop | Immutable Methods/Topology | 1-1 | 11 | 1 | 0 | 1 | ok |
491 | `im_vdb_visualize_intersections` | 1.0 | Sop |  | 2-2 | 2 | 1 | 0 | 0 | ok |
492 | `im_vis_manager` | 1.0 | Sop | Immutable Methods/Visualize | 0-1 | 0 | 0 | 0 | 0 | ok |
493 | `im_wave` | 1.0 | Sop | Immutable Methods/Create | 0-1 | 3 | 0 | 0 | 0 | ok |