Dinoer

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.