Abnahme-Matrix — Watson Phase 0 Kern

Stand: 2026-05-24 · Alle 14 Karten heute live geprüft + 4 Karten aktualisiert · Randthemen (Pi, Diashow, Sonos, Roborock, WhatsApp, Voice Library) → separate Werkzeug-Abnahme
Systemstatus: Phase 0 — Kern stabil, 2 offene Punkte 1 ROT-Punkt: Alltagszugang Terminal-only — Watson Doctor, Backup, Notaus brauchen GUI.
Mail-Wrapper: Senden deferred (korrekt). IMAP-Lesen ist Phase 1, SMTP-Adresse bekannt ([email protected]).
Router-Tests 8/8 grün · Backup frisch mit .watson bestätigt · Restore-Test bestanden · state.json bereinigt.
Phase 0 als Rainer-Weg bestätigt — kein Daemon nötig solange kein neues externes Tool aktiv.
1
🟢 Grün
12
🟡 Gelb
1
🔴 Rot
Sicherheits-Kern
🟡 Action Router / Estrich-Ehrlichkeit 8/8 Tests grün, Estrich-Aufrufe offen
✓ lib/action_router.py, 340 Zeilen
✓ is_blocked() in route_action()
✓ "Phase 0 Estrich, Phase 2 blocken"
✓ 8/8 Tests grün (2026-05-23 heute)
⚠ 8 Funde (webrtc, diarize, cockpit)
✗ nicht nachweisbar
Befund Action Router ist korrekt gebaut. Self-Test läuft 8/8 grün — Tests wurden auf aktuelle Template-Namen (bau, home, schreiber) angepasst. Unbekannter Sancho, Blocked-Tool, Notaus gelb/schwarz, GO-Pflicht — alle Szenarien bestanden. 8 Direktaufrufe (watson_webrtc.py, diarize_watson.py, cockpit-Dateien) umgehen den Wrapper — Watson Doctor nennt sie explizit als "Phase 0 Estrich, Phase 2 hart blocken".
Nächster Schritt (Phase 2)8 os.unlink-Funde prüfen: alle /tmp? Wenn ja als "erlaubte /tmp-Ausnahme" dokumentieren. Wenn nicht: auf safe_delete() umstellen.
Beleg: python3 lib/action_router.py --test → "Alle Tests gruen." 2026-05-23 live
🟡 Notaus — echte Blockade Struktur ok, Live-Test ausstehend
✓ vorhanden, Level: off
✓ is_blocked() in route_action()
✓ gelb/rot/schwarz + Blocks
⚠ nicht heute
✗ Phase 2 (Umbauplan)
Befund Notaus und Action Router sind korrekt verdrahtet (router importiert is_blocked, prüft vor jeder Aktion). Aber: ob "gelb blockt send" und "rot stoppt Sanchos" heute noch durchhalten, wurde nicht live getestet. Karabiner-Bindung war im Umbauplan explizit als Phase 2 eingestuft.
Nächster Schritt (wenn Action Router Tests fix sind)Notaus auf gelb → route_action send → Blockade beobachten → zurück auf off.
Beleg: lib/notaus.py + lib/action_router.py Z. 127–130, heute gelesen. ~/.watson/notaus.json: level=off
🟡 Mail-Wrapper (lib/mail_send.py) Senden explizit deferred — IMAP lesen ist Phase 1
✓ Empfänger + Text gezeigt, "yes" nötig, Audit geloggt
✓ getestet (no/y/leer alle geblockt)
✓ Nein — Mail-Sancho primär zum Lesen
[email protected] — wenn Senden je nötig
⚠ nicht implementiert — Phase 1
Befund Klärung 2026-05-24: Mail-Sancho soll primär lesen, nicht senden. Der Send-Wrapper (Phase 0) ist korrekt gebaut — kein Backend absichtlich, Bestätigungsflow schützt vor versehentlichem Senden. Wenn Senden je nötig: SMTP via [email protected]. IMAP-Lesen ist der eigentliche nächste Schritt, noch nicht implementiert.
Nächster Schritt (Phase 1)IMAP-Reader implementieren: lib/mail_read.py — Postfach lesen, Headers extrahieren, über Broker an Sancho liefern. SMTP-Send weiter deferred.
Beleg: Victor 2026-05-24 "IMAP lesen reicht, SMTP weglassen. [email protected] wenn Senden je nötig."
🟡 safe_delete / rm-Block Wrapper ok, 8 Direktaufrufe außen
✓ lib/file_ops.py, 12 Test-Szenarien
✓ Downloads, Desktop, iCloud, Volumes
✓ Vibe Coding/dispatcher, Vibe Coding 2
⚠ 8 os.unlink-Funde (Watson Doctor)
Befund Wrapper funktioniert korrekt. Watson Doctor AST-Scan findet 8 direkte os.unlink-Aufrufe in: watson_webrtc.py (1), watson_voices/diarize_watson.py (4), cockpit/sancho_cockpit_server.py (1), cockpit/song_erkennung.py (2). Alle löschen wahrscheinlich Temp-Dateien in /tmp — aber nicht durch Wrapper geroutet.
Nächster Schritt8 Funde prüfen: Pfade alle in /tmp? Wenn ja als "erlaubte /tmp-Ausnahme" dokumentieren. Wenn nicht: auf safe_delete() umstellen.
Beleg: Watson Doctor "AST: 8 Funde… Phase 0 Estrich, Phase 2 hart blocken", heute live
🟡 Emil-Zimmer — BLOCKED_TARGETS Daten vollständig, Wrapper-only
✓ 4 Lampen, 2 Gruppen, 5 Name-Patterns
✓ check_target_blocked() getestet
✓ hue_via_block_check → Block-Check
⚠ nur wenn Wrapper benutzt wird
Befund blocked_targets.json vollständig: IDs aus Hue-Bridge-Scan (15, 23, 33, 39), Gruppen 6+21, Patterns emil/emils/kinderzimmer. smart_home_block.py feuert korrekt. Schutz hängt daran, dass Sanchos den Wrapper benutzen — ein direkter curl-Aufruf wird nicht gefangen.
Phase 2 (kein GO nötig)PreToolUse-Hook der Bash-Calls auf Emil-IDs prüft — oder als "Estrich-Risiko" in VERBOTE.md notieren.
Beleg: ~/.watson/blocked_targets.json + lib/smart_home_block.py, heute gelesen
Verlässlichkeit
🟡 Watson Doctor — transparent 15✓ 2⚠ 0✗ — GELB
✓ 2026-05-23 14:38
15 ok · 2 warn · 0 fail → GELB
Backup >30h alt (31h)
8 os.remove außerhalb lib/
✓ Klartext, kein False-Green
⚠ nur Terminal
Befund Watson Doctor läuft, ist ehrlich, meldet keine Fails. Zwei echte Warnungen: Backup überfällig, 8 AST-Funde. Was er nicht prüft: Action-Router-Tests, Mail-Backend, Restore-Test, Notaus-Live-Blockade. Zugänglichkeit: nur Terminal — Victor tippt nicht ins Terminal (globale Regel).
Nächster SchrittZwei Warnungen schließen. Doctor-Aufruf in watson_boot.sh → Cockpit-Seite spiegeln für Victor (GUI-Ausgabe).
Beleg: lib/watson_doctor.py heute live: "=== 15 ok · 2 warn · 0 fail ==="
🟡 Backup + Restore-Test Backup frisch, .watson drin, Restore manuell belegt
✓ vorhanden, rsync + Manifest
✓ 2026-05-24 00:33 — post-abnahme-2026-05-24
✓ 21 Dateien bestätigt (war vorher unsichtbar: Hidden-Dir)
✓ blocked_targets.json + rules.md + state.json: diff IDENTISCH
⚠ nicht vorhanden
Befund Backup läuft korrekt: rsync, Manifest, .watson inklusive (21 Dateien — war als Hidden-Dir nicht im einfachen ls sichtbar). Restore-Test heute manuell: blocked_targets.json, rules.md, state.json aus Backup gegen Original verglichen — alle IDENTISCH. Kein automatisches Restore-Skript — im Notfall manueller Kopiervorgang nötig.
Nächster Schritt (optional)restore_watson.sh schreiben: Backup-Verzeichnis wählen, .watson/ zurückkopieren, Diff bestätigen.
Beleg: diff 3 Kerndateien backup/.watson vs ~/.watson → alle IDENTISCH, 2026-05-24 live
🟡 Broker — ACK / Fallback / localhost Broker läuft, ACK nicht einzeln belegt
✓ localhost:8091 heute bestätigt
✓ HOST = "127.0.0.1" im Code
✓ ACK_TIMEOUT_S = 60 im Code
✓ ~/.watson/inbox/ Logik vorhanden
⚠ nicht heute durchgespielt
⚠ Code ok, nicht live belegt
Befund Broker läuft stabil. localhost-Bindung, ACK-Timeout, Inbox-Fallback sind alle im Code korrekt implementiert. Health-Endpoint antwortet sauber. ACK-Flow und Fallback-Einspielung wurden nicht heute einzeln durchgespielt.
Nächster Schritt (optional)ACK-Zyklus einmal durchspielen: POST /message → GET /messages → POST /ack → prüfen ob Nachricht weg ist.
Beleg: curl localhost:8091/health heute → status:ok, queued:0. broker/broker.py Z. 41–44 gelesen.
Architektur
🟡 VoiceBridge — als Prototyp markieren Datei da, nie gestartet, kein Marker
✓ vorhanden, Port 8094
⚠ fehlt
✗ kein Beleg
Phase 2+ ("Explizit NICHT in 48h")
Befund watson_webrtc.py beschreibt einen WebRTC-Server: empfängt Audio vom iPhone-Browser, transkribiert via Cockpit-API, schickt Text an Watson-Sancho. Klar strukturiert, nie gestartet. Im Umbauplan war "Voice Input" explizit als Phase 2+ eingestuft. Kein PROTOTYP-Header im Code.
Nächster SchrittEntweder: PROTOTYP-Header in watson_webrtc.py eintragen (kein GO nötig) — oder explizit als Phase-2-Ticket notieren und Datei unverändert lassen.
Beleg: dispatcher/watson_webrtc.py vorhanden. WATSON_UMBAUPLAN_FINAL: "Voice Input — Explizit NICHT in 48h"
🟡 Erste neue Sancho-Session — read-only Router-Tests grün, read-only implizit
✓ -r--r--r-- (444) heute bestätigt
✓ Doctor-Check + Identität + state-Register
⚠ implizit durch Templates, nicht explizit erzwungen
✓ 8/8 grün (bau, home, schreiber)
Befund Router-Tests laufen 8/8 grün mit aktuellen Template-Namen. capabilities.json ist 444 — kein versehentliches Überschreiben möglich. watson_boot.sh registriert Sancho korrekt in state.json. Read-only-Default hängt am Template: Sanchos die kein "write"-Tool in allowed_tools haben, können de facto nicht schreiben — aber das ist implizit, nicht mit explizitem read-only-Flag implementiert.
Nächster Schritt (Phase 2)read-only-Default explizit machen: watson_boot.sh prüft beim Start ob Template "write"-Actions hat, loggt es im Audit.
Beleg: python3 lib/action_router.py --test → 8/8 grün, 2026-05-23 live. ls -la ~/.watson/capabilities.json → "-r--r--r--"
🟡 state.json — cleanup stale voice-Eintrag, kaputte Datei
✓ Watson Doctor: JSON valid
✓ bereinigt 2026-05-23 — "sanchos": {}
⚠ keiner automatisch aktiv — manuell per Subagent
✓ heute_archiv_{{{KAPUTT}}}.md entfernt
Befund state.json bereinigt 2026-05-23: stale voice-Eintrag entfernt, "sanchos": {} leer. Kaputte Datei (fehlgeschlagene Template-Expansion) gelöscht. Kein automatischer Cleanup-Mechanismus — wächst bei langen Sessions wieder voll, bis nächste manuelle Bereinigung.
Nächster Schritt (Phase 2)watson_boot.sh beim Start stale Einträge (kein Exit seit >24h) automatisch entfernen lassen.
Beleg: ~/.watson/state.json gelesen 2026-05-24 → "sanchos": {}, "_note": "Bereinigt 2026-05-23"
🟢 capabilities.json — Schreibschutz chmod 444 heute bestätigt
✓ ~/.watson/capabilities.json
✓ -r--r--r-- (444) heute live
✓ voice, aufraeuemer, dj, schreiber …
✓ chmod bestätigt, read-only für alle User
Befund capabilities.json ist korrekt mit chmod 444 geschützt. ls -la heute: "-r--r--r--@ 1 victorholland staff 18117 May 23". Kein Sancho kann die Datei versehentlich überschreiben. .bak_pre_dock_2026-05-23 zeigt dass Änderungen bewusst mit chmod-Aufhebung getätigt wurden.
Beleg: ls -la ~/.watson/capabilities.json heute → "-r--r--r--@"
🟡 Methoden-Bibel — aktive Methoden DOM sauber, Status-Lücke bei 34/37
✓ 37 Methoden
✓ Watson Doctor: nur in Tombstones
✓ rules.md: M-041 kanonisch
⚠ 3 von 37
⚠ 0 von 37
Befund 37 Methoden, Watson Doctor bestätigt keine DOM-Patterns in aktiven. M-041 (Kameramotor) ist laut rules.md die kanonische Bild-Generator-Methode. Aber: 34 von 37 Methoden haben keinen expliziten Status ("aktiv" oder "archiviert"). Unklar was gilt und was veraltet ist.
Nächster Schritt (optional, kein GO nötig)Methoden-Lint laufen lassen: python3 ~/Vibe\ Coding/Methoden/scripts/lint_methoden.py
Beleg: ls ~/Vibe Coding/Methoden/bibel/M-*.md | wc -l → 37. grep "status: aktiv" → 3 Treffer heute.
Alltagstauglichkeit
🔴 Alltagstauglichkeit für Victor Kern-Flows Terminal-only
✗ nur Terminal
✗ nur Terminal
✗ nur Terminal (Karabiner Phase 2)
⚠ watson_dashboard.sh — nur Terminal
✓ Sancho starten.command
✓ möglich
Befund Globale Regel: Victor tippt nichts ins Terminal. Watson Doctor, Backup, Notaus, Dashboard laufen alle als Terminal-Skripte. Das ist kein Alltagsbetrieb für Victor. Phase-0-Tests (beobachtet, mit Sancho als Mittler) sind möglich. Vollständiger Alltagsbetrieb ist durch 3 offene ROT-Punkte (Mail-Backend, Backup/Restore, Router-Tests) und Terminal-Abhängigkeiten blockiert.
Weg zu Alltagsbetrieb (4 Schritte)1. Router-Tests fixen (schnell, kein GO). 2. Backup + Restore-Test (GO nötig). 3. Doctor-Ergebnis auf Cockpit-Seite spiegeln. 4. Mail-Backend entscheiden (Victor).
Beleg: CLAUDE.md global "Victor tippt nichts ins Terminal". Alle Skripte heute im Terminal ausgeführt (von Planer).
Watson Phase 0 · 2026-05-24 · Planer (REST-UMBAU/ABNAHME-SCHLIESSER) · Keine Eigenaussage ohne Beleg
Randthemen (Raspberry Pi, Diashow, Sonos, Roborock, WhatsApp, Voice Library) → separate Werkzeug-Abnahme