The Operator's ===OPERATOR-DECISION=== schema gains an optional "escalation" field (<=2 steps of model/reasoning_effort/iteration_limit, validated against a new per-runtime orchestration.MODEL_POOL allowlist): per-parent for direct_builder, per-child for split. On limit_reached, completion_watcher.py now walks this ladder (via the shared fanout.escalation_ladder_for()) instead of a single flat identical-params retry, escalating model/iteration_limit before falling back to today's manual repair/Aufteilen-angefordert checkpoints. A card that never went through the Operator keeps its existing flat single-retry behavior unchanged. orchestration.child_failed(), fanout.child_terminal(), and trigger.py's Aufteilen-angefordert guard all switch from the old hardcoded ">= 1" threshold to the card's actual ladder length. board.html surfaces the current attempt count on affected cards. Also includes the board-session-usage-indicator research writeup (Codex app-server JSON-RPC + Claude /api/oauth/usage as the two non-interactive usage sources) and its Operator-produced child intents, plus the operator_klaerung_noetig phase-visibility fix already staged in this checkout (distinct phase for a needs_human/crashed Operator run that never produced children, instead of reusing "durch_kinder_blockiert"). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyeDivnWm6hgiNd3YKjK7Z
3.6 KiB
3.6 KiB
Intent: Codex-Nutzungsquelle im Board-Usage-Endpunkt
Ziel
Die in der Vorkarte board-usage-endpoint-claude bereits vorgesehene,
aber leere Codex-Seite von GET /api/board/usage mit echten Werten
befüllen: verbrauchte Prozent im 5-Stunden- und im Wochenfenster der
geteilten interaktiven drone-Codex-Identität.
Umfang
- In
hosts/blunix/localServices/board-agent/trigger.py:codex app-serverals kurzlebigen Kindprozess starten und über dessen Stdio-JSON-RPC-Protokoll zuerstinitialize, danachaccount/rateLimits/readsenden.- Aus der Antwort
rateLimits.primary.usedPercent(5-Stunden-Fenster) undrateLimits.secondary.usedPercent(Wochenfenster) sowie die jeweiligenresetsAt-Zeitstempel auslesen und in die bestehendencodex-Felder der Antwort schreiben. Der Antwortvertrag der Vorkarte bleibt unverändert. - Kurzes Timeout (wenige Sekunden) und garantiertes Aufräumen des Kindprozesses (auch bei Timeout) sicherstellen.
- Vollständige Fehlerisolierung: jeder Fehler führt nur zu
nullauf der Codex-Seite; die Claude-Seite bleibt unabhängig nutzbar.
- In
hosts/blunix/localServices/board-agent.nix:- Ein eigenes, dauerhaftes und beschreibbares Probe-
CODEX_HOMEunterhalb des bestehendenstateDir(/var/lib/board-agent) definieren und dem Trigger-Service über eine Umgebungsvariable bekannt machen. Es ist bewusst getrennt vom bestehendencodexHomeder isolierten Builder-Identität. ProtectHome = "read-only"bleibt unverändert; es wird kein Sandbox-Downgrade vorgenommen.
- Ein eigenes, dauerhaftes und beschreibbares Probe-
auth.jsonwird vor jeder Abfrage frisch aus/home/drone/.codex/auth.jsonin das Probe-CODEX_HOMEkopiert (nicht nur einmalig beim Servicestart wie beim bestehendenprepareCodexHome-Muster), damit ein rotiertes Token ohne Neustart des dauerhaft laufenden Dienstes wirksam wird.- Tests in
test_board_agent.pymit gefälschtem Subprozess: Erfolgsfall, fehlendes Binary, Timeout, kaputte/unerwartete RPC-Antwort, frisches Kopieren vonauth.json. - Kurze Ergänzung in
README.mdzum Probe-CODEX_HOMEund zur Codex-Quelle.
Explizit ausgeschlossen
- Keine Änderung am Antwortvertrag oder an der Claude-Seite des Endpunkts.
- Keine UI-Änderung in
board.html(eigene Folgekarte). - Kein dauerhaft laufender
codex app-server-Dienst; pro Abfrage ein kurzlebiger Kindprozess. - Kein Abschwächen von
ProtectHomeoder anderer Sandbox-Optionen. - Kein Verlauf/Graph, keine Alarmierung, keine Aufschlüsselung pro Rolle.
Annahmen
codex app-serverbeantwortetaccount/rateLimits/readnach eineminitialize-Handshake nicht-interaktiv und in deutlich unter einer Sekunde; eine laufende Instanz ist nicht nötig.codex app-serverschreibt beim Start breit in seinCODEX_HOME(SQLite-Dateien, Caches), weshalb ein eigenes beschreibbares Probe-Verzeichnis nötig ist.- Die Kopierkosten von
auth.json(wenige KB) sind bei einem Poll-Intervall von rund 60 Sekunden vernachlässigbar.
Offene Risiken
codex app-serverist als "[experimental]" markiert; Methodenname und Antwortstruktur können sich ändern. Die Fehlerisolierung ist deshalb verpflichtend.- Der Kindprozess darf bei Fehlern nicht als Zombie zurückbleiben oder den Request blockieren.
Erfolgskriterien
GET /api/board/usageliefert echte Codex-Prozentwerte, bei Fehlern eine Leerdarstellung, und die Claude-Seite bleibt davon unberührt.- Nix-Auswertung der geänderten
board-agent.nixund der Testlauf vontest_board_agent.pysind fehlerfrei. - Keine Secrets oder Rohdaten verlassen den Endpunkt.