{ "version": 9, "updated_at": "2026-03-25", "project_phase": "B1 Backend-Sprint – Serverseitige OpenAI-Architektur (Variante B verbindlich)", "go_live_sprint": { "start": "2026-03-25", "target": "ca. 2026-04-22", "woche_1": "WooCommerce / Stripe / Checkout / Download / Testkauf", "woche_2": "Installer / Aktivierung / Erststart", "woche_3": "Produktdarstellung / Bilder / Signing-Entscheidung", "woche_4": "End-to-End-Test / Go-Live-Freigabe" }, "priority_order": "Woche 1 (WooCommerce/Stripe) → Woche 2 (Installer/Aktivierung) → Woche 3 (Produktseite/Signing) → Woche 4 (E2E-Test/Go-Live). Desktop-Blocker nur gezielt. Update-Komfort/Hetzner/Refactors NACHRANGIG.", "priority_note": "B1 Backend-Sprint: Variante B verbindlich. Hetzner ist JETZT Backend-Pfad (OpenAI-Proxy/API). Hostpoint bleibt fuer Website/WooCommerce. Beides parallel.", "working_principles": [ "Root-cause-first statt blindem Nachpatchen", "Ein klarer Block nach dem anderen – keine 10 Baustellen gleichzeitig", "Reale installierte Builds staerker gewichten als Code-Behauptungen", "Nicht zu frueh 'fertig' sagen", "Desktop unterscheiden in: 1. Dev-Code, 2. neu gebauter Installer, 3. reales Verhalten im installierten Build" ], "next_main_block": "B1-W1: Backend Chat Proxy Endpoint (POST /v1/chat). Variante B verbindlich. Danach W2: Desktop-Umstellung, W3: Hetzner Deploy, W4: E2E-Test.", "items": [ { "id": "B1-W1", "priority": "HOECHSTE", "group": "B1 Backend-Sprint – Variante B", "area": "Backend / Architektur / OpenAI", "title": "AKTUELLER HAUPTBLOCK: Backend Chat Proxy Endpoint (POST /v1/chat)", "status": "in_arbeit", "description": "Neuen Endpunkt POST /v1/chat in backend_main.py erstellen. Auth via X-API-Token + X-Device-Id. Request (model, messages, temperature etc.) entgegennehmen. Serverseitig OpenAI chat.completions.create ausfuehren mit OPENAI_API_KEY aus Serverumgebung. Response an Desktop-App zurueckgeben. Rate Limiting pro Token/Device. Keine Secrets loggen. Muster: /v1/transcribe existiert bereits." }, { "id": "B1-W2", "priority": "HOECHSTE", "group": "B1 Backend-Sprint – Variante B", "area": "Desktop / Backend", "title": "Desktop-App: Alle OpenAI-Calls auf Backend umstellen", "status": "offen", "description": "call_chat_completion() in basis14.py auf Backend /v1/chat umstellen. News-Suche, Kommentare, Medikament-Detail, Briefgenerierung ueber Backend. OpenAI-Key-Setup-Dialog nur noch fuer Dev-Modus. Alle Features testen." }, { "id": "B1-W3", "priority": "HOECHSTE", "group": "B1 Backend-Sprint – Variante B", "area": "Ops / Deploy / Hetzner", "title": "Hetzner Deploy: Docker/Caddy/HTTPS + Production-Env", "status": "offen", "description": "Docker-Stack auf Hetzner VPS deployen. Caddy mit HTTPS (api.aza-medwork.ch oder app.aza-medwork.ch). Production .env mit OPENAI_API_KEY + STRIPE-Keys. Smoke-Tests gegen Produktions-Backend." }, { "id": "B1-W4", "priority": "HOECHSTE", "group": "B1 Backend-Sprint – Variante B", "area": "Product / E2E / Go-Live", "title": "E2E-Test: Desktop→Backend→OpenAI + Kundenweg ohne OpenAI-Key", "status": "offen", "description": "Kompletter Kundenweg testen: WooCommerce-Kauf → Download → Install → Aktivierung → Chat/Diktat/Kommentare OHNE eigenen OpenAI-Key. Security-Audit: keine Keys in Logs, Rate Limiting wirksam. Go-Live-Freigabe fuer Backend-Pfad." }, { "id": "FB-A", "priority": "HOCH", "group": "Fokusblock A – Kundenweg End-to-End (PARALLEL)", "area": "Product / Billing / Release", "title": "WooCommerce-Grundkonfiguration + Testkauf (laeuft parallel weiter)", "status": "in_arbeit", "description": "7 Admin-Schritte in WordPress/WooCommerce. Laeuft parallel zum B1 Backend-Sprint auf Hostpoint weiter." }, { "id": "FB-A-BRIDGE", "priority": "ERLEDIGT", "group": "Fokusblock A – Kundenweg End-to-End", "area": "Desktop / Lizenz", "title": "Aktivierungsschluessel → Lizenzmodus Bridge", "status": "erledigt", "description": "Kritischer Bruch behoben: Gueltiger AZA-Aktivierungsschluessel setzt jetzt license_mode=active (Vollmodus), nicht nur Start-Erlaubnis. Damit ist der manuelle erste Kundenweg praktikabel: Entwickler generiert Key, sendet per E-Mail, Kunde gibt ein, App laeuft voll. Datei: basis14.py." }, { "id": "FB-B", "priority": "HOCH", "group": "Fokusblock B – Kritische Restfehler", "area": "Desktop / Bugfix", "title": "Kritische Desktop-Restfehler nur gezielt und einzeln behandeln", "status": "offen", "description": "Keine neuen Monsterpatches. Root-cause-first. Installierten Build hoeher gewichten als Code-Behauptungen. Nur Blocker fuer den Kundenweg." }, { "id": "FB-C", "priority": "MITTEL", "group": "Fokusblock C – Windows-Signing", "area": "Release / Security", "title": "Windows-Kundenauslieferung absichern (Signing)", "status": "offen", "description": "Signing-Readiness vorbereitet. Produktives Signing vor Kundenauslieferung noch offen. Smart App Control / Reputation / Publisher-Konsistenz beachten." }, { "id": "FB-D", "priority": "NACHGELAGERT", "group": "Fokusblock D – Update-Komfort", "area": "Desktop / Release", "title": "Update-Verbesserungen BEWUSST NACHGELAGERT", "status": "nachgelagert", "description": "Update-Komfort / separater Updater ist NICHT aktuelle Prioritaet. Kein aktueller Hauptblock. Erst nach stabilem Kauf-/Download-/Installationspfad." }, { "id": "A-01", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Ops", "title": "Hostpoint-Website stabil lassen", "status": "in_progress", "description": "Keine riskanten Domain-/DNS-Experimente. Bestehende WordPress/Kadence-Seite bleibt Haupt-Website auf Hostpoint." }, { "id": "A-02", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Billing", "title": "Stripe Live-Setup sauber fertigstellen", "status": "offen", "description": "Stripe-Keys (Live) in WooCommerce eintragen, Webhooks konfigurieren, Zahlungsmethoden aktivieren." }, { "id": "A-03", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Security", "title": "Live-Secrets pruefen", "status": "offen", "description": "deploy/.env: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, MEDWORK_API_TOKEN. Keine Secrets in Code oder Logs." }, { "id": "A-04", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Ops", "title": "Deploy-Stack finalisieren", "status": "offen", "description": "Docker Compose, Caddy, Backend auf Hetzner fuer spaeteren App-Betrieb. Haupt-Website bleibt auf Hostpoint." }, { "id": "A-05", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Product", "title": "Testkauf Ende-zu-Ende durchfuehren", "status": "offen", "description": "Stripe-Testmodus: Subscription monatlich + jaehrlich kaufen, Download-Link pruefen, E-Mail pruefen, Mein-Konto pruefen." }, { "id": "A-06", "priority": "SOFORT", "group": "A – Go-Live extern", "area": "Product", "title": "Download-/Lizenzfluss live validieren", "status": "offen", "description": "Installer herunterladen, installieren, Aktivierung, Lizenzpruefung, Backend-Anbindung – alles End-to-End." }, { "id": "BRAND-01", "priority": "HOCH", "group": "Branding / Produktname", "area": "Product / Marketing", "title": "Produktname AZA Office final entscheiden (vor Go-Live)", "status": "in_arbeit", "description": "AKTUELLE RICHTUNG: AZA Office. Favorit-Langform: 'AZA Office – Ihr medizinischer KI-Arbeitsplatz fuer die Praxis'. Zweite gute Variante: 'AZA Office – Die KI-Assistenz fuer medizinische Dokumentation'. Noch nicht zwingend final juristisch/brand-strategisch entschieden, aber bevorzugte Naming-Richtung fuer WooCommerce/Website/Download/Go-Live. Fruehere Shortlist (AZA Desktop) bleibt dokumentiert in project_roadmap.json und project_plan.json." }, { "id": "B-01", "priority": "HOCH", "group": "B – Verkauf / Subscription", "area": "Product", "title": "Subscription in Website/Checkout konsistent abbilden", "status": "offen", "description": "Monatlich CHF 89 + Jahreslizenz CHF 886 (17% guenstiger). WooCommerce Subscriptions Plugin oder Stripe Billing. Pricing auf Produktseite, Checkout, E-Mails konsistent." }, { "id": "B-02", "priority": "HOCH", "group": "B – Verkauf / Subscription", "area": "Product", "title": "Pricing-Texte und Lizenztexte festziehen", "status": "erledigt", "description": "deploy/PRODUCT_V1.md und deploy/WOOCOMMERCE_PRODUCT.md auf Subscription-Modell aktualisiert." }, { "id": "B-03", "priority": "HOCH", "group": "B – Verkauf / Subscription", "area": "Billing", "title": "Billing / Invoices / VAT / Stripe-Rechnungslogik", "status": "offen", "description": "Rechnungen mit CHF, MwSt-Hinweis, korrekte Absenderadresse. Stripe Invoice-Einstellungen. AGB mit Subscription-Hinweisen." }, { "id": "C-01", "priority": "HOCH", "group": "C – Download-Produkt", "area": "Release", "title": "Stabile Basisversion als erste verkaufbare Version definieren", "status": "erledigt", "description": "v1.0.0 definiert, Installer gebaut und getestet. 6 Module, Systemstatus, Launcher, Firewall-Fix." }, { "id": "C-02", "priority": "HOCH", "group": "C – Download-Produkt", "area": "Release", "title": "Release-/Update-Strategie sauber machen", "status": "erledigt", "description": "Versionierung (v1.0.x / v1.x / v2.0), Update-Lieferung ueber WooCommerce-Account, Changelog." }, { "id": "C-03", "priority": "MITTEL", "group": "C – Download-Produkt", "area": "Release", "title": "Signierte Downloads / Versionierung / Changelog vervollstaendigen", "status": "teilweise", "description": "Signing-Readiness vorbereitet: sign_release.ps1 erstellt, Release-Pipeline mit optionalem Signing-Schritt (build_and_test_release.ps1), Artefakt-Report mit Signatur-Status (build_release_artifacts.ps1), SIGNING_READINESS.md mit Checkliste. OFFEN: Echtes EV Code-Signing-Zertifikat beschaffen, signtool.exe auf Build-Rechner installieren, produktiver Signierlauf durchfuehren, Publisher-Name im Zertifikat mit AppPublisher in aza_installer.iss abstimmen." }, { "id": "C-04", "priority": "HOCH", "group": "C – Download-Produkt", "area": "Release / Security", "title": "Code-Signing vor Kundenauslieferung aktivieren", "status": "offen", "description": "VOR erster Kundenauslieferung verpflichtend: (1) Offiziellen Firmennamen im Handelsregister pruefen (EV-Validierung prueft HR-Eintrag). (2) EV Code-Signing-Zertifikat beschaffen (DigiCert/Sectigo empfohlen, alternativ Azure Trusted Signing). (3) signtool.exe installieren (Windows SDK). (4) AppPublisher in aza_installer.iss auf exakten Zertifikats-Subject abstimmen (aktuell 'AZA MedWork'). (5) Falls HR-Name abweicht: auch legal/privacy_policy.md, legal/ai_consent.md, deploy/WOOCOMMERCE_PRODUCT.md (Absendername), deploy/WORDPRESS_GOLIVE.md gemeinsam anpassen. (6) sign_release.ps1 produktiv ausfuehren. (7) Signierte Artefakte auf Windows-PC mit Smart App Control testen. (8) Publisher-Name nach Festlegung NICHT mehr aendern (Reputation). Grund: Windows Smart App Control blockiert unsignierte/unbekannte Apps bei Kunden." }, { "id": "C-05", "priority": "HOCH", "group": "C – Download-Produkt", "area": "Release / Legal", "title": "Publisher-/Firmenname final festlegen (vor Zertifikatskauf)", "status": "offen", "description": "Vor Zertifikatskauf: (1) Offiziellen Firmennamen im Handelsregister pruefen. (2) Entscheiden ob Signing-Publisher 'AZA MedWork', 'AZA MedWork GmbH' oder anders lauten soll. (3) AppPublisher in aza_installer.iss anpassen falls noetig. (4) Alle signing-relevanten Stellen gemeinsam aktualisieren: aza_installer.iss, legal/privacy_policy.md, legal/ai_consent.md, deploy/WOOCOMMERCE_PRODUCT.md, deploy/WORDPRESS_GOLIVE.md. (5) Nicht-signing-relevante Stellen (project_status.json 'AZA Medical AI Assistant', billing/invoice_template.json) koennen unabhaengig bleiben. Analyse: Aktuell 3 Namensformen im Projekt – 'AZA MedWork' (Firma/Publisher), 'AZA Desktop' (Produkt), 'AZA Medical AI Assistant' (interner Projektname). Nur 'AZA MedWork' ist signing-kritisch." }, { "id": "D-01", "priority": "HOCH", "group": "D – Browser-AZA", "area": "Web", "title": "Nach Go-Live Step 22 verbindlich starten", "status": "offen", "description": "Browser-AZA ist Kern des Projekts. Wird nach Go-Live sofort gestartet, nicht optional." }, { "id": "D-02", "priority": "HOCH", "group": "D – Browser-AZA", "area": "Web", "title": "Browser-AZA MVP nach Spec umsetzen", "status": "offen", "description": "browser_aza_mvp_spec.md: Upload-Bereich, Fachrichtungsauswahl, /v1/transcribe, Ergebnisansicht, Copy-Button." }, { "id": "D-03", "priority": "HOCH", "group": "D – Browser-AZA", "area": "Security", "title": "Minimaler Zugangsschutz ohne Breaking Change", "status": "offen", "description": "Auth fuer Browser-AZA, ohne /license/status oder X-API-Token Contract zu brechen." }, { "id": "D-04", "priority": "HOCH", "group": "D – Browser-AZA", "area": "Web", "title": "Upload-Flow / Result-Flow / Specialty-Auswahl bauen", "status": "offen", "description": "Audio-Upload, Fachrichtungsauswahl, Transkript-Anzeige, Copy-Button. Keine PHI in Logs." }, { "id": "E-01", "priority": "SPAETER", "group": "E – Ops / Spaeter", "area": "Ops", "title": "Observability", "status": "offen", "description": "Logging, Metriken, Alerting. Kein PHI in Logs. Uptime-Monitoring." }, { "id": "E-02", "priority": "SPAETER", "group": "E – Ops / Spaeter", "area": "Ops", "title": "Admin-/Support-Tools", "status": "offen", "description": "Admin-Panel, Support-Workflows, Nutzer-Management." }, { "id": "E-03", "priority": "SPAETER", "group": "E – Ops / Spaeter", "area": "Ops", "title": "Runbook final", "status": "offen", "description": "Backups, Log-Rotation, Incident-Playbook, Token-Rotation." }, { "id": "E-04", "priority": "SPAETER", "group": "E – Ops / Spaeter", "area": "Ops", "title": "Go-Live Cutover final", "status": "offen", "description": "Finale Checkliste, Rollback-Plan, DNS-Cutover fuer Browser-AZA (app.aza-medwork.ch)." }, { "id": "ARCH-01", "priority": "HOECHSTE", "group": "Architektur – OpenAI-Key (VARIANTE B VERBINDLICH)", "area": "Backend / Architektur", "title": "OpenAI-Key-Fluss auf serverseitige Architektur umstellen – VARIANTE B", "status": "in_arbeit", "description": "VERBINDLICHE ENTSCHEIDUNG (2026-03-25): OpenAI-Key AUSSCHLIESSLICH serverseitig. Desktop-App → AZA-Backend → OpenAI. Umsetzung durch B1 Backend-Sprint (W1-W4)." }, { "id": "ARCH-02", "priority": "HOCH", "group": "Architektur – OpenAI-Key (VARIANTE B VERBINDLICH)", "area": "Backend / Architektur", "title": "Codepfade mit lokaler Key-Eingabe identifizieren und migrieren", "status": "analysiert", "description": "ANALYSE ABGESCHLOSSEN: Direkte OpenAI-Calls in basis14.py: (1) call_chat_completion() ~Z.5458, (2) News-Suche ~Z.3417, (3) Kommentare ~Z.7058, (4) Med-Detail ~Z.7453. Weitere in aza_text_windows_mixin.py, translate.py, apps/diktat/diktat_app.py. Key-Handling: openai_runtime_config.py, security_vault.py, setup_openai_runtime.ps1, config/aza_runtime.env. MIGRATION: Alle Calls auf Backend /v1/chat umstellen (B1-W2)." }, { "id": "ARCH-03", "priority": "HOCH", "group": "Architektur – OpenAI-Key (VARIANTE B VERBINDLICH)", "area": "Backend / Architektur", "title": "Migrationspfad: lokaler Key nur Dev, Produktion nur Backend", "status": "definiert", "description": "PLAN: Lokale Key-Eingabe bleibt als Dev-Only-Fallback (AZA_DEV_MODE oder aehnlich). Produktivauslieferung hat KEINEN Key-Setup-Dialog. call_chat_completion() prueft: Backend erreichbar? → Backend-Call. Sonst und nur im Dev-Modus: lokaler Key. Umsetzung in B1-W2." }, { "id": "ARCH-04", "priority": "HOECHSTE", "group": "Architektur – OpenAI-Key (VARIANTE B VERBINDLICH)", "area": "Security", "title": "GESPERRT: Keine Keys hardcoden, keinen Shared-Key, keine halben Loesungen", "status": "gesperrt", "description": "VERBINDLICHE SPERRUNG: NIEMALS OpenAI-Key hardcoded in die App. NIEMALS Shared-Key ausliefern. KEINE halben Uebergangsloesung fuer Kunden. KEINE Shared-Key-Bastelei in der App. Secrets NIEMALS loggen. /license/status nicht leichtfertig kaputtpatchen." }, { "id": "LOCK-01", "priority": "GESPERRT", "group": "Gesperrte Entscheidungen", "area": "Audio / Aufnahme", "title": "Audioaufnahme IMMER als M4A – NICHT AENDERN", "status": "gesperrt", "description": "ENDGUELTIGE ENTSCHEIDUNG: Audioaufnahme erfolgt direkt als M4A (AAC 64kbps via ffmpeg stdin-Pipe). KEIN WAV-Zwischenschritt. WAV nur als Fallback wenn ffmpeg fehlt. Diese Regel wurde bereits einmal faelschlich gebrochen und darf NIEMALS wieder geaendert werden. Jede Aenderung an aza_audio.py muss diese Regel respektieren." }, { "id": "SEC-01", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security / Architektur", "title": "Sicherheitszielbild fuer Browser-AZA entlang HIN-naher Schutzprinzipien konkretisieren", "status": "offen", "description": "Geschlossener Vertrauensraum, verifizierte digitale Identitaet (eID), 2FA, asymmetrische Verschluesselung, S/MIME, TLS, digitale Signatur, TOM, ISMS nach ISO/IEC 27001 als Zielbild, EPD-/IdP-nahe Logik. KEIN Marketing-Claim – nur internes Zielbild." }, { "id": "SEC-02", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security", "title": "Pruefen: 2FA (Zwei-Faktor-Authentisierung)", "status": "offen", "description": "Evaluieren und planen, wie 2FA fuer Browser-AZA und spaetere geschuetzte App umgesetzt wird. Benchmark: HIN-aehnlicher Vertrauensraum." }, { "id": "SEC-03", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security", "title": "Pruefen: Rollenbasierte Zugriffskontrolle (RBAC)", "status": "offen", "description": "Rollenmodell fuer Arzt, Praxis-Admin, Support, Super-Admin definieren. Prinzip der minimalen Rechte." }, { "id": "SEC-04", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security", "title": "Pruefen: Audit-Logs / Nachvollziehbarkeit", "status": "offen", "description": "Nachvollziehbare Protokollierung sicherheitsrelevanter Aktionen. Keine PHI in Logs. Aufbewahrungsfrist definieren." }, { "id": "SEC-05", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security", "title": "Pruefen: Verschluesselung in Transit und at Rest", "status": "offen", "description": "TLS fuer alle Verbindungen (Transit). Verschluesselung gespeicherter Daten (at Rest) evaluieren. Benchmark: asymmetrische Verschluesselung, S/MIME wo relevant." }, { "id": "SEC-06", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security / Ops", "title": "Pruefen: Schweizer Hosting / Datenstandort", "status": "offen", "description": "Sicherstellen, dass Gesundheitsdaten in der Schweiz oder einem aequivalent geschuetzten Rechtsraum gehostet werden. Hetzner-Standort pruefen." }, { "id": "SEC-07", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security / Architektur", "title": "Pruefen: Identitaets-/Vertrauenslogik fuer spaetere geschuetzte App", "status": "offen", "description": "EPD-/IdP-nahe Vertrauenslogik als Orientierung. Verifizierte digitale Identitaet. Kein eigener IdP bauen, sondern etablierte Standards (OIDC, SAML) evaluieren." }, { "id": "SEC-08", "priority": "HOCH", "group": "Sicherheits-Zielbild – HIN-nahe Schutzprinzipien", "area": "Security / Compliance", "title": "Keine ueberzogenen Aussenbehauptungen ohne Zertifizierung", "status": "offen", "description": "REGEL: Keine Marketing- oder Produktbehauptungen zu HIN-Zertifizierung, ISO-Zertifizierung oder EPD-Integration, solange diese nicht tatsaechlich vorliegen. Intern als Zielbild fuehren, extern nur als Orientierung kommunizieren." }, { "id": "DX-01", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / Installer", "title": "Benutzerdaten bei Deinstallation erhalten", "status": "erledigt", "description": "Inno Setup fragt bei Deinstallation ob Benutzerdaten (%APPDATA%\\AZA Desktop) geloescht werden sollen. Standard: Nein. Daten bleiben bei Neuinstallation erhalten." }, { "id": "DX-02", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / UX", "title": "Signaturlogik: Profilname als Fallback", "status": "erledigt", "description": "load_signature_name() faellt automatisch auf den Profilnamen zurueck wenn kein expliziter Signaturname gesetzt ist. Wirkt in Briefen, Rezepten, KoGu, OP-Berichten." }, { "id": "DX-03", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / UX", "title": "Rechtsklick-Haekchen im Minifenster", "status": "erledigt", "description": "Im minimierten Hauptfenster dieselbe Option 'Rechtsklick = Einfuegen' wie im Vollbild. Gleiche Variable, synchronisiert, sofort wirksam." }, { "id": "DX-04", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / UX / KI", "title": "Kommentare-Fenster (fertiggestellt)", "status": "erledigt", "description": "Vollstaendig umgesetzt: Button 'Kommentare' in Toolbar, separates Fenster, KI-Kurzkommentare via GPT, manuelles Aktualisieren, Live-Aktualisierung bei KG-Aenderung, automatisches Oeffnen nach KG-Erstellung wenn Haekchen aktiv, klickbare Diagnose-Kommentare mit Detailfenster, Tag-basiertes Highlighting." }, { "id": "DX-05", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / Bugfix", "title": "Autotext Root-Cause-Fix", "status": "erledigt", "description": "Root Cause: _is_admin NameError verhinderte Oeffnen des Autotext-Dialogs im installierten Build. Listener-Architektur auf bewaehrten Stand (Kopie 13) zurueckgesetzt. Prozess-basierter Fokus-Check entfernt zugunsten des einfacheren FocusIn/FocusOut-Mechanismus." }, { "id": "DX-06", "priority": "ERLEDIGT", "group": "Desktop UX / Persistence", "area": "Desktop / UX", "title": "Signatur-UI: Haekchen + abweichender Signaturname in Einstellungen", "status": "erledigt", "description": "Einstellungsdialog: Haekchen 'Profilname verwenden' + Feld fuer abweichenden Signaturnamen. Wenn Haekchen aktiv: Profilname. Wenn Haekchen aus + Name: diesen verwenden. Persistenz via kg_diktat_signature.txt." }, { "id": "BSL-01", "priority": "ERLEDIGT", "group": "Briefstil-Lernen", "area": "Desktop / KI / Brief", "title": "Briefstil-Lernen: Architektur + DOCX-Parsing + Stilprofil-Datenmodell", "status": "erledigt", "description": "python-docx fuer DOCX-Parsing. Persistence: kg_diktat_brief_style_profiles.json. Datenmodell: style_prompt, source_files, source_count, created. Funktionen: load/save/get_active/set_active/extract_texts." }, { "id": "BSL-02", "priority": "ERLEDIGT", "group": "Briefstil-Lernen", "area": "Desktop / UX", "title": "Briefstil-Lernen: UI / Upload / Profilverwaltung", "status": "erledigt", "description": "Button 'Stilprofil' im Brief-Fenster. Dialog: Profilauswahl (Combobox), Mehrfach-DOCX-Upload, GPT-Stilanalyse, Profilname, Loeschen. Aktives Profil sofort sichtbar." }, { "id": "BSL-03", "priority": "ERLEDIGT", "group": "Briefstil-Lernen", "area": "Desktop / KI", "title": "Briefstil-Lernen: Integration in Briefgenerierung", "status": "erledigt", "description": "Aktives Stilprofil wird VOR der Briefgenerierung als Stil-Anweisung in den System-Prompt injiziert. Klare Abgrenzung: nur Stil/Struktur, KEINE Patientendaten/Altinhalte. Reihenfolge: Stilprofil → Briefvorlage → Generierung." }, { "id": "BSL-04", "priority": "HOCH", "group": "Briefstil-Lernen", "area": "Desktop / KI", "title": "Briefstil-Lernen: Erweiterungen (OFFEN)", "status": "offen", "description": "OFFEN: (a) Erweiterte Stilanalyse mit strukturiertem JSON statt Freitext, (b) Mehrere Profile gleichzeitig vergleichen, (c) Stilprofil-Vorschau/Zusammenfassung im Dialog, (d) Weitere Dateiformate (PDF, RTF), (e) Anonymisierungs-Pipeline fuer Trainingsinput." }, { "id": "PCP-01", "priority": "ERLEDIGT", "group": "Persistenz / Consent / Profil", "area": "Desktop / UX / Consent", "title": "KI-Einwilligung beim Erststart (nicht erst bei Start-Klick)", "status": "erledigt", "description": "Consent-Dialog wird direkt nach Fachgebiet-Auswahl im Init-Flow angezeigt, bevor die App normal weiterlaueft. Wenn bereits erteilt, wird nicht erneut gefragt." }, { "id": "PCP-02", "priority": "ERLEDIGT", "group": "Persistenz / Consent / Profil", "area": "Desktop / Profil", "title": "Benutzerprofil um Code (ZSR/GLN) erweitert", "status": "erledigt", "description": "Registrierungs- und Profil-Bearbeiten-Dialog enthalten Feld 'Code (ZSR/GLN, optional)'. Persistent in kg_diktat_user_profile.json in %APPDATA%." }, { "id": "PCP-03", "priority": "ERLEDIGT", "group": "Persistenz / Consent / Profil", "area": "Desktop / Installer", "title": "Deinstallations-Frage listet alle Benutzerdaten einzeln auf", "status": "erledigt", "description": "Inno Setup Uninstaller zeigt detaillierte Liste: Profil, Transkripte, Briefe, Vorlagen, Sichtbarkeit, Consent, Signatur, Autotext, Stilprofile. Standard: behalten." }, { "id": "PCP-04", "priority": "ERLEDIGT", "group": "Persistenz / Consent / Profil", "area": "Desktop / UX", "title": "Kommentare-Fenster: Toggle 'beim Start automatisch oeffnen'", "status": "erledigt", "description": "Einstellung 'kommentare_auto_open' in autotext_data. Haekchen in Einstellungen (LabelFrame 'Startverhalten/Fenster'). Auto-open nach 1000ms wenn aktiv. Persistent." }, { "id": "PCP-05", "priority": "ERLEDIGT", "group": "Persistenz / Consent / Profil", "area": "Desktop / UX", "title": "Einstellungsdialog logisch gruppiert", "status": "erledigt", "description": "Startverhalten/Fenster als eigener LabelFrame (Diktat, Audionotiz, Kommentare). Sichtbarkeit, Add-ons, Statusanzeige, Autotext, Signatur, Datenschutz als klare Abschnitte." }, { "id": "UEB-01", "priority": "ERLEDIGT", "group": "Uebersetzer / Stabilitaet", "area": "Desktop / Bugfix", "title": "Uebersetzer-Stabilitaetsfix: Tkinter-in-Thread behoben", "status": "erledigt", "description": "Root Cause: translate.main() wurde im frozen Build in einem Hintergrund-Thread gestartet und erzeugte tk.Tk() – Tkinter ist nicht threadsafe. Fix: translate.py akzeptiert parent-Parameter und erstellt Toplevel statt Tk(). basis14.py ruft translate.main(parent=self) direkt auf dem Main-Thread auf. Kein eigener mainloop() im Embedded-Modus." }, { "id": "BRP-01", "priority": "ERLEDIGT", "group": "Briefprofile", "area": "Desktop / KI / Brief", "title": "KISIM Bericht als vordefiniertes Briefprofil", "status": "erledigt", "description": "Festes Briefstrukturprofil: Einleitung mit vidit-Zeile, Abschnitte Diagnose/Allergien/Therapie/Anamnese/Beurteilung/Diagnostik/Procedere, nummerierte Diagnosen mit ICD-10, Schlussformel mit Signatur." }, { "id": "BRP-02", "priority": "ERLEDIGT", "group": "Briefprofile", "area": "Desktop / KI / Brief", "title": "Klinischer Bericht als vordefiniertes Briefprofil", "status": "erledigt", "description": "Festes Briefstrukturprofil: Einleitung mit vidit-Zeile, pro Diagnose Untergliederung KLINIK/DIAGNOSTIK/THERAPIE/Aktuell, danach Allergien/Beurteilung/Procedere, Schlussformel mit Signatur." }, { "id": "BRP-03", "priority": "ERLEDIGT", "group": "Briefprofile", "area": "Desktop / UX", "title": "Berichtsprofil-Auswahl im Brief-Fenster", "status": "erledigt", "description": "Combobox 'Berichtsprofil' im Brief-Fenster: Standard / KISIM Bericht / Klinischer Bericht. Persistent via active_brief_profile in autotext_data. Bei Auswahl wird das Profil direkt als System-Prompt verwendet, nicht nachtraeglich umgeformt." }, { "id": "DX-07", "priority": "ERLEDIGT", "group": "Desktop UX / DevTools", "area": "Desktop / Installer / DevOps", "title": "AZA Clean Uninstall/Reset Tool", "status": "erledigt", "description": "PowerShell-Tool fuer saubere AZA-Deinstallation und Reset ohne Neustart. 2 Modi: (1) Nur App entfernen, Benutzerdaten behalten, (2) Vollstaendig zuruecksetzen inkl. Benutzerdaten. Prozesse beenden, Inno-Setup-Uninstaller silent, Restdateien/Firewall/Registry bereinigen, Installer-Ready-Meldung. Dateien: tools/aza_clean_uninstall.ps1, AZA_Deinstallieren.bat." }, { "id": "BRP-04", "priority": "ERLEDIGT", "group": "Briefprofile", "area": "Desktop / KI / Brief", "title": "Briefstil-Profile Fix und Nachschaerfung", "status": "erledigt", "description": "KISIM Bericht und Klinischer Bericht als feste Systemprofile immer im Dropdown sichtbar (nicht durch Neuinstallation/leere Datei/Loeschen entfernbar). Praezise medizinische Prompt-Definitionen mit klaren Strukturunterschieden: KISIM=Gesamtbericht mit uebergreifenden Abschnitten, Klinisch=pro Diagnose KLINIK/DIAGNOSTIK/THERAPIE/Aktuell. Vereinheitlichtes Stilprofil-System direkt im Brief-UI: Haekchen 'Stilprofil anwenden' + Dropdown (keins/Klinisch/KISIM/Benutzerprofile) + Haekchen 'Standard fuer Arztbriefe'. Medizinische Sicherheitsregeln (keine Ueberinterpretation, keine Halluzination fehlender Diagnostik). Dateien: aza_prompts.py, aza_persistence.py, aza_text_windows_mixin.py." }, { "id": "FIX-01", "priority": "ERLEDIGT", "group": "Korrektur-Patch", "area": "Desktop / UX / Build", "title": "Korrektur-Patch: UI-Fixes, Kommentare, Stilprofil-Live, KG-Inline, Zentrierung", "status": "erledigt", "description": "Sammel-Korrektur-Patch: (1) Fachuebersetzer final zu Uebersetzer umbenannt ueberall, (2) Kommentare-Fenster fertiggestellt: Haekchen auto-oeffnen, Live-Update bei KG-Aenderung, klickbare Diagnose-Kommentare mit Detailfenster, (3) Korrektur-Fenster: Scrollbar fuer Liste, (4) Stilprofil Live-Anwendung: Brief wird bei Profilwechsel sofort neu generiert, (5) Profil-anwenden-Button im Stilprofil-Dialog, (6) KG erstellen schreibt direkt ins Hauptfenster (kein Popup), (7) Persistenz: dokumente_collapsed hinzugefuegt, (8) Hauptfenster zentriert starten - robuste verzoegerte Zentrierung nach Widget-Aufbau. Dateien: basis14.py, aza_text_windows_mixin.py, aza_persistence.py, aza_config.py, version.json, CHANGELOG.md, web/index.html, deploy/*.md." }, { "id": "FIX-02", "priority": "ERLEDIGT", "group": "Nachschaerfungs-Patch", "area": "Desktop / UX / Build", "title": "Nachschaerfungs-Patch: Stilprofil-Dialog, Kommentare auto-open, Logo-Trennung", "status": "erledigt", "description": "Nachschaerfungs-Patch: (1) Stilprofil-Dialog nur noch Verwaltung (Statusanzeige, Profile anlegen/loeschen), aktive Auswahl ausschliesslich im Arztbrief-Fenster, (2) Kommentare-Fenster oeffnet sich automatisch nach KG-Erstellung wenn Haekchen gesetzt, (3) Logo-Trennung: Wassertropfen (logo.ico) fuer EXE/Desktop/Installer/Titelleiste, originales Logo (logo.png) fuer internes Branding unten links. Dateien: basis14.py, aza_text_windows_mixin.py, aza_desktop.spec." }, { "id": "FIX-07", "priority": "ERLEDIGT", "group": "Nachschaerfungs-Fixblock", "area": "Desktop / UX / Sicherheit", "title": "Resize-Grip Root-Cause, Korrekturfenster-UX, DocCheck-Links, Med-Kurzvorschau", "status": "in Verifikation", "description": "Nachschaerfungs-Fixblock: (1) Resize-Grip Root-Cause behoben: lift()+after() statt reines place(), (2) Korrekturfenster: sichtbare Falsch/Richtig-Felder OBERHALB der Korrekturliste in blauem Rahmen, (3) DocCheck-Links: search statt q Parameter fuer Flexikon-Suche, (4) Medikamenten-Kurzvorschau: _is_suspicious_med_name() Heuristik + verdaechtige Eintraege grau markiert ohne halluzinierte Infos. Dateien: aza_ui_helpers.py, basis14.py." }, { "id": "FIX-09/10/11", "priority": "ERLEDIGT", "group": "Quellenstrenge Kommentarlogik", "area": "Desktop / KI / Medikamente", "title": "Inhaltsquelle/Originallink Trennung + DocCheck + PharmaWiki", "status": "in Verifikation", "description": "FIX-11: Inhaltsquelle (Detailinhalt) und Originallink (externer Button) sauber getrennt. Inhaltsquelle: DocCheck Flexikon (Standard) + PharmaWiki (Fallback), benutzerwaehlbar + persistent (med_content_quelle). Originallink: CH=Compendium, AT=BASG, DE=BfArM unveraendert. 9/9 Medikamente verifiziert fuer beide Quellen. Kandidatenlogik unberuehrt. Dateien: basis14.py." }, { "id": "ARCH-MED-01", "priority": "HOCH", "group": "Architektur – Medikamenten-Quellenlogik Schweiz", "area": "Backend / Architektur / Medikamente", "title": "Compendium-basierte Medikamenten-Nachschlagelogik – naechste Stufe", "status": "teilweise umgesetzt", "description": "Erste Stufe umgesetzt (FIX-10): (1) Compendium.ch Produkt-Aufloesung (Wirkstoff → Praeparat + Darreichungsform). (2) PharmaWiki Quelltext-Extraktion (strukturierte Sektionen). (3) Kuratierte Fakten als Offline-Fallback. Naechste Stufe: (a) Compendium-Detailseiten-Extraktion (zusaetzlich zu Produkt-Aufloesung). (b) Caching-Strategie. (c) Robustheit gegen HTML-Aenderungen. (d) HCI Solutions API / Datenlizenz evaluieren." }, { "id": "ARCH-MED-02", "priority": "HOCH", "group": "Architektur – Medikamenten-Quellenlogik Schweiz", "area": "Backend / Architektur / Medikamente", "title": "Compendium-Zugang und Datenextraktion evaluieren", "status": "offen", "description": "Technische Evaluation: (1) Welche Compendium.ch-Zugaenge gibt es? (API, Scraping, Datenlizenz, HCI Solutions). (2) Strukturierte Daten oder HTML-Extraktion? (3) Lizenzrechtliche Rahmenbedingungen fuer kommerzielle Nutzung. (4) Machbarkeitspruefung: Welche Felder sind extrahierbar (Indikation, Einnahme, Dosierung, Warnhinweise)? (5) Caching-Strategie (lokal vs. serverseitig). Ergebnis: Klare Empfehlung welcher Compendium-Zugangsweg fuer AZA tragfaehig ist." }, { "id": "F-01", "priority": "ZUKUNFT", "group": "F – Zukunft / Internationalisierung", "area": "Architektur / Produkt / Quellen", "title": "Internationalisierung / Laender- und Quellenprofile", "status": "geparkt", "description": "NICHT FUER JETZT. Erst nach DACH-Stabilitaet (CH/DE/AT) und Produkterfolg. Zielbild: (1) UI-Sprache je nach Markt anpassbar (app_language). (2) Medikamentenquellen je nach Land (med_source_profile). (3) Diagnose-/Therapiequellen je nach Land (dx_source_profile, therapy_source_profile). (4) market_region als uebergreifendes Profil. (5) Manueller Override durch Benutzer/Praxis. Nicht hart nach Herkunftsland schalten, sondern saubere Profil-Logik. Handelsnamen, Zulassungen, Fachinfos und Verfuegbarkeit sind laenderspezifisch – deshalb spaeter Quellenprofile pro Markt. Beispiel: DACH zuerst, spaeter franzoesische UI + franzoesische med. Quellen/Links. Relevant erst nach Go-Live und DACH-Erfolg." } ] }