# Review feat/geometry @ b3cd21d1 - Fecha: 2026-10-22T15:21:02+00:00 - Verdict: **FAIL** - Build rama: PASS - Build merge: SKIP - Acción: review-fail - Modo: auto-merge ## Detalle > reviewer · deepseek-v4.1-flash ✱ Glob "demo/vinted-mock/viewer3d/vendor/**" 0 matches ✱ Glob "demo/vinted-mock/viewer3d/*" 0 matches > reviewer · deepseek-v4.1-flash → Read . > reviewer · deepseek-v4.1-flash ✱ Glob "demo/**/*" 35 matches > reviewer · deepseek-v4.1-flash ✱ Glob "packages/**/*" 3 matches → Read AGENTS.md > reviewer · deepseek-v4.1-flash ✱ Glob "**/viewer3d*" 0 matches ✱ Glob "scripts/*" 2 matches > reviewer · deepseek-v4.1-flash → Read .gitignore → Read scripts/build-site.sh > reviewer · deepseek-v4.1-flash ✱ Grep "viewer3d" in demo/vinted-mock · 0 matches ✱ Grep "importmap|BufferGeometryUtils|three/addons" in . · 0 matches > reviewer · deepseek-v4.1-flash VERDICT: FAIL SUMMARY: Rama `feat/geometry` rompe el viewer 3D por import de módulo no vendorizado y borra la ropa interior sin verificación de assets; no se puede validar desde este contexto parcial. FINDINGS: - [blocker] demo/vinted-mock/viewer3d/app.js:14 — import nuevo `three/addons/utils/BufferGeometryUtils.js`. README y contrato del viewer dicen que `vendor/` contiene solo Three.js r186 + GLTFLoader + OrbitControls + RoomEnvironment. Si ese módulo no está en `vendor/` y en el importmap, el viewer entero falla al cargar (módulo no resuelto → pantalla de error), es decir, se cae la demo y la página `/viewer/` y `/preview//viewer/`. No hay forma de verificar el vendor en este contexto: hay que confirmar el archivo o rechazar el merge. - [risk] demo/vinted-mock/viewer3d/app.js:605 — `mergeGeometries` devuelve `null` si los atributos no coinciden (body con `skinIndex/skinWeight/uv`, manos/pies sin ellos). El código lanza error y cae al estado de error del viewer; no hay fallback a la malla base. Verificar en el GLB real que body, manos y pies comparten exactamente el mismo set de atributos. - [risk] demo/vinted-mock/viewer3d/app.js:556 — `collectBodyParts()` filtra detalles por caja Y `< bodyBox.min.y + height * 0.65`. En A-pose los dedos/manos pueden quedar por encima del 65 %; si no entran, se pierde la fusión de manos y el maniquí queda sin manos (regresión visual grave en demo). - [risk] demo/vinted-mock/viewer3d/app.js:1024 — `fillBoundaryHoles()` recorre todos los bordes abiertos de la malla (no solo areolas/boca). Se descartan areolas, ojos y boca, pero cualquier otro agujero (uñas, cuello, brazalete de la cabeza `high-poly`) también se tapa con abanicos; con `loop.length <= 256` puede dejar huecos sin cerrar o generar triángulos invertidos. Requiere QA visual del GLB real, no solo Chromium headless. - [risk] demo/vinted-mock/viewer3d/app.js:1075 — `smoothChestBase()` y los bucles de suavizado de pecho/pubis usan constantes en coordenadas de malla (`0.726`, `0.068`, `0.055`) asumiendo una base concreta. En la malla masculina o en tallas Plus puede afectar a zona equivocada; no hay test ni comprobación de landmarks. - [risk] demo/vinted-mock/viewer3d/app.js:614 — se fija `window.__viewer = { state, model, mesh }`. Expone estado interno en producción (incluye `state.profile` con medidas corporales). No es secreto, pero es depuración que no debería llegar a `main`; además permite manipular el visor desde consola en la demo. - [risk] demo/vinted-mock/viewer3d/app.js:1418 — nueva rama `shapeStrength === 0` (cuerpo del anuncio) solo escala altura. Si `state.baselineProfile` se inicializa con `listing.body` y `sex` inferido, pero el perfil guardado en `localStorage` difiere, el primer `deform()` ya aplica deformación completa; comprobar que no hay salto visual entre el primer render y el primer cambio de slider. - [risk] demo/vinted-mock/viewer3d/index.html:1 — se elimina `#verdict-detail`, `#zones`, `#confidence-*`, `#missing`, `#presets`, `#body-line` del bloque visible y se mueven a `
`. `app.js` sigue haciendo `$('...')` sobre esos ids; el nuevo orden es válido, pero cualquier otra rama que toque esos nodos (feat/fit-viewer) genera conflicto semántico. Coordinar con Jaime antes del merge. - [risk] docs/PLAN.md — el diff de esta rama toca PLAN, STATS y pitch (docs de María/Pres 1) además de `docs/probadores-virtuales-3d.txt` (renombrado desde la raíz). Viola "una carpeta, un dueño" de AGENTS.md; el contenido es plausible pero no es responsabilidad de `feat/geometry` y aumenta el riesgo de conflicto con las ramas de presentación. - [risk] docs/STATS.md — añade cifras de mercado (CAGR, 1,4 % adopción, precios B2B) con marcas [A]/[M]/[B] pero sin URL primaria para varias. La regla del propio archivo es "cada cifra lleva fuente en el pie". No bloquea build, pero sí la credibilidad del pitch. - [risk] docs/PLAN.md:14 — referencias a hechos de 2026 (cierre de Doppl 30-abr-2026, ChatGPT Try-On oct-2026, cierre de Ready Player Me 31-ene-2026). No puedo verificar esas fechas en este contexto; si son inventadas o mal datadas, el jurado puede desmontar la slide. --- **Nota de alcance:** el contexto temporal de revisión no contiene `demo/vinted-mock/viewer3d/` ni `vendor/`, así que no he podido comprobar el importmap, la presencia de `BufferGeometryUtils.js` ni los atributos del GLB. El blocker del punto 1 es precisamente esa imposibilidad: sin confirmar el módulo vendorizado, el riesgo de que el viewer no arranque es real y suficiente para FAIL. **Pasos máximos alcanzados** — no puedo ejecutar más lecturas ni verificaciones en esta sesión. **Pendiente de verificar antes de reenviar:** 1. `demo/vinted-mock/viewer3d/index.html` importmap y existencia de `vendor/addons/utils/BufferGeometryUtils.js`. 2. Atributos (`position`, `normal`, `uv`, `skinIndex`, `skinWeight`) de body, manos y pies en `female-base.glb` y `male-base.glb`. 3. QA visual real (no solo consola) en talla Plus y sexo masculino: pecho, pubis, manos y pies. 4. Confirmar con Fabio que los cambios en `docs/PLAN.md`, `STATS.md` y `pitch.md` no pisan a Pres 1/María.