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
2.8 KiB
2.8 KiB
Intent: Nutzungsanzeige in der Board-Kopfzeile
Ziel
Ein kleines, dauerhaft sichtbares UI-Element im Intent-Board, das auf einen Blick zeigt, wie viel Prozent des aktuellen Nutzungslimits für Claude Code und Codex CLI noch übrig sind — damit vor dem Losschicken einer Karte sichtbar ist, ob überhaupt noch Spielraum besteht.
Umfang
- In
hosts/blunix/localServices/board-agent/board.html:- Ein kompaktes Element in der bestehenden
<header>-Zeile neben<h1>Intent-Board</h1>(oder als schmale eigene Leiste direkt darunter), unauffällig gestaltet im vorhandenen Stil. - Periodischer Abruf von
GET /api/board/usagealle 60 Sekunden, getrennt vom bestehendensetInterval(render, 5000), plus ein initialer Abruf beim Laden. - Anzeige der verbleibenden Prozent, berechnet aus den vom Endpunkt
gelieferten verbrauchten Prozent (
100 - used_percent, auf ganze Prozent gerundet und auf 0..100 begrenzt), knapp formatiert, etwa "Claude: 60 % übrig · Codex: 0 % übrig". - Der Endpunkt liefert je Anbieter ein 5-Stunden- und ein
Wochenfenster; angezeigt wird pro Anbieter der knappere der beiden
Werte (also das kleinere "übrig"), damit die Anzeige nie zu
optimistisch ist. Die
resets_at-Zeitstempel dürfen höchstens alstitle-Tooltip erscheinen. - Bei
nulloder fehlgeschlagenem Abruf für einen Anbieter dessen Wert als "—" darstellen; die jeweils andere Seite bleibt sichtbar. Ein fehlgeschlagener Abruf darf das übrige Board-Rendering nicht stören.
- Ein kompaktes Element in der bestehenden
- Ein Strukturtest in
test_board_agent.pyim Stil der vorhandenenboard.html-Tests (Vorhandensein des Elements, des Abrufs von/api/board/usageund des 60-Sekunden-Intervalls).
Explizit ausgeschlossen
- Keine Änderung an
trigger.py,board-agent.nixoder am Antwortvertrag des Endpunkts. - Kein neuer Dialog, keine neue Spalte, keine Änderung an Board-Spalten oder Trigger-Logik.
- Kein Verlauf/Graph über die Zeit, keine Alarmierung bei niedrigem Kontingent, keine Aufschlüsselung pro Rolle.
Annahmen
GET /api/board/usageexistiert bereits und liefert je Anbieterfive_hour_used_percent,seven_day_used_percentund die zugehörigenresets_at-Felder, jeweils möglicherweisenull.- Der Endpunkt gibt bereits nur berechnete Prozentwerte heraus; das Frontend braucht keine zusätzliche Filterung von Secrets.
Offene Risiken
- Bei dauerhaft fehlschlagendem Endpunkt darf die Kopfzeile nicht flackern oder Fehlermeldungen aufdrängen; die Leerdarstellung muss ruhig bleiben.
Erfolgskriterien
- Das Board zeigt einen aktuellen, unaufdringlichen Prozentwert für Claude und für Codex oder eine klare Leerdarstellung.
- Die Anzeige aktualisiert sich ohne Seitenneuladen.
- Der Testlauf von
test_board_agent.pyist grün.