Files
aza/AzA march 2026 - Kopie (12)/project_status.json
2026-04-16 13:32:32 +02:00

599 lines
39 KiB
JSON
Raw 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.
{
"project": "AZA Medical AI Assistant",
"phase": "Device-/Seat-Logik V1 implementiert. Backup-Konzept + Deinstallations-UX als naechste Hauptbloecke.",
"current_step": "Device-Logik V1 fertig (2026-04-12). Naechste Bloecke: (1) Backup-Konzept vollstaendig, (2) Deinstallations-UX, (3) WooCommerce Verkaufspfad, (4) Browser-AZA.",
"last_completed": 19,
"next_step": "Naechsten Hauptblock waehlen (Admin-Token-Rotation / Betreiber-Runbook / WooCommerce / Lizenz-Lifecycle).",
"last_update": "STATUS-PATCH 2026-04-12: (1) Device-/Seat-Logik V1 implementiert: 1 Lizenz = 2 Geraete, Stacking ueber Email, Backend fuehrend. (2) aza_device_enforcement.py komplett neu, backend_main.py + admin_routes.py + basis14.py erweitert. (3) Admin-Endpoint GET /admin/devices fuer Geraete-Uebersicht. (4) Naechste Bloecke: Backup-Konzept + Deinstallations-UX.",
"updated_at": "2026-04-12",
"workspace": {
"project_root": "C:\\Users\\surov\\Documents\\AZA_GIT\\aza",
"current_working_folder": "C:\\Users\\surov\\Documents\\AZA_GIT\\aza\\AzA march 2026",
"note": "All commands and scripts should assume this root unless explicitly changed. ALTER PFAD C:\\Users\\surov\\Documents\\AZA\\backup 24.2.26 ist NICHT mehr aktuell."
},
"notes": [
"Browser-basiertes AZA ist Kern des Projekts und nicht optional.",
"Step 22 wird verbindlich nach browser_aza_mvp_spec.md umgesetzt.",
"Kongress/CSE Thema ist geparkt (Google CSE 403 / DDG volatil). Fokus jetzt: Go-Live.",
"Preismodell: Subscription. Basic (1 User): CHF 59/Monat, CHF 590/Jahr. Team (2 User): CHF 89/Monat, CHF 890/Jahr. KEIN Einmalkauf.",
"PRODUKTNAME AKTUELLE RICHTUNG: AZA Office. Bevorzugte 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 aktuelle bevorzugte Naming-Richtung fuer WooCommerce/Website/Download/Go-Live/Produktdarstellung. FRUEHERE SHORTLIST (AZA Desktop): (1) Die KI-Loesung fuer medizinische Dokumentation, (2) KI-gestuetzte Praxisdokumentation fuer Aerzte, (3) Ihre Plattform fuer medizinische KI-Dokumentation, (4) Ihr medizinischer KI-Arbeitsplatz fuer die Praxis, (5) Die KI-Assistenz fuer medizinische Dokumentation, (6) Medizinische KI fuer Aerzte und Praxen. KRITISCH: 'von Aerzten' eher nicht verwenden.",
"Architektur: Hostpoint = Website/Marketing/WordPress/Kadence/WooCommerce. Hetzner = AZA-Backend/API/OpenAI-Proxy/Browser-AZA (JETZT RELEVANT, nicht mehr spaeter).",
"Do-not-break: /license/status Format bleibt exakt. Keine Auth-Aenderungen ohne Auftrag. Keine Secrets loggen. Keine unnoetige API-Contract-Aenderungen.",
"Do-not-break: Keine riskanten DNS-/Domain-Aenderungen an aza-medwork.ch ohne klare Pruefung. Website-Chaos durch vorschnelle Umschaltung war ein Fehler.",
"Do-not-break: OpenAI-Key NIEMALS hardcoded in App einbauen. NIEMALS Shared-Key an Kunden ausliefern. Lokale Key-Eingabe wird bei Produktivauslieferung entfernt (Variante B). Secrets NIEMALS loggen.",
"Do-not-break: Audioaufnahme IMMER als M4A (AAC via ffmpeg-Pipe). NIEMALS auf WAV zurueckaendern. WAV nur als Fallback wenn ffmpeg fehlt. Diese Entscheidung ist ENDGUELTIG wurde bereits einmal faelschlich rueckgaengig gemacht.",
"VERBINDLICH V1-Lizenzmodell (2026-04-12): 1 aktive Lizenz = 2 gleichzeitig aktive Computer. Dieselbe Kaeufer-Email darf mehrere Lizenzen kaufen. Erlaubte Geraete addieren sich: 1 Lizenz = 2, 2 Lizenzen = 4, 3 Lizenzen = 6. Backend entscheidet fuehrend. Desktop sendet email + device_id. Backend liefert: license_active, allowed_devices, used_devices, device_allowed, reason. aza_device_enforcement.py ist fuehrende Implementierung.",
"VERBINDLICH Deinstallation: Nach Deinstallation KEIN sofortiger Zwangs-Neustart. Benutzer muss Option haben: jetzt neu starten / spaeter neu starten.",
"VERBINDLICH Backup-Konzept HOHE PRIORITAET: Lokale App/Code/Builds, Installer-Artefakte, Hetzner-Backend/Server-Config/Daten, Stripe-Config/Referenzen, WordPress/WooCommerce/Website, Release-/Download-Dateien. Zusaetzlich Offsite-Sicherheitskopie in Luino.",
"ARCHITEKTURENTSCHEIDUNG VARIANTE B (VERBINDLICH, 2026-03-25): OpenAI-Key AUSSCHLIESSLICH serverseitig im AZA-Backend. Desktop-App und spaetere Browser-App sprechen NUR mit AZA-Backend. AZA-Backend spricht mit OpenAI. KEIN OpenAI-Key in der Client-App. KEIN eigener OpenAI-Key pro Kunde als Pflicht. KEIN gemeinsamer OpenAI-Key clientseitig. KEINE halben Uebergangsloesung. KEINE Shared-Key-Bastelei. Lokale Key-Eingabe wird bei Produktivauslieferung entfernt. Hetzner wird als Server-/Backend-Pfad ernsthaft einbezogen.",
"ARCHITEKTUR Audio: Aufnahme direkt als M4A (AAC 64kbps via ffmpeg stdin-Pipe). Kein WAV-Zwischenschritt. Deutlich kleinere Dateien, schnellerer Upload, Aufnahmen ueber 1 Stunde moeglich. Chunking in 10-Minuten-Segmente bei Bedarf.",
"Hostpoint-Website bleibt Haupt-Website. Hetzner NICHT fuer Haupt-Website verwenden.",
"Workspace root path fixed: C:\\Users\\surov\\documents\\aza",
"SICHERHEITS-ZIELBILD HIN-nahe Schutzprinzipien als Benchmark fuer Browser-AZA: AZA ist NICHT HIN-zertifiziert und NICHT ISO-zertifiziert. Es handelt sich um ein Sicherheits-Zielbild / Benchmark / Architekturleitlinie, KEINE Marketingbehauptung. Folgende Prinzipien gelten als Orientierung: 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, EPD-/IdP-nahe Vertrauens- und Identitaetslogik als Orientierung. Browser-AZA ist Kern des Projekts und soll langfristig ein hohes Schutz- und Vertrauensniveau erreichen. Sicherheitsarchitektur orientiert sich an etablierten Schweizer Gesundheitswesen-Prinzipien.",
"HANDOVER-REGEL Sicherheitsblock: Diesen Sicherheits-Benchmark NICHT jedes Mal neu diskutieren. Bei Sicherheits-/Architekturfragen auf dieses Zielbild zurueckgreifen statt neu zu improvisieren. Keine ueberzoegenen Aussenbehauptungen zu HIN/EPD/ISO ohne tatsaechliche Zertifizierung/Integration.",
"ARCHITEKTUR Medikamenten-Quellenlogik: Inhaltsquelle und Originallink getrennt (FIX-11). Inhaltsquellen: _fetch_doccheck_info (Standard) und _fetch_pharmawiki_info (Fallback), benutzerwaehlbar ueber _MED_CONTENT_QUELLEN / med_content_quelle. Originallink: _MED_QUELLEN / medikament_quelle (CH=Compendium, AT=BASG, DE=BfArM) unveraendert. _MEDICATION_FACTS als Offline-Fallback. Deckt alle auf DocCheck + PharmaWiki verfuegbaren Medikamente ab. Spaetere Marktprofile (DE/AT) separat.",
"ZUKUNFTSBLOCK Internationalisierung / Laender- und Quellenprofile: NICHT fuer jetzt. Erst DACH sauber stabilisieren (CH/DE/AT), Produkt erfolgreich machen, Go-Live sichern. Danach pruefen: Mehrsprachigkeit, laenderspezifische med. Quellenprofile. Profillogik vorsehen: app_language, market_region, med_source_profile, dx_source_profile, therapy_source_profile + manueller Override durch Benutzer/Praxis. Handelsnamen, Zulassungen, Fachinfos und Verfuegbarkeit sind laenderspezifisch deshalb spaeter Quellenprofile pro Markt statt Einheitslogik."
],
"auth_contract": {
"api_token_env": "MEDWORK_API_TOKEN",
"header_name": "X-API-Token",
"important_endpoints": [
"/license/status",
"/api/project/status",
"/v1/transcribe"
],
"notes": [
"Healthcheck und Dev Tools müssen MEDWORK_API_TOKEN verwenden.",
"Token wird im Header X-API-Token gesendet.",
"NICHT Authorization: Bearer verwenden.",
"Keine Tokens loggen."
]
},
"project_phase_assessment": {
"phase": "B1 Backend-Sprint Serverseitige OpenAI-Architektur (Variante B)",
"status_A": "Desktop-App ist weit fortgeschritten und grundsaetzlich benutzbar",
"status_B": "ARCHITEKTURENTSCHEIDUNG: Variante B gewaehlt OpenAI-Key nur serverseitig",
"status_C": "WooCommerce/Stripe-Pfad laeuft parallel weiter (Hostpoint)",
"status_D": "Hetzner-Backend wird jetzt ernsthaft als Server-Pfad aufgebaut",
"status_E": "Arbeitsphase = Backend-Zielarchitektur + Produktisierung parallel"
},
"go_live_sprint": {
"title": "B1 Backend-Sprint Serverseitige OpenAI-Architektur (4 Wochen)",
"goal": "AZA-Backend als OpenAI-Proxy verkaufsfaehig machen. Kein OpenAI-Key mehr beim Kunden.",
"start": "2026-03-25",
"target": "ca. 2026-04-22",
"architekturentscheidung": "VARIANTE B verbindlich: Desktop-App → AZA-Backend → OpenAI. Key nur serverseitig.",
"operative_plattform": "Hetzner (Backend/API/OpenAI-Proxy). Hostpoint bleibt fuer Website/WooCommerce.",
"wochenplan": {
"woche_1": "Backend Chat Proxy Endpoint (POST /v1/chat) + Auth + Rate Limiting",
"woche_2": "Desktop-App umstellen: 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"
}
},
"priority_order": {
"description": "B1 Backend-Sprint Prioritaeten Variante B verbindlich",
"1_hoechste": "Backend Chat Proxy Endpoint POST /v1/chat (Woche 1)",
"2_hoch": "Desktop-App von direktem OpenAI auf Backend umstellen (Woche 2)",
"3_mittel": "Hetzner Deploy: Docker/Caddy/HTTPS/Production-Env (Woche 3)",
"4_hoch": "E2E-Test Desktop→Backend→OpenAI + Go-Live-Freigabe (Woche 4)",
"5_parallel": "WooCommerce/Stripe/Kauf-Weg laeuft parallel weiter (Hostpoint)",
"explizit_nachrangig": [
"Update-Komfort / separater Auto-Updater",
"Browser-AZA Web-App (nach Backend-Architektur)",
"Grosse Refactors / Architektur-Spielereien die nicht direkt Variante B dienen"
],
"hostpoint_vs_hetzner": "Hostpoint bleibt fuer Website/WooCommerce. Hetzner ist JETZT der Backend-Pfad fuer OpenAI-Proxy/API. Beides laeuft parallel, nicht gegeneinander."
},
"working_principles": {
"description": "Verbindliche Arbeitsweise fuer die naechsten Chats",
"rules": [
"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": {
"title": "KEIN AKTIVER HAUPTBLOCK moegliche naechste Bloecke",
"status": "auswahl_offen",
"sprint_context": "PRODUKTIVPFAD + BETREIBER-KONTROLLE VOLLSTAENDIG BEWIESEN (2026-03-31). Echter Live-Kauf CHF 59. Backend-Lizenz active. Desktop Vollmodus. current_period_end korrekt. Admin Control Panel v2 LIVE. Betreiber-Kontrolle mit Einzelposten bewiesen. Technische Basis steht komplett.",
"security_notice": "AZA_ADMIN_TOKEN wurde im Chat offengelegt. Rotation vor Produktivbetrieb empfohlen.",
"possible_next_blocks": [
{
"priority": 1,
"title": "Admin-Token-Rotation (Mini-Block)",
"scope": "Offengelegten Token rotieren. 3 Commands, kein Code."
},
{
"priority": 2,
"title": "Betreiber-Runbook / Schnellreferenz",
"scope": "Klare Anleitung fuer Lizenz-/Zahlungskontrolle. Welcher Endpunkt fuer was. Curl-Beispiele."
},
{
"priority": 3,
"title": "WooCommerce / Produktiver Verkaufspfad",
"scope": "Produkte, Checkout, Download, E-Mail, Billing/Legal, Testkauf E2E."
},
{
"priority": 4,
"title": "Lizenz-/Kundenlogik professionalisieren",
"scope": "Sauberer Lifecycle, Team-/Praxislogik, lokale Persistenz."
},
{
"priority": 5,
"title": "Browser-AZA (nach Go-Live)",
"scope": "Step 22 nach browser_aza_mvp_spec.md."
}
],
"nachgelagert": [
"Autotext-Fix",
"Fenstergroessen anpassen",
"Button-Groessen / Layout fuer Online-Praesentation",
"Allgemeiner UI-Feinschliff",
"Direkte OpenAI-Restpfade in Nebenmodulen bereinigen"
]
},
"customer_journey_analysis": {
"date": "2026-03-24",
"kauf": {
"status": "offen",
"detail": "WooCommerce-Doku komplett (WORDPRESS_GOLIVE.md), aber in WordPress NICHT konfiguriert. Waehrung USD, Land US, kein Stripe Gateway, kein Subscription Plugin, Demo-Produkte vorhanden.",
"next": "WooCommerce gemaess WORDPRESS_GOLIVE.md konfigurieren (User-Aufgabe in WordPress-Admin)"
},
"download": {
"status": "teilweise",
"detail": "Download-Mechanik vorhanden (version.json, download.html). Fuer WooCommerce: Installer als Produkt-Download hochladen. URL-Inkonsistenz download vs downloads in publish-release.ps1.",
"next": "Installer-EXE in WooCommerce-Produkt hochladen"
},
"installer": {
"status": "funktional_fertig",
"detail": "Inno Setup komplett, Build-Scripts funktionsfaehig. Kein Code-Signing (SmartScreen-Warnung bei Kunden).",
"next": "Code-Signing-Zertifikat beschaffen (vor breiter Auslieferung)"
},
"aktivierung": {
"status": "produktivpfad_vollstaendig_bewiesen",
"detail": "Kompletter Produktivpfad bewiesen (2026-03-30): Echter Live-Kauf CHF 59 → Backend-Lizenz active → Desktop Vollmodus ohne Testfenster → current_period_end korrekt (1777652509). Zusaetzlich: Storno/Refund → canceled → Desktop Testmodus ebenfalls bewiesen. Root Causes geloest: lokales Aktivierungs-Gate (_has_remote_backend Bypass) + current_period_end-Fallback in Webhook.",
"next": "WooCommerce / produktiver Kauf-/Verkaufspfad sauber machen."
},
"erster_start": {
"status": "variante_b_live_erfolgreich",
"detail": "B1 Backend-Sprint KOMPLETT ERLEDIGT (2026-03-27). Desktop → Hetzner → OpenAI funktioniert in der echten App. basis14.py lokal gegen Live-Backend erfolgreich getestet. Kein lokaler OpenAI-Key noetig.",
"next": "Lizenz-/Subscription-Lifecycle sauber machen."
}
},
"first_customer_workflow": {
"description": "Ziel-Kundenweg mit Variante B (nach B1 Backend-Sprint)",
"steps": [
"1. Kunde kauft ueber WooCommerce/Stripe auf aza-medwork.ch",
"2. WooCommerce liefert Download-Link (E-Mail + Mein-Konto-Seite)",
"3. Kunde laedt aza_desktop_setup.exe herunter und installiert",
"4. App startet mit 21-Tage-Testphase (kein Key noetig)",
"5. Aktivierung ueber AZA-Key oder Stripe-Webhook (spaeter automatisch)",
"6. App laeuft im Vollmodus KEIN OpenAI-Key noetig",
"7. Alle KI-Funktionen laufen ueber AZA-Backend auf Hetzner",
"8. OpenAI-Key liegt NUR auf dem Server, Kunde sieht ihn nie"
],
"uebergangsloesung_aktuell": [
"B1 W1-W5 KOMPLETT ERLEDIGT (2026-03-27)",
"Desktop → Hetzner → OpenAI funktioniert in der echten App",
"Kein lokaler OpenAI-Key noetig fuer den Hauptpfad",
"NAECHSTER BLOCK: Lizenz-/Subscription-Lifecycle + WooCommerce/Stripe Live-Setup"
],
"manual_steps_by_developer": [
"Key generieren: python aza_activation.py 2027-03-31",
"Key per E-Mail an Kunden senden",
"Spaeter automatisieren via Hetzner-Backend + Stripe-Webhooks"
]
},
"open_focus_blocks": [
{
"id": "FB-A",
"title": "Kauf-/Download-/Installationsweg sauber festziehen",
"description": "WooCommerce / Stripe / Download / Installer / Aktivierung End-to-End aus Kundensicht",
"priority": "HOECHSTE"
},
{
"id": "FB-B",
"title": "Kritische Desktop-Restfehler nur gezielt und einzeln behandeln",
"description": "Keine neuen Monsterpatches. Root-cause-first. Installierten Build hoeher gewichten als Code-Behauptungen.",
"priority": "HOCH"
},
{
"id": "FB-C",
"title": "Windows-Kundenauslieferung absichern",
"description": "Signing-Readiness vorbereitet. Produktives Signing vor Kundenauslieferung noch offen. Smart App Control / Reputation / Publisher-Konsistenz beachten.",
"priority": "MITTEL"
},
{
"id": "FB-D",
"title": "Update-Verbesserungen bewusst nachgelagert",
"description": "Erst nach stabilem Kauf-/Download-/Installationspfad. Kein aktueller Hauptblock.",
"priority": "NACHGELAGERT"
}
],
"current_focus": {
"title": "Kauf / Download / Installation / Aktivierung erster echter Kundenweg End-to-End",
"goal": "AZA Desktop als Subscription-Produkt (Basic CHF 59/Monat, Team CHF 89/Monat) ueber aza-medwork.ch (Hostpoint WordPress + WooCommerce + Stripe) verkaufen. Der gesamte Weg von Kauf bis produktivem Grundbetrieb muss aus Kundensicht stabil sein. Bestehende Website NICHT beschaedigen.",
"in_progress_items": [
"Kauf-/Download-/Installationsweg End-to-End pruefen und festziehen",
"WooCommerce-Produkt + Stripe-Integration sauber machen",
"Installer-Datei als WooCommerce-Download hochladen",
"Testkauf im Stripe-Testmodus (monatlich + jaehrlich)",
"Download → Installation → Aktivierung → erster Start verifizieren",
"Stripe auf Live-Modus umschalten",
"Produktseite auf Home verlinken"
],
"completed_items": [
"Desktop-App als EXE gebaut",
"Lokales Backend startet automatisch mit der Desktop-App",
"Lokaler Desktop-Smoke-Test ist gruen",
"Installer/Packaging mit Inno Setup gebaut",
"Desktop Runtime Secret Provisioning eingefuehrt",
"Default Opacity auf 1.0 korrigiert",
"Praxiscomputer-Testpaket erstellt (Installer, Anleitung, Checkliste, Rueckmeldebogen)",
"Update-Check gegen release/version.json verdrahtet",
"APPDATA-Persistence-Fix: Benutzerdaten unter %APPDATA%\\AZA Desktop statt Program Files",
"Release-Pipeline nach APPDATA-Fix erneut validiert (Build+Smoke+Installer gruen)",
"Praxiscomputer-Testpaket mit neuem Installer aktualisiert",
"AZA-Startseite/Launcher mit Modulauswahl und Auto-Open eingefuehrt",
"Launcher auf 6 Module erweitert (KI, KG, Audio-Notizen, Uebersetzer, MedWork Chat, Praxis Chat)",
"Woechentliches Login statt taeglich",
"App-Ablaufdatum 30.04.2026 eingebaut",
"Aktivierungsschluessel-System fuer Geraetesteuerung (aza_activation.py)",
"Praxiscomputer-Testpaket auf neuen Stand aktualisiert (6 Module, Aktivierung, Wochenlogin)",
"OpenAI-Key-Einrichtung professionalisiert: Setup-Helfer als Standardweg, Fallback auf Config-Datei",
"Premium-UI: Launcher und Setup-Dialog im Medizinprodukt-Design, keine technischen Begriffe in Nutzerdialogen",
"Uebersetzer-Modul: Tkinter-Threading-Bug behoben (eigener Tk-Mainloop im Hauptthread statt Thread)",
"Audio-Notizen-Modul: identischer Fix (direkter Start im Hauptthread)",
"Integrierter Systemstatus/Selbsttest: 12 Pruefpunkte, Diagnose-Kopieren, Praxiscomputer-Validierung",
"Praxiscomputer-Testpaket: Systemstatus in Anleitung, Checkliste und Rueckmeldung nachgezogen",
"Windows-Firewall-Fix: Installer legt minimale Regel (localhost:8000) an, Nutzerhinweis bei Backend-Fehler",
"Release-Pipeline erneut validiert (Build+Smoke+Installer gruen, Firewall-Regel im ISS, Publish-Bundle sauber)",
"Praxiscomputer-Testpaket auf finalen Stand aktualisiert (Installer, paketinfo, Checkliste, Rueckmeldung)",
"Firewall-Regel-Pruefung im integrierten Systemstatus (check_firewall_rule in aza_firewall.py)",
"Systemstatus Backend-Erkennung gefixt: Fallback auf lokale URL (127.0.0.1:8000) wie desktop_backend_autostart",
"Systemstatus Lizenz-Fix: X-Device-Id Header mitsenden (fehlte, daher device_enforcement=denied)",
"Systemstatus Aktivierung-Fix: check_app_access() gibt Tuple zurueck, nicht Dict",
"Systemstatus Lizenz-Token-Pfad-Fix: Im frozen Build _internal statt exe_dir durchsuchen (wie basis14.py)",
"Hauptfenster UX-Feinschliff: Tooltips fuer alle Toolbar-Buttons, Backend-Status entechnisiert, Beschriftungen professionalisiert",
"Launcher-Icons: Canvas-gezeichnete Vektor-Icons (Sparkle, Clipboard, Mikrofon, Dokumente, Netzwerk, Chat)",
"Kauf-zu-Download-Flow: Success-Seite, Landing-Page mit Pricing/Checkout, Download-Seite, reale Domain-URLs",
"Live-Deployment-Readiness: CORS-Middleware, Dockerfile backend_main:app, Caddyfile Static+API, Stripe-URLs produktionsreif, PRODUCTION_CONFIG.md",
"Deploy-Stack lokal verifiziert: 7/7 Routen gruen (Health, Download-API, Success, Cancel, Landing, Download-Page, version.json), CORS-Preflight OK",
"v1.0.0 Produktdefinition erstellt (deploy/PRODUCT_V1.md)",
"Version auf 1.0.0 gesetzt (aza_version.py, version.json)",
"Hard-Expiry auf 2027-03-31 verlaengert",
"Changelog und Installationsanleitung erstellt",
"v1.0.0 Installer gebaut und getestet (Build+Smoke+Installer gruen)",
"Signing-Readiness: sign_release.ps1 erstellt, Release-Pipeline mit optionalem Signing-Schritt, Artefakt-Report mit Signatur-Status, SIGNING_READINESS.md mit Checkliste und Zertifikats-Empfehlung",
"Publisher-/Namenskonsistenz geprueft: 3 Namensformen (AZA MedWork=Firma, AZA Desktop=Produkt, AZA Medical AI Assistant=interner Projektname). Nur AZA MedWork ist signing-kritisch. Vor Zertifikatskauf HR-Name pruefen und AppPublisher abstimmen.",
"WooCommerce-Produkttexte vorbereitet (deploy/WOOCOMMERCE_PRODUCT.md)",
"Infrastruktur-Analyse: Hostpoint WordPress+Kadence+WooCommerce online (deploy/INFRA_STATUS.md)",
"Autotext Root-Cause-Fix: _is_admin NameError behoben, Listener auf bewaehrten Stand (Kopie 13) zurueckgesetzt",
"Deinstallation: Inno Setup fragt bei Deinstallation ob Benutzerdaten geloescht werden sollen (Standard: Nein, Daten bleiben erhalten)",
"Signaturlogik: load_signature_name() faellt automatisch auf Profilname zurueck wenn kein expliziter Signaturname gesetzt ist",
"Rechtsklick-Haekchen im Minifenster: gleiche Option wie im Hauptfenster, synchronisiert",
"Kommentare-Fenster: Grundstruktur implementiert (TEILWEISE Detailmodus und Live-Aktualisierung noch offen)",
"Kommentarlogik quellenstreng: Inhaltsquelle und Originallink sauber getrennt. Inhaltsquelle (Detailinhalt): DocCheck Flexikon Standard, PharmaWiki Fallback, benutzerwaehlbar + persistent. Originallink: CH=Compendium, AT=BASG, DE=BfArM unveraendert. Kuratierte Fakten als Offline-Fallback. Inline nur Indikation. Therapien separat.",
"Signatur-UI in Einstellungen: Haekchen 'Profilname verwenden' + Feld fuer abweichenden Signaturnamen",
"Briefstil-Lernen: DOCX-Upload, GPT-Stilanalyse, persistente Stilprofile, Integration vor Briefgenerierung (TEILWEISE Erweiterungen offen)",
"Persistenz-Patch: KI-Einwilligung beim Erststart, Profil+Code persistent, Kommentare-Toggle, Einstellungen gruppiert, Deinstallations-Frage erweitert",
"Uebersetzer-Stabilitaetsfix: Root Cause Tkinter-in-Thread behoben, jetzt Toplevel-Embedded-Modus statt Threading",
"Vordefinierte Briefprofile: KISIM Bericht + Klinischer Bericht als auswaehlbare Berichtsprofile im Brief-Fenster",
"AZA Clean Uninstall/Reset Tool: PowerShell-Script fuer saubere Deinstallation/Reset ohne Neustart (tools/aza_clean_uninstall.ps1, AZA_Deinstallieren.bat)",
"Briefstil-Profile Fix+Nachschaerfung: KISIM/Klinischer Bericht als feste Systemprofile immer sichtbar, praezise medizinische Prompt-Definitionen, vereinheitlichtes Stilprofil-System (Haekchen+Dropdown+Standard fuer Arztbriefe) direkt im Brief-UI",
"Nachschaerfungs-Patch FIX-02: Stilprofil-Dialog nur Verwaltung (keine aktive Auswahl mehr im Dialog, nur Status+Lernen+Loeschen), Kommentare-Fenster oeffnet automatisch nach KG-Erstellung wenn Haekchen aktiv, Logo-Trennung (Wassertropfen=EXE/Desktop/Installer-Icon, originales Logo=internes Branding unten links)",
"Stripe/Lizenz-Live-Pfad vollstaendig bewiesen: Kauf → active → Storno/Refund → canceled → Desktop-Testmodus (2026-03-30)",
"Desktop respektiert canceled-Status korrekt und faellt auf Testmodus zurueck (2026-03-30)",
"Admin Monitor v1 live: GET /admin/system_status, licenses_overview, backup_status, billing_overview (2026-03-30)",
"Control Panel v2 live: GET /admin/license_customer_map, revenue_overview, alerts, dashboard_summary (2026-03-30)",
"Backup/Storage-Monitor aktiv: taegliches Backup-Skript, /host_backups read-only gemountet, backup_status erkennt Backups (2026-03-30)",
"Admin-Sicherheit: X-Admin-Token / AZA_ADMIN_TOKEN ohne Token Unauthorized, mit falschem Token Unauthorized (2026-03-30)",
"Echter Live-Kauf CHF 59 erfolgreich Backend-Lizenz active, Desktop Vollmodus bewiesen (2026-03-30)",
"Desktop Aktivierungs-Gate Fix: _has_remote_backend() Bypass bei Remote-Backend kein Testfenster mehr (2026-03-30)",
"current_period_end Fix: Fallback in checkout.session.completed + subscription.updated/deleted Handlern (2026-03-30)",
"current_period_end korrekt gesetzt: 1777652509 nach sync_subscription (2026-03-30)",
"Betreiber-Kontrolle mit Einzelposten: revenue_overview liefert recent_charges + recent_refunds (2026-03-31)",
"Root Cause 16 geloest: revenue_overview um Einzelposten erweitert fuer praktische Zahlungskontrolle (2026-03-31)"
],
"non_goals_right_now": [
"Update-Komfort / separater Updater (bewusst nachgelagert, erst nach stabilem Kundenweg)",
"Browser-AZA Web-App (Step 22, nach Go-Live, aber verbindlich geplant)",
"Admin-Konsole",
"Weitere Desktop-UX-Aenderungen (keine Feature-Patches, nur Blocker-Fixes)",
"Hetzner-Server konfigurieren (erst wenn Browser-AZA dran ist)",
"Internationalisierung / Mehrsprachigkeit / Laender- und Quellenprofile (erst nach DACH-Stabilitaet und Produkterfolg)",
"Monsterpatches oder breite Umbauaktionen"
],
"architecture": {
"hostpoint": "Oeffentliche Website, Marketing, WordPress, Kadence, WooCommerce, Stripe-Checkout, Download-Auslieferung",
"hetzner": "AZA-Backend/API/OpenAI-Proxy (JETZT AKTIV). Docker/Caddy/HTTPS. Subdomain api.aza-medwork.ch oder app.aza-medwork.ch.",
"variante_b": "VERBINDLICH: Desktop-App → AZA-Backend (Hetzner) → OpenAI. Key nur serverseitig. Kein OpenAI-Key beim Kunden.",
"rule": "Hostpoint bleibt Haupt-Website. Hetzner ist der Backend-Pfad. Keine DNS-Aenderungen ohne klare Pruefung."
}
},
"step_22_deliverables": [
"browser_aza_mvp_spec.md",
"Browser-Seite mit Upload-Bereich",
"Fachrichtungsauswahl vor Upload",
"Request-Flow an /v1/transcribe unter Beibehaltung von X-API-Token",
"Ergebnisansicht fuer Transkript",
"Copy-Button fuer Transkript",
"Support/Privacy/Terms sichtbar"
],
"step_22_acceptance_checks": [
"Seite laedt im Browser",
"Fachrichtung kann ausgewaehlt werden",
"Audio kann hochgeladen werden",
"Backend /v1/transcribe antwortet erfolgreich",
"Transkript wird sichtbar angezeigt",
"Copy-Button funktioniert",
"Keine Secrets/Tokens im UI oder Log"
],
"phases": [
{
"id": 1,
"title": "Core Desktop + Backend",
"items": [
{ "title": "Step 13: Smoke Suite PASS", "status": "done" },
{ "title": "Step 14: Docker/Compose Smoke PASS", "status": "done" }
]
},
{
"id": 2,
"title": "Live Congress Search (PARKED)",
"items": [
{ "title": "CSE JSON API Zugriff stabil", "status": "paused" },
{ "title": "Backend Live-Suche in Kongress-UI", "status": "paused" },
{ "title": "Filter/UX News & Kongresse", "status": "paused" }
],
"why_paused": [
"Google CSE: 403 not authorized / Access/Billing unklar",
"DDG scraping volatil (Bot block / 0 results / Response-Laenge sehr kurz)"
]
},
{
"id": 3,
"title": "Go-Live / Productization",
"items": [
{ "title": "Step 15: Caddy/HTTPS + Reverse Proxy Vorbereitung", "status": "done" },
{ "title": "Step 17: Desktop-App + Installer + Kauf-/Download-Flow (Code-komplett)", "status": "done" },
{ "title": "Step 16: Go-Live extern (VPS, DNS, Stripe, Secrets, Deploy)", "status": "in_progress" },
{ "title": "Step 22: Browserbasiertes AZA (MVP) - nach Go-Live", "status": "open" },
{ "title": "Step 18: Website/Landing + Download-Page + Rechnungen/Belege (Billing/Invoice Flow)", "status": "done" },
{ "title": "Step 19: Support/Telemetry minimal (ohne PHI), Crashlogs optional", "status": "done" },
{ "title": "Step 20: Final Security pass (rate limit, request caps, audit)", "status": "done" }
]
},
{
"id": 4,
"title": "Sell-Ready Pack",
"items": [
{ "title": "Step 21: Steps/Status/Roadmap/To-Dos konsolidiert", "status": "done" },
{ "title": "Step 23: Billing & Legal sell-ready", "status": "open" },
{ "title": "Step 24: Ops/Monitoring/Runbook final", "status": "open" },
{ "title": "Step 25: Go-Live Cutover", "status": "open" }
]
}
],
"next_actions": [
"ERLEDIGT B1-W1: POST /v1/chat Endpoint (2026-03-26)",
"ERLEDIGT B1-W2: Desktop Chat-Calls auf Backend migriert (2026-03-26)",
"ERLEDIGT B1-W3/W4: Hetzner-Deploy LIVE + Server-E2E (2026-03-26)",
"ERLEDIGT B1 Desktop-Finalisierung + Live-Test (2026-03-27)",
"ERLEDIGT B1-W5: Desktop → Hetzner → OpenAI in echtem App-Test bestaetigt (2026-03-27)",
"ERLEDIGT: Stripe/Lizenz-Webhook-Block abgeschlossen (2026-03-28)",
"ERLEDIGT: Stripe Live-Test erfolgreich + neutralisiert (2026-03-30) Kauf+Storno+Refund, license_debug zeigt canceled",
"ERLEDIGT: Drei Bugs in stripe_routes.py gepatcht (COALESCE, cancel_at_period_end, sync_subscription) (2026-03-30)",
"ERLEDIGT: Stripe Live-Webhook stabilisiert (2026-03-27) 200 OK, Lizenzeintrag in DB",
"ERLEDIGT: Stripe Live-Konto, Produkt/Preise/Payment Links/Webhook eingerichtet (2026-03-27)",
"ERLEDIGT: STRIPE_SECRET_KEY + STRIPE_WEBHOOK_SECRET korrekt in Hetzner .env (2026-03-27)",
"ERLEDIGT: Webhook-500 geloest StripeObject/Routing/Env-Fallen behoben (2026-03-27)",
"ERLEDIGT: STRIPE-W1 Sandbox-Kauf erfolgreich (2026-03-28) admin@aza-medwork.ch, aza_basic_monthly, active in DB",
"ERLEDIGT: lookup_key-Fallback (_lookup_key_from_price) fuer Sandbox ohne price.lookup_key (2026-03-28)",
"ERLEDIGT: SQLite bereinigt, test@example.com geloescht, license_debug intern+extern funktional (2026-03-28)",
"ERLEDIGT: Desktop-Lizenzpfad gegen Live-Backend validiert (2026-03-30) canceled → Testmodus, active → Vollmodus korrekt",
"ERLEDIGT: Echter Live-Kauf CHF 59 (2026-03-30) Backend-Lizenz active, Desktop Vollmodus, current_period_end korrekt (1777652509)",
"ERLEDIGT: Desktop Aktivierungs-Gate Fix (2026-03-30) _has_remote_backend() Bypass, kein Testfenster bei Remote-Backend",
"ERLEDIGT: current_period_end Fix (2026-03-30) Fallback in Webhook-Handlern, sync_subscription repariert bestehende Daten",
"ERLEDIGT: Admin Monitor v1 live (system_status, licenses_overview, backup_status, billing_overview) (2026-03-30)",
"ERLEDIGT: Control Panel v2 live (license_customer_map, revenue_overview, alerts, dashboard_summary) (2026-03-30)",
"ERLEDIGT: Backup/Storage-Monitor aktiv taegliches Backup, /host_backups gemountet, ca. 137 GB frei (2026-03-30)",
"ERLEDIGT: Betreiber-Kontrolle mit Einzelposten (2026-03-31) revenue_overview liefert recent_charges + recent_refunds",
"ERLEDIGT: Root Cause 16 geloest (2026-03-31) revenue_overview um Einzelposten erweitert",
">>> KEIN AKTIVER HAUPTBLOCK Produktiv-/Kontrollbloecke abgeschlossen <<<",
"OFFEN: Admin-Token-Rotation (Token im Chat offengelegt, Rotation vor Produktivbetrieb empfohlen)",
"MOEGLICH: Betreiber-Runbook / Schnellreferenz standardisieren",
"MOEGLICH: WooCommerce / Produktiver Verkaufspfad",
"MOEGLICH: Lizenz-/Kundenlogik professionalisieren",
"MOEGLICH: Browser-AZA (nach Go-Live)",
"NACHGELAGERT: Autotext-Fix, Fenstergroessen, Buttons, UI-Feinschliff",
"NACHGELAGERT: Direkte OpenAI-Restpfade in Nebenmodulen bereinigen"
],
"todos": [
{
"id": "A-01",
"priority": "SOFORT",
"status": "in Arbeit",
"group": "A Go-Live extern",
"title": "Hostpoint-Website stabil lassen",
"description": "Keine riskanten Domain-/DNS-Experimente. Bestehende WordPress/Kadence-Seite bleibt Haupt-Website auf Hostpoint.",
"area": ["ops", "infra"]
},
{
"id": "A-02",
"priority": "SOFORT",
"status": "teilweise",
"group": "A Go-Live extern",
"title": "Stripe Live-Setup sauber fertigstellen",
"description": "Stripe Live-Konto eingerichtet. Produkt AzA Office mit 4 Preisen (Basic monatlich/jaehrlich, Team monatlich/jaehrlich). Payment Links erstellt. Webhook auf https://api.aza-medwork.ch/stripe/webhook eingerichtet und operational (200 OK). OFFEN: Stripe-Konto-Ownership dokumentieren, Bankkonto fuer Auszahlung pruefen, Testkauf validieren.",
"area": ["billing", "ops"]
},
{
"id": "A-03",
"priority": "SOFORT",
"status": "teilweise",
"group": "A Go-Live extern",
"title": "Live-Secrets pruefen",
"description": "STRIPE_SECRET_KEY und STRIPE_WEBHOOK_SECRET korrekt in Hetzner .env ergaenzt und in laufenden Container uebernommen. MEDWORK_API_TOKEN gesetzt. OFFEN: Nach stabilem Abschluss kompromittierte/sichtbare Secrets rotieren.",
"area": ["security", "ops"]
},
{
"id": "A-04",
"priority": "ERLEDIGT",
"status": "erledigt",
"group": "A Go-Live extern",
"title": "Deploy-Stack auf Hetzner live (2026-03-26)",
"description": "Docker Compose + Caddy + Backend auf Hetzner live. Services aza-api + aza-caddy laufen. api.aza-medwork.ch erreichbar. Haupt-Website bleibt auf Hostpoint.",
"area": ["ops", "infra"]
},
{
"id": "A-05",
"priority": "SOFORT",
"status": "offen",
"group": "A Go-Live extern",
"title": "Testkauf Ende-zu-Ende durchfuehren",
"description": "Stripe-Testmodus: Subscription monatlich + jaehrlich kaufen, Download-Link pruefen, E-Mail pruefen, Mein-Konto pruefen.",
"area": ["product", "billing"]
},
{
"id": "A-06",
"priority": "SOFORT",
"status": "offen",
"group": "A Go-Live extern",
"title": "Download-/Lizenzfluss live validieren",
"description": "Installer herunterladen, installieren, Aktivierung, Lizenzpruefung, Backend-Anbindung alles End-to-End.",
"area": ["product", "release"]
},
{
"id": "B-01",
"priority": "HOCH",
"status": "offen",
"group": "B Verkauf / Subscription",
"title": "Subscription in Website/Checkout konsistent abbilden",
"description": "Basic (1 User): CHF 59/Monat, CHF 590/Jahr. Team (2 User): CHF 89/Monat, CHF 890/Jahr. Stripe Billing direkt (kein WooCommerce Subscriptions Plugin noetig). Pricing auf Produktseite, Checkout, E-Mails konsistent.",
"area": ["product", "billing"]
},
{
"id": "B-02",
"priority": "HOCH",
"status": "erledigt",
"group": "B Verkauf / Subscription",
"title": "Pricing-Texte und Lizenztexte festziehen",
"description": "deploy/PRODUCT_V1.md und deploy/WOOCOMMERCE_PRODUCT.md auf Subscription-Modell aktualisiert. Nicht mehr aendern, sondern verwenden.",
"area": ["product", "legal"]
},
{
"id": "B-03",
"priority": "HOCH",
"status": "offen",
"group": "B Verkauf / Subscription",
"title": "Billing / Invoices / VAT / Stripe-Rechnungslogik",
"description": "Rechnungen mit CHF, MwSt-Hinweis, korrekte Absenderadresse. Stripe Invoice-Einstellungen. AGB mit Subscription-Hinweisen.",
"area": ["billing", "legal"]
},
{
"id": "C-01",
"priority": "HOCH",
"status": "erledigt",
"group": "C Download-Produkt",
"title": "Stabile Basisversion als erste verkaufbare Version definieren",
"description": "v1.0.0 definiert, Installer gebaut und getestet. 6 Module, Systemstatus, Launcher, Firewall-Fix.",
"area": ["release", "desktop"]
},
{
"id": "C-02",
"priority": "HOCH",
"status": "erledigt",
"group": "C Download-Produkt",
"title": "Release-/Update-Strategie sauber machen",
"description": "Versionierung (v1.0.x / v1.x / v2.0), Update-Lieferung ueber WooCommerce-Account, Changelog als Website-Seite.",
"area": ["release", "product"]
},
{
"id": "C-03",
"priority": "MITTEL",
"status": "offen",
"group": "C Download-Produkt",
"title": "Signierte Downloads / Versionierung / Changelog vervollstaendigen",
"description": "Code-Signing nach erstem Live-Kauf. Changelog-Seite auf Website. version.json mit korrekter Download-URL.",
"area": ["release", "security"]
},
{
"id": "D-01",
"priority": "HOCH",
"status": "offen",
"group": "D Browser-AZA",
"title": "Nach Go-Live Step 22 verbindlich starten",
"description": "Browser-AZA ist Kern des Projekts. Wird nach Go-Live sofort gestartet, nicht optional.",
"area": ["web", "product"]
},
{
"id": "D-02",
"priority": "HOCH",
"status": "offen",
"group": "D Browser-AZA",
"title": "Browser-AZA MVP nach Spec umsetzen",
"description": "browser_aza_mvp_spec.md: Upload-Bereich, Fachrichtungsauswahl, /v1/transcribe, Ergebnisansicht, Copy-Button.",
"area": ["web", "frontend", "backend"]
},
{
"id": "D-03",
"priority": "HOCH",
"status": "offen",
"group": "D Browser-AZA",
"title": "Minimaler Zugangsschutz ohne Breaking Change",
"description": "Auth fuer Browser-AZA, ohne /license/status oder X-API-Token Contract zu brechen.",
"area": ["security", "backend"]
},
{
"id": "D-04",
"priority": "HOCH",
"status": "offen",
"group": "D Browser-AZA",
"title": "Upload-Flow / Result-Flow / Specialty-Auswahl bauen",
"description": "Audio-Upload, Fachrichtungsauswahl, Transkript-Anzeige, Copy-Button. Keine PHI in Logs.",
"area": ["web", "frontend"]
},
{
"id": "E-01",
"priority": "SPAETER",
"status": "offen",
"group": "E Ops / Spaeter",
"title": "Observability",
"description": "Logging, Metriken, Alerting. Kein PHI in Logs. Uptime-Monitoring.",
"area": ["ops"]
},
{
"id": "E-02",
"priority": "ERLEDIGT",
"status": "erledigt",
"group": "E Ops / Spaeter",
"title": "ERLEDIGT: Admin Control Panel v2 live (2026-03-30)",
"description": "Admin Monitor v1 (system_status, licenses_overview, backup_status, billing_overview) + Control Panel v2 (license_customer_map, revenue_overview, alerts, dashboard_summary). Geschuetzt via X-Admin-Token / AZA_ADMIN_TOKEN. Datei: admin_routes.py, eingebunden in backend_main.py.",
"area": ["ops", "product"]
},
{
"id": "E-03",
"priority": "SPAETER",
"status": "offen",
"group": "E Ops / Spaeter",
"title": "Runbook final",
"description": "Backups, Log-Rotation, Incident-Playbook, Token-Rotation.",
"area": ["ops"]
},
{
"id": "E-04",
"priority": "SPAETER",
"status": "offen",
"group": "E Ops / Spaeter",
"title": "Go-Live Cutover final",
"description": "Finale Checkliste, Rollback-Plan, DNS-Cutover fuer Browser-AZA (app.aza-medwork.ch).",
"area": ["ops", "product"]
}
]
}