Ce que Dinoer ne fait pas dans votre dos
Cinq garanties, chacune avec le fichier du code qui la tient, et ce que chacune ne couvre pas.
Vous vous apprêtez à donner à une chaîne de recherche l’accès à vos identifiants et au trafic sortant de votre machine. Voici sur quoi cela repose, avec le fichier qui garantit chaque point.
Dinoer ne met jamais vos identifiants dans un terminal
Ils ne passent jamais par votre shell, votre historique de commandes ni les journaux de Dinoer : la valeur est lue dans le répertoire chiffré, à l’intérieur du processus qui pilote le navigateur, au moment où un champ est rempli.
→ lib/repertoire_chiffre.py. Comment un identifiant atteint un formulaire →
Un scénario qui écrit un secret en clair est refusé avant le démarrage du
navigateur : une action remplir sur un champ dont le sélecteur paraît
sensible (password, token, otp, cvv et d’autres) avec une valeur autre
que depuis_secrets, ou un script evaluer qui contient un jeton ou une clé à
forte entropie.
Ce que Dinoer écrit est filtré par défaut : les valeurs renvoyées par
evaluer, les URL et les messages d’erreur envoyés à la sortie ou au journal
des opérations sont neutralisés. --no-filtre-evaluer désactive ce filtre, et
la sortie l’indique alors (boussole.filtre_evaluer_actif: false).
→ lib/sanitisation.py
Ce que cela ne couvre pas : l’agent qui pilote Dinoer a son propre accès à votre machine. Avec un terminal, il peut lire votre répertoire monté comme n’importe quel autre fichier. Dinoer protège le chemin qu’il contrôle, pas celui que vous ouvrez à côté.
Le modèle qui rédige le rapport reste à l’écart du web
À chaque appel à OpenCode, invoquer_opencode() passe websearch et
webfetch à deny dans OPENCODE_CONFIG_CONTENT, en fusionnant avec la
valeur que vous aviez déjà définie. L’interdiction tient donc quel que soit le
répertoire d’où Dinoer est lancé ; le fichier opencode.jsonc à la racine du
dépôt dit la même chose pour un lancement depuis cet endroit. Mesuré le
25 septembre 2026 avec opencode debug config (OpenCode 1.18.32), lancé
depuis /tmp : avec cette valeur, websearch et webfetch valent deny ;
sans elle, allow.
→ lib/modeles.py::invoquer_opencode()
L’interdiction existe parce que, le 14 août 2026, une campagne a surpris le modèle en train de lancer douze recherches web pendant qu’il rédigeait le rapport. Elles n’apparaissaient que dans l’enregistrement complet de ses événements, pas dans le texte qu’il a rendu.
Ce que cela ne couvre pas : bash reste autorisé, parce que certains
scénarios demandent au modèle d’envoyer une notification avec curl. Un
modèle privé de websearch a atteint le web par bash curl lors d’un essai.
Des garanties de cette page, c’est la seule qui soit incomplète.
Dinoer signale, il ne décide pas
pret_a_agir: false signifie que quelque chose a été remarqué : une signature
de pare-feu applicatif (WAF), une dérive de session, un plafond de navigation
atteint, des erreurs JavaScript. L’exécution continue : Dinoer signale, vous
décidez.
La détection de WAF repose sur des mots-clés et peut se tromper. Elle apparaît
comme un compte, jamais comme une erreur qui interrompt l’exécution, et
--ignorer-waf existe pour le cas où vous avez vérifié.
Le cœur de navigation ne fait que ce qu’énumère le scénario, à une exception près
Chaque clic, chaque frappe et chaque navigation du cœur de navigation est une ligne d’un fichier de scénario, vérifié contre un schéma avant le démarrage du navigateur.
→ scenarios/schema.json
La chaîne de recherche est différente : campagne.py demande à un modèle de
juger si une page répond à une question ouverte, ou si deux pages décrivent le
même événement. Cette garantie couvre le cœur de navigation, pas ce jugement.
Vous pouvez tout revoir après coup
Chaque exécution est consignée dans un journal des opérations où l’on ne fait
qu’ajouter : ce qui a été tenté, où, avec quel résultat, et l’intention
déclarée. journal.py le lit.
→ journal.py, /var/log/dinoer/operations.jsonl
Ce qui sort de votre machine
En plus des requêtes vers les pages elles-mêmes, trois choses peuvent sortir,
chacune par votre choix : les requêtes envoyées à votre instance SearXNG, le
texte collecté envoyé au modèle OpenCode, et une notification vers un serveur
ntfy (ntfy.sh sauf si vous en indiquez un autre). Vos identifiants, non. Le
tableau complet, avec le fichier derrière chaque ligne, se trouve sur la
page d’architecture.
Ce que Dinoer ne prétend pas
Il n’est pas plus prudent que le scénario ou le manifeste que vous lui donnez. Un scénario faux fait de vrais dégâts, à la vitesse de la machine. Et la garantie sur le corpus porte sur l’origine d’une réponse, pas sur la pertinence de la question.