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/agents/design/herdr-self-close-entwurf.md
pijukka 55b692ea21 Planner darf sein eigenes Intent-Dokument selbst schreiben; Self-Close-Fix bestätigt
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
2026-09-01 20:52:18 +02:00

146 lines
7.4 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.

# 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:
1. Die letzte sichtbare Übergabe endet mit `COMPLETE`; es gibt keine offene
Rückfrage und keinen `BLOCKED: …`-Zustand.
2. Das vollständige Ergebnis steht vor dem Schließen lesbar im letzten Turn.
3. 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.json`
- `agents/claude-settings/agent-manager.json`
- `agents/claude-settings/grafiker.json`
- `agents/claude-settings/orga.json`
- `agents/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.json` stimmen 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.