Vado
Infraestructura para que un asistente de IA lea el catálogo de un comercio, cite su precio y su stock sin equivocarse, y pueda cerrar una compra. El producto entra por un diagnóstico automático de dieciséis puntos.
Landing
Analizador gratuito y planes.
Portal del comercio
Maqueta navegable, aún con datos de ejemplo.
Motor de análisis
Desde el 11-ago-2026. ~US$0,001 por informe.
Dónde vive cada cosa
| Pieza | Ubicación |
|---|---|
| Landing, portal, motor y API | Proyectos/Comprable/01-comprable-web/ |
| Arquitectura y ADRs del motor | 03-Documentos/Arquitectura/motor-analisis/ |
| Cómo correrlo a mano | 01-comprable-web/LEEME-motor.md |
| Proyecto en Vercel | comprable-web (nombre histórico, ver B-14) |
Backlog
Lo que quedó en el tintero, y lo que decidimos dejar para después a sabiendas. Cada línea dice qué falta y por qué no se hizo todavía, que es el dato que se pierde con el tiempo.
Producto y negocio
| ID | Qué falta | Por qué sigue ahí | Prioridad |
|---|---|---|---|
| B-01 | Cobro en línea del diagnóstico. Hoy el botón abre un correo y el pago se cierra a mano. | Arrastra decisiones grandes: figura legal, PSP, tributación. No es un formulario, es el escalón 2 de ADR-0006. Decisión de Francisco, no técnica. | Bloquea |
| B-02 | Sondas a los cinco asistentes. Los puntos 07 y 08 salen sin evaluar. | Solo hay llaves de Claude y Gemini. Faltan OpenAI, Grok y Perplexity. Es una gestión comercial, no código. La landing promete cinco: mientras tanto el informe declara la cobertura real (ADR-0017). | Bloquea |
| B-03 | Saldo en la cuenta de Anthropic. Devuelve HTTP 400 en cada llamada. | El motor degrada solo a Gemini 2.5 Flash y funciona, así que no detiene nada. Pero el juicio de los cuatro checks con LLM depende hoy de un proveedor único. | Importa |
| B-04 | Cerrar /informe/:id. El informe completo es alcanzable por cualquiera que tenga el enlace. |
El UUID no se adivina y la vista gratis ya no lo expone, así que no se está regalando por la web. Falta el guard real, que llega junto con el cobro (B-01) o con la cuenta de comercio (B-08). | Importa |
| B-05 | Calibrar el puntaje contra juicio humano. La spec pedía coincidir con Francisco en ≥8 de 10 comercios a ciegas. | Con seis dominios analizados no se puede afirmar. Lo que sí está verificado es cada hallazgo individual contra el sitio real. Necesita un lote de comercios y una tarde. | Importa |
| B-06 | Panel para ver leads, ofertas y canjes. Hoy solo se consultan por CLI contra el almacén. | Con pocos leads el CLI alcanza. Empieza a doler cuando haya que mirarlo a diario o desde el teléfono. | Cuando toque |
| B-07 | El código de promoción no se recuerda entre visitas al resultado. | La oferta emitida sí queda guardada de nuestro lado, así que no se pierde nada real: solo hay que reescribir el código. Cosmético. | Cuando toque |
Motor de análisis
| ID | Qué falta | Por qué sigue ahí | Prioridad |
|---|---|---|---|
| B-08 | Migrar a Postgres con RLS. Informes, leads y ofertas viven como artefactos en Vercel Blob. | Deuda consciente de ADR-0018. Comprometerse a un esquema antes de conocer el modelo de tenant es apurar una decisión cara. Disparador: la primera cuenta de comercio, no el volumen. | Cuando toque |
| B-09 | Navegador headless. Para el punto 04 del diagnóstico y, sobre todo, para el agente que llena formularios y arma el carro. | Para el diagnóstico sigue siendo deuda barata (ADR-0018). Para el agente ya no: sin navegador no hay punto 5 del MVP, y el navegador no corre en Vercel — necesita el VPS, que a su vez espera B-16. | Bloquea |
| B-10 | Versionar las rúbricas de los checks con LLM contra el histórico. | No hay histórico todavía. Desde el segundo informe de un mismo dominio, cambiar una rúbrica rompe la comparabilidad y hay que declararlo. | Importa |
| B-11 | Límite de uso durable. El freno por IP vive en memoria del proceso y en serverless se reinicia solo. | Se probó y no bloquea. Lo que sí acota el daño es el tope de usos por código (durable) y la regla de entropía en los códigos valiosos. Está documentado como lo que es, no como una muralla. | Importa |
| B-12 | Proxy de egreso con lista blanca. Cierra el DNS-rebinding que las guardas actuales no alcanzan. | Deuda consciente de ADR-0016. Aceptable mientras el motor no tenga acceso a red interna que valga la pena alcanzar. | Cuando toque |
| B-13 | Tope de reenvíos del correo de verificación. El botón se puede apretar en bucle. | Reenvía el mismo enlace sin recrawlear el sitio del comercio, así que el daño está acotado a nuestro consumo de Resend. Arreglo de una línea. | Cuando toque |
Infraestructura y orden
| ID | Qué falta | Por qué sigue ahí | Prioridad |
|---|---|---|---|
| B-14 | Renombrar de Comprable a Vado en carpetas y en el proyecto de Vercel. | No tocar a la ligera: borrar y recrear el proyecto en Vercel reactiva el SSO del equipo y deja el sitio inaccesible. Hay que hacerlo con el procedimiento correcto, no renombrando por impulso. | Cuando toque |
| B-15 | Actualizar el bundle de arquitectura viejo (02_adr/0001 a 0012, roadmap, modelo de costos). |
Dice «Comprable» en todas partes y describe los dos modos de pago y las seis solicitudes al comercio, ambos ya superados. El bundle nuevo del motor (motor-analisis/) sí está al día. |
Importa |
| B-16 | SSH al VPS de Hetzner. Rechaza la llave: Permission denied (publickey). |
No bloqueó nada porque el motor quedó en Vercel. Vuelve a importar cuando las sondas necesiten una cola de trabajo. Se desbloquea a mano desde la consola de Hetzner. | Importa |
| B-17 | Sacar el token de Cloudflare de Dropbox. Está en texto plano en IAN/01-ian-web/.env, con permisos de edición de DNS sobre toda la zona junngla.com. |
Sigue sin resolverse desde que lo levanté en julio. No es de Vado, pero Vado depende de esa zona. La regla de la casa dice que la fuente única es Infisical. | Bloquea |
| B-18 | Censo de plataformas de comercio en Chile. Cuántos comercios usan Shopify, Jumpseller, VTEX, Woo, Bsale. | Era el bloqueante de Fase 0 del plan original: define a qué puerta de onboarding apuntar primero. Ofrecido dos veces, nunca priorizado. | Importa |
Gemelo y publicación
| ID | Qué falta | Por qué sigue ahí | Prioridad |
|---|---|---|---|
| B-22 | Agente que actúa (punto 5 del MVP): llenar un formulario de contacto y dejar un carro armado. | Necesita navegador (B-09) y por lo tanto el VPS (B-16). Es lo único del MVP que no quedó construido. | Bloquea |
| B-23 | Extracción asistida por LLM para la cola larga. En sitios sin feed ni marcado, el gemelo queda sin precios. | Se prefirió no adivinar: en transbank.cl los cuatro montos que la heurística tomó por precio eran una tarifa por tramo, una cuota y dos veces el límite de transacción. Publicar eso habría hecho decir que Webpay Plus cuesta $200.000. Un LLM con la evidencia al lado podría resolverlo con la confianza declarada correctamente. |
Importa |
| B-24 | Paginación del feed. El catálogo se toma de la primera página del feed. | Shopify entrega 250 por página y Woo 100. Alcanza para la mayoría de los comercios chicos, y la cobertura se declara. Duele con el primer catálogo grande. | Importa |
| B-25 | Refresco del gemelo. Hoy se construye a mano; no hay nada que lo mantenga al día solo. | Es lo que sostiene la suscripción: un gemelo que no se refresca es una copia estática, y una copia estática es justo lo que el comercio podría hacer sin nosotros. Necesita cola y calendario. | Bloquea |
| B-26 | Medir la superficie publicada con el motor completo. El antes y después compara punto por punto, pero no vuelve a correr los 16 checks contra el gemelo. | El motor captura desde la raíz de un host y la superficie vive en un subcamino. Es una firma que hay que abrir, no un diseño equivocado. | Cuando toque |
| B-27 | App instalable de verdad para Shopify y WooCommerce, que ponga la regla de proxy sin que el comercio edite nada. | La Puerta D está probada con una regla de reescritura puesta a mano en un dominio nuestro. Para un comercio real hay que empaquetarla como app de la plataforma, que es lo que ADR-0003 exige para un onboarding de tres minutos. | Importa |
| B-28 | Comercio en otro host que la marca. El vadeo captura un host y se queda ahí. Cuando la tienda vive en un subdominio distinto del sitio de marca, el informe del dominio principal concluye que no se vende nada. | Encontrado el 18-ago con entel.cl: la marca está en www.entel.cl y toda la venta en miportal.entel.cl, sin un solo enlace a las legales entre uno y otro. Ninguno de los dos informes describe al comercio completo. Salirse del host por cuenta propia toca el límite de rastreo del ADR-0016, así que la salida es declarar el host de venta y ofrecer vadearlo, no seguirlo en silencio. |
Importa |
| B-29 | Perfil financiero. El clasificador tiene cinco perfiles y ninguno describe a un banco: el modelo entiende «producto» como un bien con precio y carro. | De los once bancos vadeados el 19-ago, ocho quedaron en contacto o informativo, con 4 de 16 puntos evaluados. El denominador es honesto, pero un informe de cuatro puntos no le sirve a un banco. Su transacción equivalente —simular un crédito, abrir una cuenta, comparar una tasa— necesita checks propios, no los de un carro de compras. |
Bloquea |
| B-30 | Sitios que solo abren para un navegador real. Cuatro de quince bancos no se pueden vadear: devuelven 403 o una página de bloqueo a cualquier cliente que no sea Chrome. | No hay arreglo del lado del motor que no sea mentir sobre quiénes somos, y el ADR-0016 dice que el rastreador se declara. Queda como dato del informe —este sitio no admite agentes— y como argumento comercial, que es más útil que un puntaje inventado. | Cuando toque |
Interfaz
| ID | Qué falta | Por qué sigue ahí | Prioridad |
|---|---|---|---|
| B-19 | Portal del comercio con datos reales. /app sigue siendo una maqueta con cifras de ejemplo. |
Necesita cuentas, que necesitan el cobro (B-01). Sirve para mostrar, no para operar. | Importa |
| B-20 | Ritmo visual de la landing. Contacto queda claro entre dos secciones oscuras. | Detalle estético menor: darle el tinte #F3F0F5 rompe la secuencia oscuro–claro–oscuro. |
Cuando toque |
| B-21 | Plantilla HTML del aviso interno de oferta. Llega como texto plano a hola@junngla.com. |
Es un correo para nosotros, no para el comercio: cumple su función así. Cosmético. | Cuando toque |
Bitácora
Lo que ya pasó, en orden inverso. Cada entrada deja anotada la decisión, no solo el resultado.
Quince bancos, y un 200 que no era el sitio
Se vadeó la banca chilena completa según el registro de la CMF: los catorce bancos establecidos en Chile más BancoEstado. Once produjeron informe; cuatro no se dejaron entrar.
El motor daba por bueno un 200 que no era el sitio. BancoEstado responde 200 con una
página que dice que la conexión fue restringida —incluso en su propio
robots.txt— y Scotiabank responde 200 con un stub de 562 bytes cuyo único contenido
es un location.href hacia scotiabankchile.cl. Los dos generaron informe con
puntaje. Ahora la captura los rechaza con el motivo escrito.
La guarda hubo que apretarla dos veces. La primera versión buscaba la frase de
bloqueo en cualquier parte de la página y rechazó a Banco Ripley —por el
<noscript> que trae toda página de Vue— y a nuestro propio
junngla.com, donde «Acceso restringido» aparece dentro de un JSON de traducciones.
La regla final exige que el aviso sea la página, no que aparezca en ella. Probada contra las
veinte capturas guardadas: rechaza exactamente dos.
El CLI también dejaba caer una traza de excepción cuando un sitio no abría. Un sitio que no nos deja entrar es un resultado, no una falla del motor: ahora imprime una línea y sale con código 2.
L06 leía la mitad de la ficha
Vadeando miportal.entel.cl el informe se contradijo consigo mismo: L01 citaba
el marcado de la ficha como prueba de que el producto está declarado, y L06 la reprobaba por
«no se puede determinar qué producto se vende». Las dos afirmaciones sobre la misma
página, en el mismo informe.
La causa: L06 le pasaba al juicio solo el texto visible. La ficha de Entel llega vacía sin
ejecutar JavaScript —36 palabras— pero declara nombre, marca, SKU, precio y disponibilidad en su
marcado, que es exactamente lo que un agente lee. Ahora el extracto lleva los dos: el marcado del
producto y el texto visible. El puntaje de Entel subió de 41 a 46, y los sitios sin marcado
(manzini.cl, repone.me) siguen reprobando, que es lo correcto.
Es la misma familia de error de siempre: concluir desde una vista parcial de la evidencia disponible. La regla que queda es que ningún check juzgue una página por un canal cuando otro check del mismo informe se apoya en el otro.
Gemelo digital y publicación por Puertas C y D
El motor pasó de diagnosticar a construir y servir. Ingesta del catálogo con
procedencia obligatoria por campo, publicación como JSON-LD, feed, llms.txt y servidor
MCP, y el mismo código sirviendo desde nuestro dominio (C) o desde el del comercio (D).
El clasificador se abrió a cuatro perfiles: informativo y contacto
dejaron de ser lo mismo, porque para un agente no lo son.
Dos errores propios corregidos en el camino. La heurística de precios tomaba
cualquier monto de la página: en Transbank los cuatro que encontró eran una tarifa por tramo,
una cuota y dos veces el límite de transacción. Ahora el gemelo nunca publica un precio
inferido. Y el corte de servicio no funcionaba: servía con max-age=120 y la CDN
seguía devolviendo 200 después de suspender, violando literalmente el ADR-0008. Se pasó a
no-store y el estado del comercio se mudó al nombre del objeto, porque leerlo
del cuerpo arrastraba 60 s de caché.
Códigos de promoción con ofertas emitidas por el servidor
Aplicar un código válido emite una oferta con identificador propio
(VADO-XXXX-XXXX), guardada de nuestro lado, y nos avisa por correo en el momento. El
correo del comercio solo cita ese identificador: el precio se resuelve contra el registro, nunca
contra su texto.
Al probarlo se descubrió que el freno anti fuerza bruta no funcionaba — vive en memoria y en serverless se reinicia. En vez de fingir un contador, se hizo innecesario: un código que regala 80% o más exige 12 caracteres, y el módulo falla al cargar si alguien agrega uno más corto.
El motor respeta robots.txt antes de descargar nada
Al analizar manzini.junngla.com apareció que el motor descargaba la portada
antes de leer robots.txt, por un reordenamiento que hice para canonicalizar
dominios. Rompía lo que ADR-0016 promete. Ahora robots se pide primero y su URL final revela
el host canónico igual.
Además, un sitio bloqueado ya no produce conclusiones inventadas: los quince puntos restantes salen sin evaluar, no reprobados, y el perfil dice que no se pudo determinar.
Marcado que solo existe con JavaScript
El vadeo de Transbank reveló que arma su Product schema.org desde una función
JavaScript que corre en el navegador: en el HTML servido no hay ni un nodo parseable. El motor lo
aprobaba porque buscaba el texto crudo. Se corrigió para exigir JSON-LD parseado, y se agregó
la detección que lo nombra: «lo tienes, y nadie lo ve».
Se restaura el embudo de correo verificado
Yo había cambiado el campo de correo por uno de dominio para evitar una copia que prometía un envío inexistente. Fue un error de alcance: el correo verificado es el producto de esa etapa del embudo. Se reconstruyó entero con Resend (ADR-0019), y el token del enlace es la puerta — no un flag en la base.
Motor de análisis en producción
Dominio → informe de dieciséis puntos con evidencia, corriendo en
vado.junngla.com. Tres decisiones que lo definen: captura y evaluación separadas
por un artefacto inmutable; el puntaje se calcula solo sobre los puntos aplicables y
nunca se publica sin su denominador; y ningún hallazgo existe sin evidencia citable.
Diez defectos encontrados verificándolo contra sitios reales, ninguno de los cuales habría salido con datos inventados. Costo medido: ~US$0,001 por informe.
Comprable pasa a llamarse Vado
Cambio de nombre por alcance internacional. Las carpetas y el proyecto de Vercel conservan el nombre viejo a propósito (ver B-14).
03-Documentos/Arquitectura/motor-analisis/02_adr/