Un código de barras de ISBN ES un EAN-13: ISO 2108 mete los libros en el mismo
espacio GTIN-13 que todo lo demás bajo los prefijos Bookland 978/979 — por eso
el mismo lector lee una novela y una lata de garbanzos. Así que `isbn` NO entra
como noveno valor de `symbology`: declararlo haría que `data-symbology`
afirmara un estándar que no existe. Entra como perfil de entrada sobre `ean13`,
que es la forma que adoptan las implementaciones serias.
- **Separadores tolerados** en las simbologías NUMÉRICAS: un ISBN viaja con
guiones y un GTIN con espacios. Code 128 y Code 39 quedan fuera a propósito —
ahí un guión es dato codificable y quitarlo cambiaría la cadena en silencio.
- **ISBN-10 → Bookland**: un valor de 10 caracteres en `ean13` se lee como
ISBN-10, se le valida SU dígito de control (pesos 10…1, mod 11, con `X`
valiendo 10) y se convierte con prefijo 978 y mod-10 recalculado. La
validación previa es la parte que importa: sin ella, un ISBN-10 mal tecleado
se convierte en un EAN-13 perfectamente válido que apunta a OTRO libro — el
modo de fallo más caro del dominio. Falla con `invalid-check-digit`.
- **La hyphenación NO es nuestra** y queda documentada como tal: las posiciones
de los guiones no se calculan desde el número, dependen de las tablas de
rangos de la International ISBN Agency, que son dato versionado con fecha de
caducidad. Meterlas aquí pondría un reloj de mantenimiento dentro de una
librería de cero dependencias. Si algún día se pinta la línea `ISBN 978-…`
sobre las barras, el string con guiones lo trae el consumidor.
Y un defecto que el ISBN destapó, anterior a él: **el nombre accesible mentía**.
`aria-label` anunciaba el valor CRUDO mientras el símbolo codificaba otro —
pasaba ya con cualquier EAN al que se le añade el dígito de control, y con el
ITF-14, y con Code 39 al mayusculizar. Ahora anuncia lo que el símbolo lleva
de verdad.
- Vectores publicados en los tests: `0-306-40615-2` → `978-0-306-40615-7`, y los
dos casos de control `X` (`0-8044-2957-X`, `0-9752298-0-X`).
- `D-1.2` estaba ROTO en el commit anterior y no lo vi: prettier parte la unión
`type Tab` a 102 caracteres y el audit exige la forma de UNA línea que
documenta la guía de demos. Restaurada con `prettier-ignore`; el audit vuelve
a PASS con 0 errores.
- `F-1.4` se rompió al escribir la sección ISBN: mencionaba `## Gaps` en línea y
el regex del audit engancha esa primera aparición. Reescrito.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>