# Esquema de los datos

## `catalogo.json`

Objeto raíz con cuatro claves.

| Clave | Contenido |
|---|---|
| `_meta` | Notas de la exportación |
| `marcas` | 36 slugs de marca |
| `categorias` | 24 categorías en dos niveles: `{slug, nombre, padre}` |
| `productos` | 169 objetos, uno por producto |

### Producto

| Campo | Tipo | Nota |
|---|---|---|
| `handle` | string | Identificador único, heredado de Shopify. **Es la llave** con la que se cruzan las redirecciones 301 y la matriz de compatibilidad |
| `titulo` | string | Título normalizado (marca + modelo + código + variante) |
| `marca` | string | Slug de marca. `maino` era el *vendor* por defecto de Shopify, no un fabricante |
| `categoria` | string | Slug de la categoría hoja |
| `estado` | string | `active` = publicable |
| `enriquecido` | bool | `true` = ficha verificada contra documentación del fabricante (89 de 169) |
| `sku` | string \| null | 123 productos aún sin SKU: lo pone el cliente |
| `precio` | int \| null | Pesos chilenos. 13 productos sin precio |
| `stock` | int \| null | Valor rescatado de Shopify; hay que revalidarlo contra bodega |
| `peso_g` | int \| null | Solo 2 productos lo traen. Necesario si el checkout cotiza envío por peso |
| `n_imagenes` | int | |
| `excerpt` | string | **Resumen truncado a 200 caracteres.** No es la descripción final de la ficha (ver LEEME) |
| `specs` | objeto \| null | Clave → valor, ya normalizado al esquema canónico (48 claves). 671 entradas en total |
| `filtros` | objeto \| null | Los mismos datos, tipados, para filtrar el catálogo: `velocidades`, `peso_g`, `nucleo_norm`, `pinon_mayor_t`, `recorrido_mm`, `rigidez`, `tornillos_cala` |
| `alertas_compra` | array \| null | 578 avisos técnicos. **Escritos en voz interna de operación**, no de tienda |
| `imagenes` | array | URLs del CDN de Shopify. Sirven para maquetar; para producción hay que usar los archivos ya rescatados y optimizados |

## `compatibilidad.json`

```
{ "compatibles":   [ {a, b, a_t, b_t, tipo, nota} ],
  "incompatibles": [ {a, b, a_t, b_t, motivo, grav} ] }
```

`a` y `b` son `handle` de producto; `a_t` y `b_t` los títulos. `tipo` es `cassette+cambio`
o `pedal+zapatilla`. `grav` es `bloqueante`: el par no funciona, no es una advertencia.

Reglas aplicadas, en este orden:

1. **Velocidades.** Cassette y cambio deben tener el mismo número de velocidades.
2. **Capacidad.** El piñón mayor del cassette no puede superar el máximo que admite el cambio.
3. **Calas.** Pedal y zapatilla deben coincidir en número de tornillos (3 = SPD-SL de ruta).

## `*.csv`

Los mismos datos aplanados, separador `;` y BOM UTF-8: se abren en Excel en español
con doble clic, sin asistente de importación.
