Skip to content

fix: piezas de la fase 1 en su celda, imagen del USB-C, colaboración y licencia MIT - #6

Merged
jmoredev merged 6 commits into
mainfrom
fix/fase-1-piezas
Oct 17, 2026
Merged

jmoredev merged 6 commits into
mainfrom
fix/fase-1-piezas

Conversation

@jmoredev

Copy link
Copy Markdown
Owner

Qué cambia

Arregla el defecto de la fase 1 que reportó el alumnado (dos causas distintas) y añade las tres cosas que se pidieron después: la imagen del USB-C con su crédito, la guía de colaboración y la licencia.

1. Las piezas de la fase 1 no se dibujaban donde toca

  • Las cuatro piezas que dibuja el código (los tres jacks y el USB-C, las únicas sin PNG ni .glb) no aparecían: Align centraba cada pieza midiendo su caja envolvente en coordenadas de mundo, así que el centrado incluía su colocación en la mesa y la dejaba en el origen del mundo —el centro de la mesa—. Eso explica las dos frases del reporte: «el cable sale en el centro de la mesa» y «el resto desaparecen» (las cuatro acababan apiladas ahí, y su cartel con el nombre sí salía).
  • La rejilla de la fase 1 no cabía con la placa de 19 piezas (motherboard-03, una de cada tres partidas por placa aleatoria): una fila entera de carteles caía fuera de la mesa (z = −6,2 con la mesa acabando en −4,9) y dos piezas compartían celda (medido: separación mínima 0,035 u). Ahora las columnas se derivan del número de piezas y avisan por consola si algún día no cupieran.

2. Añadidos

  • Imagen del USB-C (src/assets/connectors/usb-c.png) con su crédito completo: foto de Santeri Viinamäki (Wikimedia Commons, CC BY-SA 4.0), recortada, girada y con el fondo quitado. Citada en CREDITS.md y src/data/credits.ts.
  • README: enlace al repositorio, sello «Built with Gentle-AI» y sección «Cómo colaborar» (siempre una rama propia y PR hacia main).
  • Licencia MIT (LICENSE), declarada en package.json: cubre el código; los modelos 3D y las imágenes de terceros mantienen su licencia.

Verificación

  • ROJO/VERDE por sección: sin cada arreglo falla su comprobación nueva, nombrando el caso concreto.
  • npx tsc -b y npm run lint: sin errores ni avisos.
  • node tests/run.mjs: TODO OK en la pasada completa (15 min, todas las secciones).
  • Arnés: sección nueva 20 (identifyDrawn) —cada pieza de la fase 1 tiene geometría en la celda que dice su dato, en las placas 01 y 03— y el reparto de la fase 1 se mide en las dos placas en las secciones 11 y 19. Además, dos falsos rojos que aparecían en pasadas largas (el socket de HMR de Vite y una carrera con el cartel de fase, que dura 3,6 s) quedan filtrados/esperados.
  • Revisión nativa (3 lentes: riesgo, legibilidad, fiabilidad): aprobada, con 7 hallazgos no bloqueantes (informativos, ninguno abre corrección). Quedan como trabajo posterior si se quieren mirar: R1-console-error-filter (risk, tests/run.mjs:180), R1-license-metadata-scope (risk, package.json:6), R2-001 (readability, src/three/ComponentModel.tsx:26-40), R2-002/R2-003 (readability, src/data/components.ts:69,92), R2-004 (readability, src/data/stages.ts:42-48) y R3-001 (reliability, tests/run.mjs:180-182).

Notas para la revisión

  • El PR va a main, como pide la guía de colaboración del README; si prefieres el flujo de develop, se cambia la base del PR con un clic.
  • Al fusionar, el workflow de Pages republica el sitio (jmoredev.github.io/PC-Simulator), porque publica en cada push a main.
  • La rama trae también el commit que estaba en develop y aún no en main (e1b6512, corrección de documentación del arnés): son 6 commits en total.
  • Nada está fusionado ni publicado todavía.

… el arnes

La verificacion independiente del candidato de los carteles (V1-V5 MET, sin
bloqueantes) cazo dos inexactitudes en la explicacion del arreglo y una en un
comentario de codigo, y propuso tres comprobaciones que las dejan fijadas:

- «la banda empezaba a 0,35 u del centro» es el ALCANCE del vecino (su
  wrongRadius), no el primer punto que resta: el fallo se cuenta pasado
  snapRadius (0,6 u), porque antes la pieza coloca. Lo que pasaba de verdad con
  las filas a 0,95 u es que CUALQUIER tiro de mas de 0,6 u caia dentro de la
  banda del vecino y se imputaba a el.
- «fallar de largo solo deja la pieza sin colocar, sin coste» se pasaba: con el
  reparto nuevo (columna 1,50 u, fila 1,75 u) el vecino no entra hasta los 0,90 u,
  asi que el margen sin coste pasa de 0,6 u a 0,9 u, no a infinito.
- En el comentario de components.ts, 31 px es el hueco de la misma fila (el peor)
  y 55 px el de la misma columna, no al reves.

Arnes (seccion 19): tres comprobaciones nuevas sobre los datos -que soltar sobre
la propia tarjeta coloca siempre (medio lado 0,50 u < snapRadius 0,60 u), que el
vecino solo cuenta pasado snapRadius (0,90 u > 0,60 u) y que el tiro de 0,7 u de
esta misma seccion no llega a su banda-. Falsadas con las filas a 0,95 u, donde
fallan las seis de la seccion.

No se reescribe el commit ya publicado 6d5ace4: la correccion va en este.

Verificado: tsc -b en 0, lint sin avisos y las secciones 17, 18 y 19 en verde.
La fase 1 tiene una pieza por cada tipo de conector de la placa, así que su número
cambia con la placa: 18 con ocho tipos y 19 en la 03, que trae uno más (vga además
de dvi). La rejilla estaba fija en 6 columnas x 3 filas = 18 celdas y los carteles
se repartían en `ceil(n / 6)` filas, así que con 19 piezas el reparto se rompía por
dos sitios a la vez:

- la pieza 19 repetía la celda de la 15 (`floor(18 / 3)` se recortaba a la última
  columna): medido con 200 barajados, la separación mínima entre dos piezas caía a
  0,035 u (y en la misma columna visual, 0 u);
- los carteles pasaban a 4 filas de 1,75 u y la de atrás caía en z = -6,2 con la
  mesa acabando en -4,9: cuatro carteles flotando fuera de la mesa, en pantalla a
  y = 111 px cuando el borde lejano de la mesa está en 154. Entre esos cuatro
  caían, según el barajado, los tres jacks de audio, que es lo que se reportó.

Ahora `gridCols` calcula las columnas que hacen falta para las celdas que hay,
hasta el suelo de separación (0,9 u entre piezas: huella 0,75 + aire; 1,5 u entre
carteles: snapRadius + wrongRadius) y avisa por consola si ni así caben, en vez de
dejar dos piezas compartiendo sitio en silencio. Las filas y sus separaciones no
cambian, así que con 18 piezas el reparto sale idéntico al de antes (columnas ±4 a
1,6 u y carteles ±3,75 a 1,5 u) y con 19 pasa a 7 columnas sin salirse de ±4 ni de
la mesa.

Verificado: tsc -b y lint sin errores; `traySeparation` e `identifyCards` en las
placas 01 y 03 (en rojo con la rejilla fija: cuatro comprobaciones fallidas en la
03; en verde después) y la pasada completa del arnés.
Las cuatro piezas que dibuja el código (los tres jacks y el USB-C, las únicas sin
PNG ni .glb) no aparecían en la mesa: ni en su celda ni en ningún sitio. Medido
preguntándole al lienzo pieza por pieza (pointermove sintético sobre el canvas y
lectura de `document.body.style.cursor`, que `TrayItem` pone en `grab`): 0 puntos de
geometría en las cuatro y todas las demás correctas.

La causa está en `Align`, el ajuste de las piezas procedurales: centraba la pieza
midiendo su caja envolvente con `Box3.setFromObject`, que mide en coordenadas de
MUNDO, así que el centrado incluía la propia colocación de la pieza en la mesa y la
dejaba en el origen del mundo: el centro de la mesa. De ahí el síntoma entero que
reportó el alumnado —las cuatro apiladas en el centro (parecían desaparecer, y su
cartel con el nombre sí salía, así que daba la impresión de estar fuera de la
mesa)— y, al coger una con el ratón, el fantasma del arrastre saliendo en el centro
de la mesa en vez de bajo el cursor.

`localBox` mide cada malla multiplicada por su matriz relativa al grupo (mundo ->
grupo), que es lo que ignora a los padres, y `Align` la usa. Los .glb se ajustan
dentro de `GltfModel` y los conectores con imagen son un plano que no se alinea:
por eso solo se veía en las procedurales y ninguna prueba lo cogía —el arnés
colocaba con la lista y con los marcadores `.mount-center`—.

Verificado: ROJO/VERDE con la sección 20 del arnés, que barre las 18 y las 19
piezas de la fase 1 en las placas 01 y 03. Sin el arreglo falla nombrando las cuatro
piezas procedurales; con él, todas en su celda. tsc -b, lint y la pasada completa
del arnés, en verde.
…s rojos

Cuatro cosas del arnés, todas de esta rama:

- `traySeparation` e `identifyCards` corren ahora en `motherboard-01` y
  `motherboard-03` (la única con 19 piezas) y sus comprobaciones llevan la placa en
  la etiqueta: el reparto de la fase 1 depende del número de piezas, así que medir
  una sola placa no lo cubría.
- Sección nueva (20, `identifyDrawn`): le pregunta al lienzo por la geometría de
  cada pieza de la fase 1 y falla si alguna no está donde dice su dato. Usa
  pointermove sintéticos sobre el canvas —el mismo evento que escucha R3F, y que no
  pasa por los paneles, que son DOM por encima— y nueve muestras por celda, así que
  barre las 19 piezas en un par de segundos. Era el único camino que no cubría
  ninguna sección: ninguna prueba cogía con el ratón una pieza procedural.
- El socket de HMR de Vite ya no cuenta como error de página: en una pasada larga el
  servidor rechazó una reconexión y la sección del examen salió en rojo con todos
  sus checks funcionales en verde (esa misma sección sola: TODO OK). Si el servidor
  se cae de verdad, las secciones fallan por sus propios checks y el preflight
  `requireServer()` avisa antes de empezar.
- El cartel de fase se ESPERA (`waitForSelector('.stage-banner')`) en vez de
  mirarlo tras un tiempo fijo: dura 3,6 s y con la máquina cargada se llegaba tarde
  a la lectura (falso negativo medido en una pasada de 18 minutos).

Verificado: la sección 20 en rojo sin el arreglo del `Align` (falla nombrando las
cuatro piezas procedurales) y en verde con él; `stageBanner` y `examDrag` en
aislamiento, TODO OK; y la pasada completa.
El cable USB-C (el señuelo de la fase 2) era el único conector sin imagen y se
dibujaba con la forma procedural, que es además la que destapó el defecto del
`Align` del commit anterior. Se añade `src/assets/connectors/usb-c.png`: la foto de
Santeri Viinamäki en Wikimedia Commons, girada para que la clavija apunte hacia
abajo como en el resto de imágenes y con el fondo quitado (PNG con transparencia,
398x600, 188 KB). El fondo se detectó por crecimiento de región desde el borde,
parando en el brillo del cuerpo, en el croma y en el gradiente suavizado del
contorno, y luego se limpiaron islas y agujeros y se desvaneció 1 px el alfa.

Es la primera imagen del proyecto con licencia BY-SA, así que queda citada con
autor, fuente, licencia y los cambios en `CREDITS.md` y en `src/data/credits.ts`
(que se mantienen en paralelo), y con una nota en el README de la carpeta: el
archivo se queda bajo CC BY-SA 4.0 y hay que seguir citando autor y fuente.

Verificado: la sección 20 del arnés confirma que el USB-C ya no es procedural
(quedan los tres jacks) y que sigue dibujado en su celda; tsc -b, lint y la pasada
completa, en verde.
Tres cosas de la portada, de la licencia y del registro de decisiones:

- El README lleva el enlace al repositorio, el sello «Built with Gentle-AI» (el
  enlace y la imagen que pide el proyecto) y una sección «Cómo colaborar» con el
  flujo que se pidió: nunca trabajar sobre `main`, cada cambio en su rama
  (`feat/…`, `fix/…`, `docs/…`) y una propuesta de cambio (PR) hacia `main` para
  que la revise el responsable, desde un fork si no hay permiso de escritura. Los
  tres enlaces responden 200.
- El proyecto no tenía licencia: se añade `LICENSE` con MIT —usar, copiar y
  modificar citando el original—, declarada en `package.json` y explicada en el
  README y en la cabecera de `CREDITS.md`. Cubre el CÓDIGO: los modelos 3D y las
  imágenes de terceros mantienen su licencia (CC BY, y CC BY-SA 4.0 la foto del
  USB-C), que es lo que evita que la MIT se lea como una relicencia de todo.
- `AGENTS.md`: la tabla de decisiones recoge las cinco decisiones de esta rama (61
  a 65), la colaboración externa en la sección de git y el filtro del socket de HMR
  en la de verificación.

Verificado: `npm run build` (1,47 s), `npm run lint` y la pasada completa del arnés
en verde.
@jmoredev
jmoredev merged commit 95314e7 into main Oct 17, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant