523 lines
29 KiB
JSON
523 lines
29 KiB
JSON
{
|
||
"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"
|
||
}
|
||
]
|
||
}
|