Dinoer

Elecciones técnicas

Siete decisiones que definen a Dinoer, cada una con la razón detrás de ella y el costo que implica. Incluyendo una que fue forzada por una filtración real, el mismo día en que se descubrió.

Cada opción que se presenta a continuación tiene un costo. Enumerar los beneficios sin mencionar el precio convertiría esta página en un anuncio, en lugar de un documento que pueda evaluar.

Texto sobre píxeles, sin dejar nada para después

Diwall, la herramienta de la cual Dinoer fue derivado, trata la visión como una opción secundaria para elementos que no tienen una representación semántica. Dinoer no mantiene esa opción secundaria: toda la capa de percepción (capturas de pantalla, Set-of-Mark, el modelo de visión) se eliminó en una reconstrucción completa, y no se hizo opcional. No existe ninguna opción que la reactive.

El precio. Un lienzo o una imagen con los que no se puede interactuar y que carecen de una etiqueta accesible está fuera de lo que Dinoer puede procesar, punto final. En ese caso, la herramienta de la cual Dinoer fue derivado podría volver a utilizar un modelo de visión. Esa decisión se tomó deliberadamente: las tareas para las cuales Dinoer está diseñado (leer y sintetizar texto público) nunca necesitaron esa capacidad, y mantenerla implicaría incurrir en sus costos (un modelo local para ejecutar, uno remoto con el que hay que tener cuidado) para una clase de páginas a las que este proyecto no se dirige.

Solo escala cuando una página realmente lo necesite

campagne.py lee la mayoría de las páginas con requests + BeautifulSoup — sin navegador, sin JavaScript, por una fracción del coste de una sesión Playwright completa. Una página solo escala al núcleo del navegador retenido (rpa.py/shot.py) cuando el nivel ligero la marca como insuffisante_legere — una cáscara renderizada en JS sin nada legible en el HTML bruto.

El precio. El disparador de escalada actualmente se activa con «texto vacío», no con «texto presente pero inutilizable». Una campaña real encontró dos páginas: un perfil de GitHub y un canal de YouTube, que devolvieron texto y, por lo tanto, nunca generaron una escalada, y ese texto era solo ruido de banners publicitarios sin nada más. Se ha señalado como una brecha real en la arquitectura, no como algo oculto. El caso completo →

Un proceso por llamada, no un servidor

Dinoer es un comando, no un servicio. shot.py y rpa.py inician un proceso de Playwright, ejecutan lo que indica el escenario, responden una vez y finalizan: ningún script del producto escucha en un puerto entre dos llamadas. Cada llamada escribe una entrada en el registro de operaciones, indicando éxito o fallo, y cada llamada se encuentra con el bloqueo de lectura de la guía — sin un token --guide-version válido ni un marcador local, se rechaza.

campagne.py tiene otra forma: un proceso que ejecuta todo un manifiesto, llamando a su recopilación ligera dentro del mismo proceso y a rpa.py como subproceso para las páginas que necesitan un navegador, y luego termina. Lo que conserva de un paso al siguiente son archivos: el corpus, el registro de operaciones y la caché de búsqueda.

El precio. El estado vivo de la página no se conserva entre dos llamadas. Las cookies y el almacenamiento local se pueden guardar y restaurar (--sauver-session, --reprendre-session); una ventana modal abierta, un formulario a medio completar o una posición de desplazamiento no se pueden. Una secuencia que depende de este estado debe ser un solo escenario, en un solo proceso; la receta para las sesiones perdidas muestra cómo queda cuando no es así.

Lo que esta opción no cambia. El transporte no decide dónde se resuelve un secreto: está dentro del proceso de Playwright, independientemente de lo que lo haya iniciado. Un protocolo no decide nada; el agente que controla la herramienta sí. Y un modelo alojado que lee una salida, la recibe, independientemente de cómo llegó allí.

Recopilación local, una síntesis delegada que usted debe elegir cuidadosamente

La recopilación permanece en su máquina: SearXNG (local o remoto, a su elección), requests, y el núcleo de navegador conservado se ejecutan donde se ejecuta Dinoer. La síntesis de informes no lo hace — se delega a OpenCode o a un modelo local de Ollama, y los modelos de nivel gratuito de OpenCode son el backend de razonamiento predeterminado. El texto de las páginas recopiladas puede transitar hacia el backend que usted configure.

El precio. Esto no es una garantía exclusiva para toda la canalización, y esta página no pretende serlo. Si una fuente es sensible, revise lib/modeles.py y elija el back-end deliberadamente antes de dirigir a Dinoer hacia ella; la misma disciplina opencode.jsonc que se aplica al acceso a las herramientas se aplica aquí al destino del texto en sí.

El corpus es lo que el modelo está autorizado a omitir, y aun así, lo omitió una vez

opencode.jsonc, local al proyecto, niega al modelo delegado sus propias websearch / webfetch herramientas — y desde 1.0.1 la misma denegación viaja en OPENCODE_CONFIG_CONTENT en cada opencode run que inicia Dinoer, sea cual sea el directorio. Existe porque, el 14 de agosto de 2026, una campaña real descubrió que el modelo estaba haciendo exactamente lo que ahora niega: doce búsquedas web en vivo, obteniendo contenido ausente del corpus recopilado, invisible en la respuesta final y encontrado solo capturando todo el flujo de eventos en lugar de confiar en el texto devuelto.

El precio, indicado en lugar de oculto. bash permanece permitido; algunos escenarios realmente lo necesitan, para curl una notificación; y un modelo denegado websearch ha alcanzado la web activa a través de bash curl en su lugar. No es una garantía absoluta. Una superficie reducida, y la forma honesta de describirlo a un operador es exactamente esa frase, no “contenido”.

Señales, nunca veredictos

Dinoer informa sobre lo que detectó y le permite decidir. etat.pret_a_agir: false significa «se percibió una fricción» — una firma de WAF, una desviación de sesión — no un «fallo en el funcionamiento». La detección de WAF se basa en palabras clave y puede ser incorrecta; se muestra como un conteo, nunca como una excepción que detiene una ejecución.

El precio. Debe leer la respuesta. Un usuario que solo mira succes no obtiene ningún beneficio de ninguna de estas señales.

El bloqueo que hace fallar su primera ejecución

Dinoer se niega a ejecutarse hasta que la persona que lo controla haya leído la guía y pueda citar su número de versión.

Dinoer no está presente en los datos de entrenamiento de ningún modelo, y un modelo que no ha leído la guía improvisa. Eso no es hipotético; causó una violación de seguridad documentada en el proyecto predecesor a este, y esta restricción es la solución. Cómo se ve la improvisación y las dos reglas que la evitan →

El precio. Su primera llamada falla, deliberadamente, con {"succes": false, "erreur": "guide_non_lu"}. Cada comando documentado lleva --guide-version. Es fricción, es a propósito.

Y nunca se traduce. La guía solo existe en inglés. Una guía traducida puede desincronizarse silenciosamente; su número de versión se resincroniza mecánicamente mientras que su contenido aún describe la versión anterior, y un agente entonces supera el bloqueo después de leer instrucciones obsoletas. Un modelo lee inglés de forma nativa y el inglés consume menos tokens: el beneficio de traducirlo es nulo, el riesgo es real.

En resumen

  • No hay funcionalidad de respaldo visual en ningún lugar, intencionalmente; no es una versión reducida de Diwall, sino una inexistente.
  • Se recurre a un navegador solo cuando la capa inferior no puede leer una página.
  • Un proceso por llamada, no un servidor; por lo tanto, una secuencia que necesita el estado de la página en tiempo real es un escenario.
  • La colección es local; la síntesis se delega; revise el back-end antes de utilizar una fuente sensible.
  • Se hace cumplir el límite del corpus, no se asume simplemente; y la brecha real se publica, no se disimula.
  • Señales en lugar de veredictos; usted decide, por lo que debe leer.
  • La primera ejecución falla intencionalmente, y la guía que la desbloquea nunca se traduce.