Variable similarGeometriesConst

similarGeometries: inspect.sceneModel.Inspection = ...

Opt-in (InspectSceneModelParams.checkSimilarGeometries). Pose-invariant shape match — two geometries are flagged similar when they share the same primitive, vertex / triangle count, and triangle edge-length distribution (a 64-bin log₂ histogram).

Edge lengths are translation-, rotation-, and reflection- invariant, so two byte-different SceneGeometries that represent the same shape under any of those transforms produce the same histogram. NOT scale-invariant: a 1 m cube and a 5 m cube fingerprint differently.

Pairs with mergeSimilarGeometries, which fits a rigid transform from each similar geometry to the canonical via Kabsch (Horn's quaternion method) under same-vertex-order correspondence and bakes the inverse into each referencing mesh's matrix. Geometries whose vertex orders don't line up with the canonical fail the residual gate and stay in place rather than mis-align silently. The issue carries context.similar listing the redundant ids.

Two-pass: first bucket by topology — that's free, and a topology mismatch means the shapes can't be the same regardless of histogram. Then within each multi-element topology bucket, compute the edge-length histogram and bucket again.