Files
aza/AzA march 2026/project_plan.json
2026-04-16 13:32:32 +02:00

523 lines
29 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": 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"
}
]
}