Files
aza/AzA march 2026/project_plan.json

495 lines
27 KiB
JSON
Raw Normal View History

2026-03-25 22:03:39 +01:00
{
"version": 9,
"updated_at": "2026-03-25",
"project_phase": "B1 Backend-Sprint Serverseitige OpenAI-Architektur (Variante B verbindlich)",
"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": "B1-W1: Backend Chat Proxy Endpoint (POST /v1/chat)",
"goal": "POST /v1/chat in backend_main.py. Auth via X-API-Token. OpenAI serverseitig. Rate Limiting.",
"status": "in_arbeit",
"sprint_context": "Teil des B1 Backend-Sprints (Variante B verbindlich).",
"warum_dieser_block_zuerst": "Ohne /v1/chat kann Desktop-App nicht von direkten OpenAI-Calls migriert werden. Muster /v1/transcribe existiert. Alles weitere (Hetzner, Key-Entfernung) haengt davon ab.",
"done": [
"/v1/transcribe existiert als Muster (Backend→OpenAI fuer Transkription)",
"Auth-Contract X-API-Token + X-Device-Id ist etabliert",
"Docker/Caddy Deployment-Stack existiert in deploy/",
"Aktivierungsschluessel-Bridge implementiert"
]
},
"customer_journey_status": {
"date": "2026-03-25",
"kauf": "IN ARBEIT WooCommerce-Doku fertig, 7 Admin-Schritte in WordPress-Admin ausfuehren (Hostpoint, parallel)",
"download": "TEILWEISE Mechanik da, WooCommerce-Upload fehlt",
"installer": "FUNKTIONAL FERTIG kein Code-Signing",
"aktivierung": "BRIDGE IMPLEMENTIERT AZA-Key setzt Vollmodus",
"erster_start": "IN UMBAU (VARIANTE B) OpenAI-Key wird durch Backend-Proxy ersetzt. B1 Backend-Sprint laeuft."
},
"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: monatlich CHF 89 + Jahreslizenz CHF 886 (17% guenstiger). 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": "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": "open"
},
{
"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"
}
]
}