Anbinden · Weg C

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/**/*.jsonl ab der letzten Position, nimmt nur Assistenten-Zeilen mit usage (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 an POST /v1/ereignisse. Jede Sitzung wird ein Lauf; der Agent heißt wie die Routine, sonst interaktiv.
  • 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, verweigert PreToolUse das 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.py schreibt ihn, der Einleser meldet ihn. Daraus rechnet Tokenwacht die Wochenlimit-Prognose und die Ampel.
  • OTel (optional): Claude Code exportiert seine eigenen Kosten (cost_usd) nach POST /otlp/v1/logs und /otlp/v1/metrics (http/json, Bearer = derselbe Schlüssel). Tokenwacht vergleicht je Tag: Einleser gegen OTel, die Erklärungsquote.

Einrichtung

  1. Im Cockpit unter Konto einen Schlüssel mit Bereich „Ingest“ anlegen und nach ~/.tokenwacht/claudecode/schluessel schreiben (Rechte 600). Nie in settings.json, nie in einen Chat.
  2. sh sdk/claude-code-waechter/einrichten.sh kopiert die Dateien und lädt den launchd-Agenten de.tokenwacht.claudecode.
  3. In ~/.claude/settings.json den Block hooks aus sdk/claude-code-waechter/README.md eintragen (ein vorhandener Hook bleibt stehen). Laufende Sitzungen übernehmen Stop- und Subagent-Hooks sofort, neue Sitzungen alle.
  4. 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

  1. 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.
  2. In ~/.claude/settings.json (global) oder .claude/settings.json (je Projekt) den Hook eintragen:
    {
      "hooks": {
        "Stop": [{ "hooks": [{ "type": "command", "command": "TOKENWACHT_KEY=tw_live_… python3 /Users/ich/.tokenwacht/tokenwacht_hook.py" }] }]
      }
    }
    Optional: TOKENWACHT_AGENT (Standard claude-code), TOKENWACHT_KUNDE für die Weiterbelastung, TOKENWACHT_URL im Selbstbetrieb.
  3. 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.