Memory hat ein Budget: Warum sie irgendwann aufhört, sich zu erinnern


Du kennst diesen Moment: Letzte Woche hast du Hermes in klaren Worten gesagt, dass dieses Projekt mit Prozess X deployt. Diese Woche fragt es wieder. Du öffnest seine Memory-Datei und findest sie vollgestopft mit drei Monate alten temporären Entscheidungen, später widerrufenen Schlussfolgerungen und einer Handvoll fast identischer Duplikate. Du bittest es, sich etwas zu merken, es stimmt zu — und nichts bleibt hängen.

Das Gemeinste an einem vollen Memory ist, dass es keinen Fehler auslöst. Hermes’ Memory hat ein Zeichenlimit, und sobald das Budget aufgebraucht ist, werden neue Schreibvorgänge stillschweigend übersprungen. Wenn du es merkst, kann niemand sagen, wie viel verloren gegangen ist. Das Community-Plugin hermes-dreaming (am 2026-10-04 in den offiziellen Plugin-Katalog aufgenommen) existiert genau dafür: ein deterministischer Memory-Konsolidierungsdurchlauf jede Nacht.

Die Aufteilung, die es günstig macht

Die lehrreichste Designentscheidung ist die Arbeitsteilung. Über den gesamten nächtlichen Lauf hinweg ruft das Skript nie ein LLM auf:

  • ein reines Stdlib-Python-Skript liest das Memory, das du bereits hast (MEMORY.md / USER.md), plus aktuelle echte Gespräche;
  • Screening, Scoring, Matching und Quarantäne laufen alle offline;
  • der Agent wird nur geweckt, wenn wirklich etwas eine Entscheidung braucht, und dann wendet er diese wenigen Änderungen über das reguläre memory-Tool an.

In den meisten Nächten bedeutet das, dass der Durchlauf kostenlos ist: nichts zu berechnen, nichts zu ändern.

Wie es entscheidet, dass etwas erinnerungswürdig ist

Belege kommen von Menschen, an getrennten Tagen. Eine Tatsache zählt nur, wenn Menschen sie an verschiedenen Tagen erwähnen. Cron-Prompts, Compaction-Banner, URLs, nicht vertrauenswürdiger Chat-Inhalt und die eigene Ausgabe des Agenten belegen nie etwas — was den Fehlermodus abtötet, in dem ein Agent still seine eigenen Halluzinationen erinnert.

Das Scoring verwendet OpenClaws Gewichte: Relevanz, Häufigkeit, Diversität, Aktualität, Konsolidierung und Reichhaltigkeit, hinter einem Korroborations-Gate.

Jeder Kandidat wird gegen das bestehende Memory abgeglichen: exakte Treffer, explizite Alias-Regeln und gestemmte Enthaltenschaft in drei Richtungen. Eine Unterscheidung ist hier wirklich klug — ein Kandidat, der einen bestehenden Eintrag neu formuliert, aber mit anderen Zahlen, wird nicht als Duplikat verworfen. Er wird als Konflikt markiert, als mögliches Update, und trägt den nächstgelegenen Eintrag, die Datei, in der er lebt, und einen wörtlichen Anker für replace.

Das Screening passiert, bevor du irgendetwas siehst: Secrets und Prompt-Injection werden unter Quarantäne gestellt, datierte Ereignisse laufen ab (russische, englische und thailändische Datumsformate), und fast identische Fakten im Speicher tauchen nur einmal auf.

Zwei Schutzschienen: ein Wake-Gate und ein Loss-Guard

  • Ein Wake-Gate. In einer ruhigen Nacht signalisiert der Job, dass der Agent nicht gebraucht wird, und das Modell startet nie. Bemerkenswert: Eine Memory-Datei nahe ihrem Zeichenlimit zählt als Arbeit — weil das Limit Schreibvorgänge stillschweigend abschaltet, würde nichts anderes das je an die Oberfläche bringen.
  • Ein Loss-Guard. Wenn über Nacht ein großer Anteil des Memorys verschwindet, sagt der nächste Bericht das ausdrücklich.

Außerdem führt es ein Tagebuch in memories/DREAMS.md mit Herkunft für jeden Kandidaten, sodass du nachvollziehen kannst, woher ein Eintrag stammt.

Installation

Voraussetzungen: Hermes 0.21 oder neuer, Python 3.9 oder neuer, nur die Standardbibliothek.

# 1. Plugin installieren und aktivieren
hermes plugins install itpartypattaya/hermes-dreaming
hermes plugins enable hermes-dreaming

Schritt zwei ist das Installer-Skript. Du kannst es nicht überspringen: Hermes führt Cron-Skripte nur aus ~/.hermes/scripts/ aus (ein Symlink wird abgelehnt), also kopiert der Installer die beiden Pre-Check-Gate-Skripte dorthin.

python3 ~/.hermes/plugins/hermes-dreaming/skills/dreaming/scripts/install.py

Der Installer kopiert beide Gates, setzt ~/.hermes/dreaming.json aus dem Beispiel auf, macht einen Probelauf auf Wegwerf-Kopien des States und prüft die Faktenquelle und die Kernversion. Er ist idempotent, und install.py --check verifiziert, ohne etwas zu ändern — führe es nach jedem Update aus, denn die Kopien unter scripts/ können vom Skill abweichen.

Schritt drei ist die Config, und das ist der Teil, den niemand für dich erledigen kann:

$EDITOR ~/.hermes/dreaming.json

Du füllst die Zeitzone, trusted_chat_ids, agent_names und fact_source aus. Beachte, dass trusted_chat_ids fail-closed ist: Bis du deine Gruppenchats auflistest, kann kein Gruppenchat etwas belegen und das Plugin tut bewusst nichts. Wenn ein vertrauenswürdiger Chat ein Forum ist, liste die Threads auf, die kein Menschensmalltalk sind — die eigenen Alerts des Agenten, Assistant-Bridges, maschinell erzeugte Karten —, unter excluded_threads.

Schließlich die Cron-Jobs. Sie werden über Hermes’ Python-API erstellt (die CLI hat kein Flag für Toolsets, und die Job-Datei ist lebendiger Scheduler-State), mach also zuerst einen Probelauf des Plans:

~/.hermes/hermes-agent/venv/bin/python \
    ~/.hermes/plugins/hermes-dreaming/skills/dreaming/scripts/install_cron.py --deliver local --dry-run

Zufrieden mit dem Plan? Führe ihn erneut ohne --dry-run aus. Die Jobs binden an den qualifizierten Namen des Plugin-Skills, das Plugin muss also zuerst aktiviert sein; bestehende Jobs werden übersprungen, und einer, der ein anderes Skill lädt, wird gemeldet — mit --rebind zeigst du ihn zurück.

Jeder Kandidat erreicht ein Ende

Was das weniger wie ein Spielzeug und mehr wie ein Betriebswerkzeug wirken lässt, ist, dass es dir nicht ewig dieselbe Frage stellt:

  • ein Kandidat wird entweder ins Memory geschrieben oder auf die Ablehnungsliste gesetzt (ein „veraltet“ eines Menschen schließt ihn endgültig, abgeglichen über den Text);
  • neue Fakten, Konflikte und Verfallsfragen erscheinen höchstens einmal alle 14 Tage;
  • ein Eintrag, der eine „noch relevant?“-Runde überlebt hat — behalten oder an Ort und Stelle mit frischem Datum neu geschrieben —, ruht 90 Tage;
  • Cooldowns starten erst, wenn der Agent tatsächlich geantwortet hat: eine Nacht, die auf halbem Weg fehlschlug, zeigt dieselben Einträge erneut;
  • höchstens sechs Änderungen landen pro Nacht, und replace verlangt den wörtlichen Anker, den das Skript bereitgestellt hat.

Einschränkungen

  • Es ist kein Memory-Provider und registriert nichts: Es prüft, was das eingebaute Memory und der holografische Speicher bereits enthalten, es ergänzt also bestehende Memory-Plugins, statt sie zu ersetzen;
  • Faktenquellen können der holografische Speicher, ein SQLite- oder JSONL-Export oder nichts sein;
  • nichts im Paket patcht den Hermes-Kern — was du ausführst, ist der katalog-gepinnte Code.

Für den Rest des Memory-Bilds siehe die Migration des Memory-Provider-Katalogs und Cron-Memory-Kontinuität; die Befehlsfläche steht in der hermes memory-Referenz und im Plugin-Katalog-Leitfaden.