«Escríbe aquí tu mensaje»
El asistente virtual de la Sede del Catastro está programado para enseñar en gris, dentro del recuadro donde se escribe, «Escríbe aquí tu mensaje...», con esa tilde. En el mismo fichero, de 42 líneas, hay otra errata, esta en inglés, y esa sí cambia lo que hace el programa: donde debía decir length dice lenght.
- Dominio
- www.sedecatastro.gob.es
- Guardado
- 31 AGO 2026
- Comprobado en vivo
- 15 SEP 2026
- Citas
- 4 en 1 fichero guardado
- Lectura
- unos 3 min

Lo primero que hace el fichero es elegir la cara del asistente. Hay ocho robots numerados del uno al ocho, y en cada carga de la página se saca uno al azar. Es una decisión simpática: quien entra dos veces en la sede del Catastro tiene siete posibilidades entre ocho de encontrarse con otro robot. La cara sale también en el botón redondo que abre el chat, abajo a la derecha de la portada.

- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 1,9 kB
- sha256
- e86ad23969b4…
| 1 | function inicioCatia(rutaCatia) { |
| 2 | const robots = ["robot1.png", "robot2.png", "robot3.png", "robot4.png", "robot5.png", "robot6.png", "robot7.png", "robot8.png"]; |
| 3 | const robot_pos = Math.floor(Math.random() * robots.length); |
| 4 | const imgrobot = '../masterpage/img/catia/' + robots[robot_pos]; |
| 5 | let e = document. |
| 6 | t = document.head || document. |
| 7 | (e.src = |
| 8 | "../ |
| 9 | // Replace 1.x.x with the version that you want |
| 10 | (e.async = !0), |
| 11 | (e.onload = () => { |
| 12 | window.WebChat.default( |
| 13 | { |
| 14 | initPayload: '/entrada', |
Después carga la librería del chat, y al hacerlo se trae también un comentario que no es suyo: «Replace 1.x.x with the version that you want», reemplace 1.x.x por la versión que quiera. Es la instrucción del manual de la librería, rasa-webchat, de la empresa Botfront: la frase está, idéntica, en el ejemplo de uso de su manual, que leímos el 23 de septiembre, junto a otra que el Catastro también conserva, «add other props here», añada aquí otras propiedades. Copiadas con el resto del ejemplo, no hacen nada. Solo cuentan de dónde salió el código.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 1,9 kB
- sha256
- e86ad23969b4…
| 1 | function inicioCatia(rutaCatia) { |
| 2 | const robots = ["robot1.png", "robot2.png", "robot3.png", "robot4.png", "robot5.png", "robot6.png", "robot7.png", "robot8.png"]; |
| 3 | const robot_pos = Math.floor(Math.random() * robots.length); |
| 4 | const imgrobot = '../masterpage/img/catia/' + robots[robot_pos]; |
| 5 | let e = document. |
| 6 | t = document.head || document. |
| 7 | (e.src = |
| 8 | "../ |
| 9 | // Replace 1.x.x with the version that you want |
| 10 | (e.async = !0), |
| 11 | (e.onload = () => { |
| 12 | window.WebChat.default( |
| 13 | { |
| 14 | initPayload: '/entrada', |
| 15 | customData: { language: "es" }, |
| 16 | socketUrl: rutaCatia, |
| 17 | title: 'CATIA', |
| 18 | subtitle: 'Asistente Virtual Sede del Catastro', |
| 19 | profileAvatar: imgrobot, |
| 20 | showFullScreenButton: false, |
Luego vienen los ajustes visibles: el asistente se llama CATIA y se presenta como «Asistente Virtual Sede del Catastro». Y el recuadro donde el ciudadano escribe lleva su indicación en gris: «Escríbe aquí tu mensaje...». En castellano, escribe es palabra llana terminada en vocal y no lleva tilde; la que aparece ahí convierte el imperativo en otra cosa que no existe. Es la primera frase que ve quien abre el chat para preguntar.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 1,9 kB
- sha256
- e86ad23969b4…
| 14 | initPayload: '/entrada', |
| 15 | customData: { language: "es" }, |
| 16 | socketUrl: rutaCatia, |
| 17 | title: 'CATIA', |
| 18 | subtitle: 'Asistente Virtual Sede del Catastro', |
| 19 | profileAvatar: imgrobot, |
| 20 | showFullScreenButton: false, |
| 21 | mainColor: "#FFAD00", |
| 22 | userTextColor: "#333", |
| 23 | userBackgroundColor: "#000", |
| 24 | showMessageDate: true, |
| 25 | inputTextFieldHint: "Escríbe aquí tu mensaje...", |
| 26 | openLauncherImage: imgrobot, |
| 27 | // add other props here |
| 28 | customMessageDelay: (message) => { |
| 29 | let delay = message.lenght * 20; |
| 30 | if (delay > 3 * 1000) delay = 3 * 1000; |
| 31 | if (delay < 800) delay = 800; |
| 32 | return delay; |
| 33 | }, |
| 34 | params: { "storage": "session" }, |
| 35 | hideWhenNotConnected: false, |
| 36 | connectOn: 'open' |
Y queda el ajuste que da la pieza. Los asistentes virtuales fingen que escriben: esperan un poco antes de soltar cada frase para que no aparezca de golpe. Ese retardo se calcula aquí, en cuatro líneas. Se toma la longitud del mensaje, se multiplica por veinte milisegundos por carácter, y luego se le ponen dos topes: nunca más de tres segundos, nunca menos de ochocientas milésimas. La idea viene de la propia librería, que trae de serie la misma cuenta con treinta milésimas por carácter y los mismos dos topes. El fichero del Catastro la vuelve a escribir con veinte.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 1,9 kB
- sha256
- e86ad23969b4…
| 18 | subtitle: 'Asistente Virtual Sede del Catastro', |
| 19 | profileAvatar: imgrobot, |
| 20 | showFullScreenButton: false, |
| 21 | mainColor: "#FFAD00", |
| 22 | userTextColor: "#333", |
| 23 | userBackgroundColor: "#000", |
| 24 | showMessageDate: true, |
| 25 | inputTextFieldHint: "Escríbe aquí tu mensaje...", |
| 26 | openLauncherImage: imgrobot, |
| 27 | // add other props here |
| 28 | customMessageDelay: (message) => { |
| 29 | let delay = message.lenght * 20; |
| 30 | if (delay > 3 * 1000) delay = 3 * 1000; |
| 31 | if (delay < 800) delay = 800; |
| 32 | return delay; |
| 33 | }, |
| 34 | params: { "storage": "session" }, |
| 35 | hideWhenNotConnected: false, |
| 36 | connectOn: 'open' |
| 37 | }, |
| 38 | null |
| 39 | ); |
| 40 | }), |
La longitud de un texto, en JavaScript, se pide con la palabra length. Aquí pone lenght. Las dos letras del final están cambiadas de sitio, y eso basta. El lenguaje no avisa de que esa propiedad no exista; contesta indefinido. Multiplicar indefinido por veinte no da cero ni da error. Da NaN, las tres letras con las que JavaScript dice que eso no es un número.
Lo medimos ejecutando la función tal como está en el fichero. Con un saludo normal devuelve NaN; con el mensaje vacío, NaN; con quinientos caracteres, NaN. Escrita con length, ese mismo saludo daría 800 milésimas. Y lo más bonito son los dos topes que parecían proteger la cuenta, el de tres segundos por arriba y el de ochocientas milésimas por abajo. Ninguno salta, porque ninguna comparación con NaN es cierta. Lo comprobamos: NaN mayor que 3.000 es falso, y NaN menor que 800 también es falso. El error se cuela entre las dos redes.
Así que la función devuelve NaN. La librería del chat, que pedimos y leímos el 23 de septiembre, le pasa ese valor tal cual a un temporizador: con el chat abierto, cada mensaje del asistente espera lo que diga la función antes de aparecer. Un temporizador al que se le pide esperar NaN milésimas no espera: lo medimos y dispara en cero. Según su propio código, el asistente del Catastro enseña cada mensaje sin la pausa que alguien se molestó en calcular con dos topes y una multiplicación.
Dos erratas en cuarenta y dos líneas, las dos del mismo tipo: una tilde puesta donde no va y dos letras cambiadas de sitio. Y las dos siguen ahí. El fichero que pedimos el 15 y el 23 de septiembre de 2026 es el mismo que guardamos el 31 de agosto, byte por byte. Para arreglar la primera basta con mirar el recuadro. Para ver la segunda hay que abrir el fichero y saber qué se busca.
La tilde la ve cualquiera que abra el chat y no rompe nada. Las dos letras cambiadas no salen en ninguna pantalla y se llevan por delante las cuatro líneas que las rodean.
- El fichero catia.js que sirve www.sedecatastro.gob.es, idéntico el 31 de agosto y el 15 y el 23 de septiembre de 2026, elige la cara del asistente al azar entre ocho imágenes, conserva dos comentarios del ejemplo de uso del manual de rasa-webchat («Replace 1.x.x with the version that you want» y «add other props here»), escribe «Escríbe aquí tu mensaje...» en el recuadro de entrada y calcula el retardo de cada mensaje con message.lenght, propiedad que no existe.
- Ejecutada la función tal cual, devuelve NaN con cualquier mensaje; con length devolvería 800 para un saludo corto.
- Los dos topes que la rodean no corrigen nada, porque ninguna comparación con NaN es cierta, y un temporizador al que se le pasa NaN dispara en cero milésimas. Medido en un Chrome, no deducido.
- La librería del chat (Catia_index.js), pedida el 23 de septiembre, pasa el valor de esa función directamente al temporizador que retrasa cada mensaje del asistente con el chat abierto, y trae de serie la misma función escrita con length y treinta milésimas por carácter.
- La librería del chat la hemos leído, no la hemos visto funcionar: no hemos abierto el chat, porque abrirlo conecta con el asistente, ni le hemos escrito, ni hemos abierto una conversación. Lo que decimos del retardo sale de su código y de medir la función y un temporizador en un Chrome.
- No decimos que el asistente funcione mal en lo demás.
- Y no decimos nada de lo que CATIA conteste: esta pieza es sobre cuarenta y dos líneas de configuración, no sobre el asistente.
De dónde sale cada cita
Cada trozo de código de esta ficha está en un fichero guardado tal como lo entregó el servidor, con su huella (sha256) y su hora. Las citas entre «» se comprueban por programa contra ese fichero antes de publicar.
- https://www.sedecatastro.gob.es/MasterPage/js/catia.js31 de agosto de 2026, 16:18archivosha256 e86ad23969b4df4b1a25279d3cefa98ddffad3e0fcd58ca357c45e79b52ae966
- https://www.sedecatastro.gob.es/MasterPage/js/catia.js15 de septiembre de 2026, 09:50en vivo · byte a byte igualsha256 e86ad23969b4df4b1a25279d3cefa98ddffad3e0fcd58ca357c45e79b52ae966