Decisiones técnicas
Siete decisiones que dan forma a Dinoer, cada una con su razón y su coste, entre ellas la regla que impuso una fuga real el 14 de agosto de 2026.
Cada decisión de abajo tiene una razón y un coste. Se indican los dos.
Texto, nunca píxeles
Diwall, del que procede Dinoer, recurre a un modelo de visión para los elementos que no tienen representación en texto. Dinoer eliminó esa capa al reconstruirse: capturas de pantalla, Set-of-Mark, modelo de visión. Ninguna opción la recupera.
El coste. Un canvas en el que se puede hacer clic o una imagen sin etiqueta accesible quedan fuera de alcance. Dinoer apunta a texto público para leer y resumir; conservar un modelo de visión habría obligado a ejecutar uno en local, o a enviar páginas a uno alojado, para páginas que no son su objetivo.
Un navegador solo cuando la página lo necesita
campagne.py lee la mayoría de las páginas con requests y BeautifulSoup: ni
navegador ni JavaScript. Una página solo pasa al núcleo de navegación
(rpa.py/shot.py) si la recopilación ligera la marca como
insuffisante_legere: una página construida con JavaScript, sin nada legible
en su HTML.
El coste. El escalado se activa ante un texto vacío, no ante un texto inservible. En una campaña real, un perfil en una plataforma de alojamiento de código y un canal de vídeo devolvieron como texto un aviso de cookies y nunca pasaron al navegador. El caso →
Un proceso por llamada, no un servidor
Dinoer es un comando, no un servicio. shot.py y rpa.py arrancan un
navegador de Playwright, hacen lo que dice el escenario, responden una vez y
terminan: nada escucha en un puerto entre dos llamadas. Cada llamada escribe
una entrada en el registro de operaciones, con éxito o sin él, y pasa por el
bloqueo de la guía: sin un --guide-version válido, y sin la marca que deja
un número aceptado antes, se rechaza.
campagne.py funciona de otro modo: un solo proceso ejecuta todo el
manifiesto, llama directamente a su recopilación ligera, lanza rpa.py como
subproceso para las páginas que necesitan un navegador y termina. Entre un
paso y otro solo conserva archivos: el corpus, el registro de operaciones, la
caché de búsqueda.
El coste. El estado vivo de una página no sobrevive entre dos llamadas.
Las cookies y el almacenamiento local pueden guardarse y recuperarse
(--sauver-session, --reprendre-session); un diálogo abierto, un formulario
a medio rellenar o una posición de desplazamiento, no. Una secuencia que
depende de ese estado tiene que ser un solo escenario, en un solo proceso.
La receta →
Lo que esta decisión no cambia. Un secreto se resuelve dentro del proceso de Playwright, sea quien sea quien lo lanzó. Y un modelo alojado que lee una salida recibe su contenido, sea cual sea el medio que la llevó hasta él.
Recopilación local, informe redactado en otro lugar
La recopilación se ejecuta donde se ejecuta Dinoer: las consultas a SearXNG
(local o remoto, a su elección), la recopilación ligera, el núcleo de
navegación. El informe no: lo redacta el modelo que usted indique a OpenCode
en DINOER_OPENCODE_MODEL, ya sea un modelo alojado o un modelo local de
Ollama declarado en OpenCode. No hay modelo por defecto. El texto recopilado
va a ese modelo.
El coste. La cadena no es local de principio a fin, salvo que elija un
modelo local. Para una fuente sensible, elija el modelo antes de dirigir
Dinoer hacia ella, y lea lib/modeles.py.
El modelo que redacta el informe se mantiene fuera de la web
Cada opencode run que lanza Dinoer lleva websearch y webfetch en deny
dentro de OPENCODE_CONFIG_CONTENT, sea cual sea el directorio. La regla
existe porque el 14 de agosto de 2026 una campaña sorprendió al modelo lanzando
doce búsquedas web mientras redactaba, visibles solo en el registro completo de
sus eventos.
El coste. bash sigue permitido, para los escenarios que envían una
notificación con curl, y un modelo sin websearch llegó a la web con
bash curl durante una prueba. La vía abierta es menor, no está cerrada.
Detalles →
Señales, nunca veredictos
etat.pret_a_agir: false significa que se notó algo (una firma de
cortafuegos de aplicaciones, una deriva de sesión), no que Dinoer se niegue a
trabajar. La detección de WAF funciona con palabras clave y puede equivocarse;
es un recuento, nunca un error que detenga una ejecución.
El coste. Hay que leer la respuesta. Quien solo mira succes no saca nada
de estas señales.
El bloqueo que hace fallar su primera llamada
Dinoer se niega a ejecutarse mientras quien lo maneja no haya leído la guía y no pueda citar su número de versión.
Dinoer no figura en los datos de entrenamiento de ningún modelo, y un modelo que no ha leído la guía inventa comandos y maneja credenciales en el shell. Las dos reglas con las que empieza la guía →
El coste. Su primera llamada falla, a propósito, con
{"succes": false, "erreur": "guide_non_lu"}, y cada comando documentado
lleva --guide-version.
La guía nunca se traduce. Una traducción podría quedarse atrás respecto al original mientras su número de versión se actualizara de forma mecánica; un agente pasaría entonces el bloqueo tras leer instrucciones obsoletas. La guía solo existe en inglés.
En resumen
- Ninguna visión, y ninguna opción para recuperarla.
- Un navegador solo cuando la recopilación ligera no puede leer una página.
- Un proceso por llamada: una secuencia que necesita el estado vivo de la página es un solo escenario.
- La recopilación es local; el informe lo redacta el modelo que usted elige.
- El modelo que redacta el informe se mantiene fuera de la web, salvo por
bash. - Señales, no veredictos: lea la respuesta entera.
- La primera llamada falla a propósito, y la guía que la desbloquea sigue en inglés.