# Review feat/geometry @ a7305f55 - Fecha: 2026-10-22T15:33:25+00:00 - Verdict: **FAIL** - Build rama: PASS - Build merge: SKIP - Acción: review-fail - Modo: auto-merge ## Detalle > reviewer · deepseek-v4.1-flash ✱ Glob "**/*" 54 matches ✱ Glob "demo/vinted-mock/viewer3d/vendor/**/*.js" 0 matches > reviewer · deepseek-v4.1-flash ✱ Grep "ankle|crotch_y|landmarks" in packages/fit-engine/src · 0 matches ✱ Grep "BufferGeometryUtils|three/addons|importmap" in . · 0 matches > reviewer · deepseek-v4.1-flash ✱ Grep "viewer3d|body-engine|buildBody|landmark" in docs · 2 matches ✱ Grep "vendor|GLTFLoader|OrbitControls|RoomEnvironment" in . · 0 matches > reviewer · deepseek-v4.1-flash ✱ Grep "verdict-pill|underwear|superellipsePoint|raw" in . · 30 matches ✱ Grep "mergeGeometries|BufferGeometry|vendor|addons" in docs/agent-notes/3d-procedural.md · 1 match > reviewer · deepseek-v4.1-flash ✱ Grep "ankle|tobillo|crotch|hip_y|waist_y" in packages/fit-engine · 1 match → Read packages/fit-engine/src/index.ts > reviewer · deepseek-v4.1-flash VERDICT: FAIL SUMMARY: El diff actualiza docs y el visor 3D, pero añade un import de Three no vendorizado que tumba el visor y deja varios riesgos de fusión/deformación en la ruta principal de la demo. FINDINGS: - [blocker] demo/vinted-mock/viewer3d/app.js:16 — importa `three/addons/utils/BufferGeometryUtils.js` pero el diff no añade ese archivo a `vendor/` ni toca el importmap; `demo/vinted-mock/viewer3d/README.md:101` documenta `vendor/` como "Three.js r186 + GLTFLoader + OrbitControls + RoomEnvironment" (solo esos módulos). Sin el addon vendorizado, el módulo no resuelve, `app.js` no llega a evaluarse y el visor 3D no arranca para ningún listing; no hay try/catch que lo cubra porque es error de import. - [risk] demo/vinted-mock/viewer3d/app.js:~775 — `mergeGeometries(..., false)` devuelve `null` si cuerpo, manos y pies no comparten exactamente el mismo set de atributos/indexado, y el `throw` deja el visor en pantalla de error para todos los anuncios. Falta fallback a la geometría del cuerpo sin fusionar. - [risk] demo/vinted-mock/viewer3d/app.js:~1540 — `body.landmarks.ankle_y_cm` se usa sin guarda (a diferencia de `bust_y_cm`, que va con `??`). Si `buildBody()` no expone ese landmark, `ankleNorm` queda NaN y los vértices del pie reciben `dx` NaN: corrupción silenciosa de geometría sin error en consola. - [risk] demo/vinted-mock/viewer3d/app.js:~1910 — `deform()` hace 80 pasadas de suavizado de normales con `normals.array.slice()` en cada pasada, más 22 pasadas sobre el array de posiciones de ~75k vértices; en drag de slider (rAF) puede producir tirones y presión de GC durante la demo. - [risk] demo/vinted-mock/README.md:24 — sigue afirmando que el visor "deforma con las 6 medidas del anuncio", pero con `shapeStrength === 0` el cuerpo del anuncio solo se escala en altura; claim del ledger desalineado con el comportamiento por defecto. - [risk] docs/STATS.md:46 — las cifras de mercado nuevas van con etiquetas [M]/[A]/[B] y sin URL primaria (el propio texto admite "el estudio no incluye URL primaria para todas"), y `docs/PLAN.md` cita una review de App Store sin enlace; incumple la regla "cada cifra en un slide lleva fuente en el pie" y es el riesgo que el plan ya lista como "Stats mal citadas".