{ "version": 12, "updated_at": "2026-03-30", "project_phase": "Stripe/Lizenz-Live-Pfad BEWIESEN + Admin Control Panel v2 LIVE – Naechster Block: WooCommerce/Produktiver Verkaufspfad", "b1_backend_sprint": { "title": "B1 Backend-Sprint – Variante B verbindlich", "start": "2026-03-25", "target": "ca. 2026-04-22", "architekturentscheidung": "VARIANTE B: Desktop-App → AZA-Backend → OpenAI. Key nur serverseitig. Kein OpenAI-Key beim Kunden.", "woche_1": "Backend Chat Proxy Endpoint (POST /v1/chat) + Auth + Rate Limiting", "woche_2": "Desktop-App: alle OpenAI-Calls ueber Backend statt direkt", "woche_3": "Hetzner Deploy: Docker/Caddy/HTTPS + Production-Env + Smoke-Tests", "woche_4": "E2E-Test Desktop→Backend→OpenAI + Kundenweg ohne OpenAI-Key + Go-Live-Freigabe", "hostpoint_vs_hetzner": "Hostpoint bleibt fuer Website/WooCommerce. Hetzner ist JETZT der Backend-Pfad. Beides parallel." }, "priority_order": { "1_hoechste": "B1-W1: Backend Chat Proxy POST /v1/chat (Woche 1)", "2_hoch": "B1-W2: Desktop-App OpenAI-Calls auf Backend umstellen (Woche 2)", "3_mittel": "B1-W3: Hetzner Deploy Docker/Caddy/HTTPS (Woche 3)", "4_hoch": "B1-W4: E2E-Test + Go-Live-Freigabe Backend-Pfad (Woche 4)", "5_parallel": "WooCommerce/Stripe-Kauf-Weg laeuft parallel (Hostpoint)", "explizit_nachrangig": "Update-Komfort, Auto-Updater, Browser-AZA Web-App, grosse Refactors" }, "next_main_block": { "title": "WooCommerce / Produktiver Kauf-/Verkaufspfad", "goal": "AZA Office als Subscription-Produkt ueber aza-medwork.ch produktionsreif verkaufbar machen.", "status": "offen", "sprint_context": "Stripe/Lizenz-Live-Pfad BEWIESEN (2026-03-30). Admin Control Panel v2 LIVE. Backup/Storage-Monitor AKTIV. Desktop respektiert canceled korrekt. Technische Basis steht.", "warum_dieser_block_zuerst": "Technische Basis ist bewiesen. Jetzt muss der Verkaufspfad aus Kundensicht sauber funktionieren.", "scope": [ "WooCommerce-Produkt AZA Office anlegen", "Stripe-Checkout-Integration", "Mein-Konto-Seite mit Download-Link", "E-Mail-Benachrichtigungen nach Kauf", "Billing/Legal/Invoices (CHF, MwSt, AGB)", "Testkauf Ende-zu-Ende validieren" ], "alternative": "Lizenz-/Kundenlogik weiter professionalisieren (sauberer Lifecycle, Team-/Praxislogik)", "nachgelagert": ["Autotext-Fix", "Fenstergroessen", "Buttons/Layout", "UI-Feinschliff"] }, "customer_journey_status": { "date": "2026-03-30", "kauf": "NAECHSTER HAUPTBLOCK – WooCommerce-Produkt anlegen, Checkout, Download, E-Mail, Billing/Legal", "download": "TEILWEISE – Mechanik da, WooCommerce-Upload fehlt", "installer": "FUNKTIONAL FERTIG – kein Code-Signing", "aktivierung": "STRIPE LIVE-PFAD VOLLSTAENDIG BEWIESEN (2026-03-30) – Kompletter Lifecycle: Kauf → active → Storno/Refund → canceled → Desktop-Testmodus. Admin Control Panel v2 live.", "erster_start": "VARIANTE B LIVE (2026-03-27) – Desktop → Hetzner → OpenAI funktioniert. Desktop respektiert canceled-Status korrekt.", "admin_ops": "ADMIN CONTROL PANEL V2 LIVE (2026-03-30) – 8 Endpunkte, Backup/Storage/Revenue/Alerts/Dashboard. X-Admin-Token geschuetzt." }, "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" ], "pricing_model": "Subscription: Basic (1 User) CHF 59/Monat bzw. CHF 590/Jahr. Team (2 User) CHF 89/Monat bzw. CHF 890/Jahr. KEIN Einmalkauf.", "product_naming": { "current_direction": "AZA Office", "status": "Aktuelle bevorzugte Naming-Richtung – noch nicht zwingend final juristisch/brand-strategisch entschieden", "use_for": "WooCommerce-Produkt, Website, Download-Seite, Go-Live, Produktdarstellung", "rule": "Bei spaeteren Diskussionen diese Richtung wiederverwenden statt Namen jedes Mal neu zu erfinden", "favorite_long": "AZA Office – Ihr medizinischer KI-Arbeitsplatz fuer die Praxis", "second_choice": "AZA Office – Die KI-Assistenz fuer medizinische Dokumentation", "earlier_shortlist_aza_desktop": { "note": "Fruehere Favoritenliste unter dem Namen AZA Desktop – durch AZA Office abgeloest", "favorites": [ "AZA Desktop – Die KI-Loesung fuer medizinische Dokumentation", "AZA Desktop – KI-gestuetzte Praxisdokumentation fuer Aerzte", "AZA Desktop – Ihre Plattform fuer medizinische KI-Dokumentation", "AZA Desktop – Ihr medizinischer KI-Arbeitsplatz fuer die Praxis", "AZA Desktop – Die KI-Assistenz fuer medizinische Dokumentation", "AZA Desktop – Medizinische KI fuer Aerzte und Praxen" ], "critically_assessed": "'von Aerzten' eher nicht verwenden" } }, "architecture": "Hostpoint=Website/Marketing/WooCommerce. Hetzner=AZA-Backend/API/OpenAI-Proxy (JETZT AKTIV). KEINE DNS-Aenderungen ohne Pruefung.", "openai_key_strategy": "VARIANTE B VERBINDLICH (2026-03-25): OpenAI-Key AUSSCHLIESSLICH serverseitig. Desktop-App → AZA-Backend (Hetzner) → OpenAI. KEIN Key beim Kunden. KEIN Shared-Key. Lokale Key-Eingabe nur Dev-Fallback.", "audio_format_locked": "ENDGUELTIG: Aufnahme direkt als M4A (AAC 64kbps via ffmpeg stdin-Pipe). Kein WAV-Zwischenschritt. NIEMALS auf WAV zurueckaendern. WAV nur Fallback wenn ffmpeg fehlt.", "med_source_strategy_ch": { "title": "Medikamenten-Quellenlogik Schweiz – Architektur", "current_state": "FIX-11: Inhaltsquelle und Originallink sauber getrennt. Inhaltsquelle: _fetch_doccheck_info (DocCheck Flexikon, Standard) + _fetch_pharmawiki_info (PharmaWiki, Fallback), benutzerwaehlbar + persistent (med_content_quelle). Originallink: CH=Compendium, AT=BASG, DE=BfArM unveraendert (_MED_QUELLEN/medikament_quelle). _MEDICATION_FACTS als Offline-Fallback. 9/9 Medikamente verifiziert.", "target_state": "Naechste Stufe: Caching-Strategie, Robustheit gegen HTML-Aenderungen, langfristig HCI-API/Compendium-Datenlizenz.", "steps": [ "1. Compendium-Zugang evaluieren (API, Datenlizenz HCI Solutions, Scraping, lizenzrechtliche Pruefung)", "2. Datenextraktion prototypisch umsetzen (Indikation, Einnahme, Dosierung, Warnhinweise)", "3. Caching-Strategie festlegen (lokal vs. serverseitig)", "4. Lokale Faktenliste durch Compendium-Zugang ersetzen (Faktenliste bleibt Offline-Fallback)", "5. Spaetere Marktprofile fuer DE (BfArM/Gelbe Liste) und AT (BASG) separat aufbauen" ], "rules": [ "_MEDICATION_FACTS bleibt als Offline-Fallback (kein Netz / Quelle nicht erreichbar)", "DocCheck Flexikon + PharmaWiki Fallback ist die primaere Inhaltsquellen-Kette", "Originallink (CH=Compendium, AT=BASG, DE=BfArM) bleibt separat und unveraendert", "Keine erfundenen Einnahmehinweise – was nicht aus der Quelle kommt, wird weggelassen", "Spaetere Laenderprofile (DE/AT/weitere) separat, nicht vermischen" ] }, "security_benchmark_hin": { "title": "HIN-nahe Schutzprinzipien als Sicherheits-Zielbild fuer Browser-AZA", "disclaimer": "AZA ist NICHT HIN-zertifiziert, NICHT ISO-zertifiziert. Dies ist ein internes Sicherheits-Zielbild / Benchmark / Architekturleitlinie. Keine Marketingbehauptung.", "principles": [ "Geschlossener Vertrauensraum", "Verifizierte digitale Identitaet / eID", "Zwei-Faktor-Authentisierung (2FA)", "Asymmetrische Verschluesselung", "S/MIME-Verschluesselung", "TLS-Transportverschluesselung", "Digitale Signatur", "Technische und organisatorische Massnahmen (TOM)", "ISMS nach ISO/IEC 27001 als Zielbild / Benchmark", "EPD-/IdP-nahe Vertrauens- und Identitaetslogik als Orientierung" ], "rules": [ "Browser-AZA ist Kern des Projekts und soll langfristig hohes Schutz- und Vertrauensniveau erreichen.", "Sicherheitsarchitektur orientiert sich an etablierten Schweizer Gesundheitswesen-Prinzipien.", "Keine ueberzogenen Aussenbehauptungen zu HIN/EPD/ISO ohne tatsaechliche Zertifizierung/Integration.", "Oeffentliche Website bleibt Hostpoint/WordPress – davon unabhaengig.", "Spaetere geschuetzte App / Browser-AZA ist eigener Sicherheitsblock." ], "handover": [ "Diesen Sicherheitsblock NICHT vergessen bei Architektur-/Sicherheitsentscheidungen.", "NICHT jedes Mal neu diskutieren – auf dieses Zielbild zurueckgreifen.", "Bei Sicherheits-/Architekturfragen diesen Benchmark konsultieren statt neu zu improvisieren.", "TODO-IDs fuer Einzelpruefungen: SEC-01 bis SEC-08 in project_todos.json." ] }, "completed": [ { "step": "STRIPE-W3", "title": "Desktop-Lizenzpfad gegen Live-Backend validiert (2026-03-30)", "description": "Desktop respektiert canceled-Status korrekt und faellt auf Testmodus zurueck. Kompletter Lizenz-Lifecycle: Kauf → active → Storno/Refund → canceled → Desktop-Testmodus.", "files": ["basis14.py", "aza_license_logic.py"] }, { "step": "ADMIN-V1-V2", "title": "Admin Monitor v1 + Control Panel v2 live (2026-03-30)", "description": "8 interne Admin-Endpunkte, geschuetzt via X-Admin-Token / AZA_ADMIN_TOKEN. v1: system_status, licenses_overview, backup_status, billing_overview. v2: license_customer_map, revenue_overview, alerts, dashboard_summary. Root Causes: Sandbox/Live strikt getrennt, missing_lookup_key mit Fallback behoben, Live-Kontext verifiziert, DB-Hotfix (customer_email, alter aktiver Datensatz entfernt).", "files": ["admin_routes.py", "backend_main.py"] }, { "step": "BACKUP-MON", "title": "Backup/Storage-Monitor aktiv (2026-03-30)", "description": "Taegliches Backup-Skript eingerichtet. /host_backups read-only in Container gemountet. backup_status erkennt Backups korrekt. Ca. 137 GB frei.", "files": [] }, { "step": "DX-block", "title": "Desktop UX/Persistence/Briefprofile Block (2026-03-18/19)", "description": "Benutzerdaten bei Deinstallation erhalten (Inno Setup). Signatur-UI. Rechtsklick-Haekchen im Minifenster. Kommentare-Fenster (TEILWEISE). Autotext Root-Cause-Fix. Briefstil-Lernen. Persistenz-Patch: KI-Einwilligung beim Erststart (nicht erst bei Start-Klick), Profil+Code-Feld persistent, Kommentare-Toggle 'beim Start oeffnen', Einstellungen logisch gruppiert, Deinstallations-Frage detailliert erweitert." }, { "step": "DX-uninstall-tool", "title": "AZA Clean Uninstall/Reset Tool (2026-03-19)", "description": "PowerShell-Tool fuer saubere AZA-Deinstallation und Reset ohne Neustart.", "files": ["tools/aza_clean_uninstall.ps1", "AZA_Deinstallieren.bat"] }, { "step": "BRP-fix", "title": "Briefstil-Profile Fix und Nachschaerfung (2026-03-19)", "description": "System-Profile KISIM/Klinischer Bericht immer sichtbar im Dropdown. Praezise medizinische Prompt-Definitionen. Vereinheitlichtes Stilprofil-System: Haekchen+Dropdown+Standard direkt im Brief-UI. Persistenz fuer stilprofil_enabled, stilprofil_name, stilprofil_default_brief.", "files": ["aza_prompts.py", "aza_persistence.py", "aza_text_windows_mixin.py"] }, { "step": "17g", "title": "Systemstatus/Selbsttest integriert", "description": "Integrierter Systemstatus-Bereich fuer Praxiscomputer-Validierung: 12 Pruefpunkte, Diagnose kopieren, Einstieg im Launcher und Hauptfenster.", "files": ["aza_systemstatus.py", "aza_launcher.py", "basis14.py"] }, { "step": "17h", "title": "Windows-Firewall-Fix fuer lokales Backend", "description": "Installer legt minimale Firewall-Regel an (aza_desktop.exe, TCP 8000, remoteip 127.0.0.1). Nutzerhinweis bei Backend-Fehler.", "files": ["installer/aza_installer.iss", "aza_firewall.py", "basis14.py"] }, { "step": 13, "title": "Smoke Suite PASS", "description": "Backend/Client smoke tests green.", "files": [] }, { "step": 14, "title": "Docker/Compose Smoke PASS", "description": "Container build/run + smoke suite against docker.", "files": [ "deploy/docker_smoke.ps1" ] }, { "step": 18, "title": "Website/Landing + Download-Page + Billing/Invoice Flow", "description": "Public landing + download page reading release metadata; billing flow docs/templates.", "files": [ "web/index.html", "web/download.html", "release/version.json", "billing/BILLING_FLOW.md" ] }, { "step": 19, "title": "Support/Telemetry minimal (ohne PHI)", "description": "POST /telemetry/ping + GET /admin/telemetry/stats + rate-limit and docs.", "files": [ "deploy/TELEMETRY.md", "deploy/test-telemetry.ps1" ] }, { "step": 20, "title": "Final Security pass", "description": "Request caps, upload hardening, token handling consistency, audit hygiene.", "files": [ "backend_main.py" ] }, { "step": 21, "title": "Sell-Ready Konsolidierung", "description": "Steps/Status/Roadmap/To-Dos synchronisiert; Browser-AZA als Kernprojekt festgelegt.", "files": [ "project_status.json", "project_roadmap.json", "project_plan.json", "project_todos.json" ] } ], "steps": [ { "step": 22, "title": "Browserbasiertes AZA (MVP) - zentral", "goal": "Kleinste verkaufbare Browser-Version von AZA: Audio hochladen, über /v1/transcribe verarbeiten, Transkript direkt im Browser anzeigen und kopieren.", "owner": "web/frontend/backend", "status": "open", "spec_file": "browser_aza_mvp_spec.md", "scope": { "in_scope": [ "Browser-UI mit einer klaren Hauptseite fuer Upload und Ergebnis", "Minimaler Zugangsschutz (Token/License oder einfacher Login, ohne grosse Account-Plattform)", "Fachrichtungsauswahl vor dem Upload", "Audio-Upload an /v1/transcribe", "Transkript im Browser anzeigen", "Copy-to-clipboard fuer das Transkript", "HTTPS erreichbar", "Support-Link und Privacy/Terms sichtbar" ], "out_of_scope": [ "Komplexes Rollen-/Rechtesystem", "Mehrmandantenfaehige Admin-Konsole", "Auto-Update fuer Desktop", "Komplexe Rechnungserstellung im Browser", "Analytics/BI Dashboard", "Perfekte UI-Politur", "Zusatzmodule ausserhalb des Kernflows" ] }, "definition_of_done": [ "Browser-App ist ueber HTTPS erreichbar", "User kann Fachrichtung waehlen", "User kann eine unterstuetzte Audiodatei hochladen", "Upload laeuft erfolgreich gegen /v1/transcribe mit X-API-Token/Auth-Mechanik des Projekts", "Transkript wird im Browser sichtbar dargestellt", "Transkript kann mit einem Klick kopiert werden", "Fehlermeldung bei leerem/ungueltigem Upload ist benutzerverstaendlich", "Support-Link und Privacy/Terms-Link sind sichtbar", "Keine Secrets oder Tokens werden im Frontend oder Logs ausgegeben" ], "deliverables": [ "browser_aza_mvp_spec.md", "Web-Frontend fuer Browser-AZA MVP", "Ein klarer Upload/Result-Flow", "Dokumentierte MVP-Konfiguration fuer Zugangsschutz", "Kurzes Runbook fuer Start/Test des Browser-MVP" ], "acceptance_checks": [ "Browser oeffnen -> Seite laedt", "Fachrichtung auswaehlbar", "Audio hochladen -> Request an /v1/transcribe erfolgreich", "Antwort wird als Transkript sichtbar", "Copy-Button kopiert Transkript", "Support/Privacy sichtbar", "HTTPS aktiv" ], "implementation_order": [ "1. Minimales Browser-UI mit Upload-Seite festlegen", "2. Zugangsschutz fuer MVP festlegen (einfach, ohne Umbau des Auth-Contracts)", "3. Fachrichtungsauswahl in UI einbauen", "4. Upload-Flow an /v1/transcribe anbinden", "5. Ergebnisansicht + Copy-Button bauen", "6. Support/Privacy sichtbar machen", "7. HTTPS-Staging/Deployment pruefen" ], "non_negotiables": [ "/license/status Schema bleibt exakt", "Auth bleibt X-API-Token", "Keine Tokens/Secrets loggen oder im UI offen anzeigen", "Keine Breaking Changes am bestehenden Backend-Contract ohne separaten Step", "Sicherheitsarchitektur orientiert sich am HIN-nahen Zielbild (siehe security_benchmark_hin). Keine Abkuerzungen bei Auth, Verschluesselung oder Identitaet ohne Pruefung gegen diesen Benchmark." ], "todos": [ "webapp", "domain-brand", "legal-basics" ] }, { "step": 15, "title": "Caddy/HTTPS + Reverse Proxy Vorbereitung", "goal": "Reverse proxy + health/license checks via proxy, prod env template/runbook.", "owner": "ops", "status": "done" }, { "step": 16, "title": "Go-Live extern (aza-medwork.ch) – sauber abschliessen", "goal": "Subscription-Produkt (monatlich + jaehrlich) in WooCommerce anlegen, Stripe Live-Setup, Testkauf, Download-/Lizenzfluss validieren. KEINE DNS-Experimente. Hostpoint bleibt Haupt-Website.", "owner": "ops/product", "status": "in_progress", "checklist": "deploy/GO_LIVE_CHECKLIST_SHORT.md", "do_not_break": [ "Keine riskanten Domain-/DNS-Aenderungen", "Hostpoint-Website stabil lassen", "Bestehende WordPress/Kadence-Installation nicht beschaedigen" ] }, { "step": 17, "title": "Desktop-App + Installer + Kauf-/Download-Flow (CODE-KOMPLETT)", "goal": "Installer pipeline, Launcher UX, Systemstatus, Landing-Page mit Pricing/Checkout, Success/Download-Seite, Deploy-Stack (CORS, StaticFiles, Docker, Caddy). Lokal verifiziert.", "owner": "release/desktop", "status": "done", "progress_notes": [ "Desktop-EXE wird erfolgreich gebaut", "Lokales Backend startet automatisch aus der Desktop-App", "Lokaler Smoke-Test gegen /license/status ist erfolgreich (valid=true)", "Installer-Workflow mit Inno Setup ist vorbereitet (aza_installer.iss + build_installer.ps1)", "Desktop-Update-Flow ist verdrahtet (Check, Download, Installer-Start)", "Versionierung wird zentralisiert, damit App/Installer/Update-Manifest synchron bleiben", "release/version.json wird aus aza_version.py erzeugt", "Lokale Release-Pipeline wird in einem Startpunkt zusammengefuehrt (Build, Manifest, Desktop-Test, Installer, Installer-Test)", "Release-Artefakt-Report mit SHA256-Checksums fuer EXE und Installer wird erzeugt", "Publish-Bundle fuer Upload/Verteilung wird automatisch erzeugt", "Desktop Runtime Secret Provisioning eingefuehrt (openai_runtime_config.py)", "Installer-EXE erfolgreich gebaut (aza_desktop_setup.exe)", "Installer enthaelt bewusst kein hartkodiertes OpenAI-Secret", "Setup-Helfer fuer Praxiscomputer mitgeliefert (setup_openai_runtime.ps1)", "Desktop Release validated: Full-Pipeline gruen (Build, Smoke, Installer, Artifacts)", "Praxiscomputer-Testpaket erstellt (dist/practice_test_bundle)", "Opacity-Startwert auf 1.0 korrigiert (DEFAULT_OPACITY in aza_config.py)", "READY FOR FIELD TEST: Interner Build/Installer/Secret-Flow komplett, Blocker ist jetzt externer Feldtest", "APPDATA-Persistence: Alle Benutzerdaten (Consent, Audit, Config, Geometrie, Todos) unter %APPDATA%\\AZA Desktop", "PermissionError unter C:\\Program Files behoben (zentrale get_writable_data_dir in aza_config.py)", "Release-Pipeline nach Fix erneut vollstaendig validiert (2026-03-12)", "AZA-Startseite/Launcher eingefuehrt (aza_launcher.py) mit Modulauswahl und Auto-Open-Praeferenz in APPDATA", "Launcher auf 6 Module erweitert: KI, KG-Assistent, Audio-Notizen, Uebersetzer, MedWork Chat, Praxis Chat", "Woechentliches Login statt taeglich (last_login_ts im Benutzerprofil, 7-Tage-Intervall)", "App-Ablaufdatum 30.04.2026 als harter Expiry in aza_config.py", "Aktivierungsschluessel-System (aza_activation.py) fuer Geraetesteuerung mit HMAC-signiertem Schluessel" ], "definition_of_done": [ "Desktop-App laesst sich als EXE starten", "Lokales Backend wird fuer Praxistests automatisch gestartet oder automatisch erkannt", "Kein manueller backend_main.py-Start noetig fuer Standard-Praxistest", "Keine manuelle backend_url.txt noetig fuer den lokalen Standardfall", "App wartet robust, bis das Backend erreichbar ist", "Fehlerfall bei nicht startendem Backend ist benutzerverstaendlich", "Update-Check gegen release/version.json bleibt kompatibel" ], "implementation_order": [ "1. Zielarchitektur fuer lokalen Backend-Autostart festlegen", "2. Backend-Prozess aus der Desktop-App robust starten", "3. Auf Erreichbarkeit des lokalen Backends warten", "4. Fehlerfall sauber anzeigen", "5. EXE-Build so anpassen, dass der lokale Standardfall ohne Zusatzdateien funktioniert", "6. Danach Update-Mechanik vervollstaendigen" ], "non_negotiables": [ "/license/status Schema bleibt exakt", "Auth bleibt X-API-Token", "Keine Tokens/Secrets loggen", "Keine Breaking Changes am bestehenden Backend-Contract" ] }, { "step": 23, "title": "Sell-Ready Billing & Legal", "goal": "Invoice Pflichtfelder/MWST, Terms/Privacy, support process, alignment with Stripe.", "owner": "billing/legal", "status": "open" }, { "step": 24, "title": "Operations & Monitoring", "goal": "Backups, log rotation, incident playbook, uptime checks, token rotation.", "owner": "ops", "status": "in_progress", "progress_notes": [ "ERLEDIGT: Admin Monitor v1 + Control Panel v2 live (admin_routes.py, 8 Endpunkte, X-Admin-Token geschuetzt) (2026-03-30)", "ERLEDIGT: Backup/Storage-Monitor aktiv (taegliches Backup, /host_backups gemountet, alerts) (2026-03-30)", "OFFEN: Log-Rotation, Incident-Playbook, Token-Rotation, Uptime-Monitoring" ] }, { "step": 25, "title": "Go-Live Cutover", "goal": "Final checklist, domain/DNS, HTTPS, release publish, announce, rollback plan.", "owner": "ops/product", "status": "open" }, { "step": "ZUKUNFT-INT", "title": "Internationalisierung / Laender- und Quellenprofile", "goal": "UI-Sprache, Medikamenten-/Diagnose-/Therapiequellen und Quellenprofile pro Markt/Land anpassbar machen. Nicht hart nach Herkunftsland schalten, sondern saubere Profil-Logik mit manuellem Override.", "owner": "architektur/produkt", "status": "geparkt", "prerequisite": "DACH-Markt (CH/DE/AT) stabil, Produkt erfolgreich, Go-Live gesichert.", "profile_fields": ["app_language", "market_region", "med_source_profile", "dx_source_profile", "therapy_source_profile"], "notes": [ "NICHT fuer jetzt – reines Zukunftsthema.", "Erst Prioritaet: DACH sauber stabilisieren, Produkt erfolgreich machen.", "Handelsnamen, Zulassungen, Fachinfos und Verfuegbarkeit sind laenderspezifisch.", "Deshalb spaeter Quellenprofile pro Markt statt Einheitslogik.", "Beispiel: DACH zuerst, spaeter franzoesische UI + franzoesische medizinische Quellen/Links.", "Manueller Override durch Benutzer/Praxis muss vorgesehen werden." ] } ], "signing_readiness": { "title": "Windows Code-Signing / Smart App Control Readiness", "status": "vorbereitet – noch nicht produktiv aktiviert", "summary": "Windows Smart App Control (ab Win 11 22H2) blockiert unsignierte Apps. Alle Kundenauslieferungen muessen signiert werden.", "prepared": [ "sign_release.ps1 erstellt (signiert EXE, DLLs/PYDs, Installer; DryRun-Modus; Verifikation)", "build_and_test_release.ps1 erweitert (optionaler Signing-Schritt, graceful skip ohne Zertifikat)", "build_release_artifacts.ps1 erweitert (signing_status + signing_subject im Report)", "SIGNING_READINESS.md erstellt (Artefakt-Liste, Reihenfolge, Zertifikats-Optionen, Checkliste)" ], "open_before_customer_release": [ "EV Code-Signing-Zertifikat beschaffen (empfohlen: DigiCert/Sectigo, alternativ Azure Trusted Signing)", "signtool.exe auf Build-Rechner installieren (Windows SDK)", "Publisher-Name im Zertifikat mit AppPublisher in aza_installer.iss abstimmen (aktuell: 'AZA MedWork')", "sign_release.ps1 produktiv ausfuehren", "Signierte Artefakte auf Windows-PC mit Smart App Control testen", "Konsistente Publisher-Identitaet fuer alle kuenftigen Releases beibehalten" ], "artifacts_to_sign": { "critical": ["dist\\aza_desktop\\aza_desktop.exe", "dist\\installer\\aza_desktop_setup.exe"], "recommended": ["dist\\aza_desktop\\_internal\\*.dll", "dist\\aza_desktop\\_internal\\*.pyd"] }, "publisher_identity": { "status": "Analyse abgeschlossen – vor Zertifikatskauf final festlegen", "current_names_by_role": { "publisher_firma": { "name": "AZA MedWork", "used_in": ["aza_installer.iss (AppPublisher)", "legal/privacy_policy.md", "legal/ai_consent.md", "apps/diktat/diktat_app.py", "aza_consent.py", "deploy/WOOCOMMERCE_PRODUCT.md (Absendername)", "deploy/WORDPRESS_GOLIVE.md (Absendername)"], "signing_relevant": true, "note": "Dieser Name muss mit dem Zertifikats-Subject uebereinstimmen" }, "produkt_name": { "name": "AZA Desktop", "used_in": ["aza_installer.iss (AppName)", "aza_config.py (_APPDATA_FOLDER_NAME)", "deploy/PRODUCT_V1.md", "deploy/WOOCOMMERCE_PRODUCT.md", "CHANGELOG.md", "web/download.html", "build_exe.ps1", "start_dev.ps1", "tools/aza_clean_uninstall.ps1", "setup_openai_runtime.ps1", "translate.py (APPDATA-Pfad)"], "signing_relevant": false, "note": "Produktname – konsistent, kein Handlungsbedarf" }, "projekt_intern": { "name": "AZA Medical AI Assistant", "used_in": ["project_status.json (project)", "project_status_routes.py", "web/index.html (Footer)", "web/download.html (Footer)", "web/README.md", "billing/BILLING_FLOW.md", "deploy/SECURITY_CHECKLIST.md"], "signing_relevant": false, "note": "Interner Projektname / Marketing-Langname – nicht signing-relevant" }, "billing_produkt": { "name": "AZA Medical AI Assistant License", "used_in": ["billing/invoice_template.json (item description)"], "signing_relevant": false, "note": "Rechnungsposition – koennte auf 'AZA Desktop License' vereinheitlicht werden, aber nicht signing-kritisch" }, "domain": { "name": "aza-medwork.ch", "used_in": ["aza_installer.iss (AppPublisherURL)", "release/version.json (download_url)", "desktop_update_check.py", "build_release_manifest.ps1", "basis14.py (Update-Hinweis)"], "signing_relevant": false, "note": "Domain – konsistent, kein Handlungsbedarf" } }, "analysis": { "echte_inkonsistenz": "Keine echte Inkonsistenz – die verschiedenen Namen haben unterschiedliche Rollen (Firma vs. Produkt vs. interner Projektname). Alle drei Namensformen sind beabsichtigt.", "signing_kritisch": "Nur 'AZA MedWork' (publisher_firma) ist fuer Code-Signing relevant. Dieser Name muss exakt mit dem Subject/CN/O des EV-Zertifikats uebereinstimmen.", "vor_zertifikatskauf": [ "Pruefen: Ist der offizielle Firmenname im Handelsregister 'AZA MedWork', 'AZA MedWork GmbH', 'MedWork GmbH' oder anders?", "Der Zertifikats-Anbieter validiert gegen den Handelsregistereintrag (EV-Validierung)", "AppPublisher in aza_installer.iss muss EXAKT zum Zertifikat passen", "SmartScreen/Smart App Control bauen Reputation auf den Publisher-Namen auf – nach Festlegung NICHT mehr aendern", "Alle Stellen mit 'AZA MedWork' (legal, consent, installer, E-Mail-Absender) gemeinsam aktualisieren falls der HR-Name abweicht" ], "kein_handlungsbedarf": [ "'AZA Desktop' als Produktname ist ueberall konsistent", "'AZA Medical AI Assistant' als interner Projektname/Marketing ist ueberall konsistent", "Domain aza-medwork.ch ist ueberall konsistent", "Keine widersprüchlichen oder fehlerhaften Eintraege gefunden" ] } } }, "patches": [ { "id": "FIX-01", "date": "2026-03-19", "title": "Korrektur-Patch", "scope": "Uebersetzer-Label, Kommentare-Fenster, Korrektur-Scrollbar, Stilprofil-Live, KG-Inline, Zentrierung, Persistenz", "status": "done" }, { "id": "FIX-02", "date": "2026-03-19", "title": "Nachschaerfungs-Patch", "scope": "Stilprofil-Dialog nur Verwaltung (keine aktive Auswahl), Kommentare auto-open nach KG, Logo-Trennung (Wassertropfen=Icon/EXE/Installer, Logo=internes Branding)", "status": "done" } ] }