Overview

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.

Dónde vive cada cosa

PiezaUbicación
Landing, portal, motor y APIProyectos/Comprable/01-comprable-web/
Arquitectura y ADRs del motor03-Documentos/Arquitectura/motor-analisis/
Cómo correrlo a mano01-comprable-web/LEEME-motor.md
Proyecto en Vercelcomprable-web (nombre histórico, ver B-14)
Sobre el nombre de las carpetas. El proyecto se llamaba Comprable y se renombró a Vado el 31-jul-2026. Las carpetas y el proyecto de Vercel conservan el nombre viejo a propósito: renombrarlos en Vercel reactiva el SSO del equipo y deja el sitio inaccesible. Está anotado en el backlog como B-14.
Overview

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.

Cómo se lee. Bloquea impide vender o cobrar hoy. Importa hay que resolverlo antes de escalar. Cuando toque es deuda consciente, sin urgencia. La columna Por qué sigue ahí no es relleno: es la razón por la que se postergó, para no volver a discutirla desde cero.

Producto y negocio

IDQué faltaPor 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

IDQué faltaPor 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

IDQué faltaPor 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

IDQué faltaPor 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

IDQué faltaPor 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
Al cerrar una línea de este backlog, no se borra: se mueve a la bitácora con la fecha y qué se hizo. El backlog dice lo que falta; la bitácora, lo que ya pasó. Perder el registro de por qué se hizo algo es lo que obliga a rediscutirlo seis meses después.
Overview

Bitácora

Lo que ya pasó, en orden inverso. Cada entrada deja anotada la decisión, no solo el resultado.

19-ago-2026

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.

18-ago-2026

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.

18-ago-2026

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é.

13-ago-2026

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.

13-ago-2026

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.

12-ago-2026

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».

11-ago-2026

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.

11-ago-2026

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.

31-jul-2026

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).

Fuente: sesiones de trabajo jul–ago 2026 · ADRs en 03-Documentos/Arquitectura/motor-analisis/02_adr/