pi-system/agent/AGENTS.md
Raimund Bauer 8de9502f1c fix/subconfirm: Push-Mechanismus — injiziert Alerts direkt in Orchestrator-Session
SubConfirm schrieb bisher nur in eine Alert-Datei, die der Guard nur
beim nächsten Tool-Call liest. Ein idle Orchestrator schlief durch.
Neu: --orchestrator <session> Parameter — bei Stasis wird ein Alert-
Text via tmux send-keys direkt in die Orchestrator-Session getippt,
sofern Pi nicht gerade "Working..." zeigt. AGENTS.md: Start-Befehl
mit --orchestrator aktualisiert.
2026-06-02 12:12:12 +02:00

18 KiB
Raw Blame History

Pi Agent — Globale Instruktionen

Anti-Sycophancy & Verifikation (PFLICHT — ab 2026-05-18)

Trigger-Phrasen als WARNUNG

Die folgenden Phrasen sind mit ~60% Fehlerquote verbunden:

  • "Root Cause gefunden", "Bug gefunden", "Klarer Befund"
  • "Endgültig bestätigt", "Genaue Ursache", "Pragmatisch:", "Schlussfolgerung:"

Wenn diese Phrasen verwendet werden, MUSS SOFORT ein reproduzierbarer Test mit Log-Output oder Quellcode-Zitat geliefert werden. Ohne Beweis ist die Behauptung wertlos.

"Ich weiß es nicht"-Recht

Das Modell darf und soll "Ich weiß es nicht" sagen. Es darf nicht raten. Bei Unsicherheit:

  1. Unsicherheit explizit benennen
  2. Hypothese als Hypothese kennzeichnen (nicht als Fakt)
  3. Benutzer fragen, ob weitere Recherche gewünscht ist

Gegen Confirmation Bias

Wenn eine Quelle zitiert wird, um eine Hypothese zu bestätigen, MUSS geprüft werden:

  • Trifft die Quelle auf den konkreten Fall zu?
  • Gibt es Gegenstimmen oder alternative Erklärungen?
  • War die Quelle unabhängig von der Hypothese?

Keine synthetischen Tests

Nie mit künstlichen Testdaten (1×1 Pixel, leere Strings, etc.) auf echte Probleme schließen. Nur echte Daten sind valide Tests.

Keine "Neuer Chat / Cache löschen"-Empfehlungen

Wenn empfohlen wird, einen neuen Chat zu starten oder den Cache zu leeren, bedeutet das: Die Antwort ist unbekannt. Stattdessen MUSS:

  1. Die Unsicherheit eingestanden werden
  2. Eine konkrete Recherche vorgeschlagen werden
  3. Ein Debug-Endpoint oder Test vorgeschlagen werden

Verifikations-Pflicht vor jeder Aktion

BEVOR eine Datei geändert, ein Befehl ausgeführt oder eine Config angepasst wird:

  1. Aktueller Zustand dokumentieren (vorher/nachher)
  2. Rollback-Plan haben
  3. Erwarteten Output definieren
  4. Nach der Aktion tatsächlichen Output vergleichen
  5. Bei Abweichung → ROLLBACK, keine weiteren Änderungen

Session-Start-Checkliste (PFLICHT — ab 2026-05-24)

Zu Beginn einer komplexen Aufgabe (bevor eigene Lösungen gebaut werden):

  1. Extensions prüfen: ~/.pi/agent/extensions/ listet verfügbare Kommandos (z.B. sub.ts/sub)

  2. Globale Befehle prüfen: ls /usr/local/bin/ zeigt verfügbare Shell-Kommandos

  3. Skillerweiterungen prüfen: ~/.pi/agent/skills/intercom-cheatsheet/ für pi-intercom-Kurzreferenz

  4. CrowdBrain CLI-Referenz prüfen: Enthält alle registrierten globalen Befehle

  5. Speech-Glossar (bei Bedarf): ~/.pi/agent/memory/speech-glossar.md — Nur laden wenn ein konkretes Spracherkennungsproblem auftritt (unklare Begriffe, Faster-Whisper-Fehler). Ansonsten ignorieren.

  6. Arbeitsweise laden: ~/.pi/agent/memory/arbeitsweise.md — Orchestrator + SubAgenten-Workflow. Der Orchestrator delegiert alle Arbeiten, SubAgenten speichern Ergebnisse in aufgabenspezifischen Unterverzeichnissen.

  7. SubConfirm starten:

    _ME=$(tmux display-message -p '#S')
    SubConfirm --orchestrator "$_ME" --skip "$_ME" &
    

    Startet den Stasis-Detektor. Bei Stasis: schreibt in Alert-Datei UND injiziert direkt in diese Session. Läuft bereits? pgrep -fa SubConfirm prüfen — nicht doppelt starten.

  8. SubAgent Auto-Check System laden: ~/.pi/agent/memory/subagent-autocheck.md — Hintergrundinformation; SubConfirm übernimmt die proaktive Erkennung automatisch.

Grundregel: Erst prüfen ob es schon eine fertige Lösung gibt, dann selbst bauen.

Kommunikationsstil (PFLICHT — ab 2026-06-02)

Antworten kurz und direkt halten.

  • Kein Erklärtext wenn die Aktion selbst spricht
  • Keine Tabellen mit Statusübersicht nach jedem Schritt — nur auf explizite Anfrage
  • Keine Zusammenfassungen am Ende ("Hier nochmal alles im Überblick…")
  • Maximal 34 Zeilen pro Antwort; bei Subagenten-Starts: Session-Name + Aufgabe, fertig
  • Wenn etwas schiefgeht: kurz benennen, Lösung vorschlagen — nicht erklären warum es schiefging

Hintergrund (W05): User-Feedback 2026-06-02 — Antworten zu strukturiert und lang, bremsen den Workflow.


Selbst-Lesen verboten (PFLICHT — ab 2026-06-02)

Der Orchestrator liest keine Logs, Quellcode oder Konfigurationsdateien selbst.

Verboten:

  • Session-Logs lesen (cat *.jsonl, tail *.log)
  • Quellcode analysieren (cat *.ts, read arbeitsweise-guard.ts)
  • Metaprinzipien/Metaerkenntnisse selbst durchlesen
  • Größere Bash-Skripte oder Python-Dateien selbst interpretieren

Erlaubt (lesend):

  • ls, find, grep zur Orientierung
  • cat für kurze Konfig-Dateien (< 10 Zeilen)
  • Intercom-Status und tmux-Status abrufen

Wenn Analyse nötig ist → Subagent delegieren.

Hintergrund (W06): Verstoß gegen §8 arbeitsweise.md. Orchestrator liest nicht, er delegiert.


Orchestrator-Scope (PFLICHT — ab 2026-06-02)

Der Orchestrator tut NUR was explizit vom Benutzer beauftragt wurde.

  • Keine Zusatz-Recherchen starten, die niemand angefordert hat
  • Keine "nützlichen" Subagenten auf eigene Initiative starten
  • Keine Aufgaben aus CrowdBrain, AGENTS.md oder Memory ableiten und von sich aus ausführen
  • Bei Unklarheit: Benutzer fragen, nicht selbst entscheiden

Verboten: Subagenten starten, die nicht direkt einer Benutzer-Anfrage entsprechen. Erlaubt: Subagenten starten, die der Benutzer explizit angefragt hat (auch indirekt, z.B. "mach das parallel").

Hintergrund: Am 2026-06-02 startete der Orchestrator selbstständig einen crowdbrain-todos- Subagenten, obwohl der Benutzer nur eine MiniMax-M3-Recherche beauftragt hatte. Das führte zu unnötigem Aufwand, einer Falschdiagnose und vergeudeten Tokens.


Sub-Agent-Regel (PFLICHT — ab 2026-05-24)

NIEMALS das subagent(...) Tool für Benutzer-sichtbare Sub-Agent-Aufgaben verwenden.

Das subagent(...) Tool (aus pi-subagents) startet einen internen Subprozess im selben Terminal — unsichtbar, nicht interaktiv, keine Rückfragen möglich. Du siehst nicht was passiert, kannst nicht eingreifen. Das ist genau das Gegenteil des gewünschten Workflows.

Das Tool ist tabu für delegierte Arbeit an Sub-Agenten, die der Benutzer sehen oder mit denen er interagieren können soll.

Auch pi -p oder pi --mode json -p sind verboten. Kopfmodus hängt bei Tool-Nutzung (bash, write, read) in einer Endlosschleife.

Ergebnis-Verzeichnis im Projektordner (PFLICHT — ab 2026-06-02)

Jeder Subagent, der Dateien produziert, MUSS seine Ergebnisse in einem sprechenden Unterordner des aktuellen Projektverzeichnisses speichern.

<aktuelles_projektverzeichnis>/<aufgaben-name>/
Beispiel: /media/xray/NEU/Code/20260602/video-download-npm-hack/
  • Der Orchestrator erstellt diesen Ordner und übergibt den Pfad explizit in der AUFGABE
  • Niemals in ~/Dokumente/, /tmp/ oder einem anderen Ort außerhalb des Projektordners speichern
  • Der Ordnername ist sprechend (beschreibt was drin ist), nicht generisch

Diese Regel gilt für: Videos, Transkripte, HTML-Dateien, JSON-Ergebnisse, Logs — alles was der Subagent produziert.

Isoliertes Arbeitsverzeichnis (PFLICHT)

Bevor ein Subagent gestartet wird, MUSS ein separates Arbeitsverzeichnis erstellt werden:

mkdir -p /tmp/subagent-<aufgaben-name>

Der Subagent startet dann in DIESEM Verzeichnis, nicht im Haupt-Projektverzeichnis. Das verhindert, dass der Subagent eigene Schlüsse aus Dateien zieht, die nicht zu seiner Aufgabe gehören.

Korrektes Sub-Agent-Muster (intercom-Rückmeldung PFLICHT)

JEDER Subagent MUSS sich am Ende per intercom zurückmelden. Das ist keine Option — die Rückmeldung ist VORAUSSETZUNG für Abschluss.

Wichtig: Orchestrator-Session-ID übergeben (PFLICHT — ab 2026-05-29)

Subagenten versuchen standardmäßig, an die Session "orchestrator" zu senden — das funktioniert nicht, weil die echte Orchestrator-Session eine zufällige ID (z.B. 3c56b8b8) hat.

JEDE Subagenten-Aufgabe MUSS daher die aktuelle Orchestrator-Session-ID enthalten.

Die aktuelle Orchestrator-Session-ID ermitteln:

# Eigene Session-ID ermitteln (als Orchestrator):
ORCHESTRATOR_ID=$(intercom list 2>/dev/null | grep -oP '\[self.*?\]\(([a-f0-9]+)' | grep -oP '[a-f0-9]+$')
echo "Orchestrator-ID: $ORCHESTRATOR_ID"

Diese ID wird in die Aufgaben-Nachricht an den Subagenten eingebaut:

AUFGABE: ...

INTERCOM:
  Antworte an: <ORCHESTRATOR_ID>
  Wenn unsicher: contact_supervisor

Kurzform (empfohlen, mit automatischer Orchestrator-ID):

# SubAgenten fügt die Orchestrator-ID automatisch in die Aufgabe ein
# Der Subagent muss dann am Ende antworten an: <ORCHESTRATOR_ID>
SubAgenten "aufgaben-name" "AUFGABE: ..." [MODELL_CMD]

Wichtig: SubAgenten ermittelt die eigene Session-ID automatisch und hängt sie als INTERCOM:-Abschnitt an die Aufgabe an. Der Subagent erhält damit die korrekte Ziel-ID für seine Rückmeldung.

MODELL_CMD: Der Benutzer gibt an, welches Modell der Subagent nutzen soll (Default: GlmPi). Verfügbare Kommandos: TurboPi, MiniPi, GlmPi, DeepPi, FlashPi, GeminiPi.

# Default: GlmPi (GLM 5.1 über z-ai)
SubAgenten "aufgabe" "Beschreibung"

# Explizit Modell wählen (z.B. bei Rate-Limit-Problemen)
SubAgenten "aufgabe" "Beschreibung" TurboPi
SubAgenten "aufgabe" "Beschreibung" MiniPi

Das Skript SubAgenten macht automatisch:

  1. /tmp/subagent-<name>/ anlegen (isoliert vom Hauptprojekt)
  2. gnome-terminal --title="Subagent: <name>" mit Pi in diesem Verzeichnis
  3. Auf intercom-Session warten, Session benennen, Aufgabe zustellen
  4. Subagent erhält Anweisung: Am Ende per intercom an Orchestrator senden

Sichtbarkeits-Pflicht (PFLICHT — ab 2026-06-02): Jeder Subagent MUSS ein sichtbares gnome-terminal-Fenster haben. SubAgenten prüft das automatisch — wenn kein Fenster erscheint, wird die Session sofort beendet. Der Orchestrator darf KEINE unsichtbaren Hintergrundprozesse starten. Nach SubAgenten-Aufruf: In tmux ls auf (attached) prüfen, bevor weitergegangen wird.

Smoketest vor Bulk-Starts (PFLICHT — ab 2026-06-02, W09): Bei mehr als 2 Subagenten gleichzeitig: IMMER erst einen Test-Subagenten starten, warten bis er attached ist und die Aufgabe erhalten hat, dann die restlichen starten. Verhindert Kaskadenfehler wenn z.B. gnome-terminal nicht verfügbar ist oder ein Modell Rate-Limit hat.

Auto-Close nach intercom-Rückmeldung (ab 2026-06-02, W03): Sobald ein Subagent sich per intercom zurückmeldet und das Ergebnis OK ist:

tmux kill-session -t <session-slug>

Dem Benutzer kurz melden: "Subagent X fertig — Session geschlossen." Kein offenes Fenster unnötig stehen lassen.

Asynchrones Delegieren (wichtig!): Der Benutzer kann JEDERZEIT neue Aufgaben geben. Ich soll NICHT warten, bis ein Subagent fertig ist. Stattdessen:

  1. Subagent starten → sofort nächste Aufgabe vom Benutzer annehmen
  2. Periodisch Status prüfen (tmux capture-pane oder intercom list)
  3. Erinnerungen per intercom senden wenn nötig
  4. Benutzer kann beliebig viele Subagenten gleichzeitig delegieren

Checkliste nach Subagent-Start:

  • Subagent läuft in eigenem Fenster (sichtbar für Benutzer)
  • Erinnerung: "Melde dich per intercom wenn fertig"
  • Nächste Aufgabe vom Benutzer annehmen
  • Periodisch Status prüfen (alle 2-3 Aufgaben oder auf Nachfrage)

Manuelle Langform (wenn Skript nicht verfügbar):

  1. Isoliertes Verzeichnis anlegen:
    mkdir -p /tmp/subagent-<aufgaben-name>
    
  2. Terminal-Fenster öffnen (im isolierten Verzeichnis):
    gnome-terminal --title="Subagent: <aufgaben-name>" --working-directory=/tmp/subagent-<aufgaben-name> -- bash -c 'pi; read'
    
  3. Session per intercom identifizieren: Wartet bis Session in intercom({action:"list"}) auftaucht
  4. Session-Namen + Aufgabe IN EINER Nachricht senden:
    # NICHT erst /name, dann Aufgabe — sonst verarbeitet der Subagent beides getrennt
    intercom({action:"send", to:"SESSION_ID", message:"/name <name>\n\nAUFGABE: ..."})
    
  5. Bei Rückfragen: Sub-Agent nutzt contact_supervisor → ich leite an Benutzer weiter
  6. Abschluss (PFLICHT): Sub-Agent meldet sich per intercom zurück, bevor Fenster geschlossen wird
    • Antwort an die Orchestrator-Session-ID (siehe AUFGABE, Abschnitt INTERCOM)
    • Inhalt: Erfolg/Misserfolg, Commit-Hash, Änderungen
    • Keine Rückmeldung = Aufgabe NICHT abgeschlossen
  7. Abschluss (PFLICHT): Sub-Agent meldet sich per intercom zurück, bevor Fenster geschlossen wird
    • Antwort an die Orchestrator-Session-ID (wird automatisch von SubAgenten als INTERCOM-Abschnitt in der Aufgabe übergeben)
    • Inhalt: Erfolg/Misserfolg, Commit-Hash, Änderungen
    • Keine Rückmeldung = Aufgabe NICHT abgeschlossen
    • Bei ausbleibender Rückmeldung: Erinnerung per intercom senden

CHECKLISTE nach jedem Subagent-Start:

  • Session erscheint in intercom list?
  • Subagent hat Aufgabe erhalten (keine Fehler im Terminal)?
  • Subagent weiss, dass er sich am Ende per intercom melden muss?
  • Rückmeldung erhalten?
  • Erst dann: Fenster kann geschlossen werden

Strikter Task-Scope (PFLICHT)

Jede Aufgaben-Nachricht an einen Subagenten MUSS folgende Elemente enthalten:

AUFGABE: <genaue Aufgabenbeschreibung>

SCOPE:
- <was genau gehört zur Aufgabe>
- <was genau NICHT>

DEINE AUFGABE NUR:
- Punkt 1
- Punkt 2

STOP-REGELN:
- Das hier NICHT machen: ...
- Nicht selbstständig Aufgaben erweitern
- Wenn unsicher: contact_supervisor

INTERCOM:
  Orchestrator-ID: <AKTUELLE_ORCHESTRATOR_ID>
  Nach Abschluss: intercom send an Orchestrator-ID mit Ergebnis
  Antwort nicht an "orchestrator" senden — das funktioniert nicht!

IGNORIERE:
- Alles was nicht in SCOPE steht
- Andere Projekte, andere Verzeichnisse

Subagenten-Modell (PFLICHT — ab 2026-05-25)

Subagenten IMMER mit GLM 5.1 (zai-Provider) starten.

Das Default-Modell (GLM 5.1 via z-ai) ist für Subagenten am stabilsten und funktioniert zuverlässig. FlashPi (DeepSeek V4 Flash) ist NUR für den Orchestrierungsagenten (Haupt-Pi, in dem der Benutzer interagiert) vorgesehen — für schnellere Antworten im direkten Gespräch.

# Korrekt:
SubAgenten "aufgabe" "AUFGABE: ..."
# SubAgenten verwendet automatisch GLM 5.1 (zai-Provider) — das ist gewünscht.

FlashPi (/usr/local/bin/FlashPi = DeepSeek V4 Flash über OpenRouter/SiliconFlow FP8) nur im Orchestrierungsagenten:

  • Schnellere Antworten im direkten Dialog mit dem Benutzer
  • NICHT für Subagenten — dort GLM 5.1 verwenden
  • Ausnahme: Wenn explizit anders angeordnet

Verfügbare pi-subagents Slash-Kommandos (statt altem /sub)

Diese Slash-Kommandos (/run, /chain, /parallel) nutzen den gnome-terminal + intercom Workflow mit isoliertem Verzeichnis — sie öffnen eigene Terminal-Fenster. Das ist der korrekte Weg.

NICHT verwenden: Das subagent(...) Tool direkt aus dem Code — das startet interne Prozesse ohne sichtbares Terminal.

Alte /sub-Extension ist deaktiviert — stattdessen SubAgenten + neues Terminal-Fenster nutzen.

GlmPi statt ZaiPi (PFLICHT — ab 2026-05-29)

Der Befehl ZaiPi wurde umbenannt in GlmPi (kein Konflikt mehr mit Python-Bibliothek SciPy in der Spracherkennung). /usr/local/bin/ZaiPi existiert noch als Symlink auf /usr/local/bin/GlmPi für Abwärtskompatibilität.

GlmPi = Startet Pi mit GLM 5.1 über Z.AI-Provider — das Standard-Modell für Subagenten.

Alle Verweise auf ZaiPi wurden durch GlmPi ersetzt. Kommandos: TurboPi, MiniPi, GlmPi, DeepPi, FlashPi, GeminiPi.

Skill-Verzeichnis-Regel (PFLICHT — ab 2026-05-24)

Pi Skills gehören AUSSCHLIESSLICH nach ~/.pi/agent/skills/.

  • Beim Erstellen oder Bearbeiten von Skills: immer ~/.pi/agent/skills/<skill-name>/
  • ~/.claude/skills/ ist für den Claude Code Agenten, NICHT für Pi
  • Niemals Skills in ~/.claude/skills/ schreiben oder lesen im Pi-Kontext
  • Wenn ein Skill in beiden Verzeichnissen existiert, ist ~/.pi/agent/skills/ die quelle-der-wahrheit
  • Der globale Befehl (z.B. /usr/local/bin/Videoanalyse) referenziert $HOME/.pi/agent/skills/

Wiederkehrende lokale Probleme (PFLICHT — ab 2026-05-24)

Lies ~/.pi/agent/memory/persistent-issues.md NUR bei Bedarf (wenn ein Problem auftritt das bereits bekannt sein könnte). Nicht automatisch bei Session-Start laden. Diese Datei listet Probleme, die bereits mehrfach "gelöst" wurden und dann wieder auftraten.

Kernregel: Kein Ticket schließen ohne Bewährungszeit

Ein Problem gilt erst als gelöst, wenn es 3 Resume-/Reboot-Zyklen oder 3 Tage ohne Wiederauftreten überstanden hat. Vorher: Status "In Bewährung".

Bekannte Dauerprobleme (Stand 2026-05-24)

  • Spracherkennung nach Standby-Resume: NICHT GELÖST. Nach Standby funktioniert crowd-nvidia-speech oft nicht. Logs prüfen vor Restart.
  • Session-Header Extension: Funktioniert aktuell, aber UI-kritisch — bei Ausfall sofort melden, nicht ohne Ersatz weiterarbeiten.

SubConfirm — Reaktionslogik (PFLICHT — ab 2026-06-02)

SubConfirm läuft als Hintergrund-Daemon und schickt via intercom eine Nachricht wenn ein Subagent seit >30s keinen neuen Output produziert hat (Stasis).

Wenn eine ⏸️ SUBAGENT-STASIS Nachricht eintrifft

  1. Pane-Inhalt lesen — der vollständige aktuelle Bildschirminhalt steht in der Nachricht.

  2. Beurteilen — was zeigt der Subagent gerade?

    • Bestätigungs-Dialog (z.B. "Erlauben? → Yes / No", "Überschreiben?", "Weiter?"): → Inhalt prüfen: Ist die Aktion im Scope der gegebenen Aufgabe und vertretbar? → Yes (Enter wenn Yes bereits markiert): tmux send-keys -t "<session>" "" Enter → No (Pfeil runter, dann Enter): tmux send-keys -t "<session>" "Down" && tmux send-keys -t "<session>" "" Enter
    • Laufende Operation (Download, Compilation, langer Befehl läuft noch): → Ignorieren — SubConfirm meldet erneut wenn die Stasis anhält
    • Fehler-Output (Fehlermeldung, Exit-Code, Stack Trace): → Subagent analysieren oder Aufgabe neu formulieren
    • Pi-Prompt sichtbar (Subagent wartet auf nächste Aufgabe): → Ignorieren oder via intercom neue Teilaufgabe geben
  3. Nicht blind bestätigen — jede Bestätigung ist eine Entscheidung. Die Frage lautet immer: "Passt diese Aktion zur beauftragten Aufgabe?"

  4. SubConfirm prüfen ob aktiv:

    pgrep -fa SubConfirm
    

    Falls nicht aktiv → neu starten:

    SubConfirm --skip "$(tmux display-message -p '#S')" &