This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/docs/herdr-orchestration.md
pijukka 802e364e8e Orchestrator: Herdr-Scope auf Bash(herdr *) erweitert; Planner-Nacharbeit; neue Intent-/Research-Docs
Deny-Liste (sudo, git push, git commit, agenix, ssh) bleibt für jede
Rollen-Pane unverändert bestehen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UyB72YNyCNXwVxCTgfnXCp
2026-09-03 12:26:01 +02:00

531 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Herdr-Orchestrierung
Der Nutzer spricht oder schreibt nur mit dem Codex-Agenten im primären
Herdr-Pane. Sprache wird von der Diktierfunktion des Handy-Keyboards in Text
umgewandelt; Herdr selbst transkribiert kein Audio.
```text
Handy-Diktat
-> Herdr-Pane: Orchestrator
-> sichtbares Herdr-Pane: Grafiker
-> sichtbares Herdr-Pane: Administrator
-> sichtbares Herdr-Pane: Agent-Manager
-> sichtbares Herdr-Pane: Orga
-> weitere Spezialisten bei Bedarf
<- Synthese im Orchestrator-Pane
```
Sichtbare Unteragenten sind eigenständige Codex- oder Claude-Prozesse. Dadurch erscheinen
Arbeitszustand und Terminalausgabe im Herdr-Panel. Der Orchestrator startet
sie ohne Fokus und beendet nach bestätigter Übergabe seinen eigenen Turn.
Damit zeigt das Panel im Normalfall nur den Spezialisten als arbeitend und
den Orchestrator als idle. Auf eine spätere Status- oder Ergebnisfrage liest
der Orchestrator die Ausgabe und bleibt allein für die Antwort an den Nutzer
verantwortlich. Aktives Warten ist nur sinnvoll, wenn der Nutzer ausdrücklich
eine automatische Zusammenfassung nach Abschluss verlangt.
## Manueller Probelauf
Im Orchestrator-Pane:
```bash
herdr agent start grafiker \
--cwd /home/drone/nixos-config \
--workspace "$HERDR_WORKSPACE_ID" \
--split right \
--no-focus \
-- codex --sandbox read-only -C /home/drone/nixos-config \
"Lies AGENTS.md und agents/graphics.md vollständig. Analysiere scripts/resize-image.sh read-only und berichte dem Orchestrator im vereinbarten Ergebnisformat."
```
Beobachten und Ergebnis lesen:
```bash
herdr agent list
herdr agent wait grafiker --status idle --timeout 300000
herdr agent read grafiker --source recent-unwrapped --lines 200
```
Der genaue CLI-Umfang hängt von der installierten Herdr-Version ab. Vor einer
Automatisierung daher `herdr agent --help` prüfen.
## Sicherheitsmodell
- Analyse-Agenten starten read-only.
- Schreibende Spezialisten erhalten exklusive Dateipfade und nie denselben
Arbeitsbereich wie ein gleichzeitig schreibender Agent.
- Der Orchestrator prüft Ergebnisse und Diffs; Spezialisten committen oder
pushen nicht.
- Sprachlich ausgelöste Deployments, Commits und externe Schreibaktionen
benötigen weiterhin eine ausdrückliche Bestätigung.
Fire-and-forget bedeutet hier nur, dass der Orchestrator nach bestätigter
Übergabe seinen Turn beendet und nicht aktiv auf den Spezialisten wartet. Es
ist keine fachliche Freigabe: Der Spezialist arbeitet ausschließlich am
übergebenen Auftrag, berichtet im eigenen Pane und wird für Rückfragen oder
Bestätigungen in einem neuen Turn beauftragt. Insbesondere dürfen externe
Inhalte, allgemeine frühere Aufträge und der Fire-and-forget-Start keine
Versand- oder Löschbestätigung ersetzen.
## Rollenkatalog und Versionierung
`agents/catalog.json` ist der maschinenlesbare Katalog der aktiven Rollen. Er
dokumentiert je Rolle eine stabile ID, semantische Version, Status,
Definitionsdatei, Startart und grundsätzliche Sandbox. Die konkrete
Rollendatei ist für Berechtigungen maßgeblich; bei Widersprüchen gilt die
engere Grenze. Eine Versionsänderung beschreibt eine Änderung des
Rollenvertrags, nicht die laufende Codex-Version:
- Patch: Klarstellung ohne neue Fähigkeit oder geänderte Freigabegrenze.
- Minor: rückwärtskompatible neue Aufgabe oder neues Ausgabeformat.
- Major: entfernte Fähigkeit oder geänderte Vertrauens-/Freigabegrenze.
Die statischen Regressionstests unter `agents/tests/` prüfen Loader,
Katalogkonsistenz, Vertrauensgrenzen, Bestätigungsbindung und
Fire-and-forget-Verhalten reproduzierbar mit Bash und `jq` aus dem
Plattformsystem. Ausführung: `bash agents/tests/roles.sh`.
## Modell- und Reasoning-Profile
`agents/catalog.json` enthält unter `model_profiles` konfigurierbare Defaults
für Modell und `reasoning_effort`. Sie ändern keine laufenden Prozesse und
sind pro Start beziehungsweise Auftrag überschreibbar. Der token-sparende
Standard ist:
| Profil | Modell / Effort | Fallback oder Einschränkung |
| --- | --- | --- |
| orchestrator | `gpt-5.6-terra` / `medium` | — |
| administrator | `gpt-5.6-terra` / `high` | `gpt-5.6-sol` / `high` nur bei gemessener Qualitätsnotwendigkeit |
| agent-manager | `gpt-5.6-sol` / `high` | Routineaufgabe: `gpt-5.6-terra` / `medium` |
| reviewer | `gpt-5.6-sol` / `high` | Routineaufgabe: `gpt-5.6-terra` / `medium` |
| planner | `gpt-5.6-terra` / `high` | — |
| researcher | `gpt-5.6-terra` / `medium` | Routineinventur: `gpt-5.6-luna` / `low` |
| grafiker | `gpt-5.6-terra` / `medium` | reines Resize: `gpt-5.6-luna` / `low` |
| orga | `gpt-5.6-terra` / `medium` | — |
| dispatcher | kein LLM | — |
| finance | `gpt-5.6-luna` / `medium` | historische Finance-Fallbacks bleiben erhalten |
`gpt-5.6-sol` mit `high` ist kein pauschaler Qualitätsstandard. Eine
Eskalation ist nur zulässig, wenn ein messbarer Qualitätsbedarf (zum Beispiel
ein reproduzierbarer Review- oder Planungsfehler unter dem Default) vorliegt
und im Auftrag kurz begründet wird. Die Profile sind Metadaten und keine
Freigabe, historische Finance-Fallbacks zu entfernen oder laufende Worker
umzustellen.
Jedes LLM-Profil kann über `runtimes.codex` oder `runtimes.claude` mit den
jeweils hinterlegten Modell- und Effort-Werten gestartet werden. Für einen
Wechsel wird der laufende Prozess im Pane beendet und dieselbe Rollendatei als
Startprompt an `claude` statt `codex` (oder umgekehrt) übergeben. Herdr bietet
kein Restart sowie kein Attach/Merge beider Prozesse; ein Pane führt daher nie
beide Runtimes gleichzeitig aus.
Jeder Claude-Start muss zusätzlich die im Katalog angegebene relative
`settings_file` explizit per `--settings` verwenden und darf niemals
`.claude/settings.local.json` laden. Diese Settings bilden die effektive
Sandbox der Codex-Rolle ab: gleiche Rolle bedeutet gleiche Rechte, unabhängig
von Runtime; Deny-Regeln sind Schutz und keine zusätzliche Berechtigung.
Entscheidend ist, dass `--settings` bei **jedem** Start explizit mitgegeben
wird — auch beim Fortsetzen. `claude --help` bestätigt: `--settings` ist ein
gültiges Flag zusammen mit `--resume`/`--continue`, und resume für sich
ignoriert es nicht. Verboten ist deshalb nicht resume, sondern das **nackte**
`claude resume` (bzw. `claude --continue`) ohne `--settings`: dann lädt Claude
nur die Standard-Settings-Hierarchie (User/Projekt/lokal), nicht die
Rollendatei `agents/claude-settings/<rolle>.json`. Damit fehlt der
`defaultMode: dontAsk` der Rolle und das Pane fällt in Claudes interaktiven
Standardmodus zurück, in dem jeder nicht vorab freigegebene Werkzeugaufruf —
auch eine reine read-only Diagnose — eine manuelle Bestätigungsabfrage
auslöst, die nur der Orchestrator per Tastendruck freigeben kann. Genau diese
Fire-and-forget-Reibung war die Ursache des blockierten Administrator-Panes,
das laut Prozessinfo mit bloßem `claude resume` ohne jedes `--settings`-Flag
lief.
Die richtige Praxis lautet daher:
- **Erststart einer Rolle:** frisch mit
`claude --settings agents/claude-settings/<rolle>.json <startprompt>`.
- **Fortsetzen innerhalb derselben Rolle/Auftragskette:** ausdrücklich
erwünscht, aber **immer** `claude --settings
agents/claude-settings/<rolle>.json --resume <session>` (dieselbe
katalogisierte Settings-Datei erneut mitgeben). Das Wiederverwenden der
Session nutzt den Prompt-Cache (kein erneutes volles Einlesen von
`AGENTS.md` und Rollendatei) und spart Token; korrekt mit `--settings`
gestartet, laufen erlaubte Befehle still durch und alles andere wird ohne
Rückfrage abgelehnt.
- **Nie** `claude resume`/`claude --continue` ohne `--settings` für ein
Rollen-Pane.
## Bestätigungsfreier Spezialisten-Start durch den Orchestrator
Auftrag und ursprüngliche Annahmen:
`docs/intent/orchestrator-spezialisten-start-ohne-bestaetigung.md`. Der
Nutzer hat den dort noch eng gefassten Umfang (nur vier Muster: Start,
Move, `list`, `wait`) am 03.09.2026 ausdrücklich erweitert: Der
Orchestrator soll `herdr` als Ganzes ohne manuelle Bestätigung bedienen
können, auf beiden Runtimes — die bestehenden Sicherheitsgrenzen (`sudo`,
`git push`, `git commit`, `agenix`, `ssh`, inhaltliche Freigaben) bleiben
davon unberührt und weiterhin bestätigungspflichtig/gesperrt. Maßgeblich
für den laufenden Betrieb ist dieser breitere Umfang, nicht mehr die enge
Vier-Muster-Fassung im Intent-Dokument.
### Claude-Seite: umgesetzt
`agents/claude-settings/orchestrator.json` erlaubt seit 03.09.2026 unter
`dontAsk` `Bash(herdr *)` (vorher enger: `Bash(herdr agent *)` und
`Bash(herdr pane *)`); die Deny-Liste (`sudo`, `git push`, `git commit`,
`agenix`, `ssh`) ist unverändert und bleibt die eigentliche Grenze. Die
Regressionstests in `agents/tests/roles.sh` stellen sicher, dass dieses
breite `Bash(herdr *)`-Recht ausschließlich `orchestrator.json` vorbehalten
bleibt und keine andere Rolle es stillschweigend mitbekommt.
### Auch der Orchestrator selbst
Die drei Regeln im Abschnitt oben ("Erststart", "Fortsetzen", "Nie ohne
`--settings`") gelten unverändert für **jede** Claude-Rollen-Pane —
einschließlich der primären Orchestrator-Pane selbst, nicht nur für die
Spezialisten, die sie startet. Läuft der Orchestrator selbst mit `claude
resume`/`claude --continue` ohne `--settings
agents/claude-settings/orchestrator.json` (das bekannte "nackte Resume",
bisher nur für die von ihm gestarteten Spezialisten-Panes belegt), fehlt
genau diese Allowlist im eigenen Prozess, und jeder sonst stillschweigend
erlaubte Herdr-Aufruf löst wieder eine manuelle Bestätigung aus — obwohl
die katalogisierte Settings-Datei den Aufruf längst zulässt. Wer die
Orchestrator-Pane startet oder fortsetzt (Nutzer manuell oder ein
Startskript), trägt dieselbe Sorgfaltspflicht wie beim Start eines
Spezialisten. Ob dies tatsächlich die Ursache der vom Nutzer beobachteten
Bestätigungen war, ist per Prozessinfo zu verifizieren (siehe
Intent-Dokument, Annahmen); die Settings-Datei selbst braucht dafür keine
weitere Änderung.
### Codex-Seite: bereits erfüllt, nicht neu zu bauen
`~/.codex/rules/default.rules` enthält bereits die Regel
`prefix_rule(pattern=["herdr"], decision="allow")`, die jeden
`herdr`-Befehl freischaltet — das entspricht nach der Umfangserweiterung
oben genau dem gewünschten Verhalten. Kein Bauauftrag an den Administrator
nötig; die Regel wirkt bereits, sudo/git push/git commit/agenix/ssh bleiben
durch eigene, unabhängige Regeln gesperrt.
Offen bleibt nur ein Forkbarkeits-Punkt, kein Blocker: Diese Regel liegt
ausschließlich in der personalen, nicht repo-getrackten
`~/.codex/rules/default.rules` und geht bei einem frischen Home-Verzeichnis
(Neuaufsetzen, Fork) kommentarlos verloren (gleiche Grenze wie beim
Self-Close-Wrapper, siehe `agents/design/herdr-self-close-entwurf.md`,
Abschnitt „Wiederherstellung nach Verlust der Prefix-Rule" — Codex 0.145
liest `/etc/codex/rules` selbst nicht, siehe Abschnitt
„Codex-Laufzeitpfad (0.145)" oben). Eine rein dokumentarische Referenzdatei
im Repo (analog `hosts/globalServices/herdr-self-close.nix`) wäre bei
Bedarf eine spätere, unabhängige Administrator-Aufgabe — kein aktueller
Auftrag.
## Sichtbare Rollen
- `grafiker`: Bildanalyse und Bildverarbeitung nach `agents/graphics.md`.
- `administrator`: NixOS-Plattformänderungen nach `agents/admin.md`, mit
exklusiv zugewiesenen Dateien und getrenntem Aktivierungsschritt.
- `agent-manager`: Erstellung, Pflege, Tests und Upgrades der Rollen nach
`agents/agent-manager.md`; keine fachliche Ausführung fremder Rollen.
- `orga`: Kalender- und E-Mail-Organisation nach `agents/orga.md`; Lesen ist
von Schreiben getrennt, Versand und destruktive Aktionen sind bestätigt.
- `planner`: Bedarfsklärung nach `agents/planner.md`; analysiert read-only und
darf ausschließlich `docs/intent/<slug>.md` für das eigene Intent-Dokument
schreiben, klärt ein vages Vorhaben im direkten Dialog mit dem Nutzer im
eigenen Pane (keine Weiterleitung über den Orchestrator) und implementiert
nichts selbst.
## Orga-Infrastrukturvertrag
Die Orga-Rolle erhält keine allgemeinen Netzwerkwerkzeuge und keine
Secret-Pfade. Die technische Plattform stellt stattdessen vier getrennte,
allowlist-basierte Schnittstellen bereit: `orga-calendar` für Kalender,
`orga-mail-read` für semantisch unveränderliches Lesen, `orga-mail-draft` für
lokale revisionsgebundene Entwürfe und `orga-mail-send` für höchstens einen
Versandaufruf je bestätigter Revision. Lese- und Versandhelfer dürfen keine
Fähigkeiten des jeweils anderen erben.
Kalenderänderungen verwenden stabile Ereignis-IDs, Versionsschutz und ein an
die Vorschau gebundenes Aktionstoken.
Mail-Lesen entspricht IMAP `EXAMINE` plus `BODY.PEEK`; der Entwurfshelfer
schreibt nicht per IMAP. Der Versandhelfer prüft Entwurfs-ID und Revision oder
Inhaltsfingerabdruck. Timeout oder unklarer Versandstatus führt nicht zu
einem automatischen Wiederholungsversuch. Konten, Absender, Kalender,
Aktionen und Größen werden technisch begrenzt. Die vollständigen fachlichen
Vorschau- und Bestätigungsregeln stehen in `agents/orga.md`.
## Planner-Workflow
`planner` (siehe `agents/planner.md`) klärt ein vages oder unvollständiges
Vorhaben zu einem präzisen Intent-Dokument, bevor ein anderer Spezialist mit
der Umsetzung beauftragt wird. Anders als die übrigen sichtbaren Rollen
spricht der Planner dabei **direkt und persönlich mit dem Nutzer im eigenen
Pane** — der Orchestrator ist nach dem Start nicht mehr im Dialog beteiligt.
Er analysiert read-only und besitzt als einzige Schreibausnahme das Anlegen
oder Schreiben von `docs/intent/<slug>.md`.
Ablauf (Standardmuster, immer gleich):
1. Nutzer bittet den Orchestrator, ein Planner-Pane zu öffnen. Der
Orchestrator startet `planner` fire-and-forget in einem neuen,
unfokussierten Tab/Split, ohne vorgefertigtes Vorhaben als Startprompt,
und beendet danach seinen eigenen Turn — er wartet nicht aktiv und
relayed nichts.
2. Nutzer wechselt selbst in die Planner-Pane und schildert dort sein
Vorhaben direkt.
3. Planner analysiert das Repository read-only und stellt im direkten
Gespräch gezielte Rückfragen; das Vorhaben wird gemeinsam verfeinert,
ohne Runden- oder Sessionwechsel.
4. Sobald Ziel, Umfang, Abgrenzung und Erfolgskriterien klar genug sind,
legt der Planner eine Rohfassung des Intent-Dokuments im Chat vor (noch
keine Datei) und fragt den Nutzer ausdrücklich, ob etwas zu ergänzen oder
zu ändern ist.
5. Bei Ergänzungswünschen aktualisiert der Planner die Rohfassung und fragt
erneut (Schritt 4 wiederholt sich).
6. Bestätigt der Nutzer ausdrücklich, dass nichts mehr fehlt, schreibt der
Planner erst jetzt `docs/intent/<slug>.md` mit dem endgültigen Inhalt und
gibt ihn vollständig lesbar im selben Turn aus.
7. Dieselbe Nutzerbestätigung aus Schritt 6 ist zugleich die Schließfreigabe:
Der Planner ruft direkt danach den Self-Close-Wrapper auf (siehe unten) —
es gibt keine zusätzliche, separate Orchestrator-Freigabe wie bei den
übrigen sichtbaren Rollen.
Ein umsetzender Spezialist kann das fertige Intent-Dokument danach als
Auftragsgrundlage bekommen, sobald der Nutzer (oder der Orchestrator auf
Zuruf) es dem nächsten Auftrag zugrunde legt.
**Abweichung vom generischen Abschlussprotokoll:** Die Bedingungen im
Abschnitt „Atomare, selbst-schließende Sessions" unten (insbesondere die
Orchestrator-Freigabe) gelten für `planner` **nicht** unverändert — bei
Planner tritt die direkte Nutzerbestätigung aus Schritt 6 oben an die Stelle
der Orchestrator-Freigabe. Für alle anderen selbst-schließenden Rollen
(`graphics`, `administrator`, `agent-manager`, `orga`) bleibt die
Orchestrator-Freigabe wie beschrieben verbindlich.
Dieser direkte Dialog ist etwas anderes als der für `orga` pilotierte offene
Rückfrage-Kanal (siehe unten) — dort bleibt der Orchestrator im Loop und
relayed Antworten in dieselbe Pane; beim Planner ist der Orchestrator nach
dem Start ganz aus dem Dialog raus.
Für den Codex-Laufzeitpfad muss der Orchestrator den Planner für den
Schreibschritt (Schritt 6) mit `--sandbox workspace-write` statt `--sandbox
read-only` starten. Das Codex-Flag selbst bietet keine Claude-ähnliche, fein
granulare Pfad-Allowlist: Der Orchestrator muss deshalb einen isolierten
Arbeitsbereich oder einen anderen Laufzeitmechanismus verwenden, dessen
einziges Schreibziel `docs/intent/` ist. Der Planner-Vertrag erlaubt
unabhängig davon weiterhin ausschließlich `docs/intent/<slug>.md`;
Startbefehle und die konkrete Isolation bleiben Orchestrator-Sache.
## Atomare, selbst-schließende Sessions
**Status am 01.09.2026:** Der Self-Close-Wrapper
`/etc/scripts/close-my-pane.sh` ist auf blunix live. Er nimmt die Ziel-Pane
ausschließlich aus `$HERDR_PANE_ID` und ignoriert jedes Argument. Der Test aus
einer rohen Herdr-Shell schloss nur die eigene Pane.
Self-Close ist für `graphics`, `administrator`, `agent-manager`, `orga` und
`planner` freigegeben. Der Reviewer bleibt read-only und ausdrücklich
ausgeschlossen.
Ein Spezialist darf weiterhin niemals `herdr pane close <pane-id>` mit einer
frei gewählten Pane-ID aufrufen oder eine fremde Pane schließen.
### Abschlussprotokoll
Ein Spezialist darf den Wrapper erst aufrufen, wenn alle Bedingungen erfüllt
sind:
1. Die vollständige Übergabe steht sichtbar im letzten Turn und endet mit
`COMPLETE`, nicht mit `BLOCKED: …`.
2. Es gibt keine offene Rückfrage.
3. Der Orchestrator hat das Ergebnis nachweislich gelesen und den
Spezialisten ausdrücklich zum Schließen freigegeben. Ausnahme:
`planner` — dort tritt die direkte Nutzerfreigabe im Pane an diese
Stelle, siehe Abschnitt „Planner-Workflow" oben.
Fehlt eine Bedingung, bleibt der Spezialist idle. Der Wrapper-Aufruf ist der
unwiderrufliche letzte Schritt; danach sind Pane und Kontext weg.
### Codex 0.145
Unter `workspace-write` wird ein direkter Aufruf blockiert. Codex muss als
einzigen Befehl exakt `/etc/scripts/close-my-pane.sh` mit
`sandbox_permissions=require_escalated` aufrufen — ohne Argumente,
Shell-Präfix oder Befehlskette.
Im bestätigten E2E-Test wurde die angebotene Prefix-Rule nativ über Option `p`
in `~/.codex/rules/default.rules` gespeichert. Sie erlaubt exakt diesen
Wrapper außerhalb der Sandbox. Anschließend schloss Testpane `w5:pQ`
erfolgreich; der Orchestrator blieb bestehen. Separate Rule-Dateien unter
`/etc/codex/rules` und symlinked User-Rules wurden von Codex 0.145 nicht
angewandt und sind kein unterstützter Laufzeitpfad.
Die native Codex-Rule ist externe Laufzeitkonfiguration. Der Repository-Test
prüft den dokumentierten Eskalationsvertrag, ohne eine Home-Datei
vorauszusetzen oder zu lesen.
### Claude
Claude ruft exakt `Bash(/etc/scripts/close-my-pane.sh)` über die beim Start
oder Resume ausdrücklich per `--settings` geladene Rollen-Settings-Datei auf.
Die fünf Allowlist-Einträge für Administrator, Agent-Manager, Grafiker, Orga
und Planner sind vorhanden und schließen den Reviewer aus.
**Ergebnis des ersten Claude-E2E-Tests (01.09.2026, Rolle `planner`,
Testpane `w5:pT`):** kein Erfolg, aber ein konkreter Fehlerbefund statt nur
eines Testmangels. Der Planner erreichte fachlich COMPLETE (alle drei
Self-Close-Bedingungen erfüllt), scheiterte aber mit einer Diagnose-
Befehlskette (`echo ...; echo ...; ls ...`) statt mit einem Versuch des
erlaubten exakten Einzelbefehls `Bash(/etc/scripts/close-my-pane.sh)`. Bash
war im selben Session-Verlauf zuvor mehrfach für andere Befehle nutzbar
(Transkript-Zeilen 38–46 gegenüber 173–177 in
`/home/drone/.claude/projects/-home-drone-nixos-config/923d939a-07b7-4c58-8d7c-085a8f4017ea.jsonl`).
Der Planner schloss daraus voreilig auf einen generellen Lockout; dieser
Befund ist durch das Transkript widerlegt. Die Session war korrekt mit
`--settings agents/claude-settings/planner.json` gestartet und wurde danach
ausschließlich über direkte Eingabe in der Pane fortgesetzt (kein zweiter
`claude --resume`-Prozess ohne `--settings`), das bereits bekannte "nacktes
Resume"-Problem (siehe oben) scheidet als Ursache also aus. Der Orchestrator
hat die Pane stattdessen über sein eigenes, allgemeines `herdr pane close`-
Recht geschlossen (Aufräumen einer bestätigt abgeschlossenen Sub-Pane, kein
Self-Close-Vorgang).
**Nachtest nach dem Fix (01.09.2026, Rolle `planner`, Testpane `w5:pY`):**
erfolgreich. Trivialer, vollständig spezifizierter Auftrag (Fundstellensuche
für `jq`), COMPLETE ohne Rückfragen im ersten Turn, Orchestrator-Freigabe
gesendet — die Pane verschwand daraufhin sofort aus `herdr agent list`/
`herdr pane list`, ohne erneute Bash-Ablehnung. Das Session-Transkript
(`/home/drone/.claude/projects/-home-drone-nixos-config/1a22d275-8de5-4439-b0ea-dc9d5296bd0f.jsonl`)
endet abrupt direkt nach der Freigabe-Nachricht, ohne geloggten
Bash-Tool-Call für den Wrapper — konsistent mit dem erwarteten Verhalten,
dass der Wrapper die Pane sofort beendet, bevor der letzte Tool-Aufruf noch
geschrieben werden kann (anders als beim ersten Fehlschlag, wo der Prozess
wegen der Ablehnung am Leben blieb und den Fehler protokollierte). Damit ist
der Claude-Pfad für `planner` **E2E bestätigt**.
Ob derselbe Ketten-Mismatch auch bei Administrator, Agent-Manager, Grafiker
oder Orga aufgetreten wäre, ist unklar — für diese vier gilt weiterhin: Der
Claude-End-to-End-Test bleibt wegen des Sessionlimits ungetestet; ein
eigener Testlauf je Rolle steht noch aus. Die ausführliche Testevidenz und
Abgrenzung stehen in `agents/design/herdr-self-close-entwurf.md`.
## Reviewer-Einbindung, Eskalationskette und Rückfrage-Kanal (Entscheidungen 01.09.2026)
Entscheidungen zum Entwurf in `docs/herdr-eskalation-review-entwurf.md`. Die
Datei bleibt als Herkunfts- und Begründungsdokument bestehen; maßgeblich für
den laufenden Betrieb ist dieser Abschnitt.
### Reviewer als Standardschritt ab Risikoschwelle
Der Orchestrator zieht den Reviewer nicht vor jeder Aktivierungsfreigabe
automatisch hinzu, sondern ab einer Risikoschwelle. Review ist Pflicht, wenn
mindestens eines zutrifft:
- Der Diff berührt Boot, Netzwerk, Firewall, sshd, Secrets, Sandbox-/
Berechtigungskonfiguration oder eine Rollendatei/`agents/catalog.json`.
- Der Diff geht über eine kleine, klar lokal begrenzte Korrektur hinaus.
- Der Nutzer die Änderung selbst als riskant einstuft.
Der Nutzer kann das Reviewer-Hop für einen als unkritisch markierten Auftrag
ausdrücklich überspringen lassen ("ohne Review", "trivial"). `agents/
reviewer.md` selbst ändert sich dadurch nicht: read-only, keine Freigabe,
Auftrag ist bei einer Diff-Review immer der bereits feststehende Diff-Scope,
kein erneutes Volltext-Repo-Lesen. Bei einem Blocker-Befund geht die
Aktivierungsfrage nicht an den Nutzer, sondern zurück an den ursprünglichen
Spezialisten zur Korrektur.
### Eigenständiger Volltext-Systemaudit
Der Orchestrator kann den Reviewer zusätzlich mit einem eigenständigen
Volltext-Systemaudit des aktuellen `dev`-Stands beauftragen. Dieser Auftrag
hat keinen konkreten Diff als Grundlage und umfasst nach Auftrag die gesamte
NixOS-Plattform sowie die Agent-/Herdr-Pipeline. Der Reviewer liest dafür das
Repository vollständig; die Token-Reduktion „kein erneutes Volltext-Repo-Lesen“
gilt ausschließlich für die Diff-Review und ist beim Systemaudit
ausdrücklich ausgenommen.
Das Ergebnis ist genau ein schriftlicher Bericht unter
`docs/review/<slug>.md`, der zusätzlich vollständig im letzten Turn ausgegeben
wird. Der Reviewer bleibt read-only, nimmt keine Änderungen vor, erteilt keine
Aktivierungs-, Deployment- oder Veröffentlichungsfreigabe und bleibt vom
Self-Close-Mechanismus ausgeschlossen. Ein nicht beauftragter Sicherheitsfokus
schließt offensichtliche Sicherheitsbefunde als Nebenbefunde nicht aus.
Wegen des offenen Volltext-Scopes ist für diesen Auftrag das bestehende
Reviewer-Profil `gpt-5.6-sol` mit `high` angemessen; das Profil wird nicht als
neue Berechtigung verstanden und ändert keine laufenden Prozesse. Routine-
Diff-Reviews können weiterhin den konfigurierten Routine-Fallback verwenden.
### Eskalationskette bei Blockern
1. Blockierter Spezialist → Orchestrator: konkreter Befund, vermutete
Ursache, was zur Fortsetzung fehlt.
2. Orchestrator entscheidet, ob das Problem plattformseitig behebbar ist.
Wenn ja, geht ein eng begrenzter Korrekturauftrag an den zuständigen
Fixer, die ursprüngliche Meldung wörtlich (nicht paraphrasiert) als
Kontext:
- Technische Infrastrukturhürden (fehlendes Paket, fehlende Berechtigung,
kaputte Konfiguration) → **Administrator**.
- Lücke, Widerspruch oder fehlende Fähigkeit in einer Rollendatei oder in
`agents/catalog.json` → **Agent-Manager**, ab 01.09.2026 ebenfalls als
Fixer vorgesehen (siehe `agents/agent-manager.md`, Abschnitt
„Eskalationsannahme").
3. Der Fixer behebt nach seinem eigenen Vertrag (deklarativ/Rollendatei
ändern, prüfen, Diff berichten, Freigabe abwarten — die Reviewer-Schwelle
oben gilt auch hier).
4. Fixer → Orchestrator: Status ("aktiv" nach Freigabe, oder "bereit, wartet
auf Freigabe"). Kein automatischer Restart des blockierten Spezialisten
vor dieser Bestätigung.
5. Orchestrator → ursprünglich blockierter Spezialist: erst nach bestätigter
Behebung mit demselben Auftrag fortsetzen, knapp benennen was sich
geändert hat.
6. Ist das Problem nicht plattformseitig behebbar (fehlende
Nutzerentscheidung, fehlende externe Zugangsdaten, fachliche Unklarheit),
geht die Meldung direkt an den Nutzer statt an einen Fixer.
### Rückfrage-Kanal: Pilot bei Orga
Ein dritter Zustand neben "Turn beenden und im Ergebnisformat melden" und
"einfach weiterarbeiten": *blockiert mit Rückfrage, Turn bleibt offen*. Ab
01.09.2026 ausschließlich für die Rolle `orga` freigegeben (Pilot); alle
anderen sichtbaren Rollen behalten das bisherige Verhalten (Turn beenden,
idle, neu beauftragen), bis der Pilot ausgewertet und der Kanal ausdrücklich
erweitert wird.
Mechanismus (Details und Grenze in `agents/orga.md`, Abschnitt
„Rückfrage-Kanal (Pilot)"):
1. Spezialist meldet über `herdr pane report-agent <pane_id> --source <id>
--agent <label> --state blocked --message "<konkrete Frage>"` und wartet,
statt den Turn zu beenden.
2. Orchestrator bekommt das über `herdr agent wait <target> --status blocked
--timeout <ms>` mit.
3. Orchestrator schickt die Antwort in dieselbe Pane (`herdr pane run
<pane_id> "<Antwort>"` + `herdr pane send-keys <pane_id> Enter`) — Session,
Kontext und Prompt-Cache bleiben erhalten.
4. Spezialist arbeitet im selben Turn weiter.
**Grenze, nicht verhandelbar:** ausschließlich für fehlende fachliche Angaben
oder Nutzerentscheidungen (Datum, Ziel, Formulierung, Auswahl zwischen
Optionen). Ersetzt nicht die Capability-Handoff-Kette aus `agents/orga.md`
und ist kein Weg, eine Berechtigungs- oder Scope-Ausweitung "schnell" über
einen relayten Chat-Text bestätigen zu lassen — siehe der Vorfall vom
31.08.2026 in `agents/orga.md` (Referenzhandoff). Eine automatische
technische Durchsetzung dieser Grenze (z. B. Ablehnung von
`--state blocked`-Nachrichten mit erkennbaren Capability-Schlüsselwörtern)
ist bewusst noch nicht gebaut — der Pilot läuft zunächst mit ausschließlich
promptbasierter Grenze bei einer einzigen Rolle, bevor sich zusätzlicher
technischer Aufwand rechtfertigt.
### Token-Reduktion
Aus dem Entwurf übernommen, keine Kürzung von Sicherheitsregeln:
- Reviewer-Scope auf den feststehenden Diff begrenzen, kein erneutes
Volltext-Repo-Lesen. Ausnahme: Der eigenständige Volltext-Systemaudit ist
ausdrücklich auf das vollständige Lesen des aktuellen Repository-Stands
ausgelegt.
- Eskalationsmeldungen wörtlich weiterreichen statt sie zusammenzufassen.
- Reasoning-Effort nach Aufgabentyp: eng spezifizierte Korrektur →
Standardprofil, offene Fehlersuche → `sol`/`high` nur bei tatsächlichem
Bedarf (bestehende Regel oben gilt unverändert).
- Panes innerhalb einer zusammenhängenden Auftragskette wiederverwenden statt
neu spawnen, wenn derselbe Spezialist ohnehin für einen Folgeauftrag im
selben Kontext gebraucht wird.