Files
aza/AzA march 2026 - Kopie (3)/project_todos.json
2026-03-30 07:59:11 +02:00

692 lines
38 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"version": 9,
"updated_at": "2026-03-26",
"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": "Desktop lokal auf Live-Backend umstellen und testen. Hetzner ist live (api.aza-medwork.ch). Backend-URL + Token lokal setzen, AZA starten, Chat testen.",
"items": [
{
"id": "B1-W1",
"priority": "ERLEDIGT",
"group": "B1 Backend-Sprint Variante B",
"area": "Backend / Architektur / OpenAI",
"title": "ERLEDIGT: Backend Chat Proxy Endpoint (POST /v1/chat)",
"status": "erledigt",
"description": "POST /v1/chat in backend_main.py implementiert und verifiziert (2026-03-26). Auth via X-API-Token (require_api_token). Pydantic-Modelle ChatRequest/ChatMessage. Modell-Whitelist (gpt-5.2/5-mini/5-nano/4o/4o-mini/4o-mini-search-preview). Rate Limiting IP+Token. Input-Validierung (max 64 Messages, max 100k Zeichen). Secret-Scrubbing bei Fehlern. 7/7 Tests gruen: Auth 401, Bad Model 400, Empty 422, Valid 200 success=true, /license/status 200 OK, Schema komplett."
},
{
"id": "B1-W2",
"priority": "ERLEDIGT",
"group": "B1 Backend-Sprint Variante B",
"area": "Desktop / Backend",
"title": "ERLEDIGT: Desktop-App OpenAI-Calls auf Backend umgestellt (2026-03-26)",
"status": "erledigt",
"description": "call_chat_completion() in basis14.py nutzt jetzt _backend_chat_completion() -> POST /v1/chat. 4 Call-Sites migriert: (1) call_chat_completion zentral, (2) News-Suche, (3) Kommentare, (4) Med-Detail Kurzinfo. aza_text_windows_mixin.py (Briefstil-Analyse) ebenfalls migriert. _BackendChatResponse Wrapper fuer OpenAI-Interface-Kompatibilitaet. Kein direkter OpenAI-Chat-Call mehr in basis14.py. 7/7 Tests gruen. Verbleibend fuer spaeter: translate.py, congress_window.py, aza_email.py (separate Module)."
},
{
"id": "B1-W3",
"priority": "ERLEDIGT",
"group": "B1 Backend-Sprint Variante B",
"area": "Ops / Deploy / Hetzner",
"title": "ERLEDIGT: Hetzner Deploy LIVE (2026-03-26)",
"status": "erledigt",
"description": "Hetzner-Backend ist live. DNS A-Record api.aza-medwork.ch → 178.104.51.177. Repo unter /root/aza-app, deploy unter /root/aza-app/deploy. Services aza-api + aza-caddy laufen. Caddy/HTTPS aktiv. Root Causes geloest: falsches Git-Remote (naswinterthur), fehlender Repo-Root-Kontext fuer Docker, nginx auf Port 80, Caddy DNS-Resolver 127.0.0.53. Fix: explizite DNS-Server 1.1.1.1 + 8.8.8.8 im caddy-Service. .env produktiv: AZA_DOMAIN=api.aza-medwork.ch, ACME_EMAIL=info@aza-medwork.ch, MEDWORK_API_TOKENS + OPENAI_API_KEY gesetzt."
},
{
"id": "B1-W4",
"priority": "ERLEDIGT",
"group": "B1 Backend-Sprint Variante B",
"area": "Product / E2E / Go-Live",
"title": "ERLEDIGT: Server-E2E-Test erfolgreich (2026-03-26)",
"status": "erledigt",
"description": "curl https://api.aza-medwork.ch/health erfolgreich. curl -X POST /v1/chat mit gueltigem X-API-Token erfolgreich (success:true, content:OK). Variante B serverseitig Ende-zu-Ende nachgewiesen: Hetzner-Backend laeuft, Caddy/HTTPS laeuft, serverseitiger OpenAI-Zugriff laeuft."
},
{
"id": "B1-W5",
"priority": "HOECHSTE",
"group": "B1 Backend-Sprint Variante B",
"area": "Desktop / E2E / Go-Live",
"title": "AKTUELLER HAUPTBLOCK: Desktop lokal auf Live-Backend umstellen und testen",
"status": "offen",
"description": "backend_url.txt lokal auf https://api.aza-medwork.ch setzen. backend_token.txt lokal mit gueltigem MEDWORK-Token befuellen. AZA lokal starten. Chat-/Textpfad testen. Bestaetigen: Desktop → Hetzner → OpenAI laeuft ohne lokalen OpenAI-Key."
},
{
"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": "ERLEDIGT",
"group": "A Go-Live extern",
"area": "Ops",
"title": "ERLEDIGT: Deploy-Stack auf Hetzner live (2026-03-26)",
"status": "erledigt",
"description": "Docker Compose + Caddy + Backend auf Hetzner live. Services aza-api + aza-caddy. api.aza-medwork.ch erreichbar. 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": "ERLEDIGT",
"group": "Architektur OpenAI-Key (VARIANTE B VERBINDLICH)",
"area": "Backend / Architektur",
"title": "ERLEDIGT: Serverseitige OpenAI-Architektur Variante B produktiv (2026-03-26)",
"status": "erledigt",
"description": "VERBINDLICHE ENTSCHEIDUNG (2026-03-25) UMGESETZT: OpenAI-Key AUSSCHLIESSLICH serverseitig auf Hetzner. Hetzner-Backend live unter api.aza-medwork.ch. POST /v1/chat, Caddy/HTTPS, serverseitiger OpenAI-Zugriff nachgewiesen. Verbleibend: Desktop-Client auf Live-Backend umstellen."
},
{
"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."
}
]
}