Audit ergab: "Tag archivieren" sichert/leert nur verlauf.log. Die rohen
stdout/stderr-Logs (telefon/autostart.log vom launchd-Watchdog
net.dillenberg.fonagent, alle 5 Min; watcher.log/leitstand.log/monitor.log)
wachsen unbegrenzt - autostart.log stand bei 523 KB/16595 Zeilen ohne jede
Bereinigung. audit.log ist bewusst permanent (Compliance, unveraendert).
starten.sh kuerzt diese vier Dateien jetzt ab 2 MB auf die letzten 2000
Zeilen (in-place, gleiches Inode) - laeuft ohnehin alle 5 Min per Watchdog.
Redirects von > auf >> umgestellt (O_APPEND), damit die In-Place-Kuerzung
fuer die noch laufenden Prozesse sicher ist (kein Datenverlust durch
gecachte Schreib-Offsets).
pipe.protokoll.raeume_archiv_auf() loescht verlauf-archiv/*.log aelter als
90 Tage - lief bisher unbegrenzt an. Eingehaengt in pipe.watch's ohnehin
taeglichen Check (bisher nur fuer LOESCHFRIST_TAGE), jetzt unabhaengig davon.
Getestet: Kuerz-Logik (3,8 MB -> 2000 Zeilen) und raeume_archiv_auf()
(gezielt gealterte Testdatei geloescht, Rest unangetastet) isoliert
verifiziert, echte Dateien nicht angefasst.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
Dienste-Ampel (Telefon, Verarbeitung, Spracherkennung, Nextcloud) alarmierte
bisher nur im offenen Leitstand. pipe/monitor.py laeuft jetzt als eigener
Dauerprozess, prueft dieselbe Ampel (neu ausgelagert nach pipe/dienste.py)
periodisch und alarmiert bei Stoerung lokal per macOS-Benachrichtigung + Ton
(pipe/alarm.py) - unabhaengig davon, ob pipe.watch oder pipe.server laufen.
Wird ab jetzt von telefon/starten.sh mitgestartet.
Verschluesselung at rest: keine App-eigene Verschluesselung eingebaut,
stattdessen im README als Betreiber-Pflicht dokumentiert (FileVault aktivieren)
- App verlaesst sich auf Festplattenverschluesselung durch das Betriebssystem.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
Der Event-Socket-Port war fest auf 8099 vorgegeben - ein Wert, der nur auf dem
ersten Rechner stimmt. Auf der zweiten Maschine hoert FreeSWITCH auf 8022;
fs_cli antwortet dann nicht, starten.sh sieht den Trunk nie als registriert und
bricht ab, obwohl alles laeuft.
starten.sh uebernimmt die Werte jetzt aus der .env - wie pipe/config.py, mit
Vorrang fuer bereits gesetzte Umgebungsvariablen. FS_PORT und FS_ETC stehen
dokumentiert in .env.example.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pj3mSmL397czPaCfbL27Z
Nimmt Anrufe einer Hausarztpraxis entgegen, transkribiert sie lokal,
kategorisiert das Anliegen und legt es strukturiert ab. Keine Patientendaten
verlassen den Rechner: Spracherkennung, Sprachmodell und Sprachsynthese laufen
lokal, im Datenpfad steht kein Cloud-Dienst.
Aufbau:
- FreeSWITCH nimmt über einen SIP-Trunk an, spielt die Ansage und nimmt auf.
- pipe.watch erkennt fertige Aufnahmen und schiebt sie durch die Pipe.
- whisper.cpp transkribiert, ein lokales Sprachmodell (Ollama) ordnet in
Kategorie und Dringlichkeit ein — mit erzwungenem JSON-Schema.
- Ablage lokal, optional Nextcloud (WebDAV) und ein Deck-Board.
- Leitstand (pipe.server): Board mit Eingang/In Bearbeitung/Rückfragen/Erledigt,
Aufnahmen zum Anhören, Verlauf und Ampeln für alle beteiligten Dienste.
Zugangsdaten und Anrufdaten liegen außerhalb des Repositorys (.env, ablage/,
telefon/). Konfiguration siehe .env.example, Einrichtung siehe README.