pixal3d_mrp_mlx/scripts
m3ultra 5f14517553 Fix the silhouette gate: sample the surface, not the vertex list
Two bugs in the acceptance test, both found by running it for real.

1. THE GATE DID NOT APPLY TO TEXTURED RUNS. The texture path returned before the
   check, so the one path most likely to be used for real assets was the only one that
   could ship a blob silently. The check is now a shared gate() called from both.

2. THE METRIC WAS TESSELLATION-DEPENDENT. It projected the VERTEX LIST, so a decimated
   mesh sampled its own silhouette more sparsely and scored lower for an identical
   shape - holes appear inside the outline and count as misses. Measured on two real
   assets:

     asset                        verts    vertex-proj   surface-sampled
     1_img (gate FAILED)        133,842        0.790            0.911
     0_img (gate passed)        227,546        0.965            0.969

   The dense mesh barely moves; the sparse one jumps 0.12. That is the metric
   measuring tessellation, not accuracy - and at min_iou 0.85 it had just rejected a
   good reconstruction. Overlay confirmed it: the "missing" region was speckle inside
   the silhouette, not a wrong shape.

   Now samples 3M points uniformly over the surface, so density is a constant of the
   metric rather than a property of the mesh.

Worth stating plainly: the gate caught a real problem on its first live failure - just
not the one it reported. A quality gate that is itself unvalidated is a liability, and
this one needed the same "measure it, do not reason about it" treatment as the model.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 18:38:36 +10:00
..
image_to_mesh.py Fix the silhouette gate: sample the surface, not the vertex list 2026-08-03 18:38:36 +10:00
run_structure.py Real image -> occupancy grid, with a silhouette check and honest timings 2026-08-03 14:10:30 +10:00