Auf Nutzerwunsch: planner (role-version 2.0.0, Major wegen geänderter Vertrauensgrenze) darf bei COMPLETE genau eine Datei selbst anlegen — docs/intent/<slug>.md — statt das Dokument nur als Text zu liefern und auf den Orchestrator zum Ablegen zu warten. Erster Versuch nutzte Write(...)- Regeln in den Claude-Settings, die von der Permission-Prüfung ignoriert werden (nur Edit(path) gilt für dateischreibende Tools); korrigiert auf Edit(docs/intent/*.md) ohne pauschalen Edit(**)-Deny (deny hätte sonst die gezielte Freigabe überstimmt). Live mit echten claude --print-Läufen gegengeprüft: Schreiben innerhalb docs/intent/ gelingt, außerhalb bleibt blockiert. Zusätzlich: Self-Close-E2E-Nachtest für planner (Claude-Runtime) nach dem vorherigen Befehlsketten-Fix bestanden — Pfad ist jetzt live E2E bestätigt, nicht mehr nur konfiguriert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uSxdbo8zykSeH5WCMmbvp
7.4 KiB
Atomic Self-Close für Herdr-Spezialisten
Status: am 01.09.2026 auf blunix live getestet. Dieses Dokument hält die freigegebene Sicherheitsgrenze, die beiden Laufzeitpfade und die bestätigte Evidenz fest. Die frühere Empfehlung für ausschließlich orchestrator-getriebenes Ernten ist durch die Nutzerentscheidung für echtes Self-Close überholt.
Geltungsbereich
Self-Close gilt für die sichtbaren Rollen graphics, administrator,
agent-manager und orga. Der Reviewer bleibt ausdrücklich ausgeschlossen:
Seine Rolle ist read-only, seine Claude-Settings enthalten kein
Self-Close-Recht und seine Pane wird bei Bedarf durch den Orchestrator
geschlossen.
Nachträglich um planner erweitert (siehe agents/planner.md): gleicher
Wrapper, gleiche drei Bedingungen, gleiche Claude-Allowlist-Struktur. Die
oben beschriebene Codex-Live-Evidenz vom 01.09.2026 bezieht sich
ausschließlich auf die vier ursprünglichen Rollen; für planner liegt kein
eigener Codex-Test vor, dafür aber inzwischen ein erfolgreicher
Claude-E2E-Test (siehe Abschnitt "Claude-Laufzeitpfad" unten) — für die
anderen vier Rollen bleibt der Claude-Pfad weiterhin nur konfiguriert, nicht
E2E-verifiziert.
Die Capability erlaubt ausschließlich das Schließen der eigenen Pane. Sie ist
keine Freigabe, fremde Panes zu starten, zu fokussieren, zu ersetzen oder zu
schließen. Insbesondere bleibt ein freier Aufruf von herdr pane close <pane-id> für Spezialisten verboten.
Gemeinsames Sicherheitsprimitive
Der Wrapper /etc/scripts/close-my-pane.sh ist auf blunix live. Er bezieht die
Ziel-ID ausschließlich aus $HERDR_PANE_ID der aufrufenden Pane und ignoriert
alle Argumente. Ein Test aus einer rohen Herdr-Shell bestätigte, dass er nur
die eigene Pane schließt.
Vor jedem Aufruf müssen alle Bedingungen gleichzeitig erfüllt sein:
- Die letzte sichtbare Übergabe endet mit
COMPLETE; es gibt keine offene Rückfrage und keinenBLOCKED: …-Zustand. - Das vollständige Ergebnis steht vor dem Schließen lesbar im letzten Turn.
- Der Orchestrator hat das Ergebnis nachweislich gelesen und den Spezialisten ausdrücklich zum Self-Close freigegeben.
Fehlt eine Bedingung, bleibt der Spezialist idle. Der Wrapper wird nie als Teil einer Befehlskette und nie mit Argumenten aufgerufen. Das Schließen ist der unwiderrufliche letzte Schritt; Pane und Kontext sind danach nicht mehr verfügbar.
Codex-Laufzeitpfad (0.145)
Codex unter workspace-write blockiert den direkten Wrapper-Aufruf. Deshalb
muss Codex als einzigen Befehl exakt /etc/scripts/close-my-pane.sh mit
sandbox_permissions=require_escalated aufrufen. Shell-Präfixe, Argumente,
Umleitungen oder verkettete Befehle gehören nicht zu diesem Pfad.
Beim bestätigten Test wurde die angebotene Prefix-Rule nativ über Option p
gespeichert. Codex schrieb sie in ~/.codex/rules/default.rules; sie erlaubt
genau den Wrapper außerhalb der Sandbox. Danach schloss das Testpane w5:pQ
erfolgreich, während der Orchestrator bestehen blieb.
Für Codex 0.145 nicht wirksam waren separat bereitgestellte Rule-Dateien unter
/etc/codex/rules sowie symlinked User-Rules. Sie dürfen deshalb weder als
Voraussetzung noch als erfolgreiche Konfiguration dokumentiert werden. Die
native Prefix-Rule ist Laufzeitkonfiguration außerhalb des Repositorys; der
Rollentest prüft nur den dokumentierten Aufrufvertrag und setzt keine Datei im
Home-Verzeichnis voraus.
Wiederherstellung nach Verlust der Prefix-Rule
~/.codex/rules/default.rules liegt außerhalb dieses Repositorys und wird von
keiner Nix-Aktivierung erzeugt oder gesichert. Ein frisches Home-Verzeichnis
(Neuaufsetzen von blunix, Fork, versehentliches Löschen) verliert die Regel
kommentarlos — Codex fällt dann wieder auf das blockierte Verhalten unter
workspace-write zurück, ohne Fehlermeldung im Rollenvertrag selbst.
Erkennbar daran, dass ein sonst korrekt vorbereiteter Self-Close-Aufruf ohne
sichtbaren Grund hängen bleibt oder eine Sandbox-Eskalationsabfrage auslöst,
die vorher nicht kam.
Wiederherstellung: den Wrapper-Aufruf einmal regulär auslösen (Bedingungen aus
dem Abschlussprotokoll oben erfüllt), die von Codex angebotene Prefix-Rule
über Option p erneut bestätigen. Der erwartete Regelinhalt ist als
deklarative Referenz in hosts/globalServices/herdr-self-close.nix unter
/etc/codex/rules/herdr-self-close.rules hinterlegt — Codex 0.145 liest diese
Datei nicht selbst (siehe oben), sie dient ausschließlich als Repo-Referenz,
mit welchem exakten Wortlaut die interaktive Bestätigung übereinstimmen muss.
Claude-Laufzeitpfad
Claude ruft exakt Bash(/etc/scripts/close-my-pane.sh) auf. Die fünf
rollenspezifischen Allowlist-Einträge sind vorhanden:
agents/claude-settings/administrator.jsonagents/claude-settings/agent-manager.jsonagents/claude-settings/grafiker.jsonagents/claude-settings/orga.jsonagents/claude-settings/planner.json
Jeder Claude-Start und jedes Resume muss weiterhin die katalogisierte
Settings-Datei explizit per --settings laden. Ein nacktes Resume erbt die
Rollen-Allowlist nicht zuverlässig.
Beim ersten Claude-E2E-Test der Rolle planner wurde nicht Bash generell
gesperrt: Der abgelehnte Aufruf war eine Diagnose-Befehlskette
(echo ...; echo ...; ls ...) statt eines Versuchs des erlaubten exakten
Einzelbefehls. 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, statt den
tatsächlich erlaubten Befehl zu versuchen.
Beobachtung/Hypothese zum Permission-Matching (nicht als verifizierter Plattform-Fakt): Die schmale Exact-Match-Bash-Regel lehnt offenbar jede Nicht-Exact-Nutzung desselben benannten Pfads ab, statt auf ein generisches Safe-Read-Verhalten zurückzufallen.
Nachtest bestanden (01.09.2026, Rolle planner, Testpane w5:pY): Mit
dem korrigierten Rollenvertrag (nur der exakte Einzelbefehl, keine
Vorab-Diagnose per Bash) erreichte planner COMPLETE und schloss nach
Orchestrator-Freigabe erfolgreich selbst — die Pane verschwand sofort ohne
erneute Ablehnung. Der Claude-Pfad ist damit für planner live
E2E-verifiziert. Für Administrator, Agent-Manager, Grafiker und Orga steht
ein eigener Claude-E2E-Lauf weiterhin aus; für diese vier bleibt der Pfad
"konfiguriert, aber nicht live E2E-verifiziert".
Bestätigte Regressionen und Restgrenze
Die statischen Rollentests sichern:
- Rollenheader und
agents/catalog.jsonstimmen für die fünf Self-Close-Rollen überein. - Alle fünf Rollen nennen den exakten Codex-Aufruf einschließlich
sandbox_permissions=require_escalated, sowie das Verbot von Befehlsketten/Vorab-Diagnosen für den Claude-Pfad. - Die fünf Claude-Allowlist-Einträge erlauben exakt den Wrapper, kein breites
Bash(*)und kein freies Herdr-Pane-Recht. - Reviewer-Rolle und Reviewer-Settings bleiben frei von Self-Close.
- Der Harness liest keine externen Home- oder System-Rule-Dateien.
Der offene Nachweis ist der Claude-E2E-Lauf für die verbleibenden vier
Rollen (Administrator, Agent-Manager, Grafiker, Orga) — für planner liegt
er inzwischen vor (siehe oben). Ein Nachweis erweitert keine Berechtigung
und erfordert keine weitere NixOS-Aktivierung. Bis er für eine Rolle
erfolgreich ausgeführt wurde, muss jede Dokumentation für diese Rolle
zwischen „Allowlist vorhanden“ und „E2E bestätigt“ unterscheiden.