Claude Code
Zwei Wege: der Wächter (Einleser plus Hooks, seit Phase 35) misst jede Anfrage mit Schattenpreis, kennt Routinen und Sitzungen, hält Budgets ein und holt seine Regeln aus dem Cockpit. Der einfache Stop-Hook meldet nur die Nutzung je Antwort. Inhalte werden in beiden Fällen nie gelesen; beide stören Claude Code nie, auch nicht ohne Netz.
Weg C1: der Wächter (empfohlen)
Dateien im Repository: sdk/claude-code-waechter/. Was er tut:
- Einleser (launchd, alle 60 Sekunden): liest
~/.claude/projects/**/*.jsonlab der letzten Position, nimmt nur Assistenten-Zeilen mitusage(Modell, Eingabe, Ausgabe, Cache 5 Minuten und 1 Stunde, Cache-Lesen, Zeit, Sitzung, Anfrage-Kennung, Aufwand, Subagent), entfernt Streaming-Doppel, ordnet die Sitzung über die Sitzungsdateien der Desktop-App einer Routine (geplanten Aufgabe) zu, rechnet den Schattenpreis nach Listenpreis und meldet anPOST /v1/ereignisse. Jede Sitzung wird ein Lauf; der Agent heißt wie die Routine, sonstinteraktiv. - Hooks (
SessionStart,PreToolUse,SubagentStart/Stop,Stop): lesen nur Kennungen und die lokale Standdatei, die der Einleser schreibt. Ist das Laufbudget (Standard 2 €), das Tagesbudget einer Routine (3 €) oder das Budget aller Routinen (5 € je Stunde, 15 € je Tag) erreicht, verweigertPreToolUsedas Werkzeug mit Begründung; ab dem 1,5-fachen endet der Lauf. Im Strengmodus (ab 90 % Wochenlimit, bei eingeschaltetem Nutzungsguthaben, bei Ampel Rot oder von Hand) werden aufschiebbare Routinen abgewiesen und nach dem Reset nachgeholt. - Abo-Stand: eine ohnehin laufende Routine fragt den Limitstand der App ab (
get_usage),abo_stand.pyschreibt ihn, der Einleser meldet ihn. Daraus rechnet Tokenwacht die Wochenlimit-Prognose und die Ampel. - OTel (optional): Claude Code exportiert seine eigenen Kosten (
cost_usd) nachPOST /otlp/v1/logsund/otlp/v1/metrics(http/json, Bearer = derselbe Schlüssel). Tokenwacht vergleicht je Tag: Einleser gegen OTel, die Erklärungsquote.
Einrichtung
- Im Cockpit unter Konto einen Schlüssel mit Bereich „Ingest“ anlegen und nach
~/.tokenwacht/claudecode/schluesselschreiben (Rechte 600). Nie insettings.json, nie in einen Chat. sh sdk/claude-code-waechter/einrichten.shkopiert die Dateien und lädt den launchd-Agentende.tokenwacht.claudecode.- In
~/.claude/settings.jsonden Blockhooksaussdk/claude-code-waechter/README.mdeintragen (ein vorhandener Hook bleibt stehen). Laufende Sitzungen übernehmen Stop- und Subagent-Hooks sofort, neue Sitzungen alle. - Prüfen: Cockpit → Claude Code zeigt die ersten Sitzungen; der Einleser schreibt
~/.tokenwacht/claudecode/einleser.log.
Was Tokenwacht daraus macht
Detektoren: Kontextwucherung, Cache-Verlust, Modell-Fehlwahl (Opus oder Fable in einer Routine ohne Freigabe), Ausreißer, Kostensprung, Gleichstart, Leerschleife, Fehlersturm. Tagesbericht um 07:30 (ntfy): teuerste Läufe, Routinen gegen Vorwoche, Wochenlimit-Prognose, offene Befunde, Erklärungsquote. Montags das Routinen-Register (Läufe, Kosten je Lauf, Dauer, Hänger, kurze Läufe, Doppelungen über den Fingerabdruck der Anweisung). Modell und Zeitplan einer Routine stehen nur im Formular der Desktop-App — Tokenwacht schlägt vor, ändert sie nicht.
Weg C2: der einfache Stop-Hook
Ein Stop-Hook liest nach jeder Antwort das Sitzungstranskript und meldet die Nutzungsangaben je Antwort an Tokenwacht. Jede Sitzung wird ein Lauf, der Agent heißt claude-code. Ohne Routinen-Zuordnung, ohne Budgets.
Einrichtung
- Skript aus dem Repository holen:
sdk/claude-code-hook/tokenwacht_hook.py(Python 3, keine Abhängigkeiten). Ablegen z. B. unter~/.tokenwacht/tokenwacht_hook.py. - In
~/.claude/settings.json(global) oder.claude/settings.json(je Projekt) den Hook eintragen:
Optional:{ "hooks": { "Stop": [{ "hooks": [{ "type": "command", "command": "TOKENWACHT_KEY=tw_live_… python3 /Users/ich/.tokenwacht/tokenwacht_hook.py" }] }] } }TOKENWACHT_AGENT(Standardclaude-code),TOKENWACHT_KUNDEfür die Weiterbelastung,TOKENWACHT_URLim Selbstbetrieb. - Eine Frage an Claude Code stellen. Nach der Antwort läuft der Hook und meldet die Nutzung.
Was gemeldet wird
Je Assistenten-Antwort: Modell, Eingabe-, Ausgabe-, Cache-Lese- und Cache-Schreib-Token, Zeitpunkt, Sitzung als Lauf-Kennung; beim Wächter zusätzlich Routine, Aufwand, Rechtemodus, Einstieg, Subagent und ein Abo-Schnappschuss. Nicht: Prompts, Antworten, Dateiinhalte, Werkzeugargumente (der Wächter hasht sie nur für die Leerschleife). Mehrfaches Senden ist unschädlich, Tokenwacht dedupliziert über die Ereignis-Kennung.
Im Team
Jede Entwicklerin nutzt ihren eigenen Tokenwacht-Schlüssel mit Geltungsbereich „Ingest“; der Schlüssel identifiziert den Menschen. Ein Projekt je Mensch oder je Rechner (im Cockpit) macht Kosten je Person sichtbar; Routinen erscheinen als eigene Agenten.
Prüfen: Nach der ersten Antwort Anbindung prüfen — Quelle ingest, Agent interaktiv oder der Name der Routine. Fehlt der Aufruf: python3 ~/.tokenwacht/claudecode/einleser.py --probe zeigt, was der Einleser lesen würde; Fehler landen in einleser.log.