{
  "created_at": "2026-08-11T12:37:31.319588+00:00",
  "safe_mode": {
    "enabled": true,
    "message": "Diagnose und Dashboard starten keine automatischen Ollama-, STT- oder TTS-Livechecks."
  },
  "runtime": {
    "app": {
      "name": "JARVIS",
      "environment": "unraid",
      "host": "0.0.0.0",
      "port": 8080,
      "restart_required": false
    },
    "version": {
      "name": "JARVIS",
      "version": "0.1.0-alpha",
      "alpha_part": "complete",
      "codename": "First Light"
    },
    "system": {
      "python": {
        "version": "3.12.13",
        "executable": "/usr/local/bin/python3.12"
      },
      "platform": {
        "system": "Linux",
        "release": "6.12.98-Unraid",
        "machine": "x86_64"
      },
      "process": {
        "pid": 1,
        "cwd": "/app"
      },
      "runtime": {
        "started_at": "2026-08-11T12:26:24.378356+00:00",
        "uptime_seconds": 666
      }
    },
    "ollama": {
      "enabled": true,
      "base_url": "http://192.168.178.113:11434",
      "model": "qwen3:14b",
      "config_model": "qwen3:14b",
      "config_path": "/app/config/config.unraid.yaml",
      "persistent": true,
      "timeout_seconds": 120
    },
    "open_webui": {
      "enabled": true,
      "openai_base_url": "http://jarvis:8080/v1"
    },
    "storage": {
      "data_dir": "/app/data",
      "persist_sessions": true,
      "sessions_file": "sessions.json",
      "audit_file": "audit.jsonl"
    },
    "prompt": {
      "rules": [
        "Docker-first",
        "Unraid als Zielplattform",
        "Ollama als lokales LLM",
        "Open WebUI als Hauptoberflaeche",
        "Whisper fuer STT",
        "OmniVoice-Triton fuer TTS",
        "Home Assistant spaeter nur ueber geschuetzte Aktionen",
        "Visuelles Feedback fuer JARVIS-Stimme und Status",
        "Windows-Agent nur ueber Policy und Bestaetigung"
      ],
      "role": "Du bist JARVIS, ein lokaler KI-Assistent fuer ein Unraid-basiertes System.",
      "style": "Du antwortest praezise, ruhig und mit trockenem, intelligentem Humor."
    },
    "generation": {
      "temperature": 0.4,
      "num_ctx": 4096
    },
    "voice": {
      "stt_enabled": true,
      "stt_provider": "whisper",
      "stt_base_url": "http://host.docker.internal:9000",
      "stt_default_language": "de",
      "tts_enabled": true,
      "tts_provider": "omnivoice-triton",
      "tts_base_url": "http://192.168.178.113:8085",
      "tts_default_voice": "male_en",
      "tts_clone_enabled": true,
      "tts_clone_reference_audio_path": "/app/config/voice/jarvis-reference.wav",
      "tts_clone_reference_text_set": true,
      "tts_max_spoken_chars": 900,
      "tts_num_step": 32,
      "tts_chunk_mode": "sequential"
    },
    "windows_agent": {
      "enabled": false,
      "base_url": "http://host.docker.internal:8765"
    }
  },
  "update_runtime": {
    "status": "ready",
    "message": "Betriebsstand geladen.",
    "source_dir": "/app/source",
    "branch": "main",
    "current_commit": "053c0904f0b22e367998bd12b5933b42c2355b37",
    "update_status": "running",
    "update_message": "Update laeuft im Hintergrund.",
    "last_update_result": "laeuft",
    "last_update_result_message": "Update laeuft im Hintergrund.",
    "update_started_at": null,
    "update_updated_at": "2026-08-11T12:35:33.208899+00:00",
    "last_completed_at": null,
    "cleanup_status": "unknown",
    "update": {
      "state_found": true,
      "cleanup_status": "unknown",
      "status": "running",
      "started": true,
      "message": "Update laeuft im Hintergrund.",
      "error": null,
      "updater_container": "jarvis-updater",
      "updater_container_id": "fdeb8fbd255b2ae8b11ddbd801c18fbf75e2c8eb86b9fd9b323eaff671e2221e",
      "updated_at": "2026-08-11T12:35:33.208899+00:00",
      "completed_at": null,
      "healthcheck": null,
      "current_commit": "12e94995ab70942fafec2968bb3f50be17f1ea15",
      "remote_commit": "053c0904f0b22e367998bd12b5933b42c2355b37"
    },
    "voice_success_since_update": {
      "type": "voice.next_action",
      "timestamp": "2026-08-11T12:37:29.876195+00:00",
      "status": "ready"
    },
    "voice_successes_since_update": {
      "stt": null,
      "tts": null,
      "open_webui": null
    }
  },
  "voice_audit_status": {
    "status": "planned",
    "ready_count": 0,
    "persistent": true,
    "audit_path": "/app/data/audit.jsonl",
    "successes": {
      "chat": null,
      "stt": null,
      "tts": null,
      "open_webui": null,
      "open_webui_stt": null,
      "open_webui_tts": null,
      "conversation": null,
      "daily": null
    },
    "message": "0 Voice-Erfolgsnachweise gefunden."
  },
  "voice_readiness": {
    "status": "planned",
    "message": "http://host.docker.internal:9000",
    "primary_stage": "stt",
    "ready_count": 0,
    "stage_count": 4,
    "progress_percent": 0,
    "usable_now": [],
    "missing_now": [
      {
        "key": "stt",
        "label": "Hoeren",
        "next_step": "Audiodatei waehlen oder Aufnahme starten und STT-Diagnose ausfuehren."
      },
      {
        "key": "chat",
        "label": "Antworten",
        "next_step": "Open WebUI live testen und Modell jarvis pruefen."
      },
      {
        "key": "tts",
        "label": "Sprechen",
        "next_step": "TTS-Diagnose starten und Audioausgabe pruefen."
      },
      {
        "key": "audio",
        "label": "Audioausgabe",
        "next_step": "Alltagstest mit Audiodatei oder Browseraufnahme ausfuehren."
      }
    ],
    "plain_summary": "0 von 4 Voice-Bereichen sind bereit.",
    "diagnostic_code": "stt_not_ready",
    "next_step": "Audiodatei waehlen oder Aufnahme starten und STT-Diagnose ausfuehren.",
    "stages": {
      "stt": {
        "name": "STT",
        "status": "blocked",
        "message": "http://host.docker.internal:9000",
        "diagnostic_code": "stt_not_ready",
        "next_step": "Audiodatei waehlen oder Aufnahme starten und STT-Diagnose ausfuehren.",
        "quality": {
          "status": "planned",
          "message": "Noch kein erfolgreicher STT-Test im Audit.",
          "source": null
        },
        "base_url": "http://host.docker.internal:9000"
      },
      "chat": {
        "name": "Chat",
        "status": "planned",
        "message": "Echter Chat-Livecheck wurde nicht automatisch ausgefuehrt.",
        "diagnostic_code": "livecheck_not_run",
        "next_step": "Open WebUI live testen und Modell jarvis pruefen.",
        "openai_base_url": "http://jarvis:8080/v1",
        "model": "qwen3:14b"
      },
      "tts": {
        "name": "TTS",
        "status": "blocked",
        "message": "http://192.168.178.113:8085",
        "diagnostic_code": "tts_not_ready",
        "next_step": "TTS-Diagnose starten und Audioausgabe pruefen.",
        "quality": {
          "status": "planned",
          "message": "Noch kein erfolgreicher TTS-Test im Audit.",
          "source": null
        },
        "base_url": "http://192.168.178.113:8085"
      },
      "audio": {
        "name": "Audio",
        "status": "planned",
        "message": "Antwortaudio wird im Alltagstest bestaetigt.",
        "diagnostic_code": "voice_audio_not_confirmed",
        "next_step": "Alltagstest mit Audiodatei oder Browseraufnahme ausfuehren.",
        "last_daily_test": null
      }
    },
    "main_test": {
      "label": "Alltagstest",
      "endpoint": "POST /voice/daily-test",
      "requires_audio": true,
      "without_audio_hint": "Audiodatei waehlen oder Browseraufnahme starten."
    },
    "profile_hint": "STT/TTS sind aktiviert; jetzt Erreichbarkeit und Alltagstest pruefen.",
    "open_webui": {
      "base_url": "http://jarvis:8080/v1",
      "api_key_hint": "Lokalen JARVIS-Key verwenden, falls Open WebUI einen API-Key verlangt.",
      "model": "jarvis",
      "models": {
        "visible": [
          "jarvis",
          "qwen3:14b"
        ],
        "expected": [
          "jarvis",
          "qwen3:14b"
        ],
        "visible_expected_count": 2,
        "expected_count": 2,
        "jarvis_ok": true,
        "configured_ok": true
      },
      "connection": {
        "status": "warnings",
        "ok": false,
        "lightweight": true,
        "livecheck_required": true,
        "can_chat_with_jarvis": false,
        "usage_status": "Status leicht geprueft. Echter Chat-Test startet nur per Button.",
        "message": "Echter Chat-Livecheck wurde nicht automatisch ausgefuehrt.",
        "openai_base_url": "http://jarvis:8080/v1",
        "local_base_url": "http://localhost:8080/v1",
        "model": "qwen3:14b",
        "provider": null,
        "duration_ms": null,
        "models": {
          "visible": [
            "jarvis",
            "qwen3:14b"
          ],
          "expected": [
            "jarvis",
            "qwen3:14b"
          ],
          "visible_expected_count": 2,
          "expected_count": 2,
          "jarvis_ok": true,
          "configured_ok": true
        },
        "diagnostic_code": "livecheck_not_run",
        "checks": [
          {
            "name": "Bereitschaft",
            "status": "ok",
            "message": "Open WebUI ist fuer JARVIS vorbereitet."
          },
          {
            "name": "Antwortformat",
            "status": "ok",
            "message": "OpenAI-kompatibles Antwortformat ist gueltig."
          },
          {
            "name": "Echter Chatpfad",
            "status": "planned",
            "message": "Echter Chat-Livecheck wurde nicht automatisch ausgefuehrt."
          },
          {
            "name": "Modell jarvis",
            "status": "ok",
            "message": "Modell jarvis ist sichtbar."
          },
          {
            "name": "Modell qwen3:14b",
            "status": "ok",
            "message": "Modell qwen3:14b ist sichtbar."
          }
        ],
        "chat_flow": {
          "status": "ready",
          "safe_check": "GET /open-webui/connection-test",
          "live_check": "POST /open-webui/connection-test",
          "base_url": "http://jarvis:8080/v1",
          "model": "jarvis",
          "loads_ollama": false,
          "message": "Open WebUI nutzt JARVIS als OpenAI-kompatible Verbindung."
        },
        "readiness": {
          "status": "ready",
          "ready_for_open_webui": true,
          "local_webui_url": "http://localhost:3000",
          "docker_api_base_url": "http://jarvis:8080/v1",
          "local_api_base_url": "http://localhost:8080/v1",
          "model": "qwen3:14b",
          "compose_file": "/app/docker-compose.yml",
          "unraid_override_file": "/app/docker-compose.unraid.yml",
          "errors": [],
          "warnings": [],
          "checks": [
            {
              "name": "config.open_webui.enabled",
              "status": "ok",
              "message": "Open WebUI ist in der JARVIS-Konfiguration aktiviert"
            },
            {
              "name": "config.openai_api",
              "status": "ok",
              "message": "OpenAI-kompatible API ist fuer Open WebUI freigegeben"
            },
            {
              "name": "compose.open_webui",
              "status": "ok",
              "message": "Open-WebUI-Service ist in Docker Compose vorhanden"
            },
            {
              "name": "compose.openai_base_url",
              "status": "ok",
              "message": "Interne Docker-Adresse stimmt: Open WebUI spricht JARVIS ueber http://jarvis:8080/v1 an"
            },
            {
              "name": "compose.openai_enabled",
              "status": "ok",
              "message": "OpenAI-API ist in Open WebUI aktiviert"
            },
            {
              "name": "compose.api_key",
              "status": "ok",
              "message": "Lokaler API-Key fuer Open WebUI ist gesetzt"
            },
            {
              "name": "compose.webui_name",
              "status": "ok",
              "message": "Open WebUI wird als JARVIS angezeigt"
            },
            {
              "name": "compose.webui_port",
              "status": "ok",
              "message": "Externer Browser-Port stimmt: Open WebUI ist ueber http://SERVER-IP:3000 erreichbar"
            },
            {
              "name": "unraid.override",
              "status": "ok",
              "message": "Unraid-Override nutzt config.unraid.yaml"
            },
            {
              "name": "endpoint.models",
              "status": "ok",
              "message": "GET /v1/models ist fuer Open WebUI vorgesehen"
            },
            {
              "name": "endpoint.chat",
              "status": "ok",
              "message": "POST /v1/chat/completions ist fuer Open WebUI vorgesehen"
            }
          ]
        },
        "selftest": {
          "status": "ok",
          "compatible": true,
          "model": "qwen3:14b",
          "models": {
            "object": "list",
            "data": [
              {
                "id": "jarvis",
                "object": "model",
                "created": 1,
                "owned_by": "jarvis"
              },
              {
                "id": "qwen3:14b",
                "object": "model",
                "created": 1,
                "owned_by": "ollama"
              }
            ]
          },
          "model_ids": [
            "jarvis",
            "qwen3:14b"
          ],
          "checked_endpoints": [
            "/v1/models",
            "/v1/chat/completions"
          ],
          "errors": [],
          "checks": [
            {
              "name": "models.object",
              "status": "ok",
              "message": "Modellantwort nutzt OpenAI-kompatibles Listenformat"
            },
            {
              "name": "models.items",
              "status": "ok",
              "message": "Alle Modell-Eintraege haben id und object=model"
            },
            {
              "name": "models.jarvis",
              "status": "ok",
              "message": "Modell jarvis ist sichtbar und kann in Open WebUI ausgewaehlt werden"
            },
            {
              "name": "models.configured",
              "status": "ok",
              "message": "Aktives Ollama-Modell qwen3:14b ist sichtbar"
            },
            {
              "name": "chat.model_mapping",
              "status": "ok",
              "message": "Open-WebUI-Modell jarvis wird auf das aktive Ollama-Modell geroutet"
            },
            {
              "name": "chat.id",
              "status": "ok",
              "message": "Chatantwort enthaelt eine OpenAI-typische Completion-ID"
            },
            {
              "name": "chat.object",
              "status": "ok",
              "message": "Chatantwort nutzt OpenAI-kompatibles Completion-Format"
            },
            {
              "name": "chat.choice",
              "status": "ok",
              "message": "Chatantwort enthaelt eine Assistant-Nachricht"
            },
            {
              "name": "chat.usage",
              "status": "ok",
              "message": "Chatantwort enthaelt plausible Token-Nutzungsdaten"
            },
            {
              "name": "chat.finish_reason",
              "status": "ok",
              "message": "Chatantwort beendet sauber mit finish_reason=stop"
            },
            {
              "name": "chat.provider",
              "status": "ok",
              "message": "Chatantwort nennt JARVIS als Provider"
            },
            {
              "name": "chat.fingerprint",
              "status": "ok",
              "message": "Chatantwort enthaelt einen stabilen JARVIS-Fingerprint"
            },
            {
              "name": "streaming.error",
              "status": "ok",
              "message": "Streaming-Ablehnung nutzt ein OpenAI-kompatibles Fehlerformat"
            }
          ],
          "model_guidance": {
            "selected_model": "jarvis",
            "active_ollama_model": "qwen3:14b",
            "message": "In Open WebUI Modell jarvis auswaehlen. JARVIS routet jarvis auf das aktuell gespeicherte Ollama-Modell."
          }
        },
        "livecheck": {
          "status": "planned",
          "ok": false,
          "provider": null,
          "model": "qwen3:14b",
          "duration_ms": null,
          "diagnostic_code": "livecheck_not_run",
          "message": "Echter Chat-Livecheck wurde nicht automatisch ausgefuehrt."
        },
        "next_steps": [
          "In Open WebUI bei OpenAI-kompatibler Verbindung exakt die Base-URL http://jarvis:8080/v1 eintragen.",
          "Als Modell exakt jarvis auswaehlen.",
          "Eine kurze Chatnachricht in Open WebUI senden."
        ],
        "setup": {
          "base_url": "http://jarvis:8080/v1",
          "local_test_url": "http://localhost:8080/v1",
          "api_key_hint": "jarvis-local-dev-key oder den in Open WebUI erwarteten lokalen Key verwenden.",
          "model": "jarvis",
          "exact_values": {
            "base_url": "http://jarvis:8080/v1",
            "model": "jarvis",
            "api_key": "jarvis-local-dev-key oder lokaler JARVIS-Key"
          },
          "voice_hint": "Mikrofon im Browser ueber Open WebUI verwenden; JARVIS liefert Chat, Diagnose und TTS/STT-Anbindung."
        }
      }
    },
    "next_action": {
      "status": "ready",
      "message": "Spracheingabe und Sprachausgabe sind noch nicht vollstaendig bereit.",
      "action": {
        "id": "stt_then_tts",
        "label": "STT-Diagnose starten",
        "target": "run-voice-stt-diagnostics",
        "endpoint": "/voice/stt/diagnostics",
        "message": "Spracheingabe und Sprachausgabe sind noch nicht vollstaendig bereit."
      },
      "summary_status": "planned",
      "open_webui_status": "ready",
      "compact_status": {
        "status": "blocked",
        "label": "STT und TTS pruefen",
        "message": "Spracheingabe und Sprachausgabe sind noch nicht vollstaendig bereit.",
        "focus": "voice"
      },
      "priority": "stt_then_tts",
      "checks": [
        {
          "name": "Naechste Voice-Aktion",
          "status": "ok",
          "message": "Spracheingabe und Sprachausgabe sind noch nicht vollstaendig bereit.",
          "recommendation": "STT-Diagnose starten"
        }
      ]
    },
    "audit": {
      "status": "planned",
      "ready_count": 0,
      "persistent": true,
      "audit_path": "/app/data/audit.jsonl",
      "successes": {
        "chat": null,
        "stt": null,
        "tts": null,
        "open_webui": null,
        "open_webui_stt": null,
        "open_webui_tts": null,
        "conversation": null,
        "daily": null
      },
      "message": "0 Voice-Erfolgsnachweise gefunden."
    },
    "summary": {
      "status": "planned",
      "message": "Voice ist vorbereitet; STT/TTS sind noch nicht aktiv.",
      "compact_status": {
        "status": "blocked",
        "label": "STT und TTS pruefen",
        "message": "Spracheingabe und Sprachausgabe sind noch nicht vollstaendig bereit.",
        "focus": "voice"
      },
      "safe": true,
      "audio_recorded": false,
      "audio_generated": false,
      "current_state": "idle",
      "stt": {
        "enabled": true,
        "provider": "whisper",
        "base_url": "http://host.docker.internal:9000",
        "timeout_seconds": 45,
        "status": "planned"
      },
      "tts": {
        "enabled": true,
        "provider": "omnivoice-triton",
        "base_url": "http://192.168.178.113:8085",
        "default_voice": "male_en",
        "status": "blocked"
      },
      "checks": [
        {
          "name": "Sprachpipeline",
          "status": "blocked",
          "message": "Die Sprachpipeline braucht zuerst eine Korrektur in der Konfiguration."
        },
        {
          "name": "STT-Livecheck",
          "status": "planned",
          "message": "STT ist aktiviert und wird geprueft. Die echte Audioannahme ist vorbereitet."
        },
        {
          "name": "TTS-Livecheck",
          "status": "blocked",
          "message": "TTS-Livecheck ist blockiert. Adresse oder Dienst muss geprueft werden."
        },
        {
          "name": "Voice-Status",
          "status": "planned",
          "message": "Voice-Ereignisse sind vorbereitet; echte Audioereignisse folgen mit STT/TTS-Anbindung."
        }
      ],
      "endpoints": {
        "readiness": "/voice/readiness",
        "events": "/voice/events",
        "history": "/voice/history",
        "stt_contract": "/voice/stt",
        "stt_livecheck": "/voice/stt/livecheck",
        "stt_upload_plan": "/voice/stt/upload-plan",
        "stt_upload": "/voice/stt/upload",
        "chain_check": "/voice/chain-check",
        "conversation": "/voice/conversation",
        "tts_contract": "/voice/tts/contract",
        "tts_request_plan": "/voice/tts/request-plan",
        "tts_audio": "/voice/tts",
        "tts_livecheck": "/voice/tts/livecheck"
      },
      "next_steps": [
        "Open WebUI als Mikrofon- und Chatoberflaeche verwenden.",
        "Sprachdialog ueber /voice/conversation als STT-Chat-TTS-Kette testen.",
        "Dashboard fuer Status, Diagnose und technische Tests behalten."
      ]
    }
  },
  "last_daily_test": null,
  "release": {
    "version": "0.1.0-alpha",
    "codename": "First Light",
    "status": "alpha",
    "completed_count": 16,
    "open_count": 7,
    "completed": [
      "Windows-Startdatei fuer Entwicklung",
      "Docker- und Unraid-nahes Compose-Setup",
      "FastAPI-Core",
      "Dashboard",
      "Ollama-Anbindung",
      "OpenAI-kompatible API fuer Open WebUI",
      "Modellwechsel zur Laufzeit",
      "Prompt-Anzeige und Bearbeitung zur Laufzeit",
      "Generationseinstellungen",
      "Persistente Sessions",
      "Audit-Log",
      "Metriken",
      "Diagnose-Snapshot und Download",
      "Aktionsregeln fuer spaetere Werkzeuge",
      "Windows-Agent-Vertrag",
      "Voice-Service-Vertrag"
    ],
    "open": [
      "Produktive Authentifizierung",
      "Echte Open-WebUI-Pruefung auf Unraid",
      "Whisper-STT-Implementierung",
      "OmniVoice-Triton-TTS-Implementierung",
      "Windows-Agent-Desktop-Anwendung",
      "Dauerhafte datenbankgestuetzte Erinnerung",
      "Werkzeugausfuehrung mit Oberflaeche und Freigabefluss"
    ]
  },
  "release_inventory": {
    "release_dir": "/app/releases",
    "count": 0,
    "releases": []
  },
  "roadmap": {
    "version": "0.1.0-alpha",
    "codename": "First Light",
    "phase": "alpha",
    "completed_count": 16,
    "open_count": 7,
    "next_step_count": 9,
    "current_release": "0.1.0-alpha",
    "current_release_state": "complete",
    "next_release": {
      "version": "0.2.0-alpha",
      "focus": "STT, TTS und Dashboard als zuerst nutzbare JARVIS-Oberflaeche.",
      "entry_criteria": [
        "Alpha 0.1.0 Abschlussseite meldet complete.",
        "Open-WebUI-Live-Test ist vorhanden und verstaendlich.",
        "Unraid-Start kann per CheckOnly trocken geprueft werden.",
        "Windows-Testbetrieb nutzt lokale Daten- und Logordner."
      ],
      "planned_work": [
        "STT/TTS-Betriebschecks fuer Whisper und OmniVoice-Triton vertiefen.",
        "STT/TTS-Ereignisse fuer hoeren, denken und sprechen vorbereiten.",
        "Dashboard fuer Sprachstatus, Tests und klare Fehlermeldungen ausbauen.",
        "Home Assistant und visuelles Feedback bleiben vorgemerkt, aber nicht im aktiven Alpha-0.2-Fokus."
      ]
    },
    "completed": [
      "Windows-Startdatei fuer Entwicklung",
      "Docker- und Unraid-nahes Compose-Setup",
      "FastAPI-Core",
      "Dashboard",
      "Ollama-Anbindung",
      "OpenAI-kompatible API fuer Open WebUI",
      "Modellwechsel zur Laufzeit",
      "Prompt-Anzeige und Bearbeitung zur Laufzeit",
      "Generationseinstellungen",
      "Persistente Sessions",
      "Audit-Log",
      "Metriken",
      "Diagnose-Snapshot und Download",
      "Aktionsregeln fuer spaetere Werkzeuge",
      "Windows-Agent-Vertrag",
      "Voice-Service-Vertrag"
    ],
    "open": [
      "Produktive Authentifizierung",
      "Echte Open-WebUI-Pruefung auf Unraid",
      "Whisper-STT-Implementierung",
      "OmniVoice-Triton-TTS-Implementierung",
      "Windows-Agent-Desktop-Anwendung",
      "Dauerhafte datenbankgestuetzte Erinnerung",
      "Werkzeugausfuehrung mit Oberflaeche und Freigabefluss"
    ],
    "next_steps": [
      {
        "name": "Alpha 0.2.0 vorbereiten",
        "target": "Alpha 0.2.0",
        "description": "Den naechsten Entwicklungsblock sichtbar machen: STT, TTS und Dashboard zuerst stabilisieren."
      },
      {
        "name": "Sprachpipeline vorbereiten",
        "target": "Alpha 0.2.0",
        "description": "Whisper STT und OmniVoice-Triton TTS von vorbereiteten Schnittstellen zu pruefbaren Betriebschecks fuehren."
      },
      {
        "name": "Windows-Agent konkretisieren",
        "target": "Alpha 0.3.x",
        "description": "Begleitdienst, sichere Aktionen, Vorschau und Bestaetigung fuer lokale PC-Steuerung planen."
      },
      {
        "name": "Ollama-Modellverwaltung ausbauen",
        "target": "Alpha 0.3.x",
        "description": "Pull-Plan, Modellhinweise und sichere Aktivierung vorbereiten, ohne unbeabsichtigte grosse Downloads."
      },
      {
        "name": "Home Assistant vorbereiten",
        "target": "Alpha 0.3.x",
        "description": "Smart-Home-Anbindung als eigene Schnittstelle planen, mit Token, Statuscheck und geschuetzten Aktionen."
      },
      {
        "name": "Visuelles Stimmenfeedback planen",
        "target": "Alpha 0.3.x",
        "description": "Anzeige fuer JARVIS-Zustaende wie bereit, hoert zu, denkt und spricht vorbereiten."
      },
      {
        "name": "Grundlage fuer Erinnerung",
        "target": "Alpha 0.3.0",
        "description": "Dauerhafte Speicherung jenseits der aktuellen Chat-Sessions vorbereiten."
      },
      {
        "name": "Voice-Vertraege umsetzen",
        "target": "Alpha 0.4.0",
        "description": "Whisper STT und OmniVoice-Triton TTS mit echten Audioablaeufen verbinden."
      },
      {
        "name": "Windows-Agent-Anwendung",
        "target": "Alpha 0.5.0",
        "description": "Die lokale Windows-Begleit-App mit geschuetzten Aktionen bauen."
      }
    ]
  },
  "capabilities": {
    "service": {
      "name": "JARVIS",
      "version": "0.1.0-alpha",
      "alpha_part": "complete",
      "codename": "First Light"
    },
    "release": {
      "version": "0.1.0-alpha",
      "codename": "First Light",
      "status": "alpha",
      "completed_count": 16,
      "open_count": 7,
      "completed": [
        "Windows-Startdatei fuer Entwicklung",
        "Docker- und Unraid-nahes Compose-Setup",
        "FastAPI-Core",
        "Dashboard",
        "Ollama-Anbindung",
        "OpenAI-kompatible API fuer Open WebUI",
        "Modellwechsel zur Laufzeit",
        "Prompt-Anzeige und Bearbeitung zur Laufzeit",
        "Generationseinstellungen",
        "Persistente Sessions",
        "Audit-Log",
        "Metriken",
        "Diagnose-Snapshot und Download",
        "Aktionsregeln fuer spaetere Werkzeuge",
        "Windows-Agent-Vertrag",
        "Voice-Service-Vertrag"
      ],
      "open": [
        "Produktive Authentifizierung",
        "Echte Open-WebUI-Pruefung auf Unraid",
        "Whisper-STT-Implementierung",
        "OmniVoice-Triton-TTS-Implementierung",
        "Windows-Agent-Desktop-Anwendung",
        "Dauerhafte datenbankgestuetzte Erinnerung",
        "Werkzeugausfuehrung mit Oberflaeche und Freigabefluss"
      ]
    },
    "interfaces": {
      "dashboard": "/",
      "openai_compatible_base": "/v1",
      "open_webui_readiness": "/open-webui/readiness",
      "open_webui_selftest": "/open-webui/selftest",
      "open_webui_livecheck": "/open-webui/livecheck",
      "openapi_docs": "/docs"
    },
    "capabilities": {
      "chat": {
        "enabled": true,
        "endpoints": [
          "/chat",
          "/v1/chat/completions"
        ]
      },
      "ollama": {
        "enabled": true,
        "endpoints": [
          "/ollama/management",
          "/ollama/models",
          "/ollama/ping",
          "/ollama/benchmark",
          "/ollama/model"
        ]
      },
      "sessions": {
        "enabled": true,
        "persistent": true,
        "endpoints": [
          "/sessions",
          "/sessions/{session_id}"
        ]
      },
      "diagnostics": {
        "enabled": true,
        "endpoints": [
          "/status",
          "/ready",
          "/preflight",
          "/interfaces/check",
          "/interfaces/settings",
          "/interfaces/settings/backup-plan",
          "/interfaces/settings/backups",
          "/interfaces/settings/backups/cleanup-plan",
          "/interfaces/settings/backups/cleanup",
          "/interfaces/settings/backups/{backup_name}/detail",
          "/interfaces/settings/backups/{backup_name}/download",
          "/interfaces/settings/backups/{backup_name}/restore-plan",
          "/interfaces/settings/backups/{backup_name}/restore",
          "/interfaces/settings/backup",
          "/interfaces/settings/preview",
          "/interfaces/settings/apply",
          "/config/validate",
          "/config/profiles",
          "/config/diff",
          "/deployment/summary",
          "/unraid/readiness",
          "/open-webui/readiness",
          "/open-webui/selftest",
          "/metrics",
          "/diagnostics/snapshot",
          "/diagnostics/download"
        ]
      },
      "releases": {
        "enabled": true,
        "endpoints": [
          "/release",
          "/release/plan",
          "/release/readiness",
          "/alpha/completion",
          "/releases/{release_name}/detail",
          "/releases/{release_name}/manifest",
          "/releases/{release_name}/notes",
          "/releases/{release_name}/zip",
          "/releases/cleanup-plan",
          "/releases/cleanup",
          "/releases/compare/{left}/{right}",
          "/releases",
          "/docs/releases",
          "/docs/release-plan",
          "/docs/release-readiness",
          "/docs/alpha-completion"
        ]
      },
      "roadmap": {
        "enabled": true,
        "endpoints": [
          "/roadmap",
          "/docs/roadmap"
        ]
      },
      "operations": {
        "enabled": true,
        "executes_commands": false,
        "endpoints": [
          "/operations",
          "/restart",
          "/docs/restart"
        ]
      },
      "documentation": {
        "enabled": true,
        "endpoints": [
          "/docs/api",
          "/docs/interfaces",
          "/docs/interfaces/settings",
          "/docs/interfaces/backups",
          "/docs/interfaces/backups/{backup_name}",
          "/docs/interfaces/backups/{backup_name}/restore-plan",
          "/docs/jarvis",
          "/docs/unraid",
          "/docs/unraid-readiness",
          "/docs/operations",
          "/docs/restart",
          "/docs/roadmap",
          "/docs/capabilities",
          "/docs/releases",
          "/docs/deployment",
          "/docs/releases/{release_name}",
          "/docs/releases/{release_name}/notes",
          "/docs/releases/compare/{left}/{right}",
          "/docs/release-plan",
          "/docs/release-readiness",
          "/docs/alpha-completion",
          "/docs/config",
          "/docs/config-profiles",
          "/docs/config-diff",
          "/docs/personality",
          "/docs/prompt",
          "/docs/metrics",
          "/docs/diagnostics",
          "/docs/audit",
          "/docs/sessions",
          "/docs/open-webui",
          "/docs/ollama",
          "/docs/system",
          "/docs/preflight",
          "/docs/status",
          "/docs/ready",
          "/docs/health",
          "/docs/version",
          "/docs/voice",
          "/docs/windows-agent"
        ]
      },
      "prompt_runtime_editing": {
        "enabled": true,
        "persistent": false,
        "endpoints": [
          "/prompt"
        ]
      },
      "voice": {
        "enabled": false,
        "contract_ready": true,
        "visual_feedback_planned": true,
        "endpoints": [
          "/voice/status",
          "/voice/summary",
          "/voice/readiness",
          "/voice/events",
          "/v1/audio/transcriptions",
          "/v1/audio/speech",
          "/voice/open-webui-plan",
          "/voice/stt",
          "/voice/stt/upload-plan",
          "/voice/stt/upload",
          "/voice/stt/livecheck",
          "/voice/conversation",
          "/voice/tts/contract",
          "/voice/tts",
          "/voice/reply-plan",
          "/voice/tts/request-plan",
          "/voice/tts/livecheck"
        ]
      },
      "visual_feedback": {
        "enabled": false,
        "contract_ready": true,
        "planned_states": [
          "bereit",
          "hoert_zu",
          "denkt",
          "spricht"
        ],
        "endpoints": [
          "/visual-feedback/status"
        ]
      },
      "windows_agent": {
        "enabled": false,
        "contract_ready": true,
        "policy_protected": true,
        "endpoints": [
          "/windows/readiness",
          "/windows/actions",
          "/actions/preview",
          "/actions/detect"
        ]
      },
      "actions": {
        "enabled": true,
        "contract_ready": true,
        "policy_protected": true,
        "description": "JARVIS erkennt einfache Aktionsabsichten im Chat und fuehrt sichere interne Aktionen direkt aus.",
        "endpoints": [
          "/chat",
          "/v1/chat/completions",
          "/actions/detect",
          "/actions/preview"
        ]
      },
      "home_assistant": {
        "enabled": false,
        "contract_ready": false,
        "policy_protected": true,
        "planned": true,
        "endpoints": [
          "/home-assistant/readiness"
        ]
      }
    }
  },
  "config_profiles": {
    "active_config_path": "/app/config/config.unraid.yaml",
    "config_dir": "/app/config",
    "active_profile": "unraid",
    "profiles": [
      {
        "name": "default",
        "file": "/app/config/config.yaml",
        "exists": false,
        "active": false,
        "environment": "alpha",
        "host": "0.0.0.0",
        "port": 8080,
        "ollama": {
          "base_url": "http://ollama:11434",
          "model": "llama3.1:8b",
          "timeout_seconds": 120
        },
        "storage": {
          "data_dir": "data",
          "persist_sessions": true
        },
        "generation": {
          "temperature": 0.4,
          "num_ctx": 4096
        },
        "voice": {
          "stt_enabled": false,
          "stt_base_url": "http://whisper:9000",
          "stt_timeout_seconds": 30,
          "tts_enabled": false,
          "tts_base_url": "http://OmniVoice-Triton-API:8080"
        },
        "windows_agent": {
          "enabled": false,
          "base_url": "http://host.docker.internal:8765"
        },
        "validation": {
          "status": "valid",
          "valid": true,
          "errors": [],
          "warnings": []
        }
      },
      {
        "name": "windows",
        "file": "/app/config/config.windows.yaml",
        "exists": false,
        "active": false,
        "environment": "alpha",
        "host": "0.0.0.0",
        "port": 8080,
        "ollama": {
          "base_url": "http://ollama:11434",
          "model": "llama3.1:8b",
          "timeout_seconds": 120
        },
        "storage": {
          "data_dir": "data",
          "persist_sessions": true
        },
        "generation": {
          "temperature": 0.4,
          "num_ctx": 4096
        },
        "voice": {
          "stt_enabled": false,
          "stt_base_url": "http://whisper:9000",
          "stt_timeout_seconds": 30,
          "tts_enabled": false,
          "tts_base_url": "http://OmniVoice-Triton-API:8080"
        },
        "windows_agent": {
          "enabled": false,
          "base_url": "http://host.docker.internal:8765"
        },
        "validation": {
          "status": "valid",
          "valid": true,
          "errors": [],
          "warnings": []
        }
      },
      {
        "name": "unraid",
        "file": "/app/config/config.unraid.yaml",
        "exists": true,
        "active": true,
        "environment": "unraid",
        "host": "0.0.0.0",
        "port": 8080,
        "ollama": {
          "base_url": "http://192.168.178.113:11434",
          "model": "qwen3:14b",
          "timeout_seconds": 120
        },
        "storage": {
          "data_dir": "/app/data",
          "persist_sessions": true
        },
        "generation": {
          "temperature": 0.4,
          "num_ctx": 4096
        },
        "voice": {
          "stt_enabled": true,
          "stt_base_url": "http://host.docker.internal:9000",
          "stt_timeout_seconds": 45,
          "tts_enabled": true,
          "tts_base_url": "http://192.168.178.113:8085"
        },
        "windows_agent": {
          "enabled": false,
          "base_url": "http://host.docker.internal:8765"
        },
        "validation": {
          "status": "valid",
          "valid": true,
          "errors": [],
          "warnings": []
        }
      }
    ]
  },
  "config_profile_diff": {
    "profiles": [
      "default",
      "windows",
      "unraid"
    ],
    "difference_count": 9,
    "differences": [
      {
        "field": "app.environment",
        "values": {
          "default": "alpha",
          "windows": "alpha",
          "unraid": "unraid"
        }
      },
      {
        "field": "storage.data_dir",
        "values": {
          "default": "data",
          "windows": "data",
          "unraid": "/app/data"
        }
      },
      {
        "field": "ollama.base_url",
        "values": {
          "default": "http://ollama:11434",
          "windows": "http://ollama:11434",
          "unraid": "http://192.168.178.113:11434"
        }
      },
      {
        "field": "ollama.model",
        "values": {
          "default": "llama3.1:8b",
          "windows": "llama3.1:8b",
          "unraid": "qwen3:14b"
        }
      },
      {
        "field": "voice.stt.enabled",
        "values": {
          "default": false,
          "windows": false,
          "unraid": true
        }
      },
      {
        "field": "voice.stt.base_url",
        "values": {
          "default": "http://whisper:9000",
          "windows": "http://whisper:9000",
          "unraid": "http://host.docker.internal:9000"
        }
      },
      {
        "field": "voice.stt.timeout_seconds",
        "values": {
          "default": 30,
          "windows": 30,
          "unraid": 45
        }
      },
      {
        "field": "voice.tts.enabled",
        "values": {
          "default": false,
          "windows": false,
          "unraid": true
        }
      },
      {
        "field": "voice.tts.base_url",
        "values": {
          "default": "http://OmniVoice-Triton-API:8080",
          "windows": "http://OmniVoice-Triton-API:8080",
          "unraid": "http://192.168.178.113:8085"
        }
      }
    ]
  },
  "config_validation": {
    "valid": true,
    "status": "valid",
    "errors": [],
    "warnings": [],
    "checks": [
      {
        "name": "app.port",
        "status": "ok",
        "message": "Port 8080 ist gueltig"
      },
      {
        "name": "app.environment",
        "status": "ok",
        "message": "Umgebung ist unraid"
      },
      {
        "name": "ollama.base_url",
        "status": "ok",
        "message": "Ollama-URL ist http://192.168.178.113:11434"
      },
      {
        "name": "ollama.model",
        "status": "ok",
        "message": "Modell ist qwen3:14b"
      },
      {
        "name": "generation.temperature",
        "status": "ok",
        "message": "Temperatur liegt im unterstuetzten Bereich"
      },
      {
        "name": "generation.num_ctx",
        "status": "ok",
        "message": "Kontextgroesse liegt im unterstuetzten Bereich"
      },
      {
        "name": "storage.data_dir",
        "status": "ok",
        "message": "Datenordner ist /app/data"
      },
      {
        "name": "storage.sessions_file",
        "status": "ok",
        "message": "Session-Speicher nutzt JSON"
      },
      {
        "name": "storage.audit_file",
        "status": "ok",
        "message": "Audit-Speicher nutzt JSONL"
      },
      {
        "name": "voice.tts.base_url",
        "status": "ok",
        "message": "TTS-URL ist fuer den aktuellen Modus plausibel"
      },
      {
        "name": "windows_agent.base_url",
        "status": "ok",
        "message": "Windows-Agent-URL ist fuer den aktuellen Modus plausibel"
      },
      {
        "name": "prompt",
        "status": "ok",
        "message": "Prompt-Vertrag ist vollstaendig"
      }
    ]
  },
  "unraid_readiness": {
    "status": "ready",
    "ready_for_unraid": true,
    "ready_now": {
      "jarvis_container": true,
      "open_webui": true,
      "ollama_models": true,
      "config_writable": true,
      "message": "Unraid-Grundlage ist einsatzbereit; verbleibende Punkte sind Hinweise."
    },
    "project_root": "/app",
    "docker_compose": "/app/docker-compose.yml",
    "docker_compose_unraid": "/app/docker-compose.unraid.yml",
    "unraid_start_command": ".\\start-unraid.ps1",
    "unraid_check_command": ".\\start-unraid.ps1 -CheckOnly",
    "unraid_build_command": ".\\start-unraid.ps1 -Build",
    "unraid_direct_start_command": "docker compose -f docker-compose.yml -f docker-compose.unraid.yml up -d",
    "unraid_direct_build_command": "docker compose -f docker-compose.yml -f docker-compose.unraid.yml up -d --build",
    "unraid_config": "/app/config/config.unraid.yaml",
    "errors": [],
    "warnings": [],
    "checks": [
      {
        "name": "dockerfile",
        "status": "ok",
        "severity": "ok",
        "message": "Dockerfile ist vorhanden"
      },
      {
        "name": "docker_compose",
        "status": "ok",
        "severity": "ok",
        "message": "docker-compose.yml ist vorhanden"
      },
      {
        "name": "docker_compose_unraid",
        "status": "ok",
        "severity": "ok",
        "message": "docker-compose.unraid.yml ist vorhanden"
      },
      {
        "name": "start_unraid",
        "status": "ok",
        "severity": "ok",
        "message": "start-unraid.ps1 ist vorhanden"
      },
      {
        "name": "unraid_config",
        "status": "ok",
        "severity": "ok",
        "message": "config.unraid.yaml ist vorhanden"
      },
      {
        "name": "compose.services",
        "status": "ok",
        "severity": "ok",
        "message": "Erforderliche Services sind vorhanden"
      },
      {
        "name": "jarvis.config_path",
        "status": "ok",
        "severity": "ok",
        "message": "Unraid-Compose-Override zeigt JARVIS auf config.unraid.yaml"
      },
      {
        "name": "jarvis.config_volume",
        "status": "ok",
        "severity": "ok",
        "message": "Beschreibbares Config-Volume ist eingebunden"
      },
      {
        "name": "jarvis.data_volume",
        "status": "ok",
        "severity": "ok",
        "message": "Persistentes Datenvolume ist eingebunden"
      },
      {
        "name": "jarvis.logs_volume",
        "status": "ok",
        "severity": "ok",
        "message": "Persistentes Logvolume ist eingebunden"
      },
      {
        "name": "open_webui.jarvis_url",
        "status": "ok",
        "severity": "ok",
        "message": "Interne Docker-Adresse stimmt: Open WebUI nutzt http://jarvis:8080/v1"
      },
      {
        "name": "open_webui.port",
        "status": "ok",
        "severity": "ok",
        "message": "Externer Browser-Port stimmt: Open WebUI ist ueber SERVER-IP:3000 erreichbar"
      },
      {
        "name": "ollama.volume",
        "status": "ok",
        "severity": "ok",
        "message": "Ollama-Modellvolume ist eingebunden"
      },
      {
        "name": "ollama.gpu",
        "status": "ok",
        "severity": "ok",
        "message": "NVIDIA-GPU-Reservierung ist vorhanden"
      },
      {
        "name": "config.environment",
        "status": "ok",
        "severity": "ok",
        "message": "Unraid-Profil nutzt environment unraid"
      },
      {
        "name": "config.ollama_url",
        "status": "ok",
        "severity": "ok",
        "message": "Unraid-Profil nutzt eine externe Ollama-Adresse"
      }
    ]
  },
  "operations": {
    "project_root": "/app",
    "commands": [
      {
        "name": "Windows-Entwicklung starten",
        "command": ".\\start-dev.ps1",
        "purpose": "Startet JARVIS lokal unter Windows ohne Docker."
      },
      {
        "name": "Windows-Umgebung setzen",
        "command": ". .\\use-windows-config.ps1",
        "purpose": "Setzt lokale Windows-Config, Datenordner und PYTHONPATH fuer direkte Tests."
      },
      {
        "name": "Windows-Entwicklung testen",
        "command": ".\\test-dev.ps1",
        "purpose": "Prueft lokale API, Ollama, Konfiguration, Roadmap und Release-Staende."
      },
      {
        "name": "Unraid-Konfiguration pruefen",
        "command": ".\\test-unraid-config.ps1",
        "purpose": "Prueft Docker- und Unraid-Konfiguration, ohne Container zu starten."
      },
      {
        "name": "Unraid aus GitHub aktualisieren",
        "command": "bash ./update-unraid.sh",
        "purpose": "Holt neue Dateien, baut das JARVIS-Image neu und startet nur den JARVIS-Container mit bestehender AppData-Config."
      },
      {
        "name": "Unraid-Start trocken pruefen",
        "command": ".\\start-unraid.ps1 -CheckOnly",
        "purpose": "Prueft Dateien, Unraid-Config, Ports und Docker Compose, ohne Container zu starten."
      },
      {
        "name": "Unraid-Stack ohne Neubau starten",
        "command": ".\\start-unraid.ps1",
        "purpose": "Startet JARVIS auf Unraid mit vorhandenen Images. Gut nach reinen Config-Aenderungen."
      },
      {
        "name": "Unraid-Stack mit Neubau starten",
        "command": ".\\start-unraid.ps1 -Build",
        "purpose": "Baut das JARVIS-Image neu und startet den Unraid-Stack. Sinnvoll nach Code-Aenderungen."
      },
      {
        "name": "Release-Plan trocken pruefen",
        "command": ".\\make-release.ps1 -DryRun",
        "purpose": "Zeigt Ziel, Umfang und Plausibilitaet, ohne Dateien zu erstellen."
      },
      {
        "name": "Release-Plan detailliert pruefen",
        "command": ".\\make-release.ps1 -DryRun -Detailed",
        "purpose": "Zeigt zusaetzlich Beispielpfade fuer kopierte und ausgeschlossene Dateien."
      },
      {
        "name": "Release-Backup erstellen",
        "command": ".\\make-release.ps1",
        "purpose": "Erstellt einen sauberen Release-Ordner ohne venv, Daten, Logs oder Caches."
      },
      {
        "name": "Release-Backup als ZIP erstellen",
        "command": ".\\make-release.ps1 -Zip",
        "purpose": "Erstellt einen sauberen Release-Ordner und zusaetzlich eine ZIP-Datei."
      },
      {
        "name": "Lokalen Docker-Stack starten",
        "command": "docker compose up --build",
        "purpose": "Startet den normalen Docker-Stack fuer lokale Tests."
      },
      {
        "name": "Unraid-Docker-Stack starten",
        "command": "docker compose -f docker-compose.yml -f docker-compose.unraid.yml up -d",
        "purpose": "Startet den Unraid-Docker-Stack direkt mit config.unraid.yaml."
      }
    ],
    "files": {
      "windows_start": "/app/start-dev.ps1",
      "windows_test": "/app/test-dev.ps1",
      "windows_env": "/app/use-windows-config.ps1",
      "unraid_test": "/app/test-unraid-config.ps1",
      "unraid_start": "/app/start-unraid.ps1",
      "unraid_update": "/app/update-unraid.sh",
      "release": "/app/make-release.ps1",
      "docker_compose": "/app/docker-compose.yml",
      "docker_compose_unraid": "/app/docker-compose.unraid.yml",
      "windows_config": "/app/config/config.windows.yaml",
      "unraid_config": "/app/config/config.unraid.yaml",
      "unraid_guide": "/app/docs/UNRAID.md"
    },
    "file_links": [
      {
        "name": "Windows-Startdatei",
        "key": "windows_start",
        "path": "/app/start-dev.ps1"
      },
      {
        "name": "Windows-Testdatei",
        "key": "windows_test",
        "path": "/app/test-dev.ps1"
      },
      {
        "name": "Windows-Umgebungsdatei",
        "key": "windows_env",
        "path": "/app/use-windows-config.ps1"
      },
      {
        "name": "Unraid-Pruefdatei",
        "key": "unraid_test",
        "path": "/app/test-unraid-config.ps1"
      },
      {
        "name": "Unraid-Startdatei",
        "key": "unraid_start",
        "path": "/app/start-unraid.ps1"
      },
      {
        "name": "Unraid-Update-Skript",
        "key": "unraid_update",
        "path": "/app/update-unraid.sh"
      },
      {
        "name": "Release-Skript",
        "key": "release",
        "path": "/app/make-release.ps1"
      },
      {
        "name": "Docker Compose",
        "key": "docker_compose",
        "path": "/app/docker-compose.yml"
      },
      {
        "name": "Unraid Compose Override",
        "key": "docker_compose_unraid",
        "path": "/app/docker-compose.unraid.yml"
      },
      {
        "name": "Windows-Konfiguration",
        "key": "windows_config",
        "path": "/app/config/config.windows.yaml"
      },
      {
        "name": "Unraid-Konfiguration",
        "key": "unraid_config",
        "path": "/app/config/config.unraid.yaml"
      },
      {
        "name": "Unraid-Anleitung",
        "key": "unraid_guide",
        "path": "/app/docs/UNRAID.md"
      }
    ]
  },
  "prompt": {
    "system_prompt": "Du bist JARVIS, ein lokaler KI-Assistent fuer ein Unraid-basiertes System. Du antwortest praezise, ruhig und mit trockenem, intelligentem Humor. Du bist hilfreich, aber nicht albern. Antworte immer auf Deutsch, auch wenn die Eingabe sehr kurz, englisch oder nur ein Test ist. Stelle dich nicht mit englischen Standardfloskeln wie 'Hello, I'm JARVIS' vor. Bei kurzen Tests bestaetigst du knapp auf Deutsch, dass JARVIS bereit ist. Klinge ruhig, praezise und leicht trocken humorvoll; niemals albern, nie uebertrieben. Wenn du etwas nicht sicher weisst, sag es klar statt es zu erfinden. Architekturentscheidungen bleiben stabil: Docker-first; Unraid als Zielplattform; Ollama als lokales LLM; Open WebUI als Hauptoberflaeche; Whisper fuer STT; OmniVoice-Triton fuer TTS; Home Assistant spaeter nur ueber geschuetzte Aktionen; Visuelles Feedback fuer JARVIS-Stimme und Status; Windows-Agent nur ueber Policy und Bestaetigung.",
    "role": "Du bist JARVIS, ein lokaler KI-Assistent fuer ein Unraid-basiertes System.",
    "style": "Du antwortest praezise, ruhig und mit trockenem, intelligentem Humor.",
    "boundaries": "Du bist hilfreich, aber nicht albern.",
    "rules": [
      "Docker-first",
      "Unraid als Zielplattform",
      "Ollama als lokales LLM",
      "Open WebUI als Hauptoberflaeche",
      "Whisper fuer STT",
      "OmniVoice-Triton fuer TTS",
      "Home Assistant spaeter nur ueber geschuetzte Aktionen",
      "Visuelles Feedback fuer JARVIS-Stimme und Status",
      "Windows-Agent nur ueber Policy und Bestaetigung"
    ],
    "tone": {
      "precise": true,
      "calm": true,
      "dry_humor": true,
      "silly": false
    }
  },
  "status": {
    "service": "JARVIS",
    "environment": "unraid",
    "version": {
      "name": "JARVIS",
      "version": "0.1.0-alpha",
      "alpha_part": "complete",
      "codename": "First Light"
    },
    "core": {
      "online": true,
      "host": "0.0.0.0",
      "port": 8080,
      "restart_required": false
    },
    "system": {
      "python": {
        "version": "3.12.13",
        "executable": "/usr/local/bin/python3.12"
      },
      "platform": {
        "system": "Linux",
        "release": "6.12.98-Unraid",
        "machine": "x86_64"
      },
      "process": {
        "pid": 1,
        "cwd": "/app"
      },
      "runtime": {
        "started_at": "2026-08-11T12:26:24.378356+00:00",
        "uptime_seconds": 667
      }
    },
    "storage": {
      "data_dir": "/app/data",
      "persist_sessions": true,
      "sessions_file": "sessions.json",
      "audit_file": "audit.jsonl"
    },
    "ollama": {
      "enabled": true,
      "reachable": true,
      "base_url": "http://192.168.178.113:11434",
      "model": "qwen3:14b",
      "model_available": true,
      "models": [
        "qwen3:14b",
        "qwen3.5:27b"
      ],
      "message": "Ollama reachable"
    },
    "generation": {
      "temperature": 0.4,
      "num_ctx": 4096
    },
    "metrics": {
      "events_total": 42154,
      "by_type": {
        "interfaces.settings.backups": 6084,
        "interfaces.settings.backup_cleanup_plan": 6084,
        "interfaces.check": 6073,
        "updates.check": 103,
        "interfaces.settings.apply": 7,
        "voice.stt.livecheck": 15,
        "voice.tts.livecheck": 16,
        "ollama.model.changed": 18,
        "updates.apply": 71,
        "voice.tts.contract": 11,
        "voice.tts.synthesize": 5,
        "voice.reply_plan": 3,
        "open_webui.livecheck": 1,
        "chat": 2,
        "voice.tts.request_plan": 2,
        "voice.chain_check": 19,
        "voice.open_webui.diagnostics": 14,
        "voice.stt.diagnostics": 16,
        "voice.next_action": 3068,
        "voice.stt.contract": 5,
        "voice.tts.diagnostics": 8,
        "session.clear": 12,
        "voice.sample_audio_plan": 2,
        "voice.stt.upload_plan": 1,
        "openai.chat.rejected": 2,
        "openai.chat": 146,
        "openai.audio.speech": 20285,
        "voice.tts.clone_diagnostic": 5,
        "voice.technical_readiness": 1,
        "voice.report.download": 5,
        "diagnostics.snapshot": 5,
        "interfaces.settings.backup_plan": 4,
        "interfaces.settings.backup_detail": 18,
        "interfaces.settings.backup_download": 18,
        "interfaces.settings.restore_plan": 18,
        "voice.conversation": 4,
        "open_webui.connection_test": 1,
        "diagnostics.download": 1,
        "prompt.changed": 1
      },
      "chat_total": 2,
      "openai_chat_total": 146,
      "model_changes_total": 18,
      "prompt_changes_total": 1,
      "generation_changes_total": 0,
      "diagnostic_downloads_total": 1
    },
    "voice": {
      "stt": {
        "provider": "whisper",
        "enabled": true,
        "base_url": "http://host.docker.internal:9000",
        "timeout_seconds": 45,
        "default_language": "de"
      },
      "tts": {
        "provider": "omnivoice-triton",
        "enabled": true,
        "base_url": "http://192.168.178.113:8085",
        "default_voice": "male_en",
        "clone_enabled": true,
        "clone_reference_audio_path": "/app/config/voice/jarvis-reference.wav",
        "num_step": 32,
        "chunk_mode": "sequential"
      }
    },
    "windows_agent": {
      "enabled": false,
      "base_url": "http://host.docker.internal:8765"
    },
    "action_policy": {
      "enabled": true,
      "confirmation_required": [
        "delete",
        "move",
        "rename",
        "install",
        "download",
        "execute",
        "run"
      ],
      "blocked": [
        "format",
        "delete_system",
        "wipe",
        "shutdown",
        "reboot",
        "registry"
      ]
    }
  },
  "readiness": {
    "ready": true,
    "status": "ready",
    "checks": {
      "core": {
        "ready": true,
        "message": "Core online"
      },
      "storage": {
        "ready": true,
        "message": "Speicher ist beschreibbar",
        "data_dir": "/app/data"
      },
      "ollama": {
        "ready": true,
        "message": "Ollama reachable",
        "model": "qwen3:14b"
      },
      "stt": {
        "ready": true,
        "message": "STT aktiv",
        "base_url": "http://host.docker.internal:9000"
      },
      "tts": {
        "ready": true,
        "message": "TTS aktiv",
        "base_url": "http://192.168.178.113:8085",
        "clone_enabled": true
      }
    },
    "components": {
      "core": {
        "name": "Core",
        "status": "ready",
        "message": "Core online"
      },
      "storage": {
        "name": "Speicher",
        "status": "ready",
        "message": "Speicher ist beschreibbar"
      },
      "ollama": {
        "name": "Ollama",
        "status": "ready",
        "message": "Ollama reachable",
        "model": "qwen3:14b"
      },
      "stt": {
        "name": "Hoeren",
        "status": "ready",
        "message": "STT aktiv"
      },
      "tts": {
        "name": "Sprechen",
        "status": "ready",
        "message": "TTS aktiv"
      }
    },
    "message": "Core, Speicher und Ollama sind bereit; Voice ist aktiv."
  },
  "preflight": {
    "status": "limited",
    "ready_for_local_testing": true,
    "ready_for_unraid_release": true,
    "blockers": [],
    "warnings": [
      "Windows-Agent-Vertrag existiert, Ausfuehrung ist aber deaktiviert"
    ],
    "config_validation": {
      "valid": true,
      "status": "valid",
      "errors": [],
      "warnings": [],
      "checks": [
        {
          "name": "app.port",
          "status": "ok",
          "message": "Port 8080 ist gueltig"
        },
        {
          "name": "app.environment",
          "status": "ok",
          "message": "Umgebung ist unraid"
        },
        {
          "name": "ollama.base_url",
          "status": "ok",
          "message": "Ollama-URL ist http://192.168.178.113:11434"
        },
        {
          "name": "ollama.model",
          "status": "ok",
          "message": "Modell ist qwen3:14b"
        },
        {
          "name": "generation.temperature",
          "status": "ok",
          "message": "Temperatur liegt im unterstuetzten Bereich"
        },
        {
          "name": "generation.num_ctx",
          "status": "ok",
          "message": "Kontextgroesse liegt im unterstuetzten Bereich"
        },
        {
          "name": "storage.data_dir",
          "status": "ok",
          "message": "Datenordner ist /app/data"
        },
        {
          "name": "storage.sessions_file",
          "status": "ok",
          "message": "Session-Speicher nutzt JSON"
        },
        {
          "name": "storage.audit_file",
          "status": "ok",
          "message": "Audit-Speicher nutzt JSONL"
        },
        {
          "name": "voice.tts.base_url",
          "status": "ok",
          "message": "TTS-URL ist fuer den aktuellen Modus plausibel"
        },
        {
          "name": "windows_agent.base_url",
          "status": "ok",
          "message": "Windows-Agent-URL ist fuer den aktuellen Modus plausibel"
        },
        {
          "name": "prompt",
          "status": "ok",
          "message": "Prompt-Vertrag ist vollstaendig"
        }
      ]
    },
    "readiness": {
      "ready": true,
      "status": "ready",
      "checks": {
        "core": {
          "ready": true,
          "message": "Core online"
        },
        "storage": {
          "ready": true,
          "message": "Speicher ist beschreibbar",
          "data_dir": "/app/data"
        },
        "ollama": {
          "ready": true,
          "message": "Ollama reachable",
          "model": "qwen3:14b"
        },
        "stt": {
          "ready": true,
          "message": "STT aktiv",
          "base_url": "http://host.docker.internal:9000"
        },
        "tts": {
          "ready": true,
          "message": "TTS aktiv",
          "base_url": "http://192.168.178.113:8085",
          "clone_enabled": true
        }
      },
      "components": {
        "core": {
          "name": "Core",
          "status": "ready",
          "message": "Core online"
        },
        "storage": {
          "name": "Speicher",
          "status": "ready",
          "message": "Speicher ist beschreibbar"
        },
        "ollama": {
          "name": "Ollama",
          "status": "ready",
          "message": "Ollama reachable",
          "model": "qwen3:14b"
        },
        "stt": {
          "name": "Hoeren",
          "status": "ready",
          "message": "STT aktiv"
        },
        "tts": {
          "name": "Sprechen",
          "status": "ready",
          "message": "TTS aktiv"
        }
      },
      "message": "Core, Speicher und Ollama sind bereit; Voice ist aktiv."
    },
    "release": {
      "version": "0.1.0-alpha",
      "codename": "First Light",
      "status": "alpha",
      "completed_count": 16,
      "open_count": 7,
      "completed": [
        "Windows-Startdatei fuer Entwicklung",
        "Docker- und Unraid-nahes Compose-Setup",
        "FastAPI-Core",
        "Dashboard",
        "Ollama-Anbindung",
        "OpenAI-kompatible API fuer Open WebUI",
        "Modellwechsel zur Laufzeit",
        "Prompt-Anzeige und Bearbeitung zur Laufzeit",
        "Generationseinstellungen",
        "Persistente Sessions",
        "Audit-Log",
        "Metriken",
        "Diagnose-Snapshot und Download",
        "Aktionsregeln fuer spaetere Werkzeuge",
        "Windows-Agent-Vertrag",
        "Voice-Service-Vertrag"
      ],
      "open": [
        "Produktive Authentifizierung",
        "Echte Open-WebUI-Pruefung auf Unraid",
        "Whisper-STT-Implementierung",
        "OmniVoice-Triton-TTS-Implementierung",
        "Windows-Agent-Desktop-Anwendung",
        "Dauerhafte datenbankgestuetzte Erinnerung",
        "Werkzeugausfuehrung mit Oberflaeche und Freigabefluss"
      ]
    },
    "capabilities": {
      "chat": {
        "enabled": true,
        "endpoints": [
          "/chat",
          "/v1/chat/completions"
        ]
      },
      "ollama": {
        "enabled": true,
        "endpoints": [
          "/ollama/management",
          "/ollama/models",
          "/ollama/ping",
          "/ollama/benchmark",
          "/ollama/model"
        ]
      },
      "sessions": {
        "enabled": true,
        "persistent": true,
        "endpoints": [
          "/sessions",
          "/sessions/{session_id}"
        ]
      },
      "diagnostics": {
        "enabled": true,
        "endpoints": [
          "/status",
          "/ready",
          "/preflight",
          "/interfaces/check",
          "/interfaces/settings",
          "/interfaces/settings/backup-plan",
          "/interfaces/settings/backups",
          "/interfaces/settings/backups/cleanup-plan",
          "/interfaces/settings/backups/cleanup",
          "/interfaces/settings/backups/{backup_name}/detail",
          "/interfaces/settings/backups/{backup_name}/download",
          "/interfaces/settings/backups/{backup_name}/restore-plan",
          "/interfaces/settings/backups/{backup_name}/restore",
          "/interfaces/settings/backup",
          "/interfaces/settings/preview",
          "/interfaces/settings/apply",
          "/config/validate",
          "/config/profiles",
          "/config/diff",
          "/deployment/summary",
          "/unraid/readiness",
          "/open-webui/readiness",
          "/open-webui/selftest",
          "/metrics",
          "/diagnostics/snapshot",
          "/diagnostics/download"
        ]
      },
      "releases": {
        "enabled": true,
        "endpoints": [
          "/release",
          "/release/plan",
          "/release/readiness",
          "/alpha/completion",
          "/releases/{release_name}/detail",
          "/releases/{release_name}/manifest",
          "/releases/{release_name}/notes",
          "/releases/{release_name}/zip",
          "/releases/cleanup-plan",
          "/releases/cleanup",
          "/releases/compare/{left}/{right}",
          "/releases",
          "/docs/releases",
          "/docs/release-plan",
          "/docs/release-readiness",
          "/docs/alpha-completion"
        ]
      },
      "roadmap": {
        "enabled": true,
        "endpoints": [
          "/roadmap",
          "/docs/roadmap"
        ]
      },
      "operations": {
        "enabled": true,
        "executes_commands": false,
        "endpoints": [
          "/operations",
          "/restart",
          "/docs/restart"
        ]
      },
      "documentation": {
        "enabled": true,
        "endpoints": [
          "/docs/api",
          "/docs/interfaces",
          "/docs/interfaces/settings",
          "/docs/interfaces/backups",
          "/docs/interfaces/backups/{backup_name}",
          "/docs/interfaces/backups/{backup_name}/restore-plan",
          "/docs/jarvis",
          "/docs/unraid",
          "/docs/unraid-readiness",
          "/docs/operations",
          "/docs/restart",
          "/docs/roadmap",
          "/docs/capabilities",
          "/docs/releases",
          "/docs/deployment",
          "/docs/releases/{release_name}",
          "/docs/releases/{release_name}/notes",
          "/docs/releases/compare/{left}/{right}",
          "/docs/release-plan",
          "/docs/release-readiness",
          "/docs/alpha-completion",
          "/docs/config",
          "/docs/config-profiles",
          "/docs/config-diff",
          "/docs/personality",
          "/docs/prompt",
          "/docs/metrics",
          "/docs/diagnostics",
          "/docs/audit",
          "/docs/sessions",
          "/docs/open-webui",
          "/docs/ollama",
          "/docs/system",
          "/docs/preflight",
          "/docs/status",
          "/docs/ready",
          "/docs/health",
          "/docs/version",
          "/docs/voice",
          "/docs/windows-agent"
        ]
      },
      "prompt_runtime_editing": {
        "enabled": true,
        "persistent": false,
        "endpoints": [
          "/prompt"
        ]
      },
      "voice": {
        "enabled": false,
        "contract_ready": true,
        "visual_feedback_planned": true,
        "endpoints": [
          "/voice/status",
          "/voice/summary",
          "/voice/readiness",
          "/voice/events",
          "/v1/audio/transcriptions",
          "/v1/audio/speech",
          "/voice/open-webui-plan",
          "/voice/stt",
          "/voice/stt/upload-plan",
          "/voice/stt/upload",
          "/voice/stt/livecheck",
          "/voice/conversation",
          "/voice/tts/contract",
          "/voice/tts",
          "/voice/reply-plan",
          "/voice/tts/request-plan",
          "/voice/tts/livecheck"
        ]
      },
      "visual_feedback": {
        "enabled": false,
        "contract_ready": true,
        "planned_states": [
          "bereit",
          "hoert_zu",
          "denkt",
          "spricht"
        ],
        "endpoints": [
          "/visual-feedback/status"
        ]
      },
      "windows_agent": {
        "enabled": false,
        "contract_ready": true,
        "policy_protected": true,
        "endpoints": [
          "/windows/readiness",
          "/windows/actions",
          "/actions/preview",
          "/actions/detect"
        ]
      },
      "actions": {
        "enabled": true,
        "contract_ready": true,
        "policy_protected": true,
        "description": "JARVIS erkennt einfache Aktionsabsichten im Chat und fuehrt sichere interne Aktionen direkt aus.",
        "endpoints": [
          "/chat",
          "/v1/chat/completions",
          "/actions/detect",
          "/actions/preview"
        ]
      },
      "home_assistant": {
        "enabled": false,
        "contract_ready": false,
        "policy_protected": true,
        "planned": true,
        "endpoints": [
          "/home-assistant/readiness"
        ]
      }
    }
  },
  "sessions": {
    "count": 8,
    "sessions": [
      {
        "session_id": "2de5d87fe7584b91b2d5cff623d13d19",
        "messages": 2,
        "created_at": "2026-08-09T18:28:41.978146+00:00",
        "updated_at": "2026-08-09T18:29:20.961550+00:00"
      },
      {
        "session_id": "025d44ff9abe4c94b5d8fa29664a3425",
        "messages": 2,
        "created_at": "2026-08-09T18:28:48.375062+00:00",
        "updated_at": "2026-08-09T18:29:17.277149+00:00"
      },
      {
        "session_id": "be70f66847f94719b95564fecf7b6827",
        "messages": 2,
        "created_at": "2026-08-09T19:21:19.421357+00:00",
        "updated_at": "2026-08-09T19:21:50.923789+00:00"
      },
      {
        "session_id": "8fbbe0bc7a2d49ab842680a50447e315",
        "messages": 2,
        "created_at": "2026-08-09T19:21:27.578194+00:00",
        "updated_at": "2026-08-09T19:21:54.970832+00:00"
      },
      {
        "session_id": "8cccb2c12272460eaae55622aecb539a",
        "messages": 2,
        "created_at": "2026-08-09T19:21:45.004357+00:00",
        "updated_at": "2026-08-09T19:22:00.568318+00:00"
      },
      {
        "session_id": "70a496abf7c549b38e4a4e856bfb103b",
        "messages": 2,
        "created_at": "2026-08-11T09:36:14.212941+00:00",
        "updated_at": "2026-08-11T09:36:40.264258+00:00"
      },
      {
        "session_id": "5bde132e92cc4c9abed27a2f1e64a982",
        "messages": 2,
        "created_at": "2026-08-11T09:52:30.886845+00:00",
        "updated_at": "2026-08-11T09:52:57.774742+00:00"
      },
      {
        "session_id": "39212c5423e04fa299531c4caa8fdcb2",
        "messages": 2,
        "created_at": "2026-08-11T10:24:13.008916+00:00",
        "updated_at": "2026-08-11T10:24:17.475134+00:00"
      }
    ]
  },
  "audit": {
    "count": 50,
    "events": [
      {
        "id": "7b9383fd39d44c77913d64515780b73a",
        "timestamp": "2026-08-11T12:34:14.583728+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "b4ae509838044f5da8808233cada9bb0",
        "timestamp": "2026-08-11T12:34:15.620275+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "a3f235771bea440b9f14e1aeded86ad3",
        "timestamp": "2026-08-11T12:34:28.416699+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "76c5145cd2f74b68884f2bf949f1f91f",
        "timestamp": "2026-08-11T12:34:28.438823+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "b16d0d9a685c4773bb0464f51305bfe8",
        "timestamp": "2026-08-11T12:34:29.300007+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "84f4c4de7e9e43a6b675d78a25b2d901",
        "timestamp": "2026-08-11T12:34:30.390463+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "59856f4730cb40f2979a3eb24e8b8b09",
        "timestamp": "2026-08-11T12:35:14.436172+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "09087f385f1b446e8deef713953456ae",
        "timestamp": "2026-08-11T12:35:14.472156+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "26ca6a91b7674d0ba2316c8cf19a40c6",
        "timestamp": "2026-08-11T12:35:15.649937+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "f17d7a68cdf74a2b9022a30386477cf4",
        "timestamp": "2026-08-11T12:35:16.724771+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "3c6e086482de4577852b7ec4e9a0c106",
        "timestamp": "2026-08-11T12:35:25.121797+00:00",
        "type": "updates.check",
        "payload": {
          "status": "update_available",
          "update_available": true
        }
      },
      {
        "id": "24d37eff89b04cdcbdf4c4a81dc38db7",
        "timestamp": "2026-08-11T12:35:28.296011+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "e37eb5f2b3e849e8b8ce7b2e7e279f85",
        "timestamp": "2026-08-11T12:35:28.323629+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "94883cc8798d4ff2bcf02455ab3da862",
        "timestamp": "2026-08-11T12:35:29.103641+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "34a14b9971194ca297eedac8a51954c8",
        "timestamp": "2026-08-11T12:35:30.263763+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "059800e6988d4861b6731179456a2b0e",
        "timestamp": "2026-08-11T12:35:33.209639+00:00",
        "type": "updates.apply",
        "payload": {
          "started": true,
          "requires_confirmation": false
        }
      },
      {
        "id": "b5e9fdaeb4324ee7bbeca2d928d2cf12",
        "timestamp": "2026-08-11T12:35:42.903014+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "580ab4b29b7d472ba1f513bd284d94f3",
        "timestamp": "2026-08-11T12:35:42.910216+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "3bdd168bd55a4214819cfa30dbef1e23",
        "timestamp": "2026-08-11T12:35:44.292994+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "7968a10b1eca4abaaf7ba94860e15e6f",
        "timestamp": "2026-08-11T12:35:45.343007+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "ac18167546b7403399593fd1535bbd6a",
        "timestamp": "2026-08-11T12:35:57.887821+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "43ac084ba6634d79a04c087ffeba2908",
        "timestamp": "2026-08-11T12:35:57.909178+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "2b630e7a820e4d87903d585fda5c300d",
        "timestamp": "2026-08-11T12:35:59.181210+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "32577881d78049069ea2b482d882154e",
        "timestamp": "2026-08-11T12:35:59.986238+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "8c6fd51ed8da43328faa202822a08e7f",
        "timestamp": "2026-08-11T12:36:12.881638+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "708b6fbfa25e4e468ad36efe561205df",
        "timestamp": "2026-08-11T12:36:12.896088+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "f6694488eb1849c9ac153d9906cece59",
        "timestamp": "2026-08-11T12:36:14.035448+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "c083d71935f147799e9df00b320a2635",
        "timestamp": "2026-08-11T12:36:15.143544+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "89de6e3aa87d41a98da378af879bbb0e",
        "timestamp": "2026-08-11T12:36:27.893603+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "9c9d4d86eb79443aad864d926c8396b0",
        "timestamp": "2026-08-11T12:36:27.892846+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "44a88ace85cb4fd2ae51ffabdb2946b4",
        "timestamp": "2026-08-11T12:36:28.706746+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "d91cb273290948f7ac749dad1c80866a",
        "timestamp": "2026-08-11T12:36:29.786534+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "4566b64ca90e456baef39d787fc1682d",
        "timestamp": "2026-08-11T12:36:42.895390+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "bae99bd4e36142d4a2d73ef57ead9e46",
        "timestamp": "2026-08-11T12:36:42.891527+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "caaf6cb8a93b4da1b128e8bbc8b0a67c",
        "timestamp": "2026-08-11T12:36:44.135020+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "943f2eafcb3c4ad8ac81526c4d98ecbb",
        "timestamp": "2026-08-11T12:36:45.171073+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "6a9519231555487db554fcb93e66829f",
        "timestamp": "2026-08-11T12:36:57.882923+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "05ef2311d9304356b539ca195cdaeffd",
        "timestamp": "2026-08-11T12:36:57.872991+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "f0272516164c40b898cd1efa3576b6c9",
        "timestamp": "2026-08-11T12:36:58.503828+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "633ea5aea31e4e478aadf039548d0c2a",
        "timestamp": "2026-08-11T12:36:59.776004+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "63bca8117b4b49edb935a9415d7b0bb4",
        "timestamp": "2026-08-11T12:37:06.575031+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "d604b56e5c374782a6975139a3b1db27",
        "timestamp": "2026-08-11T12:37:12.906855+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "a5dced3a07964c819a42fc2b828db279",
        "timestamp": "2026-08-11T12:37:12.906688+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "be99044b18854f9d8e9cf91d2797182c",
        "timestamp": "2026-08-11T12:37:13.637709+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "68ff38ade4854d108fb66bbe3d787cb3",
        "timestamp": "2026-08-11T12:37:15.159804+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "0ac058d142ad49e2912026548eeb028f",
        "timestamp": "2026-08-11T12:37:27.918248+00:00",
        "type": "interfaces.settings.backups",
        "payload": {
          "count": 6
        }
      },
      {
        "id": "b1be943683b04b69beb43c9ca2862579",
        "timestamp": "2026-08-11T12:37:27.916541+00:00",
        "type": "interfaces.settings.backup_cleanup_plan",
        "payload": {
          "removable": 1,
          "keep_latest": 5
        }
      },
      {
        "id": "d632864a898b4531ae62e7052b329520",
        "timestamp": "2026-08-11T12:37:28.653902+00:00",
        "type": "interfaces.check",
        "payload": {
          "requested": true
        }
      },
      {
        "id": "a795dcb943f6483e9931d156c9477bd2",
        "timestamp": "2026-08-11T12:37:29.876195+00:00",
        "type": "voice.next_action",
        "payload": {
          "status": "ready",
          "action": "stt_then_tts",
          "target": "run-voice-stt-diagnostics"
        }
      },
      {
        "id": "5226ae7adc004f80976c55ae324404a1",
        "timestamp": "2026-08-11T12:37:30.995510+00:00",
        "type": "interfaces.settings.backup_plan",
        "payload": {
          "ready": true
        }
      }
    ]
  },
  "metrics": {
    "events_total": 42154,
    "by_type": {
      "interfaces.settings.backups": 6084,
      "interfaces.settings.backup_cleanup_plan": 6084,
      "interfaces.check": 6073,
      "updates.check": 103,
      "interfaces.settings.apply": 7,
      "voice.stt.livecheck": 15,
      "voice.tts.livecheck": 16,
      "ollama.model.changed": 18,
      "updates.apply": 71,
      "voice.tts.contract": 11,
      "voice.tts.synthesize": 5,
      "voice.reply_plan": 3,
      "open_webui.livecheck": 1,
      "chat": 2,
      "voice.tts.request_plan": 2,
      "voice.chain_check": 19,
      "voice.open_webui.diagnostics": 14,
      "voice.stt.diagnostics": 16,
      "voice.next_action": 3068,
      "voice.stt.contract": 5,
      "voice.tts.diagnostics": 8,
      "session.clear": 12,
      "voice.sample_audio_plan": 2,
      "voice.stt.upload_plan": 1,
      "openai.chat.rejected": 2,
      "openai.chat": 146,
      "openai.audio.speech": 20285,
      "voice.tts.clone_diagnostic": 5,
      "voice.technical_readiness": 1,
      "voice.report.download": 5,
      "diagnostics.snapshot": 5,
      "interfaces.settings.backup_plan": 4,
      "interfaces.settings.backup_detail": 18,
      "interfaces.settings.backup_download": 18,
      "interfaces.settings.restore_plan": 18,
      "voice.conversation": 4,
      "open_webui.connection_test": 1,
      "diagnostics.download": 1,
      "prompt.changed": 1
    },
    "chat_total": 2,
    "openai_chat_total": 146,
    "model_changes_total": 18,
    "prompt_changes_total": 1,
    "generation_changes_total": 0,
    "diagnostic_downloads_total": 1
  }
}