Technische Entscheidungen
Sieben Entscheidungen, die Dinoer prägen, jede mit ihrem Grund und ihrem Preis, darunter die Regel, die ein echtes Leck am 14. August 2026 erzwungen hat.
Jede Entscheidung unten hat einen Grund und einen Preis. Beides steht dabei.
Text, nie Pixel
Diwall, aus dem Dinoer hervorgegangen ist, greift bei Elementen ohne Textdarstellung auf ein Vision-Modell zurück. Dinoer hat diese Schicht beim Neuaufbau entfernt: Bildschirmaufnahmen, Set-of-Mark, das Vision-Modell. Keine Option bringt sie zurück.
Der Preis. Ein klickbarer Canvas oder ein Bild ohne zugängliche Beschriftung ist außer Reichweite. Dinoer zielt auf öffentlichen Text, der gelesen und zusammengefasst werden soll; ein Vision-Modell zu behalten hätte bedeutet, eines lokal zu betreiben oder Seiten an ein gehostetes zu schicken, für Seiten, auf die es nicht zielt.
Ein Browser nur, wenn eine Seite ihn braucht
campagne.py liest die meisten Seiten mit requests und BeautifulSoup: kein
Browser, kein JavaScript. Eine Seite geht nur dann an den Browserkern
(rpa.py/shot.py), wenn die leichte Erfassung sie als
insuffisante_legere markiert: eine Seite, die JavaScript aufbaut und deren
HTML nichts Lesbares enthält.
Der Preis. Die Eskalation greift bei leerem Text, nicht bei unbrauchbarem. Bei einer echten Kampagne lieferten ein Profil auf einer Code-Hosting-Plattform und ein Videokanal als Text nur ein Cookie-Banner und gingen nie an den Browser. Der Fall →
Ein Prozess pro Aufruf, kein Server
Dinoer ist ein Befehl, kein Dienst. shot.py und rpa.py starten einen
Playwright-Browser, tun, was das Szenario sagt, antworten einmal und beenden
sich: Zwischen zwei Aufrufen lauscht nichts auf einem Port. Jeder Aufruf
schreibt einen Eintrag ins Betriebsjournal, Erfolg oder Fehlschlag, und läuft
durch die Guide-Sperre: Ohne gültiges --guide-version und ohne die
Markierung, die eine früher akzeptierte Nummer hinterlässt, wird er
abgelehnt.
campagne.py arbeitet anders: Ein einziger Prozess führt das ganze Manifest
aus, ruft seine leichte Erfassung direkt auf, startet rpa.py als
Unterprozess für die Seiten, die einen Browser brauchen, und endet dann.
Zwischen den Schritten behält er nur Dateien: den Korpus, das Betriebsjournal,
den Such-Cache.
Der Preis. Der lebendige Zustand einer Seite überdauert keine zwei
Aufrufe. Cookies und lokaler Speicher lassen sich sichern und wieder
aufnehmen (--sauver-session, --reprendre-session); ein offener Dialog, ein
halb ausgefülltes Formular oder eine Scrollposition nicht. Eine Abfolge, die
von diesem Zustand abhängt, muss ein einziges Szenario in einem einzigen
Prozess sein. Das Rezept →
Was diese Entscheidung nicht ändert. Ein Geheimnis wird im Playwright-Prozess aufgelöst, gleich was ihn gestartet hat. Und ein gehostetes Modell, das eine Ausgabe liest, erhält deren Inhalt, gleich auf welchem Weg er dorthin kam.
Lokale Erfassung, ein anderswo geschriebener Bericht
Die Erfassung läuft dort, wo Dinoer läuft: die Anfragen an SearXNG (lokal oder
entfernt, nach Ihrer Wahl), die leichte Erfassung, der Browserkern. Der
Bericht nicht: Ihn schreibt das Modell, das Sie für OpenCode in
DINOER_OPENCODE_MODEL benennen, entweder ein gehostetes Modell oder ein
lokales Ollama-Modell, das in OpenCode eingetragen ist. Ein Standardmodell
gibt es nicht. Der erfasste Text geht an dieses Modell.
Der Preis. Die Kette ist nicht durchgehend lokal, außer Sie wählen ein
lokales Modell. Für eine sensible Quelle wählen Sie das Modell, bevor Sie
Dinoer darauf ansetzen, und lesen lib/modeles.py.
Das Modell, das den Bericht schreibt, bleibt dem Web fern
Jeder opencode run, den Dinoer startet, trägt websearch und webfetch mit
deny in OPENCODE_CONFIG_CONTENT, unabhängig vom Verzeichnis. Die Regel
gibt es, weil am 14. August 2026 eine Kampagne das Modell dabei ertappte, wie
es beim Schreiben zwölf Websuchen startete, sichtbar nur in der Aufzeichnung
aller seiner Ereignisse.
Der Preis. bash bleibt erlaubt, für Szenarien, die eine Benachrichtigung
mit curl senden, und ein Modell ohne websearch erreichte bei einem
Testlauf das Web über bash curl. Die Öffnung ist kleiner, nicht geschlossen.
Einzelheiten →
Signale, nie Urteile
etat.pret_a_agir: false bedeutet, dass etwas bemerkt wurde (eine
WAF-Signatur, eine Sitzungsabweichung), nicht dass Dinoer die Arbeit
verweigert. Die WAF-Erkennung arbeitet mit Schlüsselwörtern und kann sich
irren; sie ist ein Zähler, nie ein Fehler, der einen Lauf abbricht.
Der Preis. Sie müssen die Antwort lesen. Wer nur auf succes schaut, hat
von diesen Signalen nichts.
Die Sperre, an der Ihr erster Aufruf scheitert
Dinoer verweigert die Ausführung, bis wer es steuert den Guide gelesen hat und dessen Versionsnummer angeben kann.
Dinoer kommt in den Trainingsdaten keines Modells vor, und ein Modell, das den Guide nicht gelesen hat, erfindet Befehle und hantiert mit Zugangsdaten in der Shell. Die zwei Regeln, mit denen der Guide beginnt →
Der Preis. Ihr erster Aufruf scheitert, mit Absicht, mit
{"succes": false, "erreur": "guide_non_lu"}, und jeder dokumentierte Befehl
trägt --guide-version.
Der Guide wird nie übersetzt. Eine Übersetzung könnte hinter dem Original zurückbleiben, während ihre Versionsnummer mechanisch nachgezogen würde; ein Agent käme dann durch die Sperre, nachdem er veraltete Anweisungen gelesen hat. Den Guide gibt es nur auf Englisch.
Kurz gesagt
- Keine Bilderkennung, und keine Option, die sie zurückbringt.
- Ein Browser nur, wenn die leichte Erfassung eine Seite nicht lesen kann.
- Ein Prozess pro Aufruf: Eine Abfolge, die den lebendigen Seitenzustand braucht, ist ein Szenario.
- Die Erfassung ist lokal; den Bericht schreibt das Modell, das Sie wählen.
- Das Modell, das den Bericht schreibt, wird vom Web ferngehalten, außer über
bash. - Signale, keine Urteile: Lesen Sie die ganze Antwort.
- Der erste Aufruf scheitert mit Absicht, und der Guide, der ihn freischaltet, bleibt englisch.