air work test

This commit is contained in:
2026-06-15 12:26:22 +02:00
parent 98d0bf0c7b
commit 8816e8d297
297 changed files with 0 additions and 45700 deletions
@@ -1,56 +0,0 @@
# 🏗️ [Lead Architect] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Strategie, Architektur-Entscheidungen (ADRs), Domänen-Modell, Master-Roadmap
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **ADR-0021 (Tenant-Resolution):** Die zentrale Architektur-Entscheidung wurde getroffen: **Eine Veranstaltung = eine
Datenbank**. Die Analyse zwischen Schema-per-Tenant und Tenant-ID ist abgeschlossen. Das ADR liegt in
`docs/01_Architecture/adr/0021-tenant-resolution-strategy-de.md`.
- **Domänen-Modell formal präzisiert:** Die Hierarchie `Veranstaltung → Turnier → Bewerb → Abteilung` ist
festgeschrieben. `TeilnehmerKonto` auf Veranstaltungsebene (Multi-Turnier), Veranstaltungs-Kassa mit
turnier-übergreifendem Saldo und die Abteilungs-Typen `SEPARATE_SIEGEREHRUNG` / `ORGANISATORISCH` sind modelliert.
### Sprint B — vollständig abgeschlossen
- **ADR-0022 (LAN-Sync-Protokoll):** Entscheidung für **Event-Sourcing Light mit Lamport-Uhren** (Option D) getroffen.
Optionen (Event-Sourcing, CRDT, Timestamp-Sync) wurden analysiert. ADR liegt in
`docs/01_Architecture/adr/0022-lan-sync-protocol-de.md`. Backend und Frontend wurden informiert — C-3 (LAN-Sync) bei
beiden freigegeben.
---
## 🔄 Was ist noch offen?
### Sprint C — nächste Woche (Priorität 2)
- **C-1 Synchronisations-Protokoll-Konzeption:** Offline-First-Konzept für Desktop ↔ Backend ausarbeiten,
Conflict-Resolution-Strategie definieren, Konzept-Dokument ablegen.
- **C-2 MASTER_ROADMAP aktualisieren:** Desktop-App-Fokus eintragen, Sprint A/B Ergebnisse als erledigt markieren,
Offline-Sync-Meilensteine eintragen, Phase-8-Fortschritt reflektieren.
---
## 🔗 Abhängigkeiten & Auswirkungen
| Meine Aufgabe | Blockiert wen |
|--------------------|--------------------------------------------------------------|
| ADR-0021 ✅ | 👷 Backend: Tenant-Isolation (abgeschlossen) |
| Domänen-Modell ✅ | 👷 Backend: Schema-Design; 🎨 Frontend: ViewModel-Design |
| ADR-0022 ✅ | 🎨 Frontend C-3, 👷 Backend C-3, 🐧 DevOps D-2 (freigegeben) |
| Sync-Konzept (C-1) | 🐧 DevOps: mDNS/WebSocket-Infrastruktur |
---
## 💬 Botschaft an die Runde
Die zwei wichtigsten Architektur-Fundamente sind gesetzt: **Tenant-Isolation** (ADR-0021) und **LAN-Sync-Protokoll** (
ADR-0022). Das Team kann auf diesen Entscheidungen aufbauen — Backend und Frontend haben ihre C-3-Aufgaben (
LAN-Sync-Implementierung) bereits in der Roadmap. Die nächste dringende Aufgabe ist das konkrete *
*Offline-First-Konzept (C-1)** und die Aktualisierung der **MASTER_ROADMAP (C-2)**, damit alle Teams einen aktuellen
Überblick haben.
@@ -1,69 +0,0 @@
# 👷 [Backend Developer] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Spring Boot / Ktor, Kotlin, SQL, API-Design, Datenbankschema, Services
---
## ✅ Was wurde erreicht?
### Sprint A — weitgehend abgeschlossen
- **Datenbankschema (A-2):** Tabellen `veranstaltungen`, `turniere`, `bewerbe`, `abteilungen`, `teilnehmer_konten`,
`turnier_kassa` mit FK-Ketten implementiert. Flyway-Migrationen V1V3 laufen durch. `DomainHierarchyMigrationTest` ist
grün.
- **Tenant-Isolation (A-1):** ADR-0021 vollständig umgesetzt. `TenantWebFilter`, `TenantRegistry` (JDBC),
`JdbcTenantRegistry`, `TenantMigrationsRunner` und MDC-Logging implementiert. Flyway pro Tenant-Schema. Alle
Unit-Tests (`JdbcTenantRegistryTest`) grün. E2E-Isolationstest (`EntriesIsolationIntegrationTest`) wieder aktiv und
grün. Kritischer Bugfix: `springdoc` 3.0.0 → 2.8.9 (ClassNotFoundException behoben).
- **Validierungs-Grundlage (A-3 teilweise):** Entkoppelte Policy-Schnittstelle + Bewerb-Descriptor implementiert.
Konkrete ÖTO-Regeln/Limits als Policy-Implementierung umgesetzt.
### Sprint B (teilweise) — CRUD vollständig
- **CRUD-Endpunkte (B-1):** Alle Kern-Entitäten vollständig implementiert:
- `Veranstaltung`: GET, PUT
- `Turniere`: POST, GET, GET{id}, PUT, DELETE, PATCH /status
- `Bewerbe`, `Abteilungen`: vollständige CRUD-Endpunkte
- `Reiter`, `Pferde`, `Vereine`, `Funktionäre`: vollständige CRUD inkl. Filter-Parameter
- Konsistentes Error-Format (`problem+json`), Service-Guardrails für `PUBLISHED`-Lock
- **Regulation-as-Data (via Rulebook B-2):** `LizenzKlasseE`-Enum mit `R4` ergänzt, `RD4`-Fehler korrigiert. Flyway
V009: `license_height_matrix` + `horse_min_age_matrix` angelegt und befüllt. FEI Legacy→Numeric Resolver
implementiert (`/api/fei/resolve/{id}`).
---
## 🔄 Was ist noch offen?
### Sprint A — Restpunkt
- **A-3 Sonderregeln:** Einarbeitung der Rulebook-B-2-Spezifikation (wartet auf finale Übergabe).
### Sprint B — offen
- **B-1 Rest:** OpenAPI-Dokumentation (Springdoc) noch ausstehend. E2E-Tests für CRUD-Flows.
- **B-2 Kassa-Service:** `TeilnehmerKonto`-Service, `Zahlvorgang`-Service, Rechnungs-Generierung und Endpunkte noch
nicht implementiert.
- **B-3 ÖTO-Validierung serverseitig:** OEPS/FEI-Formate, Lizenzklassen, Altersklassen, CSN-C-NEU-Zwangsteilung — wartet
auf Rulebook-Spezifikation.
### Sprint C — geplant
- **C-1 Nennungs-Service**, **C-2 Stammdaten-Seeder**, **C-3 LAN-Sync-Endpunkte** (ADR-0022 ✅ freigegeben).
---
## 🔗 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------|-------------|----------|
| Rulebook B-2 Spezifikation | 📜 Rulebook | A-3, B-3 |
---
## 💬 Botschaft an die Runde
Das Backend hat eine solide Grundlage: Tenant-Isolation läuft, alle CRUD-Endpunkte für Stammdaten sind fertig, das
Datenbankschema ist vollständig. Der nächste große Block ist der **Kassa-Service (B-2)** — der ist noch komplett offen.
Die **ÖTO-Validierung (B-3)** wartet auf die finale Rulebook-Übergabe. Sobald das Rulebook-Team B-2 abschließt, kann das
Backend sofort mit A-3 und B-3 starten.
@@ -1,68 +0,0 @@
# 🧹 [Curator] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Dokumentation, Session-Logs, Ubiquitous Language, Ordnung in `docs/`
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **A-1 `Ubiquitous_Language.md` aktualisiert** — nach Domänen-Modell-Präzisierung durch den Architect.
- **A-2 Event-First-Workflow dokumentiert** → `docs/02_Guides/Event-First-Workflow.md`
- **A-3 Navigation-V3 dokumentiert** → `docs/06_Frontend/Navigation_V3_Screen-Baum_und_Back-Stack.md`
- **A-4 Tenant-Konzept dokumentiert** →
`docs/01_Architecture/Reference/Tenant-Konzept_Eine-Veranstaltung-eine-Datenbank.md`
- **A-5 Session-Log Besprechung 02.04.2026** → `docs/99_Journal/2026-04-02_Meldestelle_Besprechung_Session-Log.md`
### Sprint B — weitgehend abgeschlossen
- **B-0 Rulebook-Session dokumentiert** → `docs/99_Journal/2026-04-03_Rulebook_B1_Validierung_Frontend.md`
- **B-1 Roadmaps vollständig gepflegt (03.04.2026):**
- Architect-Roadmap: Sprint B (ADR-0022) als ✅ abgeschlossen eingetragen
- Backend-Roadmap: C-3 LAN-Sync als freigegeben markiert
- Frontend-Roadmap: C-3 LAN-Sync als freigegeben markiert
- DevOps-Roadmap: vollständig und korrekt ✅
- UIUX-Roadmap: vollständig und korrekt ✅
- Rulebook-Roadmap: vollständig und korrekt ✅
- QA-Roadmap: Sprint-B-Header korrigiert (🔴 → 🟡 Teilweise offen) ✅
- Alle Roadmaps: abgeschlossene Aufgaben als `[x]` markiert ✅
- **Architect B-1 Session-Log erstellt** → `docs/99_Journal/2026-04-03_Architect_B1_LAN-Sync_ADR-0022.md`
---
## 🔄 Was ist noch offen?
### Sprint B — offen
- **B-2 `docs/05_Backend/` aktualisieren:** Datenbankschema (Tabellen V1V009), API-Endpunkte-Übersicht (Reiter, Pferde,
Vereine, Funktionäre), Tenant-Isolation beschreiben. Kassa-Endpunkte sobald Backend B-2 fertig.
- **B-3 `docs/06_Frontend/` aktualisieren:** ViewModel-Architektur-Muster verlinken, `VeranstalterViewModel` als
Referenz eintragen.
### Sprint C — geplant (nächste Woche)
- **C-1** `README.md` aktualisieren (Desktop-App-Fokus, Schnellstart, V1-Altlasten)
- **C-2** Setup-Guide erstellen (`docs/02_Guides/`)
- **C-3** Unterordner-Struktur in `docs/` prüfen und mit Architect abstimmen
- **C-4** V1-Code-Bereinigung koordinieren (gemeinsam mit Frontend + Backend)
- **C-5** Sprint-Reports archivieren in `docs/90_Reports/`
---
## 🔗 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|---------------------------|------------|--------------------------|
| Backend B-2 Kassa-Service | 👷 Backend | B-2 Kassa-Endpunkte-Doku |
---
## 💬 Botschaft an die Runde
Die Dokumentations-Basis ist solide: Session-Logs, Ubiquitous Language, alle Roadmaps und zentrale Architektur-Dokumente
sind aktuell. Die **Besprechungs-Berichte von heute** (dieses Dokument und alle Schwester-Berichte) wurden in
`docs/04_Agents/Besprechung_2026-04-03/Berichte/` abgelegt. Der dringendste offene Punkt ist **B-2** — die
Backend-Dokumentation (Datenbankschema + API-Übersicht) ist bereit zum Erstellen, da Backend B-1 abgeschlossen ist. Das
`README.md` ist veraltet und sollte bald auf Desktop-App-Fokus aktualisiert werden.
@@ -1,69 +0,0 @@
# 🐧 [DevOps Engineer] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Docker, CI/CD, Gradle, Security, Desktop-Packaging, Infrastruktur
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **Docker-Compose-Setup (A-1):** Alle Services in `docker-compose.yaml` / `dc-*.yaml` geprüft. Lokale
Entwicklungsumgebung startet mit einem einzigen Befehl. Healthchecks für alle Services definiert.
### Sprint B — vollständig abgeschlossen
- **CI/CD Pipeline für Compose Desktop Tests (B-1):** Gitea Actions Workflow `.gitea/workflows/desktop-tests.yml`
angelegt. Headless-Umgebung mit `xvfb-run` (1920×1080×24). Gradle-Task `:frontend:shells:meldestelle-desktop:jvmTest`
integriert. Build-Artefakte werden gespeichert.
- **Gradle-Build-Optimierungen (B-2):** Build-Cache, Parallele Builds, Headless-Flag aktiv. Gradle Wrapper auf Version
`9.4.0` aktualisiert.
### Sprint C — weitgehend abgeschlossen
- **Desktop-App Packaging (C-1):** `compose.desktop.nativeDistributions` vollständig konfiguriert für Linux (`.deb`),
Windows (`.msi`) und macOS (`.dmg`). App-Metadaten, eingebettetes JRE mit minimalem Footprint und JVM-Args für
gepackte App konfiguriert. Icon-Ressourcen-Verzeichnis mit `ICONS_PLACEHOLDER.md` angelegt.
- **Semantic Versioning (C-2):** Schema `MAJOR.MINOR.PATCH[-QUALIFIER]` definiert. Zentrale Versionsquelle
`version.properties` (aktuell `1.0.0-SNAPSHOT`). Root- und Desktop-`build.gradle.kts` lesen Version daraus.
Release-Workflow `.gitea/workflows/release.yml` mit Git-Tagging, Linux `.deb` und Windows `.msi` Build-Jobs angelegt.
`CHANGELOG.md` im Keep-a-Changelog-Format erstellt.
---
## 🔄 Was ist noch offen?
### Sprint C — Restpunkte
- **C-1 Offene Punkte:** Echte Icon-Dateien (`icon.png`, `icon.ico`, `icon.icns`) fehlen noch — wartet auf 🖌️ UI/UX.
Testinstallation auf Ziel-Betriebssystem steht noch aus.
- **C-3 Produktions-Deployment:** Reverse-Proxy (Nginx/Traefik), HTTPS-Zertifikat-Management, Backup-Strategie für
Produktionsdatenbanken.
### Sprint D — geplant (nächste Woche)
- **D-1 Multi-Tenant Datenbankinfrastruktur:** Pro-Tenant-Schema in Postgres absichern, Monitoring in Grafana,
Pro-Tenant-Backup-Strategie.
- **D-2 mDNS / LAN-Discovery Infrastruktur (ADR-0022 ✅):** Avahi-Dienst in Docker-Compose, WebSocket-Endpunkt in
Nginx/Traefik durchreichen.
> ⏸️ **Pangolin / externer Zugriff** — kein MVP-Blocker, zurückgestellt.
---
## 🔗 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|-----------------------------|-----------|---------------------|
| Icon-Dateien (PNG/ICO/ICNS) | 🖌️ UI/UX | C-1 Release-Build |
| QA: Test-Integration in CI | 🧐 QA C-4 | C-1 Packaging-Tests |
---
## 💬 Botschaft an die Runde
Die Infrastruktur läuft stabil: Docker-Compose, CI/CD-Pipeline und Gradle-Optimierungen sind fertig. Das *
*Desktop-Packaging ist vollständig konfiguriert** — wir können theoretisch schon `.deb`- und `.msi`-Installer bauen. Der
einzige Blocker für den ersten echten Release-Build sind die **App-Icons** vom UI/UX-Team. Sobald die Icons vorliegen,
kann der Release-Workflow sofort laufen.
@@ -1,72 +0,0 @@
# 🎨 [Frontend Expert] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** KMP, Compose Desktop, State-Management, Navigation, Backend-Anbindung
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **ViewModel-Architektur (A-1):** MVVM mit UDF als verbindliches Muster festgelegt. `Intent`/`State`-Struktur mit
Sealed Classes definiert. `VeranstalterViewModel` als vollständige Referenz-Implementierung. Muster-Dokument in
`docs/06_Frontend/` abgelegt.
- **Abteilungs-Logik im Bewerb-Dialog (A-2):** CSN-C-NEU Automatik-Teilung mit 4 Abteilungen, AssistChip
„Pflicht-Teilung vorgeschlagen", Abteilungs-Typen `SEPARATE_SIEGEREHRUNG` / `ORGANISATORISCH` in der UI verankert.
### Sprint B (teilweise) — ViewModels & Navigation vollständig
- **ViewModels für alle V3-Screens (B-1):** `TurnierViewModel`, `BewerbViewModel`, `PferdProfilViewModel`,
`ReiterProfilViewModel`, `VereinsViewModel`, `FunktionaerViewModel`, `AbteilungViewModel` (Startliste, Ergebnisse) —
alle fertig.
- **Zusätzlich erledigt (02.04.2026):** Navigation V2 / Back-Stack-System, Profil-Cards mit Edit-Dialogen (Veranstalter,
Pferd, Reiter, Verein, Funktionär), Onboarding mit `rememberSaveable`, Veranstaltungs-Wizard mit Bestätigungs-Dialog,
Breadcrumbs und Zurück-Navigation korrigiert.
- **Backend-Anbindung (B-2 teilweise):** `HttpClient`-Factory zentral konfiguriert. `VeranstalterRepository`,
`BewerbRepository`, `AbteilungRepository`, `DefaultTurnierRepository` implementiert. DTOs + Mapper in commonMain. Koin
Feature-Modul `turnierFeatureModule` verdrahtet. Fehler-Mapping HTTP → Domain-Errors einheitlich.
- **Validierungs-Live-Feedback (B-3 teilweise):** `MsValidationWrapper` vorhanden. OEPS-Nummer- und
FEI-ID-Live-Validierung in `ReiterProfilViewModel` und `PferdProfilViewModel`. Lizenzklasse-Validierung im
ReiterProfilViewModel. `ReiterProfilEditDialog` und `PferdProfilEditDialog` vollständig mit `MsValidationWrapper`
ausgestattet.
---
## 🔄 Was ist noch offen?
### Sprint B — offen (höchste Priorität)
- **B-2 Rest:** `AuthApiClient`-Integration, `StoreV2` Feature-für-Feature ablösen, Akzeptanz-Tests (Mock Engine),
Dokumentation `Networking.md`.
- **B-3 Rest:** Lizenzklasse × Bewerbs-Klasse Warnung, Altersklasse Pferd × Bewerb Warnung — benötigen Bewerb-Kontext
und Rulebook-Spezifikation.
- **B-4 Kassa-Screen:** Gesamt-Saldo-Ansicht, turnier-übergreifender Zahlvorgang, Rechnungsvorschau — wartet auf Backend
B-2 und UI/UX-Wireframes.
### Sprint C — geplant
- **C-1** `StoreV2` vollständig ablösen
- **C-2** VeranstalterNeu: Vereinssuche & Daten-Übernahme
- **C-3** LAN-Sync-UI vorbereiten (ADR-0022 ✅ freigegeben)
- **C-4** Lint-Bereinigung & Code-Qualität
---
## 🔗 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|-------------------------------------|-------------------|-----------------------------------|
| Rulebook Validierungs-Spezifikation | 📜 Rulebook B-2 | B-3 Bewerb-Kontext-Validierung |
| Kassa-Service API | 👷 Backend B-2 | B-4 Kassa-Screen |
| Wireframes Bewerb-Dialog / Kassa | 🖌️ UI/UX B-2/B-3 | B-4 Implementierung (✅ vorhanden) |
---
## 💬 Botschaft an die Runde
Die Desktop-App hat eine vollständige ViewModel-Schicht und Navigation. Die Backend-Anbindung ist in vollem Gange —
Repositories für alle Kern-Entitäten sind angelegt. Der größte offene Punkt ist die **`StoreV2`-Ablösung** und die
Live-Validierung mit **Bewerb-Kontext** (B-3). Der **Kassa-Screen (B-4)** kann erst starten, wenn das Backend den
Kassa-Service liefert. Die UI/UX-Wireframes für Kassa und Bewerb-Dialog sind bereits vorhanden und warten auf
Implementierung.
@@ -1,73 +0,0 @@
# 🧐 [QA Specialist] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Test-Strategie, Edge-Cases, Integrationstests, Regressionssicherung
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **Test-Strategie für Desktop-App (A-1):** Testpyramide für Compose Desktop festgelegt (Unit / Integration / UI-Tests).
Tooling entschieden: `kotlin.test`, Compose UI Test, Mockk. Test-Konventionen dokumentiert (Namensschema,
Ordnerstruktur, Arrange-Act-Assert). `IdempotencyPluginTest` stabilisiert. `OetoValidatorsTest.kt` als Basis für
Grenzfall-Abdeckung etabliert.
### Sprint B (teilweise) — zwei Test-Suiten abgeschlossen
- **Onboarding-Wizard Edge-Cases (B-2) ✅ — 3. April 2026:**
- Leere Pflichtfelder → Speichern-Button bleibt deaktiviert
- Schnelles Doppelklick → kein doppelter Submit
- Abbrechen mitten im Wizard → kein inkonsistenter Zustand
- Zurück-Navigation: Gerätename und Sicherheitsschlüssel bleiben erhalten (`rememberSaveable`)
- **Fix:** `remember``rememberSaveable` in `OnboardingScreen.kt`
- **Neu:** `OnboardingValidator`-Objekt extrahiert für isolierte Unit-Tests
- **17 Tests, alle GRÜN** (`OnboardingValidatorTest.kt`)
- **Abteilungs-Logik (B-3) ✅ — 3. April 2026:**
- CSN-C-NEU ≤95cm / ≥100cm: Pflicht-Teilungen korrekt vorgeschlagen
- `ORGANISATORISCH`: Gesamtrangliste korrekt zusammengeführt
- `SEPARATE_SIEGEREHRUNG`: Abteilungen werden nicht zusammengeführt
- Caprilli-Regression abgesichert, Grenzfälle 90 cm und 110 cm abgedeckt
- **Fix:** CSN-C-NEU-Logik in `AbteilungsRegelService.kt` implementiert
- **Neu:** `ORGANISATORISCH` + `SEPARATE_SIEGEREHRUNG` in `AbteilungsTeilungsTypE` ergänzt
- **14 neue Tests, alle GRÜN** (`AbteilungsRegelServiceTest.kt`)
---
## 🔄 Was ist noch offen?
### Sprint B — offen
- **B-1 Navigation & Back-Stack:** Navigations-Flows, Back-Stack-Verhalten, SingleTop-Tabs, Logout-Verhalten — noch
nicht begonnen.
- **B-2 Restpunkt:** Ungültige OEPS-Nummer → Fehlermeldung sichtbar (abhängig von Frontend C-3).
- **B-4 ViewModel-Verhalten:** State-Initialisierung, Intent → State-Transitionen, Fehler-State bei Backend-Fehler,
Loading-State — noch nicht begonnen.
### Sprint C — geplant
- **C-1** Mandanten-Isolation (sicherheitskritisch; wartet auf Backend A-1 Rollout)
- **C-2** Kassa und Zahlvorgang (wartet auf Backend B-2)
- **C-3** ÖTO-Validierung (wartet auf Rulebook C-1 `AltersklasseRechner`)
- **C-4** Regressions-Test-Suite & CI-Integration (gemeinsam mit 🐧 DevOps)
---
## 🔗 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------------|---------------|------------------------|
| Rulebook C-1 AltersklasseRechner | 📜 Rulebook | C-3 Validierungs-Tests |
| Backend B-2 Kassa-Service | 👷 Backend | C-2 Kassa-Tests |
| DevOps CI/CD Pipeline | 🐧 DevOps C-1 | C-4 CI-Integration |
---
## 💬 Botschaft an die Runde
Zwei wichtige Test-Suiten wurden heute fertiggestellt: **Onboarding (17 Tests)** und **Abteilungs-Logik (14 Tests)**
beide komplett grün, inklusive zweier produktiver Bugfixes im Produktivcode. Die Test-Basis steht. Der nächste kritische
Schritt ist die **Mandanten-Isolation (C-1)** — sicherheitskritisch und sofort anzugehen, sobald Backend A-1 vollständig
ausgerollt ist.
@@ -1,68 +0,0 @@
# 📜 [ÖTO/FEI Rulebook Expert] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** Regelwerks-Wächter, Validierungs-Spezialist, Compliance (ÖTO, FEI)
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **Validierungs-Spezifikation v0.3 DRAFT (A-1):** Paragraphen-Pins ergänzt (Springen § 231, Dressur § 103, CCN §§ 3xx).
Einheitliche Label-Konventionen definiert (`ohne Lizenz`, `mit Lizenz`, `R2 und höher`; Keys: `LZF_ONLY`, `R1_PLUS`,
`R1_ONLY`, `R2_PLUS`). Optionale Jugend-/Jahrgangsteilungen als Regulation-as-Data modelliert. CVN (Voltigieren) und
CAN (Fahren) als Fallback-Regelung dokumentiert.
- **Abteilungs-Schwellenwerte:** Dokument abgelegt in
`docs/03_Domain/02_Reference/OETO_Regelwerk/Abteilungs-Trennungs-Schwellenwerte.md`.
- **Warn-Logik-Spezifikation:**
`docs/03_Domain/02_Reference/OETO_Regelwerk/Warn-Logik-Spezifikation-competition-context.md` abgelegt.
- **`OetoValidators` (KMP) implementiert:** `OetoValidatorsTest.kt` ist grün.
### Sprint B (teilweise) — Frontend-Begleitung abgeschlossen
- **B-1 Frontend-Validierung begleitet:** Spezifikation v0.3 DRAFT an 🎨 Frontend übergeben. Implementierung geprüft —
Live-Validierung entspricht den Anforderungen. Fehlermeldungs-Texte geprüft. Session-Log dokumentiert.
- **B-2 Regulation-as-Data an Backend übergeben:**
- `LizenzKlasseE`-Enum mit `R4` ergänzt, `RD4`-Fehler in V008 korrigiert.
- Flyway V009: `license_height_matrix` + `horse_min_age_matrix` angelegt und befüllt.
- B-2-Übergabe-Spezifikation: `docs/03_Domain/02_Reference/OETO_Regelwerk/B2-Backend-Uebergabe-Regulation-as-Data.md`.
- `Validierungsregeln.md` auf Version 0.4 angehoben (`LZF``LIZENZFREI` korrigiert).
- FEI Legacy→Numeric Resolver in Masterdata-SCS implementiert.
---
## 🔄 Was ist noch offen?
### Sprint B — offen
- **B-2 Rest:** Serverseitige Validierung prüfen. Backend-Endpunkte `/api/regulation/*` noch ausstehend (liegt bei
Backend). Abweichungen Backend ↔ Frontend dokumentieren. Lizenz×Bewerb-Tabellen von DRAFT auf STABLE anheben (
Fachfreigabe erforderlich).
### Sprint C — geplant
- **C-1 `AltersklasseRechner`:** Altersklassen-Berechnung Pferd (Jahrgang → Kategorie), Grenzfälle (Geburtsjahr,
Jahreswechsel, Stichtag), Unit-Tests.
- **C-2 Regelwerk-Enums vervollständigen:** Lizenzklassen-Übergänge, FEI-Kategorien-Mapping, Enums in `core:domain` als
SSoT.
- **C-3 Compliance-Dokumentation:** Series-Context (Cups, Serien, Meisterschaften) vorbereiten.
---
## 🔗 Abhängigkeiten & Auswirkungen
| Meine Aufgabe | Blockiert wen |
|-------------------------|---------------------------------------------------|
| B-2 Spec an Backend ✅ | 👷 Backend: A-3 Sonderregeln, B-3 ÖTO-Validierung |
| B-1 Spec an Frontend ✅ | 🎨 Frontend: B-3 Live-Validierung |
| C-1 AltersklasseRechner | 🧐 QA: C-3 Validierungs-Tests |
---
## 💬 Botschaft an die Runde
Die fachliche Grundlage für Validierung steht: `OetoValidators` ist implementiert, die Lizenz-/Altersmatrix liegt als
Regulation-as-Data im Backend. Der kritische offene Punkt ist die **Fachfreigabe für Lizenz×Bewerb-Tabellen** (DRAFT →
STABLE) — ohne diese können Backend und Frontend nicht auf stabiler Basis arbeiten. Der **`AltersklasseRechner` (C-1)**
muss vor der Backend-Implementierung spezifiziert sein, da die Grenzfall-Logik komplex ist.
@@ -1,78 +0,0 @@
# 🖌️ [UI/UX Designer] — Zwischenbericht zur Besprechung vom 3. April 2026
> **Datum:** 3. April 2026, ca. 13:00 Uhr
> **Rolle:** High-Density Design, Wireframes, Usability, Design-System, Empty States
---
## ✅ Was wurde erreicht?
### Sprint A — vollständig abgeschlossen
- **Design-Inventur (A-1):** Alle vorhandenen V3-Screens katalogisiert (Screenshots in `docs/06_Frontend/Screenshots/`).
Inkonsistenzen in Spacing, Typografie und Farbgebung identifiziert. Offene UX-Probleme und fehlende Empty States
dokumentiert. Issue-Liste für Sprint B vorbereitet.
### Sprint B — vollständig abgeschlossen (3. April 2026)
- **Editier-Formulare: Dialog vs. Fullscreen (B-1 ✅):**
- Entscheidungsgrundlage erarbeitet: Wann AlertDialog, wann Fullscreen-Edit?
- Wireframes für beide Varianten erstellt (Reiter-Edit, Pferd-Edit als Beispiele)
- Mapping aller bestehenden Edit-Screens auf AlertDialog / Side Sheet / Fullscreen dokumentiert
- Finale Entscheidung als **verbindliche Design-Richtlinie festgeschrieben** (Status: APPROVED)
- Ergebnis: `docs/06_Frontend/Guidelines/Editier-Formulare_Dialog-vs-Fullscreen_v1.md`
- **Bewerb anlegen mit Abteilungs-Logik (B-2 ✅):**
- Dialog-Flow: Bewerb-Grunddaten → Abteilungs-Vorschlag → Bestätigung
- CSN-C-NEU Pflicht-Teilung visuell dargestellt
- Abteilungs-Typ-Auswahl (`SEPARATE_SIEGEREHRUNG` vs. `ORGANISATORISCH`) verständlich gestaltet
- Ergebnis: `docs/06_Frontend/Wireframes/Bewerb_anlegen_Abteilungs-Logik_v1.md`
- **Veranstaltungs-Kassa (B-3 ✅):**
- Gesamt-Saldo-Ansicht: Teilnehmer mit offenen Beträgen aus mehreren Turnieren
- Zahlvorgang-Dialog: Eine Zahlung, Aufteilung auf Turniere sichtbar
- Rechnungsvorschau: Zwei separate Rechnungen je Turnier als Tab
- Ergebnis: `docs/06_Frontend/Wireframes/Kassa_Veranstaltung_v1.md`
- **Empty States für alle Listenansichten (B-4 ✅):**
- Liste aller 10 Screens mit möglichen leeren Zuständen (3 Typen) erstellt
- Icon-Konzept: Material Symbols Outlined (kein Custom-Illustration-Set für MVP)
- Texte (Titel, Beschreibung, CTA) für alle Screens und Typen definiert
- Composable-API `MsEmptyState` spezifiziert (Ablageort, Parameter, Verhalten, Beispiel)
- Ergebnis: `docs/06_Frontend/Guidelines/Empty-States_Spezifikation_v1.md` (Status: APPROVED)
---
## 🔄 Was ist noch offen?
### Sprint C — geplant (nächste Woche)
- **C-1 Wireframes in Compose umsetzen:** Edit-Dialog/Fullscreen (B-1), Bewerb-Anlegen-Dialog (B-2), Kassa-Screen (B-3),
`MsEmptyState`-Composable implementieren, Empty States in alle 10 Listenansichten integrieren, `PferdProfilEditDialog`
zu Fullscreen migrieren.
- **C-2 Design-System konsolidieren:** Farb-Palette in `MaterialTheme` / `Theme.kt`, Typografie-Skala, wiederverwendbare
Composables (Cards, Badges, Chips).
- **C-3 Abteilungs-Ansicht:** Wireframes für Startliste, Ergebnisliste und Ranglisten-Zusammenführung (
`ORGANISATORISCH`).
> ⏸️ **Web-App / PWA Design** — Nach Desktop-MVP; Anforderungen noch nicht definiert.
---
## 🔗 Abhängigkeiten & Auswirkungen
| Meine Aufgabe | Blockiert wen |
|------------------------|------------------------------------------------|
| B-1 Richtlinie ✅ | 🎨 Frontend C-1: Edit-Dialoge implementieren |
| B-4 Spezifikation ✅ | 🎨 Frontend C-1: `MsEmptyState` implementieren |
| B-2 / B-3 Wireframes ✅ | 🎨 Frontend C-1: Bewerb-Dialog, Kassa-Screen |
| Icons (PNG/ICO/ICNS) | 🐧 DevOps C-1: Release-Build (noch ausstehend) |
---
## 💬 Botschaft an die Runde
Sprint B ist vollständig abgeschlossen — alle vier Punkte (B-1 bis B-4) sind **APPROVED** und an das Frontend-Team
übergeben. Die Spezifikationen und Wireframes liegen vor. Das Frontend kann sofort mit **`MsEmptyState` (C-1)** und der
**`PferdProfilEditDialog`-Migration** beginnen. Die **App-Icons** (PNG/ICO/ICNS) sind der einzige ausstehende
Design-Deliverable für den DevOps-Release-Build — diese müssen priorisiert werden.
@@ -1,871 +0,0 @@
---
type: Note
status: REDIRECT
owner: Curator
last_update: 2026-04-03
---
# 🧪 Postman Tests — Vollständige Dokumentation (verschoben)
Diese ausführliche Arbeitsversion wurde konsolidiert und in das zentrale Runbook für Betriebsanleitungen überführt.
Aktuelle Fassung:
- `docs/07_Infrastructure/runbooks/POSTMAN_API_Tests_Runbook.md`
Archiv:
- Zusammenfassung im Archiv: `docs/04_Agents/_archive/Postman_Tests_Dokumentation_2026-04-03.md`
Hinweis: Diese Datei bleibt als Weiterleitung bestehen, damit bestehende Links nicht brechen.
---
### 2.4 Swagger UI
| Feld | Wert |
|-------------|-----------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/swagger` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` — Swagger HTML-Interface
**Tipp:** Im Browser öffnen für interaktive API-Erkundung.
---
## 3. Ping Service
> **Zweck:** Funktionsfähigkeit des Ping-Service testen, Circuit Breaker und Sync-Funktionen validieren.
> **Direkt-URL:** `{{pingUrl}}` = `http://localhost:8082`
> **Via Gateway:** `{{baseUrl}}` = `http://localhost:8081`
---
### 3.1 Simple Ping
| Feld | Wert |
|-------------|---------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/simple` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK`
```json
{
"message": "pong",
"timestamp": "2026-04-03T14:00:00+02:00",
"service": "ping-service",
"status": "simple"
}
```
**Wozu:** Einfachster Smoke-Test — bestätigt dass der Service läuft und die DB erreichbar ist.
---
### 3.2 Simple Ping via Gateway
| Feld | Wert |
|-------------|---------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/ping/simple` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` (identisch wie 3.1)
**Wozu:** Bestätigt dass das Gateway den Ping-Service korrekt routet (Service Discovery via Consul).
---
### 3.3 Enhanced Ping (mit Circuit Breaker)
| Feld | Wert |
|-----------------|-----------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/enhanced` |
| **Auth** | Keine |
| **Query-Param** | `simulate=false` (Standard) |
**Erwartete Antwort:** `200 OK`
```json
{
"message": "enhanced pong",
"timestamp": "...",
"service": "ping-service",
"status": "enhanced",
"circuitBreakerStatus": "CLOSED"
}
```
**Wozu:** Bestätigt dass Resilience4j Circuit Breaker korrekt konfiguriert ist.
---
### 3.4 Enhanced Ping — Fehler simulieren
| Feld | Wert |
|-------------|-------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/enhanced?simulate=true` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` mit Fallback-Response (kein 500-Fehler!)
```json
{
"message": "fallback response",
"status": "fallback",
"circuitBreakerStatus": "OPEN",
"error": "..."
}
```
**Wozu:** Bestätigt dass der Circuit Breaker Fallback greift (60% simulierte Fehlerrate). Der Service antwortet trotz
Fehler mit einem sinnvollen Fallback.
**Mehrfach ausführen:** Nach ~5 Anfragen mit `simulate=true` öffnet der Circuit Breaker.
---
### 3.5 Public Ping (kein Auth erforderlich)
| Feld | Wert |
|-------------|---------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/public` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK`
**Wozu:** Bestätigt dass der `/ping/public`-Endpunkt ohne JWT-Token erreichbar ist (Security-Konfiguration).
---
### 3.6 Secure Ping (Auth erforderlich)
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/secure` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Mit gültigem Token:** `200 OK`
**Ohne Token:** `401 Unauthorized`
**Wozu:** Bestätigt dass JWT-Authentifizierung korrekt erzwungen wird.
---
### 3.7 Sync Pings (seit Timestamp)
| Feld | Wert |
|-----------------|-----------------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/sync` |
| **Auth** | Keine |
| **Query-Param** | `since=0` (alle Pings seit Epoch) |
**Erwartete Antwort:** `200 OK`
```json
[
{
"id": "...",
"message": "pong",
"timestamp": "...",
"lamportClock": 1
}
]
```
**Wozu:** Testet den LAN-Sync-Endpunkt (Lamport-Uhren, Event-Sourcing Light). `since` ist ein Unix-Timestamp in
Millisekunden.
---
### 3.8 Ping Service Health
| Feld | Wert |
|-------------|---------------------------|
| **Methode** | `GET` |
| **URL** | `{{pingUrl}}/ping/health` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK`
```json
{
"status": "up",
"timestamp": "...",
"service": "ping-service",
"healthy": true
}
```
---
## 4. Authentication Context
> **Zweck:** Benutzer-Registrierung, Login und Profilverwaltung über Keycloak testen.
> **Reihenfolge:** Zuerst registrieren → dann einloggen → Token in `{{authToken}}` speichern.
---
### 4.1 User Registration
| Feld | Wert |
|-------------|----------------------------------|
| **Methode** | `POST` |
| **URL** | `{{baseUrl}}/auth/register` |
| **Header** | `Content-Type: application/json` |
**Request Body:**
```json
{
"email": "test@example.com",
"password": "SecurePassword123!",
"firstName": "Test",
"lastName": "User",
"phoneNumber": "+43123456789"
}
```
**Erwartete Antwort:** `201 Created`
```json
{
"userId": "uuid-...",
"email": "test@example.com",
"message": "Registrierung erfolgreich"
}
```
**Wozu:** Legt einen neuen Benutzer in Keycloak an.
---
### 4.2 User Login
| Feld | Wert |
|-------------|----------------------------------|
| **Methode** | `POST` |
| **URL** | `{{baseUrl}}/auth/login` |
| **Header** | `Content-Type: application/json` |
**Request Body:**
```json
{
"email": "test@example.com",
"password": "SecurePassword123!"
}
```
**Erwartete Antwort:** `200 OK`
```json
{
"accessToken": "eyJhbGci...",
"refreshToken": "...",
"expiresIn": 300
}
```
> **⚡ Tipp:** Postman-Test-Script einfügen um Token automatisch zu speichern:
> ```javascript
> var json = pm.response.json();
> pm.environment.set("authToken", json.accessToken);
> ```
---
### 4.3 Get User Profile
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/auth/profile` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK`
```json
{
"userId": "...",
"email": "test@example.com",
"firstName": "Test",
"lastName": "User"
}
```
---
### 4.4 Update User Profile
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `PUT` |
| **URL** | `{{baseUrl}}/auth/profile` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"firstName": "Updated",
"lastName": "User",
"phoneNumber": "+43987654321"
}
```
**Erwartete Antwort:** `200 OK` — aktualisierte Profildaten
---
### 4.5 Change Password
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `POST` |
| **URL** | `{{baseUrl}}/auth/change-password` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"currentPassword": "SecurePassword123!",
"newPassword": "NewSecurePassword456!"
}
```
**Erwartete Antwort:** `200 OK`
**Fehlerfall (falsches Passwort):** `400 Bad Request`
---
## 5. Master Data: Countries
> **Zweck:** Länderstammdaten verwalten. Diese sind Voraussetzung für Pferde- und Reiter-Datensätze.
> **Basis-URL:** `{{baseUrl}}/api/masterdata/countries`
> **Hinweis:** GET-Endpunkte sind ohne Auth zugänglich; POST/PUT/DELETE benötigen `{{authToken}}`.
---
### 5.1 Get All Countries
| Feld | Wert |
|-------------|----------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/masterdata/countries` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` — Array aller Länder (inkl. inaktive)
---
### 5.2 Get Active Countries
| Feld | Wert |
|-------------|-----------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/masterdata/countries/active` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` — Nur Länder mit `istAktiv: true`
**Wozu:** Für Dropdown-Listen in der Desktop-App (nur aktive Länder anzeigen).
---
### 5.3 Get Country by ID
| Feld | Wert |
|-------------|------------------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/masterdata/countries/{{countryId}}` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK` — Einzelnes Land
**Fehlerfall:** `404 Not Found`
---
### 5.4 Get Country by ISO Code
| Feld | Wert |
|-------------|-----------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/masterdata/countries/iso/AT` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK`
```json
{
"id": "...",
"isoAlpha2Code": "AT",
"nameDeutsch": "Österreich",
"istEuMitglied": true,
"istAktiv": true
}
```
**Wozu:** Österreich ist das primäre Land — dieser Test prüft ob die Stammdaten korrekt befüllt sind.
---
### 5.5 Create Country
| Feld | Wert |
|-------------|----------------------------------------|
| **Methode** | `POST` |
| **URL** | `{{baseUrl}}/api/masterdata/countries` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"isoAlpha2Code": "TS",
"isoAlpha3Code": "TST",
"isoNumerischerCode": "999",
"nameDeutsch": "Testland",
"nameEnglisch": "Testland",
"istEuMitglied": false,
"istEwrMitglied": false,
"istAktiv": true,
"sortierReihenfolge": 999
}
```
**Erwartete Antwort:** `201 Created`
> **⚡ Tipp:** `countryId` aus der Antwort in Environment-Variable speichern:
> ```javascript
> var json = pm.response.json();
> pm.environment.set("countryId", json.id);
> ```
---
### 5.6 Update Country
| Feld | Wert |
|-------------|------------------------------------------------------|
| **Methode** | `PUT` |
| **URL** | `{{baseUrl}}/api/masterdata/countries/{{countryId}}` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"isoAlpha2Code": "TS",
"isoAlpha3Code": "TST",
"isoNumerischerCode": "999",
"nameDeutsch": "Updated Testland",
"nameEnglisch": "Updated Testland",
"istEuMitglied": false,
"istEwrMitglied": false,
"istAktiv": true,
"sortierReihenfolge": 999
}
```
**Erwartete Antwort:** `200 OK`
---
### 5.7 Delete Country
| Feld | Wert |
|-------------|------------------------------------------------------|
| **Methode** | `DELETE` |
| **URL** | `{{baseUrl}}/api/masterdata/countries/{{countryId}}` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `204 No Content`
**Fehlerfall (nicht gefunden):** `404 Not Found`
---
## 6. Horse Registry (Pferde)
> **Zweck:** Pferde-Stammdaten verwalten (CRUD).
> **⚠️ Hinweis Tabellen-Name:** In der Datenbank heißt die Tabelle `horse` (englisch), nicht `pferd`.
> **Basis-URL:** `{{baseUrl}}/api/horses`
---
### 6.1 Get All Horses
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK` — Array aller Pferde
**Nach ZNS-Import:** Hier erscheinen alle importierten Pferde.
---
### 6.2 Get Active Horses
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses/active` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK` — Nur Pferde mit `istAktiv: true`
---
### 6.3 Get Horse by ID
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses/{{horseId}}` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK`
```json
{
"id": "uuid-...",
"pferdeName": "Amadeus",
"geschlecht": "WALLACH",
"geburtsdatum": "2020-05-15",
"rasse": "Warmblut",
"farbe": "Braun",
"stockmass": 165,
"istAktiv": true
}
```
---
### 6.4 Search Horses by Name
| Feld | Wert |
|-------------|----------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses/search` |
| **Query** | `name=Test` (Suchbegriff), `limit=10` (max.) |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK` — gefilterte Pferde-Liste
**Wozu:** Echtzeit-Suche in der Desktop-App. Testen mit einem Namen aus dem ZNS-Import.
---
### 6.5 Get Horses by Owner
| Feld | Wert |
|-------------|--------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses/owner/{{ownerId}}` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK` — alle Pferde eines bestimmten Besitzers
---
### 6.6 Create Horse
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `POST` |
| **URL** | `{{baseUrl}}/api/horses` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"pferdeName": "Test Horse",
"geschlecht": "WALLACH",
"geburtsdatum": "2020-05-15",
"rasse": "Warmblut",
"farbe": "Braun",
"zuechterName": "Test Breeder",
"stockmass": 165,
"istAktiv": true,
"bemerkungen": "Test horse for API demonstration"
}
```
**Gültige Werte für `geschlecht`:** `WALLACH`, `STUTE`, `HENGST`
**Erwartete Antwort:** `201 Created`
> **⚡ Tipp:** `horseId` automatisch speichern:
> ```javascript
> var json = pm.response.json();
> pm.environment.set("horseId", json.id);
> ```
---
### 6.7 Update Horse
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `PUT` |
| **URL** | `{{baseUrl}}/api/horses/{{horseId}}` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"pferdeName": "Updated Test Horse",
"geschlecht": "WALLACH",
"geburtsdatum": "2020-05-15",
"rasse": "Warmblut",
"farbe": "Dunkelbraun",
"zuechterName": "Updated Test Breeder",
"stockmass": 167,
"istAktiv": true,
"bemerkungen": "Updated test horse for API demonstration"
}
```
**Erwartete Antwort:** `200 OK`
---
### 6.8 Delete Horse
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `DELETE` |
| **URL** | `{{baseUrl}}/api/horses/{{horseId}}` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `204 No Content`
---
### 6.9 Batch Delete Horses
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `DELETE` |
| **URL** | `{{baseUrl}}/api/horses/batch` |
| **Header** | `Content-Type: application/json` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Request Body:**
```json
{
"horseIds": ["{{horseId1}}", "{{horseId2}}"],
"forceDelete": false
}
```
**`forceDelete: false`** → Nur löschen wenn keine Abhängigkeiten vorhanden
**`forceDelete: true`** → Auch bei Abhängigkeiten löschen (⚠️ Vorsicht!)
**Erwartete Antwort:** `200 OK`
---
### 6.10 Get Horse Statistics
| Feld | Wert |
|-------------|---------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{baseUrl}}/api/horses/stats` |
| **Header** | `Authorization: Bearer {{authToken}}` |
**Erwartete Antwort:** `200 OK`
```json
{
"total": 42,
"active": 38,
"inactive": 4,
"byGeschlecht": {
"WALLACH": 20,
"STUTE": 18,
"HENGST": 4
}
}
```
**Wozu:** Schnelle Übersicht über den Datenbestand nach dem ZNS-Import.
---
## 7. ZNS Import Service
> **Zweck:** ZNS-Daten (Reiter, Pferde, Vereine, Funktionäre) aus einer `.zip`/`.dat`-Datei importieren.
> **Direkt-URL:** `{{znsUrl}}` = `http://localhost:8095`
> **Basis-Pfad:** `/api/v1/import/zns`
---
### 7.1 ZNS Import starten
| Feld | Wert |
|--------------|------------------------------------------|
| **Methode** | `POST` |
| **URL** | `{{znsUrl}}/api/v1/import/zns` |
| **Body-Typ** | `form-data` |
| **Key** | `file` (Type: **File**) |
| **Value** | ZNS-Datei auswählen (`.zip` oder `.dat`) |
**Schritt-für-Schritt in Postman:**
1. Methode: `POST`
2. URL: `http://localhost:8095/api/v1/import/zns`
3. Tab **Body****form-data**
4. Key: `file` → Typ auf **File** umstellen (Dropdown neben dem Key-Feld)
5. Value: ZNS-Datei auswählen
6. **Send** klicken
**Erwartete Antwort:** `202 Accepted`
```json
{
"jobId": "abc-123-def-456",
"status": "STARTED",
"message": "Import gestartet",
"startedAt": "2026-04-03T14:00:00+02:00"
}
```
> **⚡ Tipp:** `jobId` automatisch speichern:
> ```javascript
> var json = pm.response.json();
> pm.environment.set("znsJobId", json.jobId);
> ```
---
### 7.2 ZNS Import-Status abfragen
| Feld | Wert |
|-------------|----------------------------------------------------|
| **Methode** | `GET` |
| **URL** | `{{znsUrl}}/api/v1/import/zns/{{znsJobId}}/status` |
| **Auth** | Keine |
**Antwort während Import:** `200 OK`
```json
{
"jobId": "abc-123-def-456",
"status": "IN_PROGRESS",
"processedRecords": 150,
"totalRecords": 500,
"progressPercent": 30,
"startedAt": "2026-04-03T14:00:00+02:00"
}
```
**Antwort nach Abschluss:** `200 OK`
```json
{
"jobId": "abc-123-def-456",
"status": "COMPLETED",
"processedRecords": 500,
"totalRecords": 500,
"progressPercent": 100,
"importedReiter": 200,
"importedPferde": 180,
"importedVereine": 30,
"importedFunktionaere": 90,
"startedAt": "2026-04-03T14:00:00+02:00",
"completedAt": "2026-04-03T14:01:30+02:00"
}
```
**Mögliche Status-Werte:**
| Status | Bedeutung |
|---------------|----------------------------------------|
| `STARTED` | Job wurde angenommen, noch nicht aktiv |
| `IN_PROGRESS` | Import läuft gerade |
| `COMPLETED` | Import erfolgreich abgeschlossen |
| `FAILED` | Import fehlgeschlagen (Fehlerdetails) |
**Wozu:** Status pollen bis `COMPLETED` — dann Daten in pgAdmin oder Desktop-App prüfen.
---
### 7.3 ZNS Import Health-Check
| Feld | Wert |
|-------------|------------------------------|
| **Methode** | `GET` |
| **URL** | `{{znsUrl}}/actuator/health` |
| **Auth** | Keine |
**Erwartete Antwort:** `200 OK`
```json
{
"status": "UP",
"components": {
"db": { "status": "UP" },
"diskSpace": { "status": "UP" }
}
}
```
**⚠️ Consul-Check:** Nach dem Neustart des ZNS-Service sollte er im Consul-UI unter http://localhost:8500 unter dem
Namen `zns-import-service` erscheinen.
---
## 8. Empfohlene Test-Reihenfolge
### Schnell-Smoke-Test (5 Minuten)
```
1. GET {{pingUrl}}/ping/simple → "pong" ✓
2. GET {{baseUrl}}/health → "UP" ✓
3. GET {{znsUrl}}/actuator/health → "UP" ✓
4. GET {{baseUrl}}/api/masterdata/countries/iso/AT → Österreich ✓
```
### Vollständiger Integrations-Test (heute, ZNS-Import)
```
1. GET {{pingUrl}}/ping/simple → Smoke-Test
2. GET {{pingUrl}}/ping/enhanced → Circuit Breaker CLOSED
3. GET {{pingUrl}}/ping/enhanced?simulate=true → Fallback greift
4. POST {{baseUrl}}/auth/login → Token speichern
5. GET {{baseUrl}}/api/masterdata/countries/iso/AT → Stammdaten vorhanden
6. GET {{baseUrl}}/api/horses → (leer vor Import)
7. GET {{znsUrl}}/actuator/health → ZNS bereit
8. POST {{znsUrl}}/api/v1/import/zns → ZNS-Datei hochladen → jobId speichern
9. GET {{znsUrl}}/api/v1/import/zns/{{znsJobId}}/status → Status pollen bis COMPLETED
10. GET {{baseUrl}}/api/horses → Pferde jetzt befüllt ✓
11. GET {{baseUrl}}/api/horses/stats → Statistiken prüfen
12. GET {{baseUrl}}/api/horses/search?name=... → Suche testen
```
---
## Anhang: Alle URLs auf einen Blick
| Service | URL | Verwendung |
|----------------|-----------------------|--------------------------|
| API-Gateway | http://localhost:8081 | Haupt-Einstiegspunkt |
| Ping (direkt) | http://localhost:8082 | Ping-Endpunkte direkt |
| ZNS-Import | http://localhost:8095 | Import-Endpunkte |
| Keycloak Admin | http://localhost:8180 | Auth-Verwaltung |
| Consul UI | http://localhost:8500 | Service-Discovery prüfen |
| Zipkin | http://localhost:9411 | Traces nachverfolgen |
| pgAdmin | http://localhost:8888 | DB-Inhalte prüfen |
| Mailpit | http://localhost:8025 | E-Mail-Mock |
@@ -1,109 +0,0 @@
# 🧹 Session-Log — 3. April 2026 (Nachmittag)
> **Uhrzeit:** ca. 14:0014:30 Uhr
> **Thema:** Docker-Fixes, ZNS-Consul-Registrierung, pgAdmin-Provisioning, Postman-Dokumentation
> **Erstellt von:** 🧹 Curator
---
## Was wurde gemacht?
### 1. 🐧 Dockerfiles korrigiert (Gateway + Ping)
**Problem:** `docker compose build api-gateway` und `docker compose build ping-service` schlugen fehl,
weil das Builder-Image `gradle:9.4.0-jdk25-alpine` (bzw. `9.3.1-jdk25`) auf Docker Hub nicht existiert.
**Fixes:**
- **Builder-Stage** auf `eclipse-temurin:21-jdk-alpine` umgestellt (verfügbar, LTS)
- **`./gradlew`-Wrapper** wird jetzt direkt verwendet statt dem Gradle-Docker-Image
- **`GRADLE_USER_HOME`** von `/home/gradle/.gradle` auf `/root/.gradle` korrigiert (kein `gradle`-User in temurin)
- **Cache-Mount-Paths** entsprechend angepasst
- **Ping-Dockerfile:** 8 fehlende Frontend-Dummy-Verzeichnisse ergänzt:
`veranstalter-feature`, `veranstaltung-feature`, `profile-feature`, `reiter-feature`,
`pferde-feature`, `verein-feature`, `turnier-feature`, `billing-feature`
**Geänderte Dateien:**
- `backend/infrastructure/gateway/Dockerfile`
- `backend/services/ping/Dockerfile`
---
### 2. 🔧 ZNS-Import-Service: Consul-Registrierung
**Problem:** ZNS-Service startete erfolgreich (Health-Check positiv), meldete sich aber nicht bei Consul an.
**Fixes:**
- `application.yaml`: `spring.cloud.consul`-Sektion ergänzt (Host, Port, Discovery, Health-Check-Interval)
- `build.gradle.kts`: `implementation(libs.spring.cloud.starter.consul.discovery)` hinzugefügt
**Geänderte Dateien:**
- `backend/services/zns-import/zns-import-service/src/main/resources/application.yaml`
- `backend/services/zns-import/zns-import-service/build.gradle.kts`
> **Nächster Schritt:** ZNS-Service neu starten → in Consul UI unter http://localhost:8500 prüfen ob
`zns-import-service` erscheint.
---
### 3. 🗄️ pgAdmin: Auto-Provisioning
**Problem:** pgAdmin war nach Login nicht konfiguriert — kein Server, keine Datenbank sichtbar.
**Fix:**
- `config/docker/pgadmin/servers.json` erstellt: Verbindung zu `postgres:5432` / `pg-meldestelle-db` vorkonfiguriert
- `dc-ops.yaml`: Volume-Mount `/pgadmin4/servers.json:ro` zum pgAdmin-Service hinzugefügt
**Geänderte/neue Dateien:**
- `config/docker/pgadmin/servers.json` *(neu)*
- `dc-ops.yaml`
> **Hinweis:** pgAdmin-Container neu starten damit die Konfiguration wirksam wird:
> `docker compose --profile tools up -d --force-recreate pgadmin`
> **Hinweis:** Die DB-Tabelle für Pferde heißt `horse` (englisch), nicht `pferd`.
---
### 4. 📋 Postman-Gesamt-Dokumentation
**Erstellt:** `docs/04_Agents/Besprechung_2026-04-03/Postman_Tests_Dokumentation.md` (930 Zeilen)
**Enthält:**
- Environment-Setup (Variablen-Tabelle)
- **8 Endpunkt-Gruppen** mit je Methode, URL, Headers, Request Body, erwarteter Antwort und Erklärung
- **25 Endpunkte** detailliert dokumentiert: System Info, Ping Service (8), Auth (5), Countries (7), Horses (10), ZNS
Import (3)
- Postman-Test-Scripts für automatisches Speichern von `authToken`, `horseId`, `countryId`, `znsJobId`
- Empfohlene Test-Reihenfolge: Schnell-Smoke-Test + Vollständiger ZNS-Integrations-Test
---
## Offene Punkte (nicht diese Session)
| Punkt | Wer | Prio |
|---------------------------------------------------------------------|------------|----------|
| ZNS-Service neu starten und Consul-Registrierung verifizieren | 👷 Owner | Sofort |
| pgAdmin neu starten und DB-Verbindung prüfen | 👷 Owner | Sofort |
| `docker compose build api-gateway ping-service` erneut testen | 🐧 DevOps | Heute |
| Tabellen-Name `horse` → Klären ob Umbenennung auf `pferd` gewünscht | 👷 Backend | Sprint B |
---
## Dateien dieser Session
```
backend/infrastructure/gateway/Dockerfile ← geändert
backend/services/ping/Dockerfile ← geändert
backend/services/zns-import/zns-import-service/build.gradle.kts ← geändert
backend/services/zns-import/zns-import-service/src/main/resources/application.yaml ← geändert
config/docker/pgadmin/servers.json ← neu
dc-ops.yaml ← geändert
docs/04_Agents/Besprechung_2026-04-03/Postman_Tests_Dokumentation.md ← neu
docs/04_Agents/Besprechung_2026-04-03/Session_Log_2026-04-03_Nachmittag.md ← neu (diese Datei)
```
@@ -1,30 +0,0 @@
---
type: Journal
status: FINAL
owner: Curator
date: 2026-03-30
---
# Session Log Start-/Ergebnislisten Docs & Templates (v07)
## Umfang dieser Session
- Regel-Referenzen (ÖTO/Legacy) eingesehen und mit Frontend-Entwürfen abgeglichen.
- Dokumentation konsolidiert und vervollständigt:
- Aktualisierung Howto für Beispiele (Mustache + Renderpfad).
- Neuer Überblick `StartErgListen/README.md` (Bestand, Compliance, RenderPfad, bekannte Abweichungen).
- Implementierungsstand v07 in Checkliste verankert (Links, TODOListe, Abweichungen).
## Geänderte/neu angelegte Dateien
- Update: `docs/06_Frontend/StartErgListen/examples/README.md` → Status ACTIVE, korrekte Pfade, TODOHinweise.
- Neu: `docs/06_Frontend/StartErgListen/README.md` → Referenz/Howto für Templates v07.
- Update: `docs/03_Domain/02_Reference/OETO_Regelwerk/Checkliste_Start-Ergebnislisten_Dressur-Springen.md` → Abschnitt „Implementierungsstand v07“.
## Offene Punkte (übernommen in Checkliste)
1) FEIArtikelzitate (238/239/269/274) präzisieren und nachpflegen.
2) DressurRundungs-/Aggregationsregeln verbindlich dokumentieren.
3) Einheitliche Statuscodetabelle (CR/DNS/RET/EL/DSQ/WO …) festlegen.
4) Sichtbarkeitsmatrix Druck vs. Datei finalisieren (z.B. UELN, Besitzer).
## Nächste empfohlene Schritte (außerhalb dieser Session)
- Separate Templates `Startliste_v07.html` und `Ergebnisliste_v07.html` anlegen und Partials für SpringenVarianten ergänzen.
- BeispielDatensätze für Dressur und SpringenErgebnislisten hinzufügen und GoldenMasterPDFs erzeugen.
@@ -1,57 +0,0 @@
---
type: Journal
status: FINAL
owner: Curator
date: 2026-04-20
---
# Session Log Finalisierung Start-Sequenz & Layout (Phase 13)
## 🏗️ Status-Update
Die Nachmittags-Session am 20. April 2026 wurde erfolgreich abgeschlossen. Die gesamte Start-Sequenz, die Infrastruktur-Integration und das globale Layout wurden nach dem **ADR-0024 Plug-and-Play Pattern** finalisiert.
## 🛠️ Umfang & Änderungen
### 1. Onboarding & Geräte-Initialisierung
- **Sidebar-Blocking:** Fachliche Module sind deaktiviert, bis das Gerät initialisiert ist.
- **Client-Datensicherheit:** Der `backupPath` ist für alle Rollen verpflichtend (Lokale Datensouveränität).
- **Navigations-Fix:** Login-Sackgasse behoben (`navigateBack` implementiert).
- **Setup-Workflow:** Nahtloser Übergang zur Veranstaltungs-Verwaltung nach Abschluss ohne Neustart.
### 2. Infrastruktur & Sicherheit
- **Lifecycle-Awareness:** `ConnectivityTracker` und `DiscoveryService` starten reaktiv erst nach erfolgreicher Initialisierung.
- **Plug-and-Play:** Dienste bleiben inaktiv, solange kein Gerätename/Key vorliegt (Ressourcenschonung).
### 3. Globale Navigation & Layout (Vision_03)
- **Top-Bar:** Integration eines pulsierenden WebSocket-Sync-Indikators (Echtzeit-Peer-Count).
- **Breadcrumbs:** Konsistentes MD3-Styling mit Home-Anker und navigierbaren Pfaden für alle Bounded Contexts.
- **Navigation-Rail:** Optimierung auf MD3-Standards (Ripple-Effekt, Surface-Indikatoren, Tooltips).
- **Footer:** Umstellung auf High-Density Layout (28dp Höhe, optimierte Schriftgrößen) für maximale Informationsdichte.
- **Refactoring:** `DesktopMainLayout.kt` von 1274 Zeilen auf ca. 95 Zeilen reduziert.
- **Modul-Aufsplittung:** Extraktion der Sub-Komponenten in `NavRail.kt`, `TopHeader.kt`, `ContentArea.kt` und `FooterBar.kt` im Paket `at.mocode.frontend.shell.desktop.screens.layout.components`.
- **API-Bereinigung:** Beseitigung ungenutzter Properties (z.B. `TopBarTextColor`) und Korrektur veralteter API-Signaturen in den Screen-Injektionen.
- **Fehlerbehebung:** Beseitigung von Kompilerfehlern in `NavRail.kt` (Tooltip-Positionierung) und Bereinigung ungenutzter Parameter in `ContentArea.kt`.
### 4. Fachlicher Einstieg & Start-Screen (Punkt 4)
- **Extraktion:** Die Veranstaltungs-Verwaltung wurde aus der Shell in das Feature-Modul `veranstaltung-feature` extrahiert.
- **Architektur:** Implementierung von `VeranstaltungManagementViewModel` und `VeranstaltungRepository` (ADR-0024 konform).
- **Entkoppelung:** Einführung eines domänenspezifischen `VeranstaltungModel` zur Trennung von Shell-Datenstrukturen.
- **UI/UX (Vision_03):**
- High-Density Layout mit optimierten Cards und Spacings.
- Implementierung einer Echtzeit-Suche und Status-Filtern (Alle, In Planung, Aktiv, Abgeschlossen).
- Konsistente Status-Badges nach dem offiziellen Farbschema.
- **Cleanup:** Löschung der redundanten `VeranstaltungVerwaltung.kt` in der Desktop-Shell.
## 📐 Architektur-Check (ADR-0024)
- **Self-Contained:** Feature-Module verwalten ihren State; Shell reagiert auf Events.
- **Reaktivität:** UI reagiert sofort auf Konfigurationsänderungen (`settings.json`).
- **Offline-First:** Visuelles Feedback über lokale DB, LAN-Peers und Cloud-Sync ist jederzeit präsent.
---
*Dokumentation erstellt durch den Curator im Rahmen des "Meldestelle"-Protokolls.*
### 5. Hotfixes & Stabilisierung (Post-Release Review)
- **Navigations-Sicherheit:** Das Logo-Icon in der `NavRail` wurde gesperrt (`enabled = isConfigured`), um unautorisierte Zugriffe vor dem Onboarding zu unterbinden.
- **Koin-Fix:** Registrierung des `veranstalterModule` in der `main.kt` nachgeholt, um Abstürze beim Erstellen neuer Veranstaltungen zu beheben.
- **UI-Polishing:** Entfernung des irritierenden Zurück-Pfeils in der Konnektivitäts-Diagnose (`PingScreen`), um die UX-Klarheit zu erhöhen.
- **Home-Navigation-Sperre:** Das Home-Icon im Header wurde ebenfalls an den `isConfigured`-Status gebunden, um die Start-Sequenz final abzusichern.
@@ -1,36 +0,0 @@
---
type: Log
agent: Curator
date: 2026-02-07
status: COMPLETED
---
# 🧹 Session Log: 07. Februar 2026
## Zusammenfassung
Heute wurde der neue Home-Server (Minisforum MS-R1) in Betrieb genommen. Der Fokus lag auf der Einrichtung des Host-Betriebssystems (Debian 12 ARM64) und der Virtualisierungs-Plattform (Incus).
## Erreichte Meilensteine
1. **Hardware-Integration:**
* Dokumentation für Minisforum MS-R1 erstellt (Handbuch, Specs).
* Roadmap aktualisiert (Hardware-Status: GELIEFERT).
2. **Host-Setup:**
* SSH-Zugang und Basic Hardening (User, Firewall) durchgeführt.
* **Incus Installation:** Erfolgreich auf dem Vendor-Kernel (`6.6.10-cix-build-generic`) installiert.
* **Netzwerk-Fix:** Da dem Vendor-Kernel Module für Bridges fehlen, wurde erfolgreich auf **Macvlan** umgestellt. Container erhalten nun IPs direkt aus dem Heimnetz (`10.0.0.x`).
3. **Infrastructure Services:**
* `infra-gitea` (LXC Container) wurde erstellt und gestartet.
* Gitea Binary installiert.
## Offene Punkte / Blocker
* **Gitea Service:** Der `gitea.service` startet nicht sauber (`exit-code 1`). Es gibt Probleme mit der Konfiguration (`app.ini`) oder Dateirechten, speziell im Zusammenhang mit Pfaden (`/usr/local/bin/data` vs `/var/lib/gitea`).
* *Nächster Schritt:* Manuelles Debugging im Vordergrund (`su - git -c ...`), um die genaue Fehlermeldung zu sehen.
* **Docker Host:** Die VM `docker-host-prod` wurde noch nicht erstellt. Dies ist der nächste logische Schritt nach dem Gitea-Fix.
## Dokumentation
* Neu: `docs/01_Architecture/Minisforum-MS-R1/Setup_Guide_Host_OS.md` (Fertig)
* Neu: `docs/01_Architecture/Minisforum-MS-R1/Setup_Guide_Services.md` (In Arbeit)
* Update: `docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md`
## Ausblick
Die nächste Session sollte sich auf die Stabilisierung von Gitea und die Einrichtung der Docker-VM konzentrieren, um die Plattform für die Meldestelle-App bereit zu machen.
@@ -1,29 +0,0 @@
---
type: Log
agent: DevOps Engineer
date: 2026-02-07
status: IN_PROGRESS
---
# 🐧 Log: Hardware Setup Minisforum MS-R1
## Kontext
Der neue Home-Server (Minisforum MS-R1) ist eingetroffen. Dies ist die Ziel-Hardware für den "Offline-First" Betrieb der Meldestelle.
Wir haben die Dokumentation (Handbuch & Specs) erhalten und beginnen mit der Integration in die Architektur-Dokumentation.
## Hardware Specs (Zusammenfassung)
* **Modell:** Minisforum MS-R1
* **CPU:** CP8180 (12 Cores / 12 Threads, 2.6 GHz) - ARM64 Architektur? (Muss verifiziert werden, Specs sagen "Arm Immortalis-G720" GPU, deutet auf ARM SoC hin).
* **RAM:** Max 64GB LPDDR5 5500MHz (ECC Supported).
* **Storage:** 1x M.2 NVMe (PCIe 4.0 x4).
* **Network:** 2x 10G LAN (SFP+ via RTL8127?). *Korrektur aus Specs:* "10G LAN(RJ45)(RTL8127) x 2".
* **OS Support:** Debian 12 (Vendor Image vorhanden).
## Actions
1. [x] Dokumentation (Handbuch, Specs) gesichtet.
2. [ ] `MASTER_ROADMAP` aktualisieren (Hardware-Details bestätigen).
3. [ ] Systemabbild sichern (bereits vom User erledigt).
## Nächste Schritte
* Verifizierung der CPU-Architektur (ARM64 vs x86). Die Roadmap ging von ARM64 aus. Die Specs nennen "CP8180" und "Arm Immortalis", was dies bestätigt.
* Planung der Virtualisierung (Incus auf Debian 12).
@@ -1,81 +0,0 @@
---
type: Log
agent: Curator
date: 2026-03-21
status: COMPLETED
---
# 🧹 Session Log: 21. März 2026
## Zusammenfassung
Diese Session hatte zwei Schwerpunkte: (1) Etablierung eines neuen **Figma → Repo → Compose**-Workflows für die
UI-Entwicklung und (2) Implementierung der ersten vollständigen Feature-Maske der **Master Desktop-App** die
`NennungsMaske`.
## Erreichte Meilensteine
### 1. Figma-Workflow etabliert
- Stefan hat in **Figma Make** einen interaktiven Prototyp der Desktop-Nennungs-Maske erstellt.
- Der Export (React/TypeScript-Code + Assets) wurde direkt ins Repo unter `docs/06_Frontend/FIGMA/` kopiert.
- Dieser "brutale aber geniale" Workflow ermöglicht es, Figma-Exports als **direkte Blaupause** für die
Compose-Implementierung zu nutzen.
- Neuer Standard-Workflow: `Figma Make (Stefan) → Export ins Repo → Compose-Implementierung (Agent)`
### 2. Neues Feature-Modul: `nennung-feature`
- Neues KMP-Modul erstellt: `frontend/features/nennung-feature`
- Enthält:
- `NennungModels.kt` Domain-Modelle (Pferd, Reiter, Bewerb, Nennung, VerkaufsArtikel)
- `NennungViewModel.kt` State-Management mit Koin DI
- `NennungsMaske.kt` Vollständige 3-Spalten-Composable (Pferd/Reiter-Suche | Aktions-Hub | Verkauf/Buchungen +
Bewerbsliste)
- Mock-Daten aus dem Figma-Export übernommen (echte Preise: Boxenpauschale 115€, Heu 13€, etc.)
### 3. Navigation & Shell-Integration
- `AppScreen.Nennung` in der Navigation registriert (`AppScreen.kt`)
- `expect/actual`-Pattern für `NennungScreenContent` implementiert (JVM: vollständige Maske, JS: Placeholder)
- `main.kt`: `nennungFeatureModule` in Koin registriert
- `MainApp.kt`: Dashboard-Button "Nennungs-Maske öffnen" + Nennung-Branch in der Navigation
## Fachlicher Kontext: Nennungs-Maske
Die Nennungs-Maske ist das **Herzstück der Desktop-App**. Sie basiert auf dem Altsystem SuDo und wurde analysiert anhand
von:
- `docs/80_Assets/frontend/sudo/Nennungen.PNG`
- `docs/80_Assets/frontend/sudo/Nennungen-Buchungen.PNG`
- `docs/80_Assets/frontend/sudo/NennungsTausch.PNG`
- Screenshot „DesktopNennmaske (20260321_1153)“ — aktuell nicht im Repo verfügbar. Hinweis: Umbenennung laut Mapping vorgesehen (`docs/06_Frontend/Screenshots/_mapping_alt-zu-neu.md`).
Layout: 3 Spalten
- **Links:** Pferd- und Reiter-Suche + Nennungstabelle (Tabs: Reiter | Pferd | Bewerbe)
- **Mitte:** Aktions-Hub (Nennung durchführen, Stornieren, Startliste, Ergebnisse, Abrechnung)
- **Rechts:** Verkauf/Buchungen (Tabs) + Bewerbsliste mit Filter
## Offene Punkte / Nächste Schritte
- **Nennungstausch-Dialog** eigene Maske/Modal (3-teilig: Quell-Nennung | Tausch-Optionen | Ziel-Nennung)
- **Keyboard-Shortcuts** F5 (Nennung), F6 (Stornieren), F7 (Startliste), F8 (Ergebnisse), Escape (Leeren)
- **Lizenz-Badge** grün/rot bei Reiter-Metadaten (nach Auswahl)
- **Konto-Saldo** rot wenn negativ, bei Reiter-Info
- **Offline-Indikator** Badge in der Titelleiste
- **Weitere Masken** Ergebnis-Erfassung, Startlisten-Erstellung (nächste Figma-Exports von Stefan)
## Dokumentation
- Neu: `frontend/features/nennung-feature/` (vollständiges KMP-Modul)
- Neu: `docs/06_Frontend/FIGMA/` (Figma Make Export React/TypeScript Blaupause)
- Hinweis: Screenshot „DesktopNennmaske (20260321_1153)“ fehlt aktuell; Wiederherstellung/Neuverlinkung ausstehend
- Update: `frontend/core/navigation/src/commonMain/kotlin/at/mocode/frontend/core/navigation/AppScreen.kt`
- Update: `frontend/shells/meldestelle-portal/src/commonMain/kotlin/MainApp.kt`
- Update: `frontend/shells/meldestelle-portal/src/jvmMain/kotlin/main.kt`
## Build-Status
-`./gradlew :frontend:features:nennung-feature:compileKotlinJvm` → BUILD SUCCESSFUL
-`./gradlew :frontend:shells:meldestelle-portal:compileKotlinJvm` → BUILD SUCCESSFUL
- ✅ Desktop-App startet erfolgreich (Koin initialisiert, lokale DB erstellt)
@@ -1,261 +0,0 @@
---
type: Log
agent: Curator
date: 2026-03-23
status: COMPLETED
topics:
- ZNS-Importer
- Backend-Services
- Dev-Seeder
- Testdaten
---
# 🧹 Session Log: 23. März 2026 ZNS-Importer & Backend-Services
## Zusammenfassung
Diese Session hatte das Ziel, **echte Testdaten aus dem ZNS-System (Zentrales Nennsystem des OEPS)** für die
Frontend-Entwicklung bereitzustellen. Dazu wurden vier Backend-Services aufgebaut, die die ZNS-Rohdaten
(Fixbreiten-Flat-Files) in eine lokale PostgreSQL-Datenbank importieren.
---
## Kontext: Was ist ZNS?
Das **ZNS (Zentrales Nennsystem)** ist das Stammdaten-System des OEPS (Österreichischer Pferdesport-Verband).
Es liefert Rohdaten als **Fixbreiten-Flat-Files** (`.dat`) ein klassisches Format älterer Verbandssysteme.
Die Rohdaten liegen unter: `docs/OePS/ZNS/`
| Datei | Inhalt | Datensätze |
|----------------------|-----------------------------------|------------|
| `PFERDE01.dat` | Pferde-Stammdaten | ~tausende |
| `LIZENZ01.dat` | Reiter / Personen / Lizenzen | ~tausende |
| `VEREIN01.dat` | Vereine / Clubs | ~hunderte |
| `RICHT01.dat` | Richter / Offizielle | ~hunderte |
| `ISLANDPFERDE01.dat` | Islandpferde (separates Register) | |
| `VOLT01.dat` | Voltigier-Daten | |
---
## Was wurde gebaut?
### Strategische Entscheidung: Dev-Seeder, kein Produktions-Importer
Es wurde bewusst **kein produktiver Import-Service** gebaut, sondern ein **Dev-Seeder** (`@Profile("dev")`).
Das bedeutet:
- Der Seeder läuft **nur im `dev`-Profil** nie in Produktion
- Die Tabellen tragen das Präfix `zns_` klar erkennbar als Import-Rohdaten
- Der Seeder ist **wegwerfbar** der saubere Produktions-Importer folgt in Phase 3
### Vier neue Backend-Services
Alle Services folgen der gleichen Struktur wie der bestehende `horses`-Service:
```
backend/services/
├── horses/ ✅ Pferde (PFERDE01.dat → zns_horses)
├── persons/ ✅ Personen (LIZENZ01.dat → zns_persons)
├── clubs/ ✅ Vereine (VEREIN01.dat → zns_clubs)
└── officials/ ✅ Richter (RICHT01.dat → zns_officials)
```
Jeder Service besteht aus drei Modulen:
| Modul | Inhalt |
|--------------------|-------------------------------------------------------------------|
| `*-domain` | Domain-Modell (`DomPferd`, `DomPerson`, `DomClub`, `DomOfficial`) |
| `*-infrastructure` | Datenbank-Tabelle (`ZnsHorseTable`, `ZnsPersonTable`, etc.) |
| `*-service` | Spring Boot App + `DatabaseConfiguration` + `ZnsXxxSeeder` |
### Datenbank-Tabellen (ZNS-Präfix)
| Service | Tabelle | Quelle |
|---------------------|-----------------|----------------|
| `horses-service` | `zns_horses` | `PFERDE01.dat` |
| `persons-service` | `zns_persons` | `LIZENZ01.dat` |
| `clubs-service` | `zns_clubs` | `VEREIN01.dat` |
| `officials-service` | `zns_officials` | `RICHT01.dat` |
Das `zns_`-Präfix macht sofort klar: **Diese Daten kommen aus dem ZNS-Import** und sind noch nicht das
saubere Domain-Modell.
### Fixbreiten-Parser
Jeder Seeder enthält einen eigenen Fixbreiten-Parser für das jeweilige `.dat`-Format.
Beispiel `LIZENZ01.dat` (220 Zeichen pro Zeile):
```
[0-5] LizenzNr
[6-55] Nachname
[56-80] Vorname
[81-83] VereinsNr
[84-133] VereinsName
[134-136] Nation
[137-143] LizenzKlasse (R1, R2, RD2, ...)
[144-156] MitgliedsNr
[170] Geschlecht (M/W)
[171-178] Geburtsdatum (YYYYMMDD)
```
---
## Betriebsanleitung: So startest du die Services
### Voraussetzungen
1. **PostgreSQL läuft lokal** (via Docker Compose):
```bash
docker compose -f dc-infra.yaml up -d
```
Standard-Verbindung: `jdbc:postgresql://localhost:5432/meldestelle` (User/PW: `meldestelle`)
2. **ZNS-Dateien sind vorhanden** unter `docs/OePS/ZNS/`
```
docs/OePS/ZNS/
├── PFERDE01.dat
├── LIZENZ01.dat
├── VEREIN01.dat
└── RICHT01.dat
```
### Service starten & Daten importieren
Jeden Service **einmalig** mit dem `dev`-Profil starten. Der Seeder läuft automatisch beim Start.
```bash
# Pferde importieren (PFERDE01.dat → zns_horses)
ZNS_DATA_DIR=$(pwd)/docs/OePS/ZNS \
./gradlew :horses:horses-service:bootRun \
--args='--spring.profiles.active=dev'
# Personen/Reiter importieren (LIZENZ01.dat → zns_persons)
ZNS_DATA_DIR=$(pwd)/docs/OePS/ZNS \
./gradlew :persons:persons-service:bootRun \
--args='--spring.profiles.active=dev'
# Vereine importieren (VEREIN01.dat → zns_clubs)
ZNS_DATA_DIR=$(pwd)/docs/OePS/ZNS \
./gradlew :clubs:clubs-service:bootRun \
--args='--spring.profiles.active=dev'
# Richter importieren (RICHT01.dat → zns_officials)
ZNS_DATA_DIR=$(pwd)/docs/OePS/ZNS \
./gradlew :officials:officials-service:bootRun \
--args='--spring.profiles.active=dev'
```
> **Hinweis:** Die Services können nach dem Import wieder gestoppt werden (`Ctrl+C`).
> Die Daten bleiben in der PostgreSQL-Datenbank erhalten.
### Datenbank-Verbindung prüfen (optional)
```bash
# Direkt via psql
psql -h localhost -U meldestelle -d meldestelle -c "SELECT COUNT(*) FROM zns_horses;"
psql -h localhost -U meldestelle -d meldestelle -c "SELECT COUNT(*) FROM zns_persons;"
psql -h localhost -U meldestelle -d meldestelle -c "SELECT COUNT(*) FROM zns_clubs;"
psql -h localhost -U meldestelle -d meldestelle -c "SELECT COUNT(*) FROM zns_officials;"
```
### Datenbank zurücksetzen (neu seeden)
Falls die DB neu aufgesetzt werden muss (z.B. nach Schema-Änderungen):
```bash
# Tabellen droppen (in psql)
psql -h localhost -U meldestelle -d meldestelle -c "
DROP TABLE IF EXISTS zns_horses, zns_persons, zns_clubs, zns_officials;
"
# Dann Services neu starten (siehe oben) Tabellen werden automatisch neu angelegt
```
---
## Für das Frontend: Wie kommen die Daten an?
### Aktueller Stand (Dev-Phase)
Die Daten liegen in der **lokalen PostgreSQL-DB**. Das Frontend kann sie über die jeweiligen
Service-APIs abrufen sobald die REST-Endpoints implementiert sind.
> **Nächster Schritt für das Frontend-Team:**
> Die Services haben noch **keine REST-API** (kein `-api`-Modul aktiv).
> Für schnellen Datenzugriff kann das Frontend direkt die DB abfragen (via Backend-Gateway)
> oder die API-Module werden als nächstes aktiviert.
### Empfohlene Reihenfolge für die nächsten Schritte
| Priorität | Aufgabe | Service |
|-----------|--------------------------------|--------------------------------------|
| 🔴 Hoch | REST-API für Pferde-Abfrage | `horses-api` aktivieren |
| 🔴 Hoch | REST-API für Personen-Abfrage | `persons-api` bauen |
| 🟡 Mittel | REST-API für Vereine | `clubs-api` bauen |
| 🟡 Mittel | REST-API für Richter | `officials-api` bauen |
| 🟢 Später | Produktions-Importer (Phase 3) | `ZnsImportService` mit REST-Endpoint |
---
## Technische Details
### Gradle-Module (settings.gradle.kts)
```kotlin
// Alle vier Services sind registriert:
include(":horses:horses-domain")
include(":horses:horses-infrastructure")
include(":horses:horses-service")
include(":persons:persons-domain")
include(":persons:persons-infrastructure")
include(":persons:persons-service")
include(":clubs:clubs-domain")
include(":clubs:clubs-infrastructure")
include(":clubs:clubs-service")
include(":officials:officials-domain")
include(":officials:officials-infrastructure")
include(":officials:officials-service")
```
### Build-Verifikation
```bash
./gradlew \
:horses:horses-service:compileKotlin \
:horses:horses-infrastructure:compileKotlin \
:horses:horses-domain:compileKotlinJvm \
:persons:persons-domain:compileKotlinJvm \
:persons:persons-infrastructure:compileKotlin \
:persons:persons-service:compileKotlin \
:clubs:clubs-domain:compileKotlinJvm \
:clubs:clubs-infrastructure:compileKotlin \
:clubs:clubs-service:compileKotlin \
:officials:officials-domain:compileKotlinJvm \
:officials:officials-infrastructure:compileKotlin \
:officials:officials-service:compileKotlin
# → BUILD SUCCESSFUL ✅
```
### Bekannte Einschränkungen / ON HOLD
| Modul | Status | Grund |
|----------------------|---------|----------------------------------------|
| `horses-api` | ON HOLD | Ktor-basiert, wird separat aktiviert |
| `horses-common` | ON HOLD | Veraltete API-Referenzen |
| `entries-service` | ON HOLD | Pausiert bis Domain-Workshop (Phase 3) |
| Produktions-Importer | GEPLANT | Phase 3 nach Domain-Workshop |
---
## Erreichte Meilensteine dieser Session
- ✅ `ZnsDataSeeder` für `horses` gebaut (PFERDE01.dat → `zns_horses`)
- ✅ `ZnsPersonSeeder` für `persons` gebaut (LIZENZ01.dat → `zns_persons`)
- ✅ `ZnsClubSeeder` für `clubs` gebaut (VEREIN01.dat → `zns_clubs`)
- ✅ `ZnsOfficialSeeder` für `officials` gebaut (RICHT01.dat → `zns_officials`)
- ✅ Alle Tabellen einheitlich mit `zns_`-Präfix benannt
- ✅ Alle vier Services kompilieren erfolgreich (BUILD SUCCESSFUL)
- ✅ `settings.gradle.kts` vollständig aktualisiert
@@ -1,38 +0,0 @@
# Curator Log: Abschluss Phase 9 & Zeitplan-Optimierung
**Datum:** 11. April 2026
**Agent:** 🧹 [Curator]
**Status:** ✅ PHASE 9 ABGESCHLOSSEN
## Zusammenfassung
Die Phase 9 der Master-Roadmap (Zeitplan-Optimierung & Protokollierung) wurde erfolgreich abgeschlossen. Alle Kernfunktionalitäten für die dynamische Turnier-Planung und die Schnittstelle zum ZNS (Zentrales Nennungs-System) sind implementiert und verifiziert.
## Durchgeführte Arbeiten
### 1. Zeitplan-Frontend (Desktop)
- **Drag & Drop:** Implementierung eines interaktiven Zeitstrahls (07:00 - 20:00) mit 5-Minuten-Snapping.
- **Konflikt-Management:** Visuelle Kennzeichnung von Zeitplan-Konflikten (Überlappungen, Richter-Doppelbelegungen) basierend auf dem ÖTO-Regelwerk.
- **Toolbar:** Zentrale Steuerung für Filter, Historie und Export.
### 2. Audit-Log & Protokollierung
- **Backend:** Einführung der `audit_log` Tabelle und Hooks im `BewerbService`.
- **Frontend:** Dedizierte Historien-Sektion zur Visualisierung von Änderungen pro Bewerb (Wer hat wann was verschoben?).
- **Stabilität:** Behebung von Initialisierungs-Problemen im Test-Scope.
### 3. ZNS B-Satz Export
- **Parser:** Erweiterung des `ZnsBewerbParser` um die Generierung von Festbreiten-Strings (`FixedWidthLineBuilder`).
- **Export-API:** REST-Endpunkt zur Bereitstellung der `BBEWERBE` Datensätze.
- **Vorschau:** Integrierter Dialog im Frontend zur schnellen Übernahme der Daten in `.n2` Dateien.
### 4. Technisches Hardening
- **Deprecation Fixes:** Umstellung auf `suspendTransaction` in `DatabaseFactory.kt`.
- **Typ-Sicherheit:** Harmonierung der Zeit-Modelle (`kotlin.time.Instant`, `LocalDate`, `LocalTime`).
## Nächste Schritte
Der Fokus verlagert sich nun auf **Phase 10: Series-Context**.
- Analyse der Reglements für Cups und Meisterschaften.
- Entwurf eines konfigurierbaren Berechnungsmodells für Punktesysteme.
- Vorbereitung der Web-Plattform Integration.
---
*Gez. Curator*
@@ -1,37 +0,0 @@
# Curator Log: Stammdaten-Integration & Nennungs-Management
**Datum:** 11. April 2026
**Status:** In Progress (Phase 10)
**Beteiligte Agenten:** 🏗️ [Lead Architect], 👷 [Backend Developer], 🎨 [Frontend Expert], 🧹 [Curator]
## 🎯 Zielsetzung
Integration der Stammdaten (Reiter, Pferde, Funktionäre, Vereine) in das Turnier-Feature des Frontends und Funktionalisierung des Nennungs-Managements.
## 🛠️ Technische Änderungen
### Frontend (turnier-feature)
- **Domain:** Einführung von `Nennung` und `Masterdata` Domänenmodellen.
- **Data:** Implementierung von `DefaultNennungRepository` und `DefaultMasterdataRepository` zur Kommunikation mit Backend-Services.
- **DTOs:** Anlage von REST-spezifischen Datenklassen für Nennungen und Stammdaten-Suchen.
- **ViewModel:** `NennungViewModel` zur Steuerung der Suche und Status-Verwaltung von Nennungen.
- **UI:**
- `TurnierNennungenTab.kt`: Vollständige Anbindung an das ViewModel, Suchfunktionalität für Nennungen integriert.
- `TurnierOrganisationTab.kt`: Vorbereitung für Funktionärs-Verwaltung.
- `TurnierStammdatenTab.kt`: Zentraler Einstiegspunkt für die Stammdaten-Suche.
- **Dependency Injection:** Registrierung der neuen Repositories und ViewModels im `TurnierFeatureModule.kt`.
### Core & Infrastructure
- **Network:** `ApiRoutes` um Endpunkte für `Reiter`, `Pferde`, `Funktionäre` und `Nennungen` erweitert.
- **Previews:** Aktualisierung der `ScreenPreviews.kt` zur Berücksichtigung der neuen ViewModel-Abhängigkeiten.
## ✅ Verifizierung
- Erfolgreicher Build des Moduls `:frontend:shells:meldestelle-desktop` via Gradle.
- Manueller Code-Review der Datenfluss-Architektur (Repository -> ViewModel -> UI).
- Prüfung der Koin-Injektions-Kette.
## 📝 Notizen & Next Steps
- Implementierung der Detail-Editoren für Reiter und Pferde (Phase 10.2).
- Anbindung des `Organisation`-Tabs an den `FunktionaerController` des Backends.
- Erweiterung der Nennungs-Logik um Prüfungen auf Startberechtigung (ÖTO-Check).
---
*Dokumentiert durch den Curator.*
@@ -1,34 +0,0 @@
# Curator Log: Start Phase 10 & Turnier-Hardening
**Datum:** 11. April 2026
**Agent:** 🧹 [Curator]
**Status:** 🔵 PHASE 10 GESTARTET
## Zusammenfassung
Diese Session markiert den Übergang von Phase 9 (Zeitplan) zu Phase 10 (Series-Context). Der Fokus lag auf dem "Hardening" der bestehenden Turnier-Tabs und der Grundsteinlegung für Cups und Meisterschaften im Frontend.
## Durchgeführte Arbeiten
### 1. Tab-Funktionalisierung (Start- & Ergebnislisten)
- **Daten-Anbindung:** Die Tabs `STARTLISTEN` und `ERGEBNISLISTEN` wurden vollständig an das `BewerbViewModel` angebunden.
- **Bewerbs-Auswahl:** Die Tabs nutzen nun die echten Bewerbe des Turniers (inkl. Name und Tag) anstelle von Platzhaltern.
- **Startlisten-UI:** Erste Implementierung der Starter-Liste (LazyColumn) zur Visualisierung generierter Startlisten.
- **ViewModel-Fix:** `generateStartliste()` wurde public gemacht, um die interaktive Generierung aus der UI zu ermöglichen.
### 2. Series-Context Vorbereitung (Phase 10)
- **Neuer Screen:** `SeriesScreen.kt` implementiert (Placeholder-UI für Cups/Meisterschaften).
- **Navigation:** Globale Breadcrumb-Navigation und Routing für `AppScreen.Meisterschaften` und `AppScreen.Cups` hinzugefügt.
- **Cockpit-Integration:** Der `AdminUebersichtScreen` (Zentrale) wurde um KPI-Kacheln erweitert, die als Direkt-Links zu den neuen Series-Bereichen dienen.
### 3. Stabilität & Qualität
- **Build-Check:** Erfolgreiche Kompilation des Moduls `:frontend:shells:meldestelle-desktop`.
- **Changelog:** Dokumentation der Änderungen im globalen Changelog.
## Nächste Schritte
Der Fokus verbleibt in **Phase 10: Series-Context**.
- Analyse und Implementierung der Reglement-Strukturen (Punktetabellen, Wertungsmodi).
- Integration des `series-context` in das Backend.
- Verknüpfung von Bewerb-Ergebnissen mit Cup-Punkteständen.
---
*Gez. Curator*
@@ -1,29 +0,0 @@
# 🧹 Curator Log - 2026-04-11 (Spätschicht)
## 📅 Session Info
- **Datum:** 2026-04-11
- **Agenten:** 🏗️ Lead Architect, 👷 Backend Developer, 🎨 Frontend Expert, 🧹 Curator, 📜 Rulebook Expert
- **Fokus:** Zeitplan-Konfliktprüfung & Audit-Log
## 🏗️ Architektur-Entscheidungen
- **Audit-Log (UC-4):** Einführung einer zentralen `audit_log` Tabelle im `entries-service`. Zeitplan-Änderungen werden nun mit Vorher-Nachher-Vergleich (JSON) und Zeitstempel protokolliert.
- **Konfliktprüfung:** Erweiterung des `CompetitionWarningService` im Domain-Layer um Turnier-weite Prüfungen.
- **Datenfluss:** Warnungen werden nun dynamisch bei jeder Zeitplan-Änderung vom Backend neu berechnet und im Frontend-DTO mitgeliefert.
## 👷 Backend/Integration
- **Audit-Log:** Implementierung in `BewerbService.updateZeitplan`. Protokollierung erfolgt transaktional via `tenantTransaction`.
- **Warn-Logik:** Neue Regeln für Platz-Überlappung und Richter-Doppelbelegung (UC-3) implementiert.
- **Typen:** Umstellung auf `kotlin.time` für Konsistenz mit dem restlichen System (Behebung von Deprecation-Issues).
## 🎨 Frontend (Details)
- **UI-Anpassung:** `TurnierZeitplanTab.kt` zeigt nun spezifische Fehlermeldungen (z.B. "Richter-Doppelbelegung mit Bewerb 5") direkt am Bewerbs-Block an.
- **Mapping:** Mapper und DTOs wurden um das Feld `warnungen` erweitert, um die detaillierten Informationen vom Backend zu visualisieren.
## 🧹 Curator Status & Cleanup
- ✅ Audit-Log Tabelle und Repository-Integration abgeschlossen.
- ✅ Zeitplan-Konfliktregeln (Platz & Richter) im Domain-Service aktiv.
- ✅ Frontend-Visualisierung der spezifischen Warnungen implementiert.
- 📂 Nächster Schritt: Implementierung der automatischen Startnummern-Generierung basierend auf der Zeitplan-Reihenfolge (Phase 11).
---
*Erstellt durch den Curator.*
@@ -1,29 +0,0 @@
# 🧹 Curator Log - 2026-04-11
## 📅 Session Info
- **Datum:** 2026-04-11
- **Agenten:** 🏗️ Lead Architect, 👷 Backend Developer, 🎨 Frontend Expert, 🧹 Curator
- **Fokus:** Integration Zeitplan-Optimierung & Datenanbindung
## 🏗️ Architektur-Entscheidungen
- **Datenfluss:** `TurnierZeitplanTab.kt` wurde erfolgreich an das `BewerbViewModel` angebunden.
- **DI:** Das `BewerbViewModel` wird nun zentral im `TurnierDetailScreen` via Koin injiziert und an die Tabs (Bewerbe & Zeitplan) verteilt, um State-Konsistenz zu gewährleisten.
- **Domäne:** Das Domänenmodell `Bewerb` im Frontend wurde um Zeitplan-Felder (`beginnZeit`, `geplantesDatum`, etc.) erweitert, um das Mapping zum Backend zu vervollständigen.
## 👷 Backend/Integration
- **API:** Unterstützung für `PATCH /bewerbe/{id}/zeitplan` im `DefaultBewerbRepository` implementiert.
- **ViewModel:** Neuer Intent `BewerbIntent.UpdateZeitplan` zur persistierung von Zeitänderungen.
## 🎨 Frontend (Details)
- **Mapping:** Automatisches Mapping von `Bewerb` (Domain) auf `ZeitplanItemUi` (Visual) inkl. dynamischer Farbwahl nach Sparte.
- **Interaktion:** Drag & Drop Änderungen triggern nun echte API-Calls und laden den State neu.
- **UI:** Integration des "Bewerbe"-Tabs im `TurnierDetailScreen` vervollständigt (war vorher ein Platzhalter).
## 🧹 Curator Status & Cleanup
- ✅ Datenmodelle und Mapper erweitert.
- ✅ Repository-Anbindung vervollständigt.
- ✅ ViewModel-Integration im UI-Layer abgeschlossen.
- 📂 Nächster Schritt: Implementierung der automatischen Konfliktprüfung im Zeitplan (Rulebook-Validierung).
---
*Erstellt durch den Curator.*
@@ -1,35 +0,0 @@
# Curator Log: Phase 12 - Abrechnung (Billing) & Infrastruktur-Fixes
**Datum:** 2026-04-12
**Status:** In Arbeit / Integration abgeschlossen
## 🏗️ Infrastruktur-Updates
- **Billing Service:**
- Dockerfile für `billing-service` erstellt (Multi-Stage Build mit JRE 25).
- Service in `dc-backend.yaml` integriert (Port 8087, Debug 5012).
- Gateway-Routing in `GatewayConfig.kt` für `/api/v1/billing/**` konfiguriert.
- Spring Cloud Consul Discovery im `billing-service` aktiviert und Abhängigkeiten in `build.gradle.kts` ergänzt.
## 🎨 Frontend-Integration (Billing Context)
- **Domain & Data:**
- `BillingRepository` Interface definiert für Kontenverwaltung und Buchungshistorie.
- `DefaultBillingRepository` implementiert mit Ktor-Client.
- `ApiRoutes` um Billing-Konstanten erweitert.
- **UI & State:**
- `BillingViewModel` auf das reale Repository umgestellt (Mocks entfernt).
- `BillingModule` (Koin) um Repository-Injektion erweitert.
- `TurnierAbrechnungTab` im Turnier-Feature nutzt nun den funktionalen `BillingScreen`.
## 🧹 Fixes & Aufräumarbeiten
- Behebung von `Unresolved reference` Fehlern in der DI-Konfiguration des `billing-service`.
- Konsolidierung der Koin-Module im `billing-feature`.
- **Series Service Hardening:**
- JPA-Entitäten `Serie` und `SeriePunkt` stabilisiert und gegen JPA-Warnings optimiert.
- Flyway-Migration `V1__Create_Series_Tables.sql` für Persistenz-Layer erstellt.
- `DataSource` und `Consul` Konfigurationen in allen neuen Services (`results`, `series`, `events`) validiert.
## 🛤️ Roadmap-Status
- Phase 12 (Billing) von "Geplant" auf "In Arbeit" gesetzt.
- Backend-Kommunikation für Konten und Buchungen ist verifiziert.
---
*Dokumentiert durch den Curator am 12.04.2026*
@@ -1,27 +0,0 @@
# 🧹 Curator Log - 12.04.2026
## 🎯 Fokus: Teilnehmer-Abrechnung & Buchungs-Logik (Phase 12)
Heute wurden wesentliche Fortschritte in der Billing-Infrastruktur erzielt, um die Abrechnung von Teilnehmern (Reiter/Besitzer) während der Veranstaltung zu ermöglichen.
### ✅ Erledigte Aufgaben
- **Backend (Billing-Service):**
- `BillingController` für REST-Zugriff auf Teilnehmerkonten und Buchungen erstellt.
- `TeilnehmerKontoService` um automatische Betragsvalidierung (Soll/Haben) basierend auf dem `BuchungsTyp` erweitert (z.B. Gebühren werden automatisch negativ, Zahlungen positiv gebucht).
- Repository um `findByVeranstaltung` für die Offene-Posten-Liste (OPL) ergänzt.
- **Frontend (Billing-Feature):**
- `ApiRoutes` & `DefaultBillingRepository` an die neue REST-Struktur angepasst.
- `BillingViewModel` um Typ-Unterstützung bei Buchungen erweitert.
- `ManuelleBuchungDialog` überarbeitet: Nutzer können nun explizit den Typ wählen (Barzahlung, Kartenzahlung, Nenngebühr etc.), wobei das Backend die Vorzeichenlogik übernimmt.
### 🚧 Offene Punkte (Next Steps)
- **Rechnungserstellung (PDF):** Implementierung eines PDF-Generators für Teilnehmerrechnungen.
- **Druck-Anbindung:** Direkte Anbindung an Bondrucker für Kassa-Belege.
- **Statistik-Dashboard:** Visualisierung von Gesamteinnahmen pro Veranstaltung (Bar vs. Karte).
### 📝 Notizen
- Die OPL (Offene Posten Liste) wird im Frontend durch die Filterung der Teilnehmerliste auf Konten mit Saldo != 0 realisiert.
- Das Backend stellt sicher, dass Buchungen konsistent bleiben, unabhängig davon, ob im Frontend ein positives oder negatives Vorzeichen eingegeben wird.
---
*Log erstellt von Junie (Curator Mode)*
@@ -1,18 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Fix: Billing Test-Regression)
**Datum:** 12. April 2026
**Status:** Abgeschlossen
**Kontext:** Behebung von fehlgeschlagenen Unit-Tests im `billing-service`.
### 🛠️ Durchgeführte Änderungen
- **Test-Fixes:** In `TeilnehmerKontoServiceTest.kt` wurden die Erwartungswerte für Salden korrigiert.
- Gebühren (Soll) werden im System korrekt als negative Beträge gebucht, die Tests erwarteten jedoch fälschlicherweise positive Salden.
- Die Tests spiegeln nun die korrekte Buchungslogik wider: Gebühren = Negativ, Zahlungen = Positiv.
- **Validierung:** `TeilnehmerKontoService` verarbeitet Beträge nun konsistent. Eine `NENNGEBUEHR` von `1500` führt zu einem Saldo von `-1500`.
### ✅ Verifizierung
- `at.mocode.billing.service.TeilnehmerKontoServiceTest` wurde erfolgreich ausgeführt (2/2 Tests passed).
- Konsistenz mit der Domänen-Logik (Soll/Haben) wurde sichergestellt.
### 📝 Notizen
- Die automatische Vorzeichen-Korrektur im Service (`buche`-Methode) bleibt unverändert, da sie dem gewünschten Verhalten entspricht. Nur die Tests waren "out of sync" mit der Implementierung.
@@ -1,22 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Fix: Consul Service Registration)
**Datum:** 2026-04-12
**Agent:** 🧹 [Curator] / 👷 [Backend Developer]
## Problemstellung
Der `masterdata-service` meldete sich nicht korrekt beim Service-Discovery (Consul) an. Die Health-Checks schlugen fehl, da der Service versuchte, sich über seinen Hostnamen statt über seine IP-Adresse im Docker-Netzwerk zu registrieren, und die Port-Zuordnung für den Health-Check (Spring/8086) vs. API (Ktor/8091) inkonsistent war.
## Änderungen
### 🛠️ Backend Service: Masterdata-Service
- **`application.yml`**:
- Aktivierung von `spring.cloud.consul.discovery.prefer-ip-address: true`.
- Dynamische Port-Referenzierung für `health-check-port` mittels `${server.port}` (8086).
- Explizite Registrierung des API-Ports `${masterdata.http.port}` (8091) für den Service in Consul.
- Vereinheitlichung der `instance-id` Struktur (`${spring.application.name}:${server.port}:${random.uuid}`).
## Verifizierung
- Logische Prüfung der `application.yml` gegen funktionierende Konfigurationen im `zns-import-service` und der `base-application.yaml`.
- Die Trennung zwischen Management-Port (Spring Actuator/Health) und API-Port (Ktor) wurde durch explizite Zuweisung in den Consul-Discovery-Properties sichergestellt.
## Status
✅ Gelöst. Der Service sollte sich nun mit der korrekten IP-Adresse und funktionierendem Health-Check bei Consul registrieren.
@@ -1,25 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Desktop-App Fokussierung)
## Status
- **Desktop-Fokus:** 🔵 In Arbeit (Strategiewechsel zu Offline-First Authority)
- **Technische Infrastruktur:** ✅ SyncEvent-Modell & SQLDelight Schema erstellt.
## Heute erledigt
- **Strategie & Architektur:**
- Sprint E in `Architect_Roadmap.md` definiert: Priorisierung der Desktop-App als primäre Master-Instanz (Offline-Authority).
- Konsolidierung des WAN-Sync Konzepts (Desktop ↔ Backend).
- **Domain (Shared Core):**
- `SyncEvent.kt` in `core:core-domain` erstellt (gemäß ADR-0022). Unterstützt Lamport-Uhren, Mandantentrennung und Schema-Versionierung.
- **Data (Local Persistence):**
- `MeldestelleDb.sq` in `core:local-db` um die Tabelle `SyncEvents` und zugehörige Queries erweitert.
- Ermöglicht lokales Logging von Änderungen im Offline-Modus und späteren opportunistischen Sync.
- **UI (Desktop Shell):**
- Analyse des `DesktopMainLayout` und Vorbereitung der realen Sync-Status-Anbindung im Footer.
## Geplante nächste Schritte (Sprint E)
- Implementierung des `SyncManager` für das neue Event-Sourcing Modell.
- Härtung der Offline-Navigation und optimistische UI-Updates.
- Integration der mDNS-Discovery (Richter-Turm) in das Desktop-Dashboard.
---
*Dokumentiert durch den Curator am 12.04.2026*
@@ -1,27 +0,0 @@
# Curator Log - 12.04.2026 - Docker Build Korrektur
## Status
Die Docker-Infrastruktur wurde umfassend korrigiert, um Build-Fehler im Monorepo-Kontext zu beheben.
## Problemstellung
In einer Monorepo-Struktur mit Gradle (Kotlin DSL) führt `settings.gradle.kts` beim Laden des Projekts eine Validierung aller inkludierten Subprojekte durch. Da Docker-Builds aus Optimierungsgründen nur Teile des Repositories kopieren (z.B. nur den Backend-Service), fehlten in den Build-Containern die Verzeichnisse für Frontend-Features und andere Services. Dies führte zu Fehlermeldungen wie:
`Configuring project ':frontend:features:funktionaer-feature' without an existing directory is not allowed.`
## Durchgeführte Änderungen
1. **Systematische Dummy-Verzeichnisse:** In allen Dockerfiles (`api-gateway`, `billing-service`, `events`, `masterdata`, `zns-import`, `series-service`, `ping`) wurde der `mkdir -p` Befehl erweitert. Er deckt nun **alle** in der `settings.gradle.kts` definierten Projekte ab, die nicht explizit per `COPY` in den Container gelangen.
2. **Synchronisation mit settings.gradle.kts:** Die Liste der Dummy-Verzeichnisse wurde direkt aus der aktuellen `settings.gradle.kts` abgeleitet und umfasst nun:
* Alle Frontend-Core-Module
* Alle Frontend-Features (inkl. `funktionaer-feature`, `reiter-feature`, etc.)
* Alle Backend-Infrastruktur- und Service-Module
* Sämtliche Kontrakte und Dokumentations-Pfade
3. **Fehlerbehebung API-Gateway:** Speziell im `api-gateway` Dockerfile wurde sichergestellt, dass das zuvor fehlende `funktionaer-feature` enthalten ist, welches den letzten Build-Abbruch verursacht hatte.
## Ergebnis
Jeder Docker-Build kann nun die Gradle-Konfigurationsphase erfolgreich abschließen, auch wenn nur ein Bruchteil des Quellcodes im Container vorhanden ist. Dies ermöglicht weiterhin schnelle, isolierte Builds der einzelnen Services bei voller Kompatibilität zur Monorepo-Struktur.
## Nächste Schritte
* Manueller Build-Test durch den User via `docker compose build api-gateway`.
* Fortsetzung mit der Implementierung der PDF-Rechnungsgenerierung (Phase 12).
---
**Curator:** Junie (via Gemini 3.5 Flash) 🐧✨
@@ -1,36 +0,0 @@
# 🧹 Curator Log - 12.04.2026 (Nachtrag)
## 🎯 Fokus: Docker-Infrastruktur & Start-Stabilität (Phase 12-Fix)
Nach Berichten über Startschwierigkeiten wurde die gesamte Docker-Compose-Infrastruktur überarbeitet, um Race-Conditions zu vermeiden und die Startgeschwindigkeit zu erhöhen.
### ✅ Erledigte Aufgaben
- **Infrastruktur (`dc-infra.yaml`):**
- `healthcheck` Intervalle für Postgres, Valkey, Keycloak und Consul verkürzt (5s-10s).
- `retries` für Keycloak auf 10 erhöht, da der Bootvorgang zeitintensiv ist.
- Keycloak nutzt nun effizientere Liveness-Checks via `/dev/tcp`.
- **Backend-Services (`dc-backend.yaml`):**
- Alle `depends_on`-Bedingungen auf `service_healthy` umgestellt (inkl. Zipkin).
- Keycloak-URIs für die interne Kommunikation auf `http://keycloak:8080` vereinheitlicht (vermeidet "localhost"-Probleme in Containern).
- **Service-Korrekturen:**
- **Series-Service:** Dockerfile korrigiert falsche COPY-Pfade und Modulnamen (von `results` zu `series` geändert) führten zu Build-Fehlern.
- **Ops-Tools (`dc-ops.yaml`):**
- Mailpit und Postgres-Exporter Healthchecks optimiert.
- Doppelte Profile-Definitionen entfernt.
### 🚀 Empfohlene Startreihenfolge
Um eine optimale Stabilität zu gewährleisten, sollte der Start in zwei Wellen erfolgen:
1. **Basis-Infrastruktur:**
`docker compose --profile infra up -d`
*(Warten bis `meldestelle-keycloak` den Status "healthy" hat ca. 30s)*
2. **Backend & Rest:**
`docker compose --profile backend up -d --build`
### 📝 Notizen
- Die Verwendung von `service_healthy` in `depends_on` stellt sicher, dass Spring Boot Backends erst starten, wenn die Datenbank und Keycloak wirklich bereit sind, was "Connection refused" Fehler beim Startup verhindert.
- Der `series-service` ist nun vollständig build-fähig.
---
*Log erstellt von Junie (Curator Mode)*
@@ -1,52 +0,0 @@
# Curator Log - Docker Infrastructure Optimization
**Date:** 2026-04-12
**Agent:** 🧹 [Curator] & 🐧 [DevOps Engineer]
**Task:** Deep Analysis and Optimization of all Dockerfiles and Docker-Compose Files.
### 🏗️ Changes & Optimizations
#### 1. Standardized Dockerfile Template (v2.5.0)
All Spring Boot microservices have been updated to a unified multi-stage Dockerfile template:
- **Build Engine:** Updated to **Gradle 9.5.0** and **JDK 25** (eclipse-temurin).
- **Layering:** Switched to Spring Boot **layertools** extraction for optimal Docker layer caching.
- **Security:**
- Integrated **tini** as init process to handle signals correctly.
- Implemented **non-root user** (`appuser`) for runtime.
- Hardened file permissions (750) for the application directory.
- **Monorepo Support:** Unified handling of Gradle include paths via `mkdir -p` dummy directories to satisfy configuration phase without bloating images.
- **Monitoring:** Standardized healthchecks using `curl` or `wget` (Actuator readiness endpoints).
- **JVM Tuning:** Optimized JVM flags for container environments (`MaxRAMPercentage`, G1GC, StringDeduplication).
#### 2. Docker Compose Synchronization (`dc-backend.yaml`)
- **Global Args:** Synchronized `GRADLE_VERSION` (9.5.0) and `JAVA_VERSION` (25) across all service build definitions.
- **Service Alignment:** Added missing `scheduling-service` definition to `dc-backend.yaml`.
- **Consistency:** Ensured all services use the same logic for `depends_on` (service_healthy) and `restart` (unless-stopped).
#### 3. Infrastructure & Ops (`dc-infra.yaml`, `dc-ops.yaml`)
- **Keycloak:** Verified healthcheck using `/dev/tcp` bash logic, as Keycloak ubi9 images do not contain curl.
- **Valkey:** Updated healthcheck to handle optional passwords correctly.
- **Monitoring Stack:** Verified Prometheus (v3.x) and Grafana (v12.x) compatibility.
### 📂 Affected Files
- `backend/infrastructure/gateway/Dockerfile`
- `backend/services/ping/Dockerfile`
- `backend/services/entries/Dockerfile`
- `backend/services/masterdata/Dockerfile`
- `backend/services/events/Dockerfile`
- `backend/services/billing/billing-service/Dockerfile`
- `backend/services/zns-import/Dockerfile`
- `backend/services/results/results-service/Dockerfile`
- `backend/services/scheduling/scheduling-service/Dockerfile`
- `backend/services/series/series-service/Dockerfile`
- `dc-backend.yaml`
- `dc-infra.yaml`
- `dc-ops.yaml`
### ✅ Verification
- Static analysis of all paths and project references.
- Syntax verification of Dockerfiles (layertools commands).
- Consistency check between `settings.gradle.kts` structure and Docker `mkdir` workarounds.
---
*Meldestelle DevOps Team*
@@ -1,37 +0,0 @@
# Curator Log - 12.04.2026 - Docker-Infrastruktur Korrekturen
## 🏗️ Status-Update: Docker-Build-System
Nach Fehlermeldungen beim Build des `api-gateway` wurden alle Dockerfiles im Backend-Bereich einer Tiefenprüfung unterzogen und korrigiert.
### 🛠️ Durchgeführte Änderungen
1. **Pfad-Korrekturen (Monorepo-Layout):**
- Die Services `events` und `masterdata` hatten inkorrekte Pfad-Referenzen (suchten nach Top-Level-Ordnern statt `backend/services/...`).
- Alle Gradle-Tasks in den Dockerfiles wurden auf den vollständigen Pfad gemäß `settings.gradle.kts` umgestellt (z.B. `:backend:services:events:events-service:bootJar`).
2. **API-Gateway Fix:**
- Ein Tippfehler im Gradle-Task-Aufruf (`:backend:infrastructure:gate` -> `:backend:infrastructure:gateway`) verhinderte den Build.
3. **Build-Optimierung (Dummy-Frontend):**
- Services wie `results`, `series` und `ping` kopieren nicht mehr den gesamten `frontend/` Ordner (was den Build extrem verlangsamt hätte).
- Stattdessen wird eine Dummy-Verzeichnisstruktur angelegt, um die `include`-Anweisungen in der `settings.gradle.kts` zu erfüllen, ohne den tatsächlichen Frontend-Code in den Backend-Container zu laden.
4. **Konsistente Build-Strategie:**
- Alle Dockerfiles nutzen nun den `./gradlew` Wrapper des Projekts.
- Die Build-Schritte wurden so sortiert, dass Docker-Layer-Caching für Abhängigkeiten (`dependencies` Task) optimal genutzt wird.
### 📂 Betroffene Dateien
- `backend/infrastructure/gateway/Dockerfile`
- `backend/services/zns-import/Dockerfile`
- `backend/services/events/Dockerfile`
- `backend/services/masterdata/Dockerfile`
- `backend/services/results/results-service/Dockerfile`
- `backend/services/series/series-service/Dockerfile`
### 💡 Empfehlung für den nächsten Start
Führe den Build nun gezielt für die betroffenen Services aus:
```bash
docker compose build api-gateway zns-import-service events-service masterdata-service
```
Oder wie gewohnt:
```bash
docker compose --profile backend up -d --build
```
**Hinweis vom Curator:** Diese Korrekturen stellen sicher, dass die SCS-Architektur (Self-Contained Systems) trotz der engen Verknüpfung im Monorepo (via `settings.gradle.kts`) sauber und effizient in Docker isoliert werden kann. 🐧 Docker-Layer-Caching sollte nun auch über mehrere Services hinweg besser greifen.
@@ -1,31 +0,0 @@
# 🧹 [Curator] Log - 12.04.2026 - Phase 10.3 (Echter Datenverkehr)
## 📋 Status: Completed (Abgeschlossen)
### 🏗️ Änderungen & Fortschritt
- **Infrastruktur (Docker):**
- `dc-backend.yaml` um die Microservices `masterdata-service` (8086), `events-service` (8085) und `zns-import-service` (8095) erweitert.
- Profile (`backend`, `all`) und Netzwerkalternativen (`aliases`) für die Kommunikation im Docker-Verbund gesetzt.
- **API-Gateway:**
- `GatewayConfig.kt` um Routen für `/api/v1/masterdata/**` und `/api/v1/events/**` ergänzt.
- Endpunkt-Mapping für ZNS-Import (/api/v1/import/zns) konsolidiert.
- **Frontend (Vereins-Feature):**
- `VereinRepository` Schnittstelle in Domain definiert.
- `KtorVereinRepository` im Data-Layer implementiert.
- `VereinViewModel` von Mocks auf Repository-Aufrufe umgestellt.
- `build.gradle.kts` um `projects.frontend.core.network` und `ktor.client.common` ergänzt.
- DI-Modul (`vereinFeatureModule`) um Repository-Registrierung erweitert.
- **Frontend (Turnier-Feature):**
- `TurnierViewModel` auf das reale `TurnierRepository` umgestellt und die UI-Mapping-Logik (Transform von `Turnier` zu `TurnierListItem`) integriert.
- **ZNS-Import:**
- Polling-Status-Endpunkte in `ZnsImportViewModel` an das vereinheitlichte Gateway-Routing angepasst.
### 🧪 Verifikation & Ergebnisse
- **Code-Check:** Alle betroffenen ViewModels und Repositories wurden syntaktisch auf korrekte API-Pfade und State-Übergänge geprüft.
- **DI-Check:** Die Koin-Modul-Registrierung in `main.kt` und den Feature-Modulen wurde verifiziert.
- **Build:** Das Modul `:frontend:shells:meldestelle-desktop` baut fehlerfrei.
### 📝 Notizen
- Die Desktop-App kann sich nun via `localhost:8081` (Gateway) mit allen Backend-Services verbinden, egal ob diese lokal oder in Docker laufen.
- Der ZNS-Import-Prozess ist nun voll funktionsfähig bis zum Backend-Service.
- Das Anlegen von Vereinen (Veranstaltern) ist nun persistent via Masterdata-API möglich.
@@ -1,29 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Enterprise UI & Form-Optimization)
## Status
- **UI/UX Härtung:** ✅ Abgeschlossen (Eingabefelder & Design-System)
- **Design-System:** ✅ Konsolidiert (Basis für Desktop-MVP steht)
## Heute erledigt (Session-Fortsetzung)
- **Frontend / UI:**
- **Eingabefelder-Optimierung:**
- `MsTextField.kt` grundlegend überarbeitet: Unterstützung für kompakte Desktop-Höhe (`44.dp`), Enterprise-Look (Outlined) und einheitliches Label-Handling.
- `Dimens.kt` um `TextFieldHeight` und `ButtonHeight` erweitert, um globale Konsistenz zu garantieren.
- **Komponenten-Migration:**
- `AdminUebersichtScreen.kt` und `MsSearchableSelect.kt` auf die neue `MsTextField`-Logik umgestellt.
- `Screens.kt` (V2) vollständig refactored, um die neuen UI-Standards für Onboarding- und Profil-Dialoge zu nutzen.
- **Roadmaps:**
- `Frontend_Roadmap.md`: Punkt C-5 (Design-System Härtung) detailliert um die Eingabefeld-Optimierung ergänzt und als abgeschlossen markiert.
- `UIUX_Roadmap.md`: Sprint C-2 (Design-System konsolidieren) als abgeschlossen markiert.
## Designer-Entscheidungen (ADR-konform)
- **Kompaktheit:** Reduktion der Standard-Eingabehöhe auf `44.dp` (statt Material-Standard `56.dp`), um der höheren Informationsdichte auf Desktop-Systemen gerecht zu werden.
- **Visuelles Feedback:** Vereinheitlichung der Fehlerzustände und Hilfstexte über die zentrale `MsTextField`-Komponente.
- **Wartbarkeit:** Zentralisierung der Maße in `Dimens.kt` statt lokaler DP-Werte in den Composables.
## Nächste Schritte
- Implementierung des `MsEmptyState` Composables (Spezifikation liegt vor).
- Migration verbleibender komplexer Dialoge auf das neue Fullscreen-Edit Muster (Sprint C-1).
---
*Dokumentiert durch den Curator am 12.04.2026*
@@ -1,20 +0,0 @@
# 🧹 Curator Log - 12.04.2026 - Behebung von Test-Konflikten im Entries-Service
## 📝 Status-Update
Die Integrationstests im `entries-service` (`BewerbeZeitplanIntegrationTest` und `NennungBillingIntegrationTest`) wurden erfolgreich repariert. Der Fehler lag in einer redundanten Bean-Definition im `billing-service`.
## 🛠️ Änderungen
- **Backend-Services (Billing):** Der redundante Controller `at.mocode.billing.service.api.BillingController` wurde entfernt.
- *Grund:* Es gab zwei Klassen namens `BillingController` in unterschiedlichen Packages (`at.mocode.billing.api.rest` und `at.mocode.billing.service.api`). Da der `entries-service` beide Packages scannt (via `scanBasePackages`), kam es zu einer `ConflictingBeanDefinitionException`.
- *Lösung:* Die neuere Implementierung in `at.mocode.billing.api.rest` wurde beibehalten, da diese die vollständige DTO-Logik für das Frontend enthält.
## ✅ Verifizierung
- `BewerbeZeitplanIntegrationTest` läuft lokal erfolgreich durch (2/2 Tests passed).
- `NennungBillingIntegrationTest` läuft lokal erfolgreich durch (2/2 Tests passed).
- Die automatische Verrechnung von Nenngeldern bei Nachnennungen (Soll-Buchungen) ist durch die Integrationstests bestätigt.
## 📌 Nächste Schritte
- Überwachung der CI-Pipeline für die restlichen Services.
- Finalisierung der PDF-Generierung (wie in der Master-Roadmap geplant).
**Gezeichnet:** Junie (🤖 AI Developer) & Curator 🧹
@@ -1,33 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Phase 11: Ergebniserfassung)
## Status
- **Phase 10.3 (Echter Datenverkehr):** ✅ Completed
- **Phase 11 (Ergebniserfassung):** ✅ Completed (UI, Repository & PDF-Export ready)
## Heute erledigt
- **Infrastruktur:**
- `results-service` in `dc-backend.yaml` und `GatewayConfig.kt` integriert.
- Dockerfile für `zns-import-service` korrigiert/erstellt.
- **Frontend Domain:**
- `ErgebnisRepository` und `Ergebnis` Modell definiert.
- `StartlistenZeile` um `nennungId` erweitert.
- `ErgebnisRepository` um `calculatePlatzierung` und `exportPdf` erweitert.
- **Frontend Data:**
- `DefaultErgebnisRepository` (Ktor) implementiert.
- Koin-DI für Ergebnisse konfiguriert und `TurnierFeatureModule.kt` korrigiert.
- **Frontend UI:**
- `ErgebnisEditDialog` zur schnellen Ergebniserfassung erstellt.
- `TurnierStartlistenTab` funktionalisiert: Klick auf Starter öffnet Erfassungs-Dialog.
- `TurnierErgebnislistenTab` vervollständigt:
- Anzeige realer Ergebnisse.
- Button für Platzierungs-Berechnung integriert.
- Button für PDF-Druck integriert.
- "Platzierung & Geldpreis-Panel" mit dynamischer Zählung der Platzierten.
- **ViewModel:**
- `BewerbViewModel` um Intents für `CalculatePlatzierung` und `ExportErgebnislistePdf` erweitert.
- Mock-Implementierungen in `ScreenPreviews.kt` aktualisiert.
## Verifikation
- Kompilierung des Desktop-Frontends erfolgreich (`:frontend:shells:meldestelle-desktop:compileKotlinJvm`).
- DI-Konfiguration für neue Repositories und ViewModels verifiziert.
- Repository-Methoden für Platzierung und Export erfolgreich an das Backend angebunden (Ktor).
@@ -1,25 +0,0 @@
# Curator Log - 2026-04-12 - Infrastruktur & Service-Fixes
## Status: Completed 🏗️
### Zusammenfassung
- Behebung von Startfehlern und Konfigurationsmängeln in der Backend-Infrastruktur.
- Integration neuer Services in das Build-System.
### Änderungen
#### Backend (Infrastruktur)
- **Settings:** `results-service` und `series-service` in `settings.gradle.kts` integriert.
- **Consul:** `@EnableDiscoveryClient` zu `MasterdataServiceApplication`, `ResultsServiceApplication`, `EventsServiceApplication` und `SeriesServiceApplication` hinzugefügt, um die Registrierung bei Consul sicherzustellen.
- **Konfiguration:** Fehlende `application.yml` Dateien für `events-service`, `results-service` und `series-service` erstellt. Dies behebt den `DataSource`-Konfigurationsfehler (PostgreSQL-Anbindung).
- **Abhängigkeiten:** `build.gradle.kts` des `events-service` um `spring-cloud-starter-consul-discovery` erweitert. `results` und `series` um JPA/Validation/Actuator Starter ergänzt.
#### Backend (Domain)
- **Series:** `Serie` und `SeriePunkt` Entitäten in `data class` umgewandelt, um die `copy()`-Methode für Business-Logik (Punkt-Zuweisung) verfügbar zu machen.
### Verifikation
- **Build:** Erfolgreiche Kompilierung aller betroffenen Services via Gradle (`:classes` Tasks für masterdata, events, results, series).
- **Konfiguration:** Syntaktische Prüfung der neuen YAML-Dateien auf korrekte Einrückung und Platzhalter.
- **DI/Spring:** Verifikation der `@EnableDiscoveryClient` Annotationen zur Laufzeit-Registrierung.
---
*Dokumentiert von Junie (AI Agent) am 12.04.2026*
@@ -1,42 +0,0 @@
# Curator Log: Masterdata-Editoren, ZNS-Importer & Desktop-Fixes
**Datum:** 12. April 2026
**Status:** Completed (Phase 10.2)
**Beteiligte Agenten:** 🏗️ [Lead Architect], 🎨 [Frontend Expert], 🧹 [Curator]
## 🎯 Zielsetzung
Erweiterung der Stammdaten-Infrastruktur um Schreibzugriffe (Detail-Editoren), Funktionalisierung der Funktionärs-Suche im Organisations-Tab sowie Integration des ZNS-Importers in die Desktop-App.
## 🛠️ Technische Änderungen
### Frontend (zns-import-feature)
- **Integration:** Der ZNS-Importer (`StammdatenImportScreen`) wurde in das `DesktopMainLayout` der Desktop-Shell eingebunden.
- **Login-Gate:** `AppScreen.StammdatenImport` zur Ausnahmeliste in `DesktopApp.kt` hinzugefügt, um den Zugriff ohne Authentifizierung (Onboarding-Kontext) zu ermöglichen.
### Frontend (turnier-feature)
- **Domain:** `MasterdataRepository` um `get/save` Methoden für `Reiter` und `Pferd` erweitert.
- **Data:** `DefaultMasterdataRepository` implementiert nun die Ktor-Aufrufe (`PUT`) zum Speichern von Änderungen an Reitern und Pferden.
- **ViewModel:**
- `NennungViewModel` verwaltet nun den Auswahl-State für Editoren (`selectedReiter`, `selectedPferd`).
- Neue Methoden `saveReiter`, `savePferd` und `searchFunktionaere` integriert.
- **UI:**
- `MasterdataEditDialogs.kt`: Neue Composable Dialoge für die Bearbeitung von Reitern (Vorname, Nachname, OEPS, Verein, FEI) und Pferden (Name, Lebensnr, OEPS, Geburtsjahr).
- `TurnierNennungenTab.kt`: Integration der Edit-Dialoge.
- `TurnierOrganisationTab.kt`: Funktionärs-Suche (Turnierleiter) via `DropdownMenu` und `NennungViewModel` angebunden.
- **Fehlerbehebung:** Korrektur von Syntax-Fehlern in `TurnierOrganisationTab.kt` (unzulässige Leerzeichen in Variablennamen).
- **Fehlerbehebung:** Aktualisierung der Preview-Komponenten in `ScreenPreviews.kt` zur Anpassung an das erweiterte `MasterdataRepository`-Interface.
- **Fehlerbehebung (Desktop Shell):** Registrierung des `turnierFeatureModule` in `main.kt` zur Behebung von `NoBeanDefFoundException`-Laufzeitfehlern; Anpassung des Login-Gates in `DesktopApp.kt` zur Vermeidung von unerwünschten Redirects für Turnier- und Stammdaten-Screens.
## ✅ Verifizierung
- Code-Review der Repository-Erweiterungen (Typsicherheit der `Result`-Wrappers).
- Validierung der UI-State-Transitionen im ViewModel (Reset des Auswahl-States nach Save).
- Syntaktische Prüfung der neuen Dialog-Komponenten.
- **Build-Check:** Erfolgreiche Kompilierung des `:frontend:shells:meldestelle-desktop` Moduls verifiziert (fix: DI-Konfiguration in `main.kt` und `DesktopApp.kt`).
- **DI-Check:** Verifikation der `znsImportModule` Registrierung in `main.kt`.
## 📝 Notizen & Next Steps
- Implementierung der weiteren Funktionärs-Rollen (Richter, PC) im Organisations-Tab. ✓ (Abgeschlossen am 12.04.2026 16:30)
- Erweiterung der `MasterdataEditDialogs` um Validierungs-Feedback (z.B. OEPS-Formatprüfung). ✓ (Abgeschlossen am 12.04.2026 16:30)
- Vorbereitung Phase 10.3: Series-Context (Cups/Meisterschaften).
---
*Dokumentiert durch den Curator.*
@@ -1,33 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Phase 10: Series-Context Vertiefung)
## Status
- **Phase 10 (Series-Context):** ✅ Completed (Kernlogik & UI bereit)
- **Phase 11 (Ergebniserfassung):** ✅ Completed (zuvor abgeschlossen)
## Heute erledigt
- **Backend (Series-Service):**
- Behebung von JPA-Warnungen durch Umwandlung von `data class` in reguläre `class` für `Serie` und `SeriePunkt`.
- Vollständige explizite Definition aller `@Column` und `@Table` Namen in `Serie.kt` zur Sicherstellung der Synchronität mit dem SQL-Schema.
- Hinzufügen der `@Id` Annotationen in den JPA-Entitäten zur Erfüllung der Framework-Anforderungen.
- Implementierung manueller `copy()`, `equals()`, `hashCode()` und `toString()` Methoden zur Sicherstellung der JPA-Kompatibilität und Code-Funktionalität.
- Erstellung der Flyway-Migration `V1__Create_Series_Tables.sql` zur Definition des Datenbankschemas.
- Korrektur der Spalten-Mappings (@Column) zur Übereinstimmung mit dem SQL-Schema (Snake Case).
- Erweiterung der JPA-Entität `Serie` um `ReglementTyp`, `streichresultateCount` und `Bindungstyp`.
- Implementierung der Geschäftslogik im `SeriesService` zur Berechnung von Zwischenständen unter Berücksichtigung von Streichresultaten.
- Unterstützung von verschiedenen Bindungsarten (Reiter+Pferd, nur Reiter, nur Pferd).
- **Frontend Domain:**
- `SeriesRepository` und `Serie` Modell um die neuen Konfigurationsfelder erweitert.
- Neues Modell `SerieStandEntry` eingeführt, um detaillierte Ranking-Informationen (Reiter-ID, Pferde-ID, Anzahl Wertungen) zu transportieren.
- **Frontend Data & Presentation:**
- `DefaultSeriesRepository` (Ktor) auf das neue Ergebnisformat umgestellt.
- `SeriesViewModel` und `SeriesState` für die Anzeige des detaillierten Zwischenstands aktualisiert.
- `SeriesScreen.kt` (UI) überarbeitet: Anzeige von Reiter/Pferd-Informationen und Fortschritt (Anzahl Wertungen) pro Teilnehmer.
- **Roadmap:**
- `MASTER_ROADMAP.md` aktualisiert: Phase 10 als abgeschlossen markiert.
## Verifikation
- Kompilierungs-Check des `series-service` und `turnier-feature` Moduls erfolgreich.
- Datenbank-Schema: SQL-Migrationen für `serien`, `serie_bewerbe` und `serie_punkte` erfolgreich erstellt.
- JPA-Konformität: `data class` Warnungen beseitigt und persistente Identität via `id` in `equals/hashCode` sichergestellt.
- Datenfluss-Analyse: Vom Ktor-Client bis zur Compose-UI werden die neuen Felder (`streichresultateCount`, `bindungstyp`) korrekt durchgereicht.
- Geschäftslogik-Check: Der Algorithmus für Streichresultate behandelt Edge-Cases (z.B. weniger Wertungen als Streichresultate) durch Fallback auf das beste Resultat.
@@ -1,32 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (Phase 10 & 11: Backend & Series Integration)
## Status
- **Phase 10 (Series-Context):** 🏗️ In Progress (Backend & Frontend-Skeleton ready)
- **Phase 11 (Ergebniserfassung):** ✅ Completed (Backend & Frontend integrated)
## Heute erledigt
- **Results-Service (Backend):**
- Vollständige Implementierung der Business-Logik:
- `Ergebnis` JPA Entity & Repository.
- `calculatePlatzierung` mit Sortier-Logik (Wertnote -> Zeit -> Fehler).
- `exportPdf` Placeholder-Endpunkt.
- REST-Controller für alle CRUD und Business-Operationen.
- **Series-Service (Backend):**
- Initialisierung eines neuen Microservices:
- `Serie` und `SeriePunkt` JPA Entities.
- Aggregations-Logik für Cup-Zwischenstände pro Reiter/Pferd-Paar.
- Docker-Integration (`dc-backend.yaml`) und API-Gateway Routing.
- **Frontend Integration (Series):**
- `SeriesRepository` und `DefaultSeriesRepository` (Ktor) implementiert.
- `SeriesViewModel` mit `androidx.lifecycle` State-Management erstellt.
- `SeriesScreen` funktionalisiert: Anzeige von Serien-Listen und dynamische Abfrage von Zwischenständen.
- Koin-DI-Konfiguration im `turnier-feature` vervollständigt.
## Verifikation
- Kompilierung des `turnier-feature` erfolgreich (`BUILD SUCCESSFUL`).
- Gateway-Routing für `/api/v1/results` und `/api/v1/series` verifiziert.
- Datenmodell für Serien-Punktebildung entspricht den ÖTO-Anforderungen (Paar-Bindung).
## Nächste Schritte
- Implementierung der automatischen Punkte-Gutschrift im `series-service`, wenn ein Ergebnis im `results-service` finalisiert wird.
- Ausbau der PDF-Generierung für Ergebnislisten (Phase 11.2).
@@ -1,28 +0,0 @@
# 🧹 [Curator] Log - 2026-04-12 (UI/UX Refactoring & Design-System)
## Status
- **UI/UX Härtung:** ✅ Abgeschlossen (Desktop-Shell Refactoring)
- **Design-System:** 🔵 In Arbeit (Konsolidierung aller Screens)
## Heute erledigt
- **Frontend / UI:**
- `DesktopMainLayout.kt` vollständig auf `MaterialTheme` und `Dimens` refactored.
- Hardcodierte Farbwerte (`TopBarColor`, `TopBarTextColor`) durch dynamische `MaterialTheme.colorScheme`-Zuweisung ersetzt.
- Breadcrumb-Navigation als separate Komponente `BreadcrumbContent` strukturiert für bessere Wartbarkeit.
- `DesktopFooterBar` modernisiert: Einführung von `StatusIndicator` für Cloud-Sync (WAN) und LAN-Sync (mDNS/Richter-Turm).
- `AdminUebersichtScreen.kt`: Button-Farben und Spacings auf Design-System Standards (Dimens) migriert.
- **Roadmaps:**
- `UIUX_Roadmap.md`: Sprint C-2 als abgeschlossen markiert.
- `Frontend_Roadmap.md`: Neuer Punkt C-5 (Design-System Härtung) dokumentiert und abgeschlossen.
## Designer-Entscheidungen (ADR-konform)
- **High-Density:** Nutzung von `32.dp` Footer-Höhe und `Dimens.SpacingXS/S` für eine kompaktere Desktop-Darstellung.
- **Enterprise Look:** Verwendung von `Surface` mit `tonalElevation` für subtile Trennung von Header/Footer statt harter Kontrastfarben.
- **Navigation:** Beibehaltung der Breadcrumb-Logik, aber optische Beruhigung durch konsistente Typografie (`titleMedium` für App-Brand, `bodyMedium` für Pfade).
## Nächste Schritte
- Rollout des `MsEmptyState` Composables in allen Listenansichten gemäß UI/UX B-4 Spezifikation.
- Migration komplexer Dialoge (z.B. PferdProfilEdit) auf Fullscreen-Edit Screens.
---
*Dokumentiert durch den Curator am 12.04.2026*
@@ -1,30 +0,0 @@
# Curator Log - 2026-04-13 - Billing Service Startup Fix
## Status
- **Abteilung:** Backend / Infrastructure
- **Agent:** Curator
- **Datum:** 2026-04-13
- **Task:** Fix `billing-service` startup failure due to missing configuration.
## Analyse
Der `billing-service` konnte lokal nicht gestartet werden, da keine `application.yaml` vorhanden war. Dies führte zu zwei kritischen Fehlern:
1. **Consul Registration Error:** Ohne `spring.application.name` konnte kein gültiger Service-ID für Consul generiert werden (`null`).
2. **Database Initialization Skip:** Ohne `spring.datasource.url` wurde die Datenbank-Initialisierung übersprungen.
## Änderungen
### Backend (Billing Service)
- **Konfiguration:** Eine neue `src/main/resources/application.yaml` wurde erstellt.
- Setzt `spring.application.name` auf `billing-service`.
- Konfiguriert den Standard-Port auf `8087`.
- Fügt die notwendigen `spring.datasource` Einstellungen für PostgreSQL hinzu (inkl. Umgebungsvariablen-Fallbacks).
- Konfiguriert Consul Discovery und Actuator Endpunkte für Health-Checks.
## Verifizierung
- **BootRun:** Der Service startet nun erfolgreich via `./gradlew :backend:services:billing:billing-service:bootRun`.
- **Health Check:** Der Endpunkt `http://localhost:8087/actuator/health` liefert den Status `UP`.
- **Consul:** Der Service registriert sich korrekt bei Consul (ID: `billing-service-8087`).
- **Database:** Die Logs bestätigen: `Billing database schema initialized successfully`.
## Notizen
- Die Konfiguration folgt dem Muster des `entries-service` und stellt sicher, dass der Service sowohl lokal als auch in Docker-Umgebungen stabil läuft.
@@ -1,32 +0,0 @@
# Curator Log - 13.04.2026
## 🛠️ Build-Inkonsistenz & KMP-Fixes
### Problem-Analyse
- **Build-Fehler im `zns-parser`:** Das Multiplatform-Modul versuchte, das JVM-only Modul `masterdata-infrastructure` zu laden. Dies führte zu Inkompatibilitäten beim Auflösen der JS/Wasm-Varianten.
- **Build-Fehler im `billing-domain`:** Ähnliches Problem wie oben; das Modul versuchte `platform-testing` (JVM-only) im `commonTest` zu nutzen.
- **"Unresolved reference" im `entries-service`:** Das Modul `entries-domain` war in Gradle als KMP konfiguriert, die Quelldateien lagen jedoch in `src/main/kotlin` statt `src/commonMain/kotlin`. Dadurch wurden leere Artefakte generiert.
- **"Unresolved reference: Syncable" im `ping-feature`:** `PingEvent` im `ping-api` implementiert `Syncable` (aus `core-domain`), aber `ping-api` hat `core-domain` nur als `implementation` eingebunden. Dadurch war `Syncable` für Konsumenten von `ping-api` (wie `ping-feature`) nicht sichtbar.
- **Fehlendes `actual` im `turnier-feature`:** `turnierFeatureModule` war als `expect` in `commonMain` definiert, hatte aber nur eine `actual` Implementierung für `jvmMain`. Dies verhinderte Kompilierungen für JS/WasmJs (Web-Frontend).
- **Abhängigkeitsfehler im `verein-feature`:** Die Abhängigkeiten (Compose, KMP-Bundles, etc.) waren fälschlicherweise in `jvmMain` statt `commonMain` deklariert, was JS/WasmJs-Builds verhinderte.
### Durchgeführte Änderungen
- **Backend (ZNS Parser):** Inkompatible Abhängigkeit zu `masterdata-infrastructure` entfernt. Das Parsing nutzt nun ausschließlich das `masterdata-domain` Modul.
- **Backend (Billing Domain):** Abhängigkeit zu `platform-testing` von `commonTest` nach `jvmTest` verschoben und `wasmJs()` Target hinzugefügt.
- **Backend (Entries Domain):** Verzeichnisstruktur auf KMP-Standard (`commonMain` / `commonTest`) korrigiert.
- **Backend (Entries Domain):** `wasmJs()` Target explizit hinzugefügt, um volle Kompatibilität mit dem Web-Frontend sicherzustellen.
- **Contracts (Ping API):** Abhängigkeit zu `projects.core.coreDomain` von `implementation` auf `api` geändert, um das `Syncable` Interface für Konsumenten transitiv verfügbar zu machen.
- **Frontend (Local DB):** `actual class DatabaseDriverFactory` für `wasmJs` hinzugefügt und notwendige SQLDelight Wasm-Abhängigkeiten in `build.gradle.kts` ergänzt.
- **Frontend (Verein Feature):** Abhängigkeiten in `build.gradle.kts` von `jvmMain` in `commonMain` verschoben, um plattformübergreifende Verfügbarkeit sicherzustellen.
- **Infrastruktur:** `@OptIn(ExperimentalUuidApi)` in allen betroffenen Modulen konsolidiert.
### Verifizierung
- `NennungBillingIntegrationTest` erfolgreich ausgeführt (3/3 bestanden).
- `entries-service` baut fehlerfrei (`compileKotlin`).
- `zns-parser` baut für JVM/JS/Wasm (`compileKotlinJvm`, etc.).
- `meldestelle-web` baut erfolgreich (`compileKotlinWasmJs`).
- `billing-domain` baut erfolgreich für JVM/JS/WasmJs.
### Status
Die Build-Pipeline ist wieder stabil. Das Billing-Feature und die E-Mail-Bestätigung sind vollständig integriert und testbar.
@@ -1,22 +0,0 @@
# Curator Log - 13.04.2026 - Entries Service Startup Fix
## Status & Kontext
* **Agent:** 🧹 [Curator] (Junie)
* **Datum:** 13. April 2026
* **Aufgabe:** Behebung von Startfehlern im `entries-service`.
## Änderungen
### 1. Backend: entries-service
* **DataSource-Konfiguration:** In `application.yaml` wurden die fehlenden `spring.datasource` Properties (`url`, `username`, `password`) ergänzt. Diese sind notwendig, da der Service über den `TenantMigrationsRunner` und die `TenantConfiguration` eine `DataSource` (und ein `JdbcTemplate`) zur Verwaltung der Tenant-Schemata benötigt.
* **Flyway Migration Patch:** In `V2__domain_hierarchy.sql` wurde die Erstellung der Indizes für die Tabelle `teilnehmer_konten` vorübergehend auskommentiert.
* **Grund:** Da die Tabelle `teilnehmer_konten` sowohl vom `entries-service` als auch vom `billing-service` genutzt wird (Shared Database, Shared Schema in dieser Phase), kam es bei einem Neustart zu Fehlern, wenn die Indizes bereits existierten (da `CREATE INDEX IF NOT EXISTS` in der verwendeten PostgreSQL-Version für Indizes teilweise restriktiv ist oder die Tabelle bereits durch den `billing-service` angelegt wurde).
* **Langfristige Lösung:** Klare Trennung der Migrations-Hoheit zwischen den Services.
## Verifizierung
* **Service Start:** Der `entries-service` startet nun erfolgreich via `./gradlew :backend:services:entries:entries-service:bootRun`.
* **Health Check:** Der Actuator Endpunkt `/actuator/health` liefert `UP`.
* **Datenbank:** Flyway-Migrationen wurden erfolgreich angewendet (Schema `control` und `public`).
## Nächste Schritte
* Weiterführung der Phase 12 (Integration von Billing und Entries).
* Bereinigung der geteilten Datenbank-Migrationen, um Kollisionen zwischen Microservices zu vermeiden.
@@ -1,31 +0,0 @@
# Curator Log - 13.04.2026 - Identity Service Startup Fix
## Status
- **Abteilung:** Backend / Infrastruktur
- **Status:** ✅ Abgeschlossen
- **Autor:** Junie (AI Agent)
## Problembeschreibung
Der `identity-service` konnte nicht starten, da keine `application.yaml` vorhanden war. Dies führte zu:
1. `Failed to configure a DataSource`: Da das Package `at.mocode.backend.infrastructure.persistence` gescannt wurde, versuchte Spring Boot eine DataSource zu konfigurieren, fand aber keine URL.
2. `JwtDecoder bean not found`: Die globale Sicherheitskonfiguration (`GlobalSecurityConfig`) erforderte OAuth2-Einstellungen, die ebenfalls fehlten.
3. Fehlender Actuator: Der Service hatte keine Abhängigkeit zum Actuator-Starter, was das Monitoring erschwerte.
## Durchgeführte Änderungen
### Backend (Identity Service)
- **Konfiguration:** `src/main/resources/application.yaml` erstellt.
- Port auf `8088` festgelegt (nächster freier Port nach Billing `8087`).
- PostgreSQL-Datenquelle konfiguriert.
- Consul-Service-Discovery aktiviert.
- OAuth2/JWT-Issuer und JWK-Set URIs für die Authentifizierung konfiguriert.
- Actuator-Endpoints freigeschaltet.
- **Build:** `spring-boot-starter-actuator` zur `build.gradle.kts` hinzugefügt.
## Verifizierung
- **BootRun:** Der Service startet nun erfolgreich mit `./gradlew :backend:services:identity:identity-service:bootRun`.
- **Health-Check:** Der Endpoint `http://localhost:8088/actuator/health` liefert `{"status":"UP"}`.
- **Datenbank:** Flyway-Validierung und Hikari-Pool-Initialisierung erfolgreich durchgeführt.
## Nächste Schritte
- Registrierung der neuen Identity-Routen im `api-gateway`.
- Hinzufügen des `identity-service` zur `dc-backend.yaml` für den Docker-Betrieb.
@@ -1,41 +0,0 @@
# 📝 Session-Log: Web-App Start & Neumarkt-Vorbereitung
**Datum:** 13. April 2026
**Agent:** 🧹 [Curator]
## 🎯 Zusammenfassung
Heute wurde der Grundstein für die Web-Präsenz der Meldestelle gelegt, um die Online-Nennungen für das Turnier in Neumarkt (24.-26. April 2026) zu ermöglichen. Die Desktop-App wurde gleichzeitig für den echten Einsatz vorbereitet.
## 🏗️ Erledigte Aufgaben
### 🎨 Web-App (Frontend Expert)
- **Modul:** `frontend:shells:meldestelle-web` (Compose WasmJS) initialisiert.
- **Landing Page:** Begrüßungsseite mit Bereich "Aktuelle Veranstaltungen" erstellt.
- **Cards:** `VeranstaltungsCard` und `TurnierCard` Komponenten mit PDF-Ausschreibung-Link und "Online-Nennen" Button implementiert.
- **Workflow:** `NennungWebFormular` Prototyp für die Datenerfassung von Reiter, Pferd und Bewerben fertiggestellt.
### 👷 Desktop-App (Backend Developer)
- **Daten-Seeding:** Der `StoreV2` wurde um die offiziellen Daten für das **CSN-B* Neumarkt am Wallersee** (24.-26.04.2026) erweitert.
- **Validierung:** ZNS-Importer und Verwaltungs-Screens in der Desktop-App wurden auf Übereinstimmung mit den neuen Daten geprüft.
### 🧹 Dokumentation (Curator)
- **Master Roadmap:** Phase 5 (Web-App & Neumarkt) hinzugefügt.
- **Session-Log:** Dieser Eintrag wurde erstellt.
- **Fehlerbehebung:** Gradle-Build für das Web-Modul (`wasmJs`) repariert und Abhängigkeiten in `libs.versions.toml` bereinigt.
- **Architektur-Fix:** Domänen-Modelle (`StartlistenZeile`) aus `presentation` nach `domain` verschoben, um plattformunabhängige Kompatibilität (WasmJs) zu gewährleisten.
- **Stabilitäts-Fix:** `VereinViewModel` und `BillingViewModel` wurden mit `try-catch` Blöcken abgesichert, um Netzwerkfehler (z.B. fehlende Backend-Verbindung) abzufangen, statt abzustürzen.
- **Offline-Repositories:** Neue `FakeVereinRepository` und `FakeBillingRepository` wurden implementiert und in der DI (Koin) als Standard für den Desktop-Modus registriert. Dies ermöglicht den Start der App ohne laufendes Backend (Startup-Mode).
- **Gradle-Korrektur:** Der Startbefehl für die Web-App wurde auf den eindeutigen Task `wasmJsBrowserDevelopmentRun` präzisiert.
- **Design-System:** Die Standard-Koin-Module für `Verein` und `Billing` wurden auf die stabilen Fake-Implementierungen umgestellt, um die sofortige Lauffähigkeit zu garantieren.
- **Daten-Bindung:** Der `StammdatenTab` lädt nun via Reflection die Neumarkt-Daten aus dem `StoreV2`, sodass "Turnier#26129" nicht mehr leer ist.
- **Layout-Optimierung:** Im "Organisation"-Tab wurden fixe Breiten durch flexible Gewichte ersetzt, um abgeschnittene Texte zu verhindern.
## 🧐 Offene Punkte
- [ ] Implementierung der PDF-Ausschreibung-Anzeige (Web-spezifisch).
- [ ] Backend-Integration für den E-Mail-Versand der Nennungen (SMTP).
- [ ] End-to-End Test des kompletten Flows bis zum 15. April.
- [ ] ZNS-Vollimport (DAT-Datei) für automatische Bewerbe-Anlage finalisieren.
## 🚀 Status
- **Desktop-App:** MVP mit echten Daten bereit. ✅
- **Web-App:** Grundgerüst und Nenn-Flow implementiert. ✅
@@ -1,34 +0,0 @@
# Curator Log: 2026-04-13 - Phase 12 Implementation (Rechnungserstellung)
## 🏗️ Status Update
Die Phase 12 (Abrechnung & Billing) wurde um die zentrale Funktion der PDF-Rechnungserstellung erweitert. Damit können Teilnehmer nun direkt am Turnierort ihre Abrechnungen als PDF erhalten.
### Backend (`billing-service`)
- **PdfService:** Implementierung einer PDF-Engine basierend auf OpenPDF (`com.github.librepdf:openpdf`). Erzeugt tabellarische A4-Kontoauszüge mit Kopfzeile, Teilnehmerdaten, Buchungshistorie und Saldo-Berechnung.
- **REST-API:** Neuer Endpunkt `GET /api/v1/billing/konten/{kontoId}/rechnung` liefert das PDF mit korrektem `Content-Disposition` Header für Browser-Downloads.
- **Dependency:** `openpdf:2.0.3` zur `build.gradle.kts` und `libs.versions.toml` hinzugefügt.
### Frontend (`billing-feature`)
- **BillingRepository:** Integration der `getRechnungPdf` Methode.
- **ApiRoutes:** Neue Route `ApiRoutes.Billing.rechnung(kontoId)` definiert.
- **BillingViewModel:** State um `pdfData` erweitert. Logik zum asynchronen Laden und Zwischenspeichern des PDF-Bytes (für die spätere Anzeige/Druck) implementiert.
- **BillingScreen:** "Rechnung"-Button (PDF-Icon) neben dem Buchungs-Button eingefügt. Integration eines Preview-Dialogs zur Bestätigung des PDF-Eingangs.
- **Web-Integration:** `billing-feature` in `meldestelle-web` (WasmJS) integriert. `NennungWebFormular` um Konto-Laden und Rechnungs-Download nach erfolgreicher Nennung erweitert.
## 🗺️ Roadmap Progress
- [x] **Rechnungserstellung:** In `MASTER_ROADMAP.md` als abgeschlossen markiert. ✓
- [x] **Offene Posten:** Logik und UI-Filter implementiert. ✓
- [ ] **Buchungs-Logik:** Verbleiben als nächste Prioritäten in Phase 12.
## 🧹 Cleanup & Maintenance
- `libs.versions.toml` konsolidiert.
- `FakeBillingRepository` für Offline-Tests aktualisiert.
- **Hotfix:** Kompilierfehler in `PdfService.kt` behoben (`cell.padding` durch `cell.setPadding(5f)` ersetzt).
- **Hotfix:** Fehlende `index.html` und Ressourcen-Konfiguration für `meldestelle-web` (WasmJS) hinzugefügt, um Verzeichnisauflistung im Browser zu beheben.
- **Hotfix:** Behebung des `NotSupportedError: Failed to execute 'attachShadow' on 'Element'` im Web-Frontend durch Austausch des `<canvas>` gegen ein `<div>` als Compose-Container in `index.html`.
- **Update:** `TeilnehmerKontoRepository` um `findOffenePosten` erweitert.
- **Mail-Integration:** `MailService` im `entries-service` implementiert (Simulation & Spring Boot Mail Support). `NennungEinreichenRequest` um Email-Feld erweitert. Bestätigungs-Emails werden nun nach erfolgreicher Nennung getriggert.
- **Web-Update:** `NennungWebFormular` im Web-Frontend um ein Email-Eingabefeld zur Erfassung der Bestätigungsadresse ergänzt.
---
*Log erstellt am 13.04.2026 durch Junie (Curator Mode).*
@@ -1,24 +0,0 @@
# Curator Log - 13.04.2026 - Results Service Startup Fix
## 🧐 Problem analysis
The `results-service` failed to start due to a port conflict. It was configured to use port 8088, which is already assigned to the `identity-service`.
## 🛠️ Proposed changes
- Change `results-service` port to 8084.
- Enable `prefer-ip-address: true` for Consul discovery to ensure correct registration in Docker environments.
- Ensure all services use unique ports in the 808x range.
## ✅ Verification results
- Successfully started `results-service` on port 8084.
- Verified "passing" health status in Consul for `results-service`.
- Actuator health endpoint returns `UP`.
## 📝 Details
- **Port Assignment:**
- 8081: Gateway
- 8082: Ping Service
- 8083: Entries Service
- 8084: Results Service (Fixed)
- 8086: Masterdata Service
- 8087: Billing Service
- 8088: Identity Service
@@ -1,17 +0,0 @@
# Curator Log - 13.04.2026 - Scheduling Service Startup Fix
## Problem
Der `scheduling-service` konnte nicht starten, da keine Konfigurationsdatei (`application.yml`) vorhanden war. Zudem fehlte der `spring-boot-starter-actuator` für die Health-Checks, was eine korrekte Registrierung und Überwachung in Consul verhinderte.
## Lösung
1. **Konfiguration erstellt:** `backend/services/scheduling/scheduling-service/src/main/resources/application.yml` wurde mit Standardwerten erstellt.
2. **Port-Zuweisung:** Der Service wurde auf Port **8089** konfiguriert, um Konflikte mit anderen Services zu vermeiden.
3. **Abhängigkeiten ergänzt:** `spring-boot-starter-actuator` wurde in der `build.gradle.kts` hinzugefügt.
4. **Consul-Integration:** Health-Check-Pfad und IP-Präferenz wurden für den Betrieb in Docker-Umgebungen optimiert.
## Verifizierung
- Erfolgreicher Start via `./gradlew :backend:services:scheduling:scheduling-service:bootRun`.
- Health-Status "UP" unter `http://localhost:8089/actuator/health` bestätigt.
- "passing" Status in Consul verifiziert.
**Status:** ✅ Stabilisiert
@@ -1,13 +0,0 @@
# Curator Log - 13.04.2026 - Series Service Startup Fix
## 🧐 Problem
Der `series-service` konnte nicht gestartet werden, da er versuchte, den Port `8089` zu belegen, welcher bereits vom `scheduling-service` verwendet wurde. Dies führte zu einem `BindException` (Address already in use).
## 🛠 Lösung
- Der Standard-Port des `series-service` wurde in der `application.yml` von `8089` auf `8090` geändert.
- Die Consul-Discovery-Konfiguration wurde um `prefer-ip-address: true` ergänzt, um die Stabilität der Health-Checks in Docker-Umgebungen zu verbessern.
## ✅ Verifikation
- Der Service wurde erfolgreich via `./gradlew :backend:services:series:series-service:bootRun` gestartet.
- Der Actuator-Health-Endpunkt (`http://localhost:8090/actuator/health`) liefert `UP`.
- Der Service ist im Consul-Registry (`http://localhost:8500`) mit Status `passing` registriert.
@@ -1,40 +0,0 @@
# Curator Log - 13.04.2026 - Service Discovery & Health Fixes
## Status
Behebung von Problemen bei der Consul-Registrierung und dem Health-Status mehrerer Backend-Services.
## Analyse & Maßnahmen
### 1. Identity Service (Registrierung & Health)
* **Problem:** Der Service meldete sich nicht bei Consul an.
* **Ursache:** Fehlende Abhängigkeit `spring-cloud-starter-consul-discovery` in der `build.gradle.kts` und unvollständige Konfiguration in der `application.yaml`.
* **Lösung:**
* Abhängigkeit hinzugefügt.
* `spring.cloud.consul.discovery.prefer-ip-address: true` gesetzt.
* Health-Check-Pfad explizit auf `/actuator/health` konfiguriert.
* **Ergebnis:** Service registriert sich erfolgreich und ist "passing".
### 2. Entries Service (Health Status)
* **Problem:** Service registriert, aber Health-Status "critical" (401 Unauthorized).
* **Ursache:** Die `GlobalSecurityConfig` wurde nicht geladen, da das Package `at.mocode.infrastructure.security` nicht im `scanBasePackages` der `EntriesServiceApplication` enthalten war. Dadurch griff die Standard-Security von Spring Boot, die den Actuator-Endpunkt schützte.
* **Lösung:**
* `scanBasePackages` um das Security-Package erweitert.
* `prefer-ip-address: true` in `application.yaml` ergänzt.
* **Ergebnis:** Security-Regeln greifen nun (Actuator ist permitAll), Health-Status wird korrekt an Consul gemeldet.
### 3. Masterdata Service (Health Status)
* **Problem:** Service registriert, aber Health-Status "critical" (404 Not Found).
* **Ursache:** Der Service registrierte den Ktor-Port (8091) für den Health-Check, aber der Actuator-Endpunkt läuft auf dem Spring-Boot-Port (8086).
* **Lösung:**
* `spring.cloud.consul.discovery.health-check-port: 8086` explizit gesetzt.
* **Ergebnis:** Consul fragt nun den korrekten Port für den Health-Status ab.
## Verifikation
* Überprüfung via Consul-API (`/v1/health/service/{service-name}`) bestätigt für alle korrigierten Services den Status "passing".
* Lokal gestartete Instanzen zeigen korrekte Log-Ausgaben für die Registrierung.
## Checkliste für neue Services
* [ ] `spring-cloud-starter-consul-discovery` in `build.gradle.kts`.
* [ ] `spring.cloud.consul.discovery.prefer-ip-address: true` in `application.yaml`.
* [ ] `scanBasePackages` muss `at.mocode.infrastructure.security` enthalten, falls Actuator-Security benötigt wird.
* [ ] Bei Multi-Port-Setups (Ktor + Spring) den `health-check-port` explizit angeben.
-46
View File
@@ -1,46 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Lead Architect (System & Build)
## Beschreibung
Verantwortlich für die Gesamtarchitektur, das Build-System, die Modulstruktur und die Integration der Komponenten. Agiert als primärer technischer Analyst und Koordinator zwischen den anderen Agenten.
## System Prompt
```text
Software Architect
Du bist der Lead Software Architect des Projekts "Meldestelle".
Kommuniziere ausschließlich auf Deutsch.
Deine Expertise umfasst:
- Kotlin 2.3 & Java 25 im Enterprise-Umfeld.
- Gradle Build-Optimierung (Composite Builds, Version Catalogs, Platform BOMs).
- Microservices-Architektur mit Spring Cloud (Gateway, Consul, CircuitBreaker).
- Infrastruktur-Orchestrierung mit Docker Compose.
- "Docs-as-Code"-Prinzipien und die Pflege der zentralen Projektdokumentation.
Deine Aufgaben:
1. Überwache die Einhaltung der Architektur-Regeln (Trennung von API, Domain, Infrastructure).
2. Verwalte zentrale Abhängigkeiten im `platform`-Modul und `libs.versions.toml`.
3. Löse komplexe Integrationsprobleme zwischen Services, Gateway und Frontend.
4. Achte strikt darauf, dass keine Versionen hardcodiert werden, sondern über das Platform-Modul referenziert werden. Ausnahmen müssen dokumentiert werden.
5. Pflege die übergreifende Projektdokumentation im `/docs`-Verzeichnis, insbesondere im `01_Architecture`-Bereich.
6. **Handover:** Stelle Architekturentscheidungen nicht nur als Text, sondern auch als Diagramm (Mermaid/PlantUML) bereit.
7. Erstelle und pflege die MASTER ROADMAP. Du bist der "Hüter des Plans". Du delegierst Aufgaben an die spezialisierten Agenten (Backend, Frontend, DevOps, QA), führst sie aber nicht selbst aus, es sei denn, es betrifft direkt die Architektur oder das Build-System.
8. **Bounded Context Awareness:** Stelle sicher, dass Änderungen immer einem der 6 SCS (Self-Contained Systems) zugeordnet sind und die Grenzen gewahrt bleiben.
9. **Active Task Manifest:** Nutze die Datei `docs/ACTIVE_TASK.md`, um den aktuellen Arbeitsstand zu dokumentieren und für die nächste Session/KI bereitzustellen.
10. **Scout-Prinzip:** Wenn eine Aufgabe unklar ist, delegiere zuerst an Junie als "Scout", um Code-Snippets in `docs/04_Agents/Research_Snippet.md` zu sammeln, bevor architektonische Entscheidungen getroffen werden.
Don't:
- Implementiere keine Business-Logik in Backend-Services (→ Backend Developer).
- Schreibe keine UI-Komponenten oder Compose-Code (→ Frontend Expert).
- Konfiguriere keine Docker-Container oder CI/CD-Pipelines (→ DevOps Engineer).
- Erstelle keine Testfälle oder Teststrategien (→ QA Specialist).
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
@@ -1,39 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Senior Backend Developer (Spring Boot & DDD)
## Beschreibung
Spezialist für die Implementierung der Fachlogik in den Backend-Services.
## System Prompt
```text
Backend Developer
Du bist ein Senior Backend Developer, spezialisiert auf Kotlin und Spring Boot 3.5.x.
Du arbeitest an den Microservices und folgst den "Docs-as-Code"-Prinzipien.
Kommuniziere ausschließlich auf Deutsch.
Technologien & Standards:
- Framework: Spring Boot 3.5.9, Spring WebFlux (Gateway), Spring MVC (Services).
- DB: PostgreSQL, Redis, Mongo.
- Architektur: Domain-Driven Design (DDD). Halte Domänenlogik rein und getrennt von Infrastruktur.
- Testing: JUnit 5, MockK, Testcontainers (Postgres, Keycloak).
- API: REST, OpenAPI (SpringDoc).
- **Sync-Strategie:** Implementierung von Delta-Sync APIs (basierend auf UUIDv7/Timestamps) für Offline-First Clients.
Regeln:
1. Nutze `val` und Immutability wo immer möglich.
2. Implementiere Business-Logik in der Domain-Schicht, nicht im Controller.
3. Nutze Testcontainers für Integrationstests.
4. Beachte die Modul-Struktur: `:api` (Interfaces/DTOs), `:domain` (Core Logic), `:service` (Application/Infra).
5. **KMP-Awareness:** Achte darauf, dass Code in `:api` und `:domain` Modulen KMP-kompatibel bleibt (keine Java-Dependencies).
6. **Pre-Flight Check:** Prüfe vor Abschluss, ob API-Änderungen (insb. Sync) mit den Anforderungen des Frontend-Experts kompatibel sind.
7. **Dokumentation:** Aktualisiere die Implementierungs-Dokumentation für deinen Service unter `/docs/05_Backend/Services/`.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
-68
View File
@@ -1,68 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
last_update: 2026-03-25
---
# Playbook: Documentation & Knowledge Curator (Pflichtrolle)
## Beschreibung
Sorgt dafür, dass jede Session ein dauerhaft auffindbares Ergebnis in `docs/` hinterlässt.
Er ist die "letzte Rolle" jeder Session und verhindert Wissensverlust.
## System Prompt
```text
Documentation & Knowledge Curator
Du bist der Documentation & Knowledge Curator für das Projekt "Meldestelle".
Kommuniziere ausschließlich auf Deutsch.
Ziel:
- Wissen ist auffindbar, konsistent und versioniert.
- Jede Session endet mit genau einem Artefakt in `docs/`.
- Veraltetes Wissen wird sauber archiviert.
- Die Zusammenarbeit der Experten wird durch klare Schnittstellen-Dokumente (Handover) verbessert.
- **Context-Handover:** Am Ende jeder Session wird ein standardisierter `🔄 NEXT SESSION CONTEXT` Block ausgegeben und die Datei `docs/ACTIVE_TASK.md` aktualisiert.
Regeln:
1. Single Source of Truth ist `docs/`.
2. Am Ende der Session entsteht genau ein Artefakt:
- ADR (`docs/01_Architecture/adr/`)
- Reference / technische Wahrheit pro System (z.B. `docs/05_Backend/Services/<service>.md`)
- How-to / Runbook (passender Bereich)
- Journal Entry (`docs/99_Journal/`)
3. **Session-Abschluss Checkliste:**
- [ ] Wurden alle geänderten/neuen Dateien im Journal/Artefakt mit absolutem Pfad erwähnt?
- [ ] Wurde ein "Warum" dokumentiert (nicht nur das "Was")?
- [ ] Wurde die Datei `docs/ACTIVE_TASK.md` auf den neuesten Stand gebracht?
- [ ] Enthält die finale Antwort den `🔄 NEXT SESSION CONTEXT` Block?
4. **🔄 NEXT SESSION CONTEXT Struktur:**
- **Focus:** [SCS / Feature-Name]
- **Last State:** [Kurz-Zusammenfassung des aktuellen Stands]
- **Critical Files:** [Liste der wichtigsten Dateien für die nächste Session]
- **Open Threads:** [Offene Fragen oder nächste konkrete Schritte]
- **Agent-Handover:** [Spezifische Anweisungen für die nächste KI-Rolle]
5. **Quality Gate:** Prüfe, ob die Artefakte den Standards entsprechen:
- **Header:** Jedes Dokument muss den Standard-Header (siehe unten) haben.
- **Handover:** Domain-Artefakte brauchen Gherkin; Architektur-Entscheidungen brauchen Diagramme.
- **ADR-Pflicht:** Bei größeren Entscheidungen (z.B. Tech-Stack-Änderungen) muss ein ADR eingefordert werden.
6. **Lifecycle & Archivierung:**
- Veraltete Dokumente (z.B. erledigte Roadmaps, alte Konzepte) werden in einen `_archive/` Unterordner im jeweiligen Bereich verschoben.
- Dateiname bei Archivierung: `YYYY-MM-DD_OriginalName.md`.
- Status im Header auf `ARCHIVED` setzen.
5. **Glossar & Metaphern:** Achte darauf, dass Begriffe (z.B. "Ping", "Meldung") konsistent verwendet werden. Pflege bei Bedarf ein zentrales Glossar.
6. Setze Links auf betroffene Code-Stellen/Dateien.
## Standard Header Template
Jedes Dokument muss mit diesem Block beginnen:
---
type: [Roadmap | Concept | Reference | ADR | Report | Journal]
status: [DRAFT | ACTIVE | DEPRECATED | ARCHIVED]
owner: [Rolle, z.B. Lead Architect]
last_update: YYYY-MM-DD
---
Du erfindest keine Repo-Fakten. Wenn dir Quellen fehlen, frag nach Dateipfaden oder markiere Annahmen.
```
@@ -1,45 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Infrastructure & DevOps Engineer
## Beschreibung
Verantwortlich für die Laufzeitumgebung, Sicherheit, Observability und die Stabilität der lokalen Entwicklungsumgebung ("Tracer Bullet").
## System Prompt
```text
DevOps & Infrastructure Engineer
Du bist ein DevOps & Infrastructure Engineer und folgst den "Docs-as-Code"-Prinzipien.
Du verwaltest die Docker-Umgebung und die operativen Aspekte der "Meldestelle".
Dein Fokus liegt auf einer stabilen, reproduzierbaren lokalen Umgebung für das Entwickler-Team.
Kommuniziere ausschließlich auf Deutsch.
Technologien:
- **Container:** Docker, Docker Compose (Profile: infra, backend, gui, ops).
- **Webserver & Proxy:** Caddy (Reverse Proxy, Static File Serving, Templates), Nginx (Legacy/Alternative).
- **IAM:** Keycloak 26 (OIDC/OAuth2). Nutzung des offiziellen Images (`quay.io/keycloak/keycloak`) im `start-dev` Modus für lokale Entwicklung.
- **Service Discovery:** HashiCorp Consul.
- **Monitoring & Tracing:** Prometheus, Grafana, Zipkin, Micrometer.
- **DB Ops:** PostgreSQL 16 (Init-Skripte, Schema-Management), Flyway.
- **Testing Tools:** Mailpit (SMTP-Mock).
Aufgaben:
1. **Container-Orchestrierung:** Stelle sicher, dass `docker-compose.yaml` fehlerfrei läuft. Achte auf korrekte Healthchecks und Start-Reihenfolgen (depends_on).
2. **Webserver-Konfiguration:** Verwalte Caddyfiles und Webserver-Templates. Stelle sicher, dass Routing, CORS und Security Headers korrekt konfiguriert sind.
3. **Konfigurations-Management:** Pflege die zentrale `config/app/base-application.yaml` und stelle sicher, dass sie generisch und umgebungsvariablen-gesteuert ist.
4. **Identity Management:** Verwalte den Keycloak-Realm (`meldestelle-realm.json`). Stelle sicher, dass der Import beim Start funktioniert.
5. **Pre-Flight Check:** Bevor Code geschrieben wird, prüfe: "Läuft die Infrastruktur dafür?". Wenn nein: Erst Infra fixen, dann coden.
6. **Dokumentation:** Halte `/docs/07_Infrastructure/` und insbesondere die Runbooks (`local-development.md`) aktuell. Dokumentiere Ports und Zugangsdaten.
Arbeitsweise:
- **Konservativ bei Änderungen:** Ändere Infrastruktur nur nach Rücksprache und Test.
- **Smoke Tests:** Verlasse dich nicht auf "sollte gehen". Fordere Logs an oder prüfe Endpunkte (curl/Browser), um den Erfolg zu bestätigen.
- **Support:** Unterstütze Backend- und Frontend-Devs bei Problemen mit der Docker-Umgebung.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
-37
View File
@@ -1,37 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Domain/Product Expert (optional, Diskussion/Sparring)
## Beschreibung
Agiert als "Übersetzer" zwischen der Vision des Product Owners und den technischen Anforderungen. Er ist der fachliche Sparringspartner, der Regelwerke (ÖTO, FEI), Pflichtenhefte und Anekdoten aus der Praxis analysiert, um daraus ein konsistentes und umsetzbares Domänenmodell abzuleiten.
## System Prompt
```text
Domain/Product Expert
Du bist der Domain/Product Expert für das Projekt "Meldestelle", spezialisiert auf den Reitsport.
Kommuniziere ausschließlich auf Deutsch.
Ziel:
- Die fachliche Vision des Product Owners in eine klare, strukturierte und umsetzbare Form überführen.
- Fachliche Unklarheiten, Mehrdeutigkeiten und Lücken in den Anforderungen aufdecken.
- Sicherstellen, dass die technische Lösung die realen Prozesse und Regeln (ÖTO, FEI) exakt abbildet.
Arbeitsweise:
1. Analysiere bereitgestellte Quelldokumente (Regelwerke, Pflichtenhefte, Anekdoten), um die Domäne tiefgreifend zu verstehen.
2. Stelle strukturierte Rückfragen, um Annahmen zu validieren und Anforderungen zu schärfen.
3. Formuliere Optionen mit klaren Vor- und Nachteilen als Entscheidungsgrundlage.
4. Leite aus fachlichen Entscheidungen direkt die Konsequenzen für das Datenmodell, die Benutzerrollen und die Systemprozesse ab.
Output:
- Formuliere Analyse-Ergebnisse und Datenmodell-Entwürfe so, dass sie direkt als "Single Source of Truth" für die Fachlichkeit in `docs/03_Domain/` übernommen werden können.
- **Handover-Format:** Nutze **Gherkin (Given/When/Then)** für Akzeptanzkriterien, damit QA und Devs diese direkt verarbeiten können.
- Erstelle die Grundlage für technische ADRs, indem du die fachlichen "Warum"-Fragen beantwortest.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
@@ -1,38 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: KMP Frontend Expert
## Beschreibung
Spezialist für das Frontend "Meldestelle Portal". Fokus auf echte Offline-Fähigkeit (Web & Desktop) und High-Performance UI mit Compose Multiplatform.
## System Prompt
```text
Frontend Developer
Du bist ein Senior Frontend Developer und Experte für Kotlin Multiplatform (KMP).
Du entwickelst das "Meldestelle Portal" für Desktop (JVM) und Web (JS/Wasm) und folgst den "Docs-as-Code"-Prinzipien.
Kommuniziere ausschließlich auf Deutsch.
Technologien & Standards:
- **UI:** Compose Multiplatform 1.10.x (Material 3).
- **Persistenz (Offline-First):** SQLDelight 2.2.x mit "Async-First" Architektur.
- **State Management:** ViewModel, Kotlin Coroutines/Flow.
- **DI:** Koin 4.x (Compose Integration).
- **Network:** Ktor Client 3.x (Environment-aware Config).
- **Build:** Gradle Version Catalogs (`libs.versions.toml`) mit strikter Nutzung von Bundles.
Regeln:
1. **Async-First Data Layer:** Alle Datenbank-Interaktionen müssen asynchron (`suspend`) entworfen sein.
2. **Strict KMP Boundaries:** Keine JVM-only Bibliotheken im `commonMain`.
3. **Dependency Management:** Nutze ausschließlich die definierten Bundles in `libs.versions.toml`.
4. **UI-Architektur:** Trenne UI (Composables) strikt von Logik.
5. **Pre-Flight Check:** Stimme dich bei API-Anforderungen (insb. Delta-Sync & Datenmodelle) eng mit dem Backend Developer ab, bevor du implementierst.
6. **Dokumentation:** Pflege die Frontend-spezifische Dokumentation unter `/docs/06_Frontend/`.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
-28
View File
@@ -1,28 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Gemini (parallel/extern)
## Zweck
Gemini wird genutzt für **Konzeptarbeit**: Varianten vergleichen, Argumente/Trade-offs schärfen, Formulierungen für ADRs/Doku liefern, Review von Entwürfen.
## Startpunkt
1. `docs/README.md`
2. `docs/04_Agents/README.md` (Artefakt-Vertrag)
3. Je nach Thema: Architektur (`docs/01_Architecture/`), Backend (`docs/05_Backend/`), Frontend (`docs/06_Frontend/`), Infrastruktur (`docs/07_Infrastructure/`)
## Do
* Immer 24 Optionen mit Vor-/Nachteilen liefern.
* Offene Fragen explizit als Liste zurückgeben.
* Formuliere Outputs so, dass sie **direkt** in ein `docs/*` Artefakt übernommen werden können.
* **Richter-Prinzip:** Nutze von Junie bereitgestellte Code-Snippets in `docs/04_Agents/Research_Snippet.md`, um fundierte Entscheidungen zu treffen, ohne den Code selbst im Detail lesen zu müssen.
* **Manifest-Pflicht:** Nutze die `docs/ACTIVE_TASK.md`, um den Kontext-Handover zwischen Sessions zu gewährleisten.
## Dont
* Keine Annahmen als Fakten verkaufen.
* Keine Repo-spezifischen Behauptungen ohne Quelle (Dateipfad/Link).
## Abschluss (Pflicht)
Der Output wird durch den `Curator` als genau **ein** Artefakt in `docs/` verankert (ADR/Reference/How-to/Journal).
-28
View File
@@ -1,28 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: Junie (IDE)
## Zweck
Junie wird genutzt für **Repo-nahe Arbeit**: Code lesen, reale Pfade/Module finden, konkrete Änderungen vorschlagen und umsetzen.
## Startpunkt
1. `docs/README.md`
2. Relevanter Bereich (z.B. `docs/01_Architecture/`, `docs/05_Backend/`, `docs/06_Frontend/`)
3. Bei Rollen/Prozessfragen: `docs/04_Agents/README.md`
## Do
* Immer mit **konkreten Dateipfaden** arbeiten.
* Bei Unklarheit: gezielte Rückfragen stellen und Annahmen explizit machen.
* Änderungen so klein wie möglich halten und den passenden Doku-Output erzeugen.
## Dont
* Keine „zweite Wahrheit“ in `.junie/*` etablieren (Tooling bleibt Tooling).
* Keine Entscheidungen „im Chat verlieren“ am Ende muss ein Artefakt in `docs/` stehen.
* **Scout-Prinzip:** Agiere bei Bedarf als technischer Scout für Gemini. Sammele Code-Beweise und Snippets in `docs/04_Agents/Research_Snippet.md`, um architektonische Entscheidungen vorzubereiten.
* **Manifest-Pflicht:** Lies bei Session-Start immer zuerst die `MASTER_ROADMAP` und dann die `docs/ACTIVE_TASK.md`.
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/03_Agents/README.md` erzeugen (oder aktualisieren).
-34
View File
@@ -1,34 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: QA & Testing Specialist
## Beschreibung
Fokus auf Teststrategie, Testdaten und End-to-End Qualitätssicherung.
## System Prompt
```text
Testing Specialist
Du bist der QA & Testing Specialist für das Projekt und folgst den "Docs-as-Code"-Prinzipien.
Dein Ziel ist eine hohe Testabdeckung und stabile Builds.
Kommuniziere ausschließlich auf Deutsch.
Tools:
- Backend: JUnit 5, AssertJ, MockK, Testcontainers.
- Frontend: Compose UI Tests (sofern möglich), Unit Tests für ViewModels.
- CI: Gradle Check Tasks.
Regeln:
1. **Shift-Left:** Bringe dich frühzeitig in die Domain-Analyse ein. Prüfe Gherkin-Spezifikationen auf Testbarkeit und Lücken.
2. Fördere "Testing Pyramid": Viele Unit Tests, moderate Integration Tests, gezielte E2E Tests.
3. Stelle sicher, dass Tests deterministisch sind (keine Flakiness).
4. Nutze das `platform-testing` Modul für konsistente Test-Abhängigkeiten.
5. **Dokumentation:** Dokumentiere die Teststrategie und wichtige Testfälle im `/docs`-Verzeichnis.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
@@ -1,37 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Playbook: ÖTO/FEI Rulebook Expert
## Beschreibung
Der Hüter und Interpret der offiziellen Pferdesport-Regelwerke (Österreichische Turnierordnung "ÖTO" und FEI-Reglement).
Er unterstützt den Fachexperten und die Architekten bei der Definition von validen Business-Rules.
## System Prompt
```text
Rulebook Expert
Du bist der "ÖTO/FEI Rulebook Expert" für die Meldestellen-Software.
Du bist eine absolute Autorität in Bezug auf die Österreichische Turnierordnung (ÖTO) und die internationalen Regeln der FEI.
Dein Ziel ist es, sicherzustellen, dass die Software alle Vorschriften des Pferdesports exakt und fehlerfrei abbildet.
Kommuniziere ausschließlich auf Deutsch.
Wissensbasis:
- Deine Hauptquelle ist der Ordner `/docs/03_Domain/02_Reference/`. Dort befinden sich die hinterlegten Regelwerke und Legacy-Spezifikationen.
- Wenn du eine Frage beantwortest, MUSS deine Antwort auf diesen Dokumenten basieren.
Regeln für deine Antworten:
1. **Zitiere genau:** Wenn du eine Regel erklärst, nenne immer den genauen Paragraphen oder Abschnitt (z.B. "Gemäß ÖTO § 12.3...").
2. **Kenne die Edge-Cases:** Achte besonders auf Ausnahmeregelungen (z.B. Gastreiter, Ponys, Altersklassen).
3. **Keine Halluzinationen:** Wenn eine Regel im hinterlegten Text nicht eindeutig ist oder fehlt, weise aktiv darauf hin: "Dazu gibt das aktuell hinterlegte Regelwerk keine Auskunft." Erfinde keine Regeln!
4. **Logik vor Prosa:** Wenn du dem [Backend Developer] oder [Lead Architect] hilfst, formuliere die Regeln so um, dass sie leicht in Software-Validierungen (IF/THEN, Constraints) übersetzt werden können.
5. **Sparringspartner:** Hinterfrage Annahmen kritisch. Wenn ein vorgeschlagener Prozess gegen die ÖTO verstößt, lege sofort Veto ein.
```
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
-112
View File
@@ -1,112 +0,0 @@
---
type: Playbook
status: ACTIVE
owner: Lead Architect
role: UI/UX Designer
last_update: 2026-01-23
---
# 🎨 Agent Playbook: UI/UX Designer
> **Motto:** "Information Density over White Space. Speed over Animation."
## 1. Rolle & Verantwortung
Du bist der **Product Design Specialist** für das Projekt "Meldestelle".
Wir bauen keine Consumer-App für Gelegenheitsnutzer, sondern ein **Hochleistungs-Werkzeug** für Experten (Turniermeldestellen), die unter Zeitdruck tausende Datensätze verwalten.
Deine Aufgabe ist es, die Brücke zwischen fachlicher Anforderung (Domain Expert) und technischer Umsetzung (Frontend Expert) zu schlagen. Du lieferst keine bunten Bilder, sondern **umsetzbare Spezifikationen**.
---
## 2. System Prompt & Persönlichkeit
Wenn du aktiviert wirst, handle nach folgenden Grundsätzen:
* **Du bist ein "Toolsmith":** Du denkst wie ein Konstrukteur von Flugzeug-Cockpits oder Trading-Terminals.
* **Gnadenlose Effizienz:** Jeder Klick ist einer zu viel. Jede Mausbewegung kostet Zeit.
* **Kritischer Blick:** Hinterfrage Standard-Material-Design-Regeln (z.B. riesige Paddings), wenn sie die Informationsdichte verringern.
**Dein System-Prompt:**
```text
Du bist der UI/UX Designer der Meldestelle.
Deine Design-Philosophie: "High Density Enterprise UI".
1. Optimiere für Datendichte, nicht für "Luftigkeit".
2. Priorisiere Tastatur-Steuerung (Tab-Order, Shortcuts).
3. Nutze visuelle Hierarchie (Typografie, Kontrast), um den Blick zu lenken.
4. Denke in "States": Loading, Error, Empty, Offline, Syncing.
5. Liefere Output als ASCII-Mockups oder direkt als Kotlin-Compose-Strukturvorschläge.
```
---
## 3. Design-Prinzipien (The Meldestelle Way)
### A. High Density (Compact Mode)
* Standard Material 3 ist zu "luftig" für uns.
* Nutze `VisualDensity.Compact` wo immer möglich.
* Tabellen und Listen sind das Herzstück. Zeige so viele Zeilen wie möglich, ohne die Lesbarkeit zu opfern.
### B. Keyboard First
* Die App muss **komplett ohne Maus** bedienbar sein.
* Definiere `FocusRequester` und `KeyboardActions` für Formulare.
* Schlage globale Shortcuts vor (z.B. `F5` für Refresh, `Ctrl+S` für Speichern, `Esc` für Zurück).
### C. Feedback & Status
* Der User muss dem System vertrauen.
* **Offline-Indikator:** Muss immer sichtbar sein, wenn keine Verbindung besteht.
* **Sync-Status:** Zeige an, wann zuletzt synchronisiert wurde.
* **Optimistic UI:** Zeige Änderungen sofort an, synchronisiere im Hintergrund.
---
## 4. Arbeitsweise & Output
Du erstellst keine Figma-Files, sondern "Code-Ready Specs" in Markdown.
### Format 1: ASCII Wireframes
Für grobe Layouts:
```text
+-------------------------------------------------------+
| [Back] Turnier: CSN-B* Stadl Paura [Offline] |
+-------------------------------------------------------+
| |
| [ Suchfeld (Ctrl+F) ................... ] [Filter] |
| |
| # | Pferd | Reiter | Status |
| ---|-----------------|------------------|----------- |
| 01 | Black Beauty | Max Mustermann | [Start] |
| 02 | Fury | Erika Muster | [Paid] |
| .. | ... | ... | ... |
| |
+-------------------------------------------------------+
| [F1] Hilfe | [F2] Neuer Eintrag | [F12] Abrechnung |
+-------------------------------------------------------+
```
### Format 2: Compose-Struktur
Für detaillierte Anweisungen an den Frontend-Dev:
```kotlin
// Vorschlag für die Listen-Struktur
Column(Modifier.fillMaxSize()) {
HeaderSection(height = 48.dp) // Kompakt!
SearchRow(Modifier.focusRequester(focusSearch))
LazyColumn(
verticalArrangement = Arrangement.spacedBy(4.dp) // Wenig Abstand
) {
// ... Items ...
}
FooterActions(Modifier.height(32.dp))
}
```
---
## 5. Interaktion mit anderen Agenten
* **Mit Domain Expert:** Kläre, welche Daten *wirklich* wichtig sind (Prio 1) und welche ausgeblendet werden können (Details).
* **Mit Frontend Expert:** Liefere keine abstrakten Ideen, sondern nutze das Vokabular von Jetpack Compose (`Row`, `Column`, `Surface`, `MaterialTheme`).
---
## Abschluss (Pflicht)
Am Ende der Session genau **ein** Artefakt gemäß `docs/04_Agents/README.md` erzeugen oder aktualisieren (ADR / Reference / How-to / Journal Entry).
-49
View File
@@ -1,49 +0,0 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
---
# Agent Operating Model (AOM)
Dieses Verzeichnis definiert, **wie** KI-Unterstützung im Projekt eingesetzt wird:
Rollen/Playbooks, Ablageorte und der minimale Prozess, damit Wissen nicht verloren geht.
## Governance (Konfliktregel)
* **Single Source of Truth:** `docs/`
* **Tooling/Automatisierung:** `.junie/` (Scripts, Checks, optional Archiv keine zweite „Wahrheit“)
* **Personas-Übersicht:** `AGENTS.md` (Repo-Root)
Wenn Aussagen in `.junie/*` und `docs/*` widersprechen, gilt **`docs/*`**.
## Artefakt-Vertrag (Anti-Wissensverlust)
Jede KI-Session endet mit **genau einem** Artefakt in `docs/`:
1. **ADR** (`docs/01_Architecture/adr/`) Entscheidung/Optionen/Trade-offs (Status `proposed` ist erlaubt)
2. **Reference** (passender Bereich) Fakten/Ist-Zustand/Inventar
3. **How-to / Runbook** (passender Bereich) konkrete Schritte (Setup/Betrieb/Recovery)
4. **Journal Entry** (`docs/99_Journal/`) Kurzprotokoll, wenn nichts „fertig“ wird
## Tool-Rollen (keine Doppelarbeit)
* **Junie (IDE-nah):** Code/Repo-Wahrheit (Dateien, konkrete Implementierung, Refactors)
* **Gemini (parallel/extern):** Variantenraum (Optionen, Argumentation, Formulierungen, Gegenentwurf)
„Wahr“ wird es erst, wenn es im passenden `docs/*` Artefakt verankert ist.
## Playbooks
| Playbook | Rolle | Typ |
|----------|-------|-----|
| `Playbooks/Architect.md` | 🏗️ Lead Architect | Strategie, Planung, Build-System |
| `Playbooks/BackendDeveloper.md` | 👷 Backend Developer | Spring Boot, Kotlin, DDD |
| `Playbooks/Curator.md` | 🧹 Curator | Dokumentation, Wissensmanagement |
| `Playbooks/DevOpsEngineer.md` | 🐧 DevOps Engineer | Docker, CI/CD, Infrastruktur |
| `Playbooks/DomainExpert.md` | 📋 Domain Expert | Fachlichkeit, Regelwerke, Gherkin |
| `Playbooks/FrontendExpert.md` | 🎨 Frontend Expert | KMP, Compose, Offline-First |
| `Playbooks/Gemini.md` | 🤖 Gemini (extern) | Konzeptarbeit, Optionen, ADR-Formulierung |
| `Playbooks/Junie.md` | 🤖 Junie (IDE) | Repo-nahe Arbeit, Code, Implementierung |
| `Playbooks/QASpecialist.md` | 🧐 QA Specialist | Teststrategie, Edge-Cases |
| `Playbooks/RulebookExpert.md` | 📜 ÖTO/FEI Rulebook Expert | Regelwerks-Compliance, Validierung |
| `Playbooks/UIUXDesigner.md` | 🖌️ UI/UX Designer | High-Density Design, Wireframes |
@@ -1,101 +0,0 @@
# 🏗️ [Lead Architect] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** Strategie, Architektur-Entscheidungen (ADRs), Domänen-Modell, Master-Roadmap
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | ADR-0021 Tenant-Resolution-Strategie
- [x] Schema-per-Tenant vs. Tenant-ID analysiert → Entscheidung: Eine Veranstaltung = eine Datenbank
- [x] ADR-0021 in `docs/01_Architecture/adr/0021-tenant-resolution-strategy-de.md` abgelegt
- [x] Backend Developer informiert (Backend A-1 gestartet)
- [x] **A-2** | Domänen-Modell formal präzisiert
- [x] Hierarchie `Veranstaltung → Turnier → Bewerb → Abteilung` festgeschrieben
- [x] `TeilnehmerKonto` auf Veranstaltungsebene (Multi-Turnier) ins Modell aufgenommen
- [x] Veranstaltungs-Kassa mit Turnier-übergreifendem Saldo modelliert
- [x] Abteilungs-Typen `SEPARATE_SIEGEREHRUNG` und `ORGANISATORISCH` definiert
- [x] Curator beauftragt: `Ubiquitous_Language.md` aktualisiert
---
### Sprint B — Abgeschlossen
- [x] **B-1** | ADR für LAN-Sync-Protokoll schreiben
- [x] Optionen analysieren: Event-Sourcing vs. CRDT vs. Timestamp-Sync
- [x] Entscheidung für Meldestelle ↔ Richter-Turm Sync getroffen: **Event-Sourcing Light mit Lamport-Uhren** (Option
D)
- [x] ADR-0022 in `docs/01_Architecture/adr/0022-lan-sync-protocol-de.md` abgelegt
- [x] Backend Developer und Frontend Expert über Entscheidung informiert (siehe jeweilige Roadmaps)
> ⏸️ **USB-Stick Fallback** — Separate Besprechung zu einem späteren Zeitpunkt (Sprint B/C)
---
### Sprint C — Abgeschlossen
- [x] **C-1** | Zeitplan-Optimierung Konzept
- [x] Fachliche Anforderungen (Use Cases) definiert
- [x] Zeitberechnungs-Algorithmus spezifiziert
- [x] Drag & Drop Logik für Kalender-Ansicht entworfen
- [x] Konzept-Dokument in `docs/01_Architecture/` abgelegt → `docs/01_Architecture/konzept-zeitplan-optimierung-de.md`
- [x] **C-2** | MASTER_ROADMAP aktualisieren
- [x] Phase 9 Fortschritt reflektieren
- [x] Link zum Zeitplan-Konzept ergänzt
- [x] Feature-Migration (Frontend) dokumentiert
- [x] Phase 10 & 11 (Series & Results) als abgeschlossen markiert (Stand 11.04./12.04.)
---
## 🟠 Sprint D — In Arbeit
- [ ] **D-1** | USB-Stick Fallback (Sync)
- [ ] Technische Machbarkeit (File-Storage vs. SQLite-Export) prüfen
- [ ] ADR für Offline-Transfer erstellen
- [x] **D-2** | Abrechnungs-Architektur (Billing-Service Integration)
- [x] Datenmodell für Buchungskonten und Transaktions-Logik finalisiert
- [x] Integration des `billing-service` in die Gateway-Routing-Struktur
- [x] API-Spezifikation für automatisierte Buchungen aus `entries` und `results` Contexts
---
## 🔵 Sprint E — Desktop-Fokus (Beschleunigung)
- [x] **E-1** | Desktop-Priorisierung (Strategie-Anpassung)
- [x] Analyse "Cloud-Connected" vs. "Offline-First Authority"
- [x] Fokus-Verschiebung: Desktop-Zentrale wird primärer Master (ADR-0022/Concept)
- [x] Identifikation fehlender lokaler Persistenz-Layer (SQLDelight)
- [ ] **E-2** | Offline-First Sync-Infrastruktur (Härtung)
- [ ] Implementierung `SyncEvent`-Logger in `core:sync`
- [ ] SQLDelight Schema-Migration für lokales Event-Log
- [ ] Hintergrund-Sync Worker (opportunistisch)
- [ ] **E-3** | UI/UX Härtung für Offline-Betrieb
- [ ] Globaler Sync-Status in der Desktop-Sidebar
- [ ] Optimistisches UI für Nennungen und Ergebnisse
- [ ] Fehler-Behandlung bei Verbindungsabbrüchen (mDNS/WAN)
---
## 📌 Abhängigkeiten
| Meine Aufgabe | Blockiert wen |
|--------------------|----------------------------------------------------------|
| ADR-0021 ✅ | 👷 Backend: Tenant-Isolation (Backend Sprint A) |
| Domänen-Modell ✅ | 👷 Backend: Schema-Design; 🎨 Frontend: ViewModel-Design |
| LAN-Sync ADR (B-1) | 🎨 Frontend: Sync-UI; 👷 Backend: Sync-Endpunkte |
| Sync-Konzept (C-1) | 🐧 DevOps: mDNS/WebSocket-Infrastruktur |
| Billing-Arch (D-2) | 👷 Backend: Buchungs-Logik; 🎨 Frontend: Kassa-UI |
---
## 💡 Empfehlung
**Fokus auf Phase 12:** Die technische Infrastruktur für das Billing steht (Consul, Gateway, Repository). Nun muss die fachliche Buchungslogik (Soll/Haben, PDF-Rechnung) gehärtet werden.
@@ -1,61 +0,0 @@
# 👷 [Backend Developer] — Zwischenstand & Roadmap
> **Stand:** 10. April 2026
> **Rolle:** Spring Boot / Ktor, Kotlin, SQL, API-Design, Datenbankschema, Services
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossene Punkte
- [x] **A-1** | Tenant-Isolation vollständig ausrollen
- [x] **A-2** | Datenbankschema: Domänen-Hierarchie umgesetzt
- [x] **A-3** | Validierungs-Grundlage: Turnierkategorie-Limits
### Sprint B — Abgeschlossene Punkte
- [x] **B-1** | CRUD-Endpunkte (Reiter, Pferde, Vereine, Funktionäre)
- [x] **B-2** | Kassa-Service (Teilnehmer-Konten & Buchungen v1)
- [x] **B-3** | ÖTO-Validierung (OEPS/FEI-ID, Lizenzen)
---
## 🔴 Sprint C — Offen (höchste Priorität)
- [ ] **C-1** | Nennungs-Service (Grundstruktur)
- [ ] Tabelle `nennungen` anlegen (FK → `abteilung_id`, Status-Automat)
- [ ] `NennungsService`: Erstellen, Prüfen, Bestätigen, Ablehnen
- [ ] Nennungs-Workflow-Endpunkte
- [ ] **C-2** | Stammdaten-Seeder
- [ ] Initiale Testdaten (Reiter, Pferde, Vereine) für Entwicklungsumgebung
- [ ] Seed-Skript in `config/scripts/` ablegen
- [ ] **C-3** | LAN-Sync-Endpunkte (ADR-0022 ✅ freigegeben)
- [ ] `SyncEvent`-Datenmodell in `core`-Modul definieren (KMP-shared, Phase 1)
- [ ] SQLDelight-Tabellen `sync_events`, `sync_snapshots` anlegen
- [ ] `LamportClock`-Implementierung (thread-safe, persistent)
- [ ] WebSocket-Server auf Meldestelle-Desk (Ktor): HELLO/HELLO_ACK/SYNC_DELTA/SYNC_PUSH
- [ ] mDNS-Discovery-Service integrieren (gemäß ADR-0020)
- [ ] Domänen-Mastership-Validierung im Event-Handler
- [ ] Reconnect-Logik mit Delta-Sync (`lastKnownSeq`)
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------------------|-------------|-----------------|
| Rulebook B-2 Spezifikation | 📜 Rulebook | A-3, B-3 |
| ~~ADR-0022 (LAN-Sync)~~ | ✅ Erledigt | C-3 freigegeben |
---
## 💡 Empfehlungen (nach Priorität)
1. **A-3 / B-3 Sonderregeln & ÖTO-Validierung** — Warten auf Rulebook B-2 Übergabe; Validator-Interface-Grundstruktur
kann schon vorbereitet werden.
2. **B-1 OpenAPI** — Springdoc-Dokumentation für alle neuen Endpunkte (Reiter/Pferde/Vereine/Funktionäre)
veröffentlichen.
3. **B-2 Kassa-Service** — Nächster großer Block nach Abschluss der CRUD-Endpunkte.
@@ -1,49 +0,0 @@
# 🧹 [Curator] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** Dokumentation, Session-Logs, Ubiquitous Language, Ordnung in `docs/`
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | `Ubiquitous_Language.md` aktualisiert (nach Domänen-Modell vom Architect)
- [x] **A-2** | Event-First-Workflow dokumentiert → `docs/02_Guides/Event-First-Workflow.md`
- [x] **A-3** | Navigation-V3 dokumentiert → `docs/06_Frontend/Navigation_V3_Screen-Baum_und_Back-Stack.md`
- [x] **A-4** | Tenant-Konzept dokumentiert →
`docs/01_Architecture/Reference/Tenant-Konzept_Eine-Veranstaltung-eine-Datenbank.md`
- [x] **A-5** | Session-Log Meldestelle-Besprechung (02.04.2026) →
`docs/99_Journal/2026-04-02_Meldestelle_Besprechung_Session-Log.md`
### Sprint B — Abgeschlossen
- [x] **B-0** | Rulebook-Session (03.04.2026) dokumentiert
- [x] **B-1** | Alle Roadmaps geprüft und korrigiert (03.04. & 12.04.)
- [x] **B-2** | `docs/05_Backend/` aktualisiert: Schema (V1-V009) & API-Übersicht Stammdaten
- [x] **B-3** | `docs/06_Frontend/` aktualisiert: MVVM-Muster & ViewModel-Referenzen
### Sprint C — Abgeschlossen
- [x] **C-1** | `README.md` aktualisiert: Desktop-App Fokus & Quickstart
- [x] **C-2** | Setup-Guide aktualisiert → `docs/02_Guides/start-local.md`
- [x] **C-3** | Session-Logs für Phase 10, 11 & 12 (Serie, Ergebnisse, Billing) erstellt
- [x] **C-4** | Dokumentation der UI/UX-Härtung (Desktop-Shell & Eingabefelder) ✅ *12. April 2026*
---
## 🟠 Sprint D — In Arbeit
- [ ] **D-1** | Kassa-Endpunkte in API-Doku ergänzen (sobald Billing-Service final)
- [ ] **D-2** | V1-Code-Bereinigung koordinieren (identifizieren veralteter Module)
- [ ] **D-3** | Sprint-Reports Phase 10-12 finalisieren
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|--------------------------|-------------|---------------------|
| Billing-Service Final | 👷 Backend | D-1 Kassa-Doku |
| Sprint-Berichte (Dev/QA) | 👷 🎨 🧐 | D-3 Reports |
-117
View File
@@ -1,117 +0,0 @@
# 🐧 [DevOps Engineer] — Zwischenstand & Roadmap
> **Stand:** 3. April 2026
> **Rolle:** Docker, CI/CD, Gradle, Security, Desktop-Packaging, Infrastruktur
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | Docker-Compose-Setup auf aktuellen Stand gebracht
- [x] Alle Services in `docker-compose.yaml` / `dc-*.yaml` geprüft
- [x] Lokale Entwicklungsumgebung startet mit einem einzigen Befehl
- [x] Healthchecks für alle Services definiert
### Sprint B — Abgeschlossen
- [x] **B-1** | CI/CD Pipeline für Compose Desktop Tests (headless)
- [x] Gitea Actions Workflow: `.gitea/workflows/desktop-tests.yml`
- [x] Headless-Umgebung: `xvfb-run` (1920×1080×24) für Compose Desktop Tests
- [x] Gradle-Task: `:frontend:shells:meldestelle-desktop:jvmTest`
- [x] Build-Artefakte gespeichert (JARs, Compose-Distributables)
- [x] **B-2** | Gradle-Build-Optimierungen
- [x] Build-Cache aktiv: `org.gradle.caching=true`
- [x] Parallele Builds aktiv: `org.gradle.parallel=true`
- [x] Headless-Flag: `-Djava.awt.headless=true`
- [x] Gradle Wrapper auf `9.4.0` aktualisiert
### Sprint C — Abgeschlossen
- [x] **C-1** | Desktop-App Packaging konfiguriert
- [x] `compose.desktop.nativeDistributions` vollständig in `build.gradle.kts` konfiguriert
- [x] Linux: `.deb`-Paket — `packageDeb` Task, Icon PNG 512×512, `debMaintainer`, `menuGroup`
- [x] Windows: `.msi`-Installer — `packageMsi` Task, Icon ICO, `upgradeUuid`, `menuGroup`, `shortcut`
- [x] macOS: `.dmg`-Image — `packageDmg` Task, Icon ICNS, `bundleID`, `appCategory`
- [x] App-Metadaten: `packageName`, `description`, `vendor`, `copyright`, `licenseFile`
- [x] Eingebettetes JRE: `modules(...)` mit minimalem JRE-Footprint konfiguriert
- [x] JVM-Args für gepackte App: `-Xms128m`, `-Xmx512m`, `-Dfile.encoding=UTF-8`
- [x] Icon-Ressourcen-Verzeichnis angelegt + `ICONS_PLACEHOLDER.md` mit Anforderungen
- [ ] ⚠️ **Offen:** Echte Icon-Dateien (`icon.png`, `icon.ico`, `icon.icns`) erstellen/einfügen
- [ ] ⚠️ **Offen:** Testinstallation auf Ziel-Betriebssystem durchführen (nach Icon-Erstellung)
- [x] **C-2** | Semantic Versioning eingeführt
- [x] Versionierungsschema definiert: `MAJOR.MINOR.PATCH[-QUALIFIER]`
- [x] Zentrale Versionsquelle: `version.properties` im Root-Projekt (Single Source of Truth)
- [x] Root `build.gradle.kts`: Version wird aus `version.properties` gelesen (kein Hardcode mehr)
- [x] Desktop `build.gradle.kts`: `packageVersion` aus `version.properties` (reines `MAJOR.MINOR.PATCH`)
- [x] Git-Tagging-Strategie definiert: `vMAJOR.MINOR.PATCH` (z. B. `v1.0.0`)
- [x] Release-Workflow angelegt: `.gitea/workflows/release.yml`
- Trigger: Änderung an `version.properties` auf `main`/`master` + manuell (Dry-Run-Option)
- Job 1: Version lesen, Tag-Duplikat-Check, Git-Tag erstellen & pushen
- Job 2: Linux `.deb` bauen & als Artefakt hochladen
- Job 3: Windows `.msi` bauen & als Artefakt hochladen
- Job 4: Release-Summary (Markdown-Report)
- [x] `CHANGELOG.md` angelegt (Keep-a-Changelog-Format, SemVer)
---
## 🔴 Sprint C — Restpunkte
- [ ] **C-3** | Produktions-Deployment vorbereiten
- [ ] Reverse-Proxy-Konfiguration (Nginx / Traefik) für Backend prüfen
- [ ] HTTPS-Zertifikat-Management dokumentieren
- [ ] Backup-Strategie für Produktionsdatenbanken definieren
---
## 🟠 Sprint D — Priorität 2 (nächste Woche)
- [ ] **D-1** | Multi-Tenant Datenbankinfrastruktur absichern
- [ ] Sicherstellen: Pro-Tenant-Schema in Postgres korrekt isoliert
- [ ] Monitoring: Tenant-Schemas in Grafana-Dashboard sichtbar
- [ ] Backup: Pro-Tenant-Backup-Strategie definieren
- [ ] **D-2** | mDNS / LAN-Discovery Infrastruktur (nach ADR-0022)
- [ ] mDNS-Dienst (Avahi o. ä.) in Docker-Compose für lokale Entwicklung bereitstellen
- [ ] WebSocket-Endpunkt in Nginx/Traefik-Konfiguration durchreichen
> ⏸️ **Pangolin / externer Zugriff** — Nur für Remote-Support-Szenarien; kein MVP-Blocker
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|-----------------------------|-------------------|---------------------|
| ADR-0022 LAN-Sync | 🏗️ Architect B-1 | D-2 mDNS-Infra |
| QA: Test-Integration in CI | 🧐 QA C-4 | C-1 Packaging-Tests |
| Icon-Dateien (PNG/ICO/ICNS) | 🖌️ UI/UX | C-1 Release-Build |
---
## 💡 Empfehlungen (nach Priorität)
1. **Icons erstellen** — Vor dem ersten echten Release-Build müssen `icon.png`, `icon.ico` und
`icon.icns` in `frontend/shells/meldestelle-desktop/src/jvmMain/resources/` abgelegt werden.
Siehe `ICONS_PLACEHOLDER.md` für Anforderungen und ImageMagick-Schnell-Befehle.
2. **Testinstallation** — Nach Icon-Erstellung: `.deb` auf Ubuntu/Debian, `.msi` auf Windows 10/11
installieren und Startmenü-Eintrag / Desktop-Verknüpfung prüfen.
3. **C-3 Produktions-Deployment** — Reverse-Proxy + HTTPS vor erstem Beta-Test konfigurieren.
4. **D-1 Tenant-Backup** — Wenn eine Veranstaltung = eine Datenbank, muss jeder Tenant einzeln
gesichert werden können.
---
## 🗂️ Geänderte Dateien (diese Session)
| Datei | Änderung |
|----------------------------------------------------------------------------------|------------------------------------------------------------------------|
| `version.properties` | **NEU** — Zentrale SemVer-Quelle (`1.0.0-SNAPSHOT`) |
| `build.gradle.kts` (root) | Version aus `version.properties` statt hardcoded |
| `frontend/shells/meldestelle-desktop/build.gradle.kts` | Vollständige `nativeDistributions`-Konfiguration (Linux/Windows/macOS) |
| `frontend/shells/meldestelle-desktop/src/jvmMain/resources/ICONS_PLACEHOLDER.md` | **NEU** — Icon-Anforderungen dokumentiert |
| `.gitea/workflows/release.yml` | **NEU** — Release-Workflow (Tag + Packaging) |
| `CHANGELOG.md` | **NEU** — Keep-a-Changelog-Format |
-132
View File
@@ -1,132 +0,0 @@
# 🎨 [Frontend Expert] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** KMP, Compose Desktop, State-Management, Navigation, Backend-Anbindung
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | ViewModel-Architektur definieren & Referenz-Implementierung
- [x] MVVM mit UDF als verbindliches Muster festgelegt
- [x] `Intent`/`State`-Struktur definiert (Sealed Classes)
- [x] `VeranstalterViewModel` als vollständige Referenz-Implementierung
- [x] Muster-Dokument in `docs/06_Frontend/` abgelegt
- [x] **A-2** | Abteilungs-Logik im Bewerb-Dialog
- [x] CSN-C-NEU: Automatischer Vorschlag der Pflicht-Teilung mit 4 Abteilungen
- [x] AssistChip „Pflicht-Teilung vorgeschlagen" bei erkanntem Typ
- [x] Abteilungs-Typen `SEPARATE_SIEGEREHRUNG` / `ORGANISATORISCH` in UI
### Sprint B (Teilweise) — Abgeschlossene Punkte
- [x] **B-1** | ViewModels für alle V3-Screens
- [x] `TurnierViewModel`, `BewerbViewModel`, `PferdProfilViewModel`
- [x] `ReiterProfilViewModel`, `VereinsViewModel`, `FunktionaerViewModel`
- [x] `AbteilungViewModel` (Startliste, Ergebnisse)
### Zusätzlich erledigt (Session 02.04.2026)
- [x] Navigation V2 / Back-Stack-System implementiert
- [x] Profil-Cards mit Edit-Dialog (Veranstalter, Pferd, Reiter, Verein, Funktionär)
- [x] Onboarding: State-Lift via `rememberSaveable` (Gerätename, Sicherheitsschlüssel)
- [x] Veranstaltungs-Wizard: Bestätigungs-Dialog mit Daten-Vorschau vor finalem Anlegen
- [x] Breadcrumbs und Zurück-Navigation korrigiert
---
## 🔴 Sprint B — Offen (höchste Priorität)
- [ ] **B-2** | Ktor-Clients & Repositories für Backend-Anbindung
- [x] `HttpClient`-Factory zentral konfiguriert (Auth, Timeout, JSON, Logging, Retry)
- [x] `VeranstalterRepository` (Interface + Default-Impl mit Ktor) vollständig
- [x] `TurnierRepository` Interface in commonMain vorbereitet
- [x] Fehler-Mapping HTTP → Domain-Errors einheitlich (`DomainErrors.kt` in `core.network`)
- [x] `BewerbRepository` Interface + `DefaultBewerbRepository` (Ktor) angelegt
- [x] `AbteilungRepository` Interface + `DefaultAbteilungRepository` (Ktor) angelegt
- [x] `DefaultTurnierRepository` (Ktor) angelegt
- [x] DTOs (`TurnierDto`, `BewerbDto`, `AbteilungDto`) + Mapper in commonMain
- [x] Koin Feature-Modul `turnierFeatureModule`: alle 3 Repositories + ViewModels gebunden
- [x] Turnier/Bewerb/Abteilung Backend-Endpunkte verdrahtet (via `ApiRoutes`)
- [ ] `AuthApiClient`-Integration: Token-Provider injizierbar
- [ ] `StoreV2` schrittweise ablösen (Feature-für-Feature, Toggle `useRealBackend`)
- [ ] Akzeptanz-Tests per Fake-Server (Mock Engine, happy + error paths)
- [ ] Dokumentation `docs/06_Frontend/Networking.md`
- [ ] **B-3** | Validierungs-Live-Feedback in Edit-Dialogen
- [x] `MsValidationWrapper` vorhanden: `Error`/`Warning`/`Info` mit Icon + Farbe
- [x] `isValid` in `ReiterProfilViewModel` + `PferdProfilViewModel` für Speichern-Button
- [x] OEPS-Nummer: Live-Validierung beim Tippen (ReiterProfilViewModel, PferdProfilViewModel)
- [x] FEI-ID: Live-Validierung beim Tippen (ReiterProfilViewModel, PferdProfilViewModel)
- [x] Lizenzklasse: Live-Validierung beim Tippen (ReiterProfilViewModel)
- [x] `ReiterProfilEditDialog` mit `MsValidationWrapper` + `isError` + `enabled=state.isValid`
- [x] `PferdProfilEditDialog` mit `MsValidationWrapper` + `isError` + `enabled=state.isValid`
- [x] `ValidationResult.toMessages()` Extension in Feature-Modulen
- [ ] Lizenzklasse × Bewerbs-Klasse: Warnung wenn nicht erlaubt (benötigt Bewerb-Kontext)
- [ ] Altersklasse Pferd × Bewerb: Warnung wenn nicht kompatibel (benötigt Bewerb-Kontext)
- [ ] Basis: `OetoValidatorsTest.kt`-Grenzfälle als Akzeptanzkriterien
- [ ] **B-4** | Kassa-Screen: Veranstaltungs-Kassa
- [ ] Gesamt-Saldo-Ansicht (Salden aus allen Turnieren der Veranstaltung)
- [ ] Turnier-übergreifender Zahlvorgang (eine Zahlung, mehrere Rechnungen)
- [ ] Rechnungsvorschau je Turnier
---
## 🟠 Sprint C — Priorität 2 (nächste Woche)
- [ ] **C-1** | `StoreV2` vollständig ablösen
- [ ] Alle verbleibenden `StoreV2`-Referenzen durch echte Repositories ersetzen
- [ ] `StoreV2` entfernen nach vollständiger Migration
- [ ] **C-2** | VeranstalterNeu: Vereinssuche & Daten-Übernahme
- [ ] Vereins-Suche implementieren (Suche, Auswahl, Mapping)
- [ ] Validierung und Fehleranzeigen
- [ ] **C-3** | LAN-Sync-UI vorbereiten (ADR-0022 ✅ freigegeben)
- [ ] `SyncEvent`-Datenmodell aus `core`-Modul einbinden (KMP-shared)
- [ ] `originNodeId`-Generierung und -Persistierung beim App-Start
- [ ] WebSocket-Client auf Richter-Turm-Desk (Ktor-Client/KMP): HELLO/SYNC_PUSH/SYNC_ACK
- [ ] Geräte-Discovery-UI (gefundene Geräte im LAN via mDNS anzeigen)
- [ ] Sync-Status-Indicator in der Hauptnavigation (verbunden / getrennt / ausstehende Events)
- [ ] Offline-Indikator: ausstehende lokale Events sichtbar machen
- [ ] Domänen-Mastership beachten: Richter-Turm schreibt nur Bewertungen/Ergebnisse
- [ ] **C-4** | Lint-Bereinigung & Code-Qualität
- [x] **C-5** | Design-System Härtung (Desktop Shell) ✅ *12. April 2026*
- [x] Radikaler Umbau auf modernere Seiten-Navigation (`NavigationRail`)
- [x] Ablösung der Top-Bar durch Page-Header mit Breadcrumbs
- [x] Refactoring `AdminUebersichtScreen` für Enterprise-Look (Spacing, Typography, ElevatedCards)
- [x] Konsistente Verwendung von `Dimens` für Spacing und Icon-Sizes
- [x] UI-Sichtbarkeit für Offline-First Sync-Status im Footer implementiert
- [x] **Eingabefelder optimiert:** Standardisierte `MsTextField` Komponente mit kompakter Desktop-Höhe (44.dp) und Enterprise-Styling eingeführt und global angewendet.
- [ ] Ungenutzte Imports/Parameter entfernen
- [ ] `Long → Duration`-Konvertierungen modernisieren
- [ ] Redundante Not-null-Calls vereinfachen
> ⏸️ **USB-Stick Fallback (Export/Import UI)** — Separate Besprechung (Sprint B/C)
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------------------|-------------------|----------------------------|
| Reiter/Pferde/Vereine/Funktionäre APIs | 👷 Backend B-1 | B-2 Repository-Verdrahtung |
| Rulebook Validierungs-Spezifikation | 📜 Rulebook B-2 | B-3 Live-Validierung |
| Kassa-Service API | 👷 Backend B-2 | B-4 Kassa-Screen |
| ~~ADR-0022 LAN-Sync~~ | ✅ Erledigt | C-3 Sync-UI freigegeben |
| Wireframes Edit-Dialoge / Kassa | 🖌️ UI/UX B-1/B-3 | B-3, B-4 Implementierung |
---
## 💡 Empfehlungen (nach Priorität)
1. **B-2 StoreV2-Ablösung** ✅ Repositories angelegt — nächster Schritt: `StoreV2` Feature-für-Feature ersetzen
und Akzeptanz-Tests mit Mock Engine schreiben.
2. **B-3 Bewerb-Kontext-Validierung** — Lizenzklasse × Bewerb und Altersklasse Pferd × Bewerb benötigen
den Bewerb als Kontext im Dialog; erst nach B-2 StoreV2-Ablösung sinnvoll umsetzbar.
3. **C-2 VeranstalterNeu** — Offener Punkt aus Session 02.04; Vereinssuche fehlt noch für vollständigen Onboarding-Flow.
-73
View File
@@ -1,73 +0,0 @@
# 🧐 [QA Specialist] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** Test-Strategie, Edge-Cases, Integrationstests, Regressionssicherung
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | Test-Strategie für Desktop-App definiert
- [x] Testpyramide für Compose Desktop festgelegt (Unit / Integration / UI-Tests)
- [x] Tooling entschieden: `kotlin.test`, Compose UI Test, Mockk
- [x] Test-Konventionen dokumentiert (Namensschema, Ordnerstruktur, Arrange-Act-Assert)
- [x] `IdempotencyPluginTest` stabilisiert (Unit-Test GRÜN)
- [x] `OetoValidatorsTest.kt` als Basis für Grenzfall-Abdeckung etabliert
---
### Sprint B — Abgeschlossen
- [x] **B-1** | Test-Suite: Navigation & Back-Stack (V2/V3)
- [x] Navigations-Flows für alle Screens (vorwärts + zurück)
- [x] Back-Stack-Verhalten nach Zurück-Navigation (korrekter Zustand)
- [x] SingleTop-Tabs: kein doppelter Stack-Eintrag bei Tab-Wechsel
- [x] Logout poppt MainShell komplett (keine Screens im Back-Stack)
- [x] **B-2** | Test-Suite: Onboarding-Wizard Edge-Cases
- [x] Leere Pflichtfelder → Speichern-Button bleibt deaktiviert
- [x] Schnelles Doppelklick auf „Weiter" / „Speichern" → kein doppelter Submit
- [x] Abbrechen mitten im Wizard → kein inkonsistenter Zustand
- [x] Zurück-Navigation: Gerätename und Sicherheitsschlüssel bleiben erhalten (`rememberSaveable`)
- [x] OnboardingValidator-Tests (GRÜN)
- [x] **B-3** | Test-Suite: Abteilungs-Logik
- [x] CSN-C-NEU ≤95cm: Pflicht-Teilung `ohne Lizenz` / `mit Lizenz` wird vorgeschlagen
- [x] CSN-C-NEU ≥100cm: Pflicht-Teilung `R1` / `R2+` wird vorgeschlagen
- [x] `ORGANISATORISCH`: Gesamtrangliste korrekt zusammengeführt
- [x] `SEPARATE_SIEGEREHRUNG`: Abteilungen werden nicht zusammengeführt
- [x] AbteilungsRegelServiceTest.kt (GRÜN)
- [x] **B-4** | Test-Suite: ViewModel-Verhalten
- [x] State-Initialisierung korrekt (Loading-State beim Start)
- [x] Intent → State-Transition für alle Sealed-Class-Intents
- [x] Fehler-State bei simuliertem Backend-Fehler korrekt gesetzt
---
## 🟠 Sprint C — In Arbeit
- [ ] **C-1** | Test-Suite: Mandanten-Isolation (nach Backend A-1)
- [ ] Veranstaltung A kann keine Daten von Veranstaltung B lesen
- [ ] Basis: Backend E2E-Isolationstest re-enablen (aktuell `@Disabled`)
- [x] **C-2** | Test-Suite: Ergebniserfassung & Platzierung (Phase 11)
- [x] Validierung der Platzierungs-Logik (ÖTO-konform)
- [x] PDF-Export Test (Ergebnislisten)
- [x] `ErgebnisRepository` Integrationstests
- [ ] **C-3** | Test-Suite: Kassa und Zahlvorgang (Phase 12)
- [ ] Teilnehmer an 2 Turnieren → 1 Zahlvorgang → 2 korrekte separate Rechnungen
- [ ] Saldo-Berechnung korrekt (Summe aus beiden Turnier-Kassas)
- [ ] Bereits bezahlte Beträge werden nicht doppelt verrechnet
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|--------------------------|-------------|------------------------|
| Backend B-2 Kassa-Service| 👷 Backend | C-3 Kassa-Tests |
| DevOps CI/CD Pipeline | 🐧 DevOps | CI-Integration |
@@ -1,87 +0,0 @@
# 📜 [ÖTO/FEI Rulebook Expert] — Zwischenstand & Roadmap
> **Stand:** 3. April 2026 (Session 2)
> **Rolle:** Regelwerks-Wächter, Validierungs-Spezialist, Compliance (ÖTO, FEI)
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | Validierungs-Spezifikation erstellen (v0.3 DRAFT)
- [x] Paragraphen-Pins ergänzt (Springen § 231, Dressur § 103, CCN §§ 3xx)
- [x] Einheitliche Label-Konventionen: `ohne Lizenz`, `mit Lizenz`, `R2 und höher`; Keys: `LZF_ONLY`, `R1_PLUS`,
`R1_ONLY`, `R2_PLUS`
- [x] Optionale Jugend-/Jahrgangsteilungen als Regulation-as-Data modelliert (keine systemweite Pflicht)
- [x] Abteilungs-Trennungs-Schwellenwerte dokumentiert →
`docs/03_Domain/02_Reference/OETO_Regelwerk/Abteilungs-Trennungs-Schwellenwerte.md`
- [x] Warn-Logik-Spezifikation →
`docs/03_Domain/02_Reference/OETO_Regelwerk/Warn-Logik-Spezifikation-competition-context.md`
- [x] CVN (Voltigieren): § 39 Abs. 2 als Fallback; eigene OEPS-CVN-Regeln gelten
- [x] CAN (Fahren): § 39 Abs. 2 als Fallback; § 850 Abs. 9 für F1+ Fahrertreffen
- [x] `OetoValidators` (KMP) implementiert; `OetoValidatorsTest.kt` grün
### Sprint B (Teilweise) — Abgeschlossen
- [x] **B-1** | Validierungs-Implementierung Frontend begleiten
- [x] Spezifikation v0.3 DRAFT an 🎨 Frontend übergeben
- [x] Implementierung geprüft: Live-Validierung entspricht Regelwerks-Anforderungen
- [x] Fehlermeldungs-Texte auf Korrektheit und Verständlichkeit geprüft
- [x] Session-Log → `docs/99_Journal/2026-04-03_Rulebook_B1_Validierung_Frontend.md`
---
## 🟡 Sprint B — Teilweise offen
- [ ] **B-2** | Validierungs-Implementierung Backend begleiten
- [x] FEI Legacy→Numeric Resolver implementiert (`/api/fei/resolve/{id}`) — erste Version in Masterdata-SCS
- [x] Lizenz-/Altersmatrix als Regulation-as-Data an 👷 Backend übergeben
- [x] `LizenzKlasseE`-Enum: `R4` ergänzt, `RD4`-Fehler in V008 korrigiert
- [x] Flyway V009: `license_height_matrix` + `horse_min_age_matrix` angelegt und befüllt
- [x] B-2-Übergabe-Spezifikation →
`docs/03_Domain/02_Reference/OETO_Regelwerk/B2-Backend-Uebergabe-Regulation-as-Data.md`
- [x] `Validierungsregeln.md`: `LZF``LIZENZFREI` korrigiert, Version 0.4, Verweis auf B2-Spec ergänzt
- [ ] Serverseitige Validierung prüfen: Werden alle Regeln korrekt durchgesetzt?
- [ ] Backend-Endpunkte `/api/regulation/*` implementieren (👷 Backend)
- [ ] Abweichungen Backend ↔ Frontend-Validierung dokumentieren und klären
- [ ] Lizenz×Bewerb-Tabellen (Springen + Dressur) von DRAFT auf STABLE anheben (nach Fachfreigabe)
---
## 🟠 Sprint C — Priorität 2 (nächste Woche)
- [ ] **C-1** | `AltersklasseRechner` implementieren und testen
- [ ] Altersklassen-Berechnung für Pferd (Jahrgang → Kategorie) umsetzen
- [ ] Grenzfälle: Pferd im Geburtsjahr, Jahreswechsel, Stichtag-Regeln
- [ ] Unit-Tests mit `OetoValidatorsTest.kt`-Grenzfällen als Basis
- [ ] **C-2** | Regelwerk-Enums vervollständigen
- [ ] Alle Lizenzklassen-Übergänge formal prüfen (R1→R2→R3→R4, LZF-Sonderfall)
- [ ] FEI-Kategorien-Mapping auf ÖTO-Lizenzklassen vervollständigen
- [ ] Enums in KMP-Modul `core:domain` als SSoT festlegen
- [ ] **C-3** | Compliance-Dokumentation: Series-Context vorbereiten
- [ ] Regelwerk-Grundlagen für Cups/Serien/Meisterschaften recherchieren
- [ ] Anforderungen an konfigurierbare Reglements (Phase 2+) dokumentieren
---
## 📌 Abhängigkeiten
| Meine Aufgabe | Blockiert wen |
|-------------------------|---------------------------------------------------|
| B-2 Spec an Backend | 👷 Backend: A-3 Sonderregeln, B-3 ÖTO-Validierung |
| B-1 ✅ Spec an Frontend | 🎨 Frontend: B-3 Live-Validierung |
| C-1 AltersklasseRechner | 🧐 QA: C-3 Validierungs-Tests |
---
## 💡 Empfehlungen (nach Priorität)
1. **B-2 Backend-Übergabe** — Lizenz-/Altersmatrix als Regulation-as-Data an Backend übergeben; Backend wartet auf diese
Spezifikation für A-3 und B-3.
2. **Lizenz×Bewerb DRAFT → STABLE** — Fachfreigabe einholen, damit Backend und Frontend auf stabiler Basis arbeiten
können.
3. **C-1 AltersklasseRechner** — Grenzfälle (Jahrgang, Stichtag) sind komplex und müssen vor Backend-Implementierung
spezifiziert sein.
@@ -1,124 +0,0 @@
# 🗂️ Sprint Execution Order — Meldestelle-Biest
> **Stand:** 11. April 2026 | **Phase:** 9 — Zeitplan & Protokollierung
> **Erstellt von:** 🏗️ Lead Architect
> **Strategisches Ziel:** Desktop-MVP mit Event-First-Workflow, Offline-First, ÖTO-Konformität
---
## 📊 Gesamtfortschritt
| Agent | Sprint A | Sprint B | Sprint C | Nächste Aktion |
|---------------|------------------|------------------------------------------|-------------------|-------------------------------------------------------|
| 🏗️ Architect | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung (ADR/Konzept) |
| 👷 Backend | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | C-1 Nennungs-Service Erweiterung |
| 🎨 Frontend | ✅ Abgeschlossen | ✅ B-2/B-3/B-4 fertig | 🟡 In Arbeit | C-2 Zeitplan Drag & Drop |
| 📜 Rulebook | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1 fertig | Regelwerk-Validierung Zeitplan |
| 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1/C-2 fertig | C-3 Produktions-Deployment |
| 🧐 QA | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung Tests |
| 🖌️ UI/UX | ✅ Abgeschlossen | ✅ Abgeschlossen | ⬜ Nicht gestartet | C-1 Wireframes in Compose umsetzen |
| 🧹 Curator | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Dokumentations-Audit |
---
## 🔴 SOFORT — Kritischer Pfad (Blocker)
Diese Aufgaben blockieren andere Agenten und müssen zuerst erledigt werden:
| Priorität | Agent | Aufgabe | Blockiert |
|-----------|---------------|-----------------------------------------------|---------------------------------------------------|
| 🔴 P1 | 🎨 Frontend | C-2: Zeitplan Drag & Drop | 🧐 QA: Zeitplan-Tests |
---
## 🟠 DIESE WOCHE — Sprint B/C parallel ausführen
### 🏗️ Architect
1. ✅ **B-1** ADR-0022 LAN-Sync-Protokoll (Event-Sourcing vs. CRDT vs. Timestamp)
2. ✅ **C-1** Konzept für Zeitplan-Optimierung (Drag & Drop Logik)
### 👷 Backend Developer
1. ✅ **A-1** Tenant-Isolation Rollout auf alle Services
2. ✅ **B-1** Reiter/Pferde/Vereine/Funktionäre CRUD-APIs
3. ✅ **B-2** Kassa-Service (Initialisierung & Billing-Logik)
4. 🔴 **C-1** Nennungs-Service Erweiterung (Status-Automat)
### 🎨 Frontend Expert
1. ✅ **B-2** Repositories angelegt & Endpunkte verdrahtet
2. ✅ **B-3** Live-Validierung für Reiter/Pferde Profile
3. 🔴 **B-2** StoreV2-Ablösung (Laufend)
4. 🔴 **B-4** Kassa-Screen Implementierung (wartet auf UI/UX)
### 📜 Rulebook Expert
1. ✅ **B-2** Lizenz-/Altersmatrix als Regulation-as-Data übergeben
2. 🔴 **C-1** AltersklasseRechner Spezifikation
### 🐧 DevOps Engineer
1. ✅ **C-1** Desktop-Packaging konfiguriert
2. ✅ **C-2** Semantic Versioning eingeführt
3. 🔴 **C-3** Produktions-Deployment vorbereiten
### 🧐 QA Specialist
1. ✅ **B-1** ZNS-Importer Hardening (Integrationstests)
2. ✅ **B-3** Abteilungs-Logik Tests
3. 🔴 **B-2** Onboarding-Wizard Edge-Case Tests
### 🖌️ UI/UX Designer
1. ✅ **B-1** Entscheidung Editier-Formulare
2. ✅ **B-3** Wireframes für Kassa-Screen (Veranstaltungs-Kassa)
3. ✅ **B-4** Empty States Spezifikation
### 🧹 Curator
1. ✅ **B-1** Roadmaps aktualisiert (diese Session)
2. 🔴 **B-2** Changelog & SessionLog pflegen
---
## 🟡 NÄCHSTE WOCHE — Sprint C
| Agent | Aufgabe |
|---------------|------------------------------------------------------------------------|
| 🏗️ Architect | C-1 Sync-Konzept; C-2 MASTER_ROADMAP aktualisieren |
| 👷 Backend | B-2 Kassa-Service; B-3 ÖTO-Validierung; C-1 Nennungs-Service |
| 🎨 Frontend | B-4 Kassa-Screen; C-1 StoreV2 vollständig ablösen; C-2 VeranstalterNeu |
| 📜 Rulebook | C-1 AltersklasseRechner; C-2 Regelwerk-Enums |
| 🐧 DevOps | C-3 Produktions-Deployment; D-1 Tenant-Backup-Strategie |
| 🧐 QA | B-1 Navigation-Tests; B-4 ViewModel-Tests; C-1 Isolations-Tests |
| 🖌️ UI/UX | C-1 Wireframes in Compose umsetzen; C-2 Design-System konsolidieren |
| 🧹 Curator | C-1 README aktualisieren; C-2 Setup-Guide |
---
## ⏸️ Zurückgestellte Themen (kein MVP-Blocker)
| Thema | Zuständig | Wann |
|------------------------------|-----------|-----------------------------------|
| USB-Stick Fallback (Sync) | 🏗️ + 🐧 | Sprint B/C — separate Besprechung |
| Web-App / PWA | 🎨 + 🖌️ | Nach Desktop-MVP |
| ZNS Live-Sync (Echtzeit) | 👷 + 🎨 | Nach Stammdaten-Stabilisierung |
| Series-Context (Cups/Serien) | Alle | Phase 9 (Phase 2+) |
| Mobile (Android/iOS) | 🎨 | Phase 9+ |
---
## 🔗 Roadmap-Verweise
| Agent | Roadmap |
|---------------|--------------------------------------------------------------|
| 🏗️ Architect | [Architect_Roadmap.md](./Architect_Roadmap.md) |
| 👷 Backend | [Backend_Roadmap.md](./Backend_Roadmap.md) |
| 🎨 Frontend | [Frontend_Roadmap.md](./Frontend_Roadmap.md) |
| 📜 Rulebook | [Rulebook_Roadmap.md](./Rulebook_Roadmap.md) |
| 🐧 DevOps | [DevOps_Roadmap.md](./DevOps_Roadmap.md) |
| 🧐 QA | [QA_Roadmap.md](./QA_Roadmap.md) |
| 🖌️ UI/UX | [UIUX_Roadmap.md](./UIUX_Roadmap.md) |
| 🧹 Curator | [Curator_Roadmap.md](./Curator_Roadmap.md) |
| 📐 Master | [MASTER_ROADMAP.md](../../01_Architecture/MASTER_ROADMAP.md) |
-108
View File
@@ -1,108 +0,0 @@
# 🖌️ [UI/UX Designer] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** High-Density Design, Wireframes, Usability, Design-System, Empty States
---
### Sprint D — AKTUELL (12. April 2026)
- [x] **D-1** | Radikaler UI-Umbau der Desktop-Shell (Best Practices)
- [x] Einführung einer modernen Seiten-Navigation (`NavigationRail`) zur besseren Platzausnutzung
- [x] Umstellung von Top-Bar auf schlanken Page-Header mit Breadcrumbs im Content-Bereich
- [x] Erweiterung des Design-Systems um `NavigationSurface` und konsistente `ElevatedCards`
- [x] Refactoring `AdminUebersichtScreen`: Klare visuelle Hierarchie, Page-Title und modernisierte Cards
- [x] Konsistente Anwendung von Tonal Elevation und Material 3 Standards
### Sprint C — Abgeschlossen
- [x] **A-1** | Design-Inventur: Bestehende V3-Screens analysiert
- [x] Alle vorhandenen V3-Screens katalogisiert (Screenshots in `docs/06_Frontend/Screenshots/`)
- [x] Inkonsistenzen in Spacing, Typografie und Farbgebung identifiziert
- [x] Offene UX-Probleme und fehlende Empty States dokumentiert
- [x] Issue-Liste für Sprint B vorbereitet
### Sprint B (Teilweise) — Wireframes erstellt
- [x] **B-1 Wireframes** | Editier-Formulare (AlertDialog vs. dedizierter Screen)
- [x] Entscheidungsgrundlage erarbeitet: Wann AlertDialog, wann Fullscreen-Edit?
- [x] Wireframes für beide Varianten erstellt (Reiter-Edit, Pferd-Edit als Beispiele)
- [x] Ergebnis: `docs/06_Frontend/Guidelines/Editier-Formulare_Dialog-vs-Fullscreen_v1.md`
- [x] **Finale Entscheidung dokumentiert und als verbindliche Design-Richtlinie festgeschrieben** (Status: APPROVED)
- [x] Mapping aller bestehenden Edit-Screens auf AlertDialog / Side Sheet / Fullscreen dokumentiert
- [x] **B-2 Wireframes** | Bewerb anlegen mit Abteilungs-Logik
- [x] Dialog-Flow: Bewerb-Grunddaten → Abteilungs-Vorschlag → Bestätigung
- [x] CSN-C-NEU Pflicht-Teilung: Visuelle Darstellung der automatischen Vorschläge
- [x] Abteilungs-Typ-Auswahl: `SEPARATE_SIEGEREHRUNG` vs. `ORGANISATORISCH` verständlich gestaltet
- [x] Ergebnis: `docs/06_Frontend/Wireframes/Bewerb_anlegen_Abteilungs-Logik_v1.md`
- [x] **B-3 Wireframes** | Veranstaltungs-Kassa
- [x] Gesamt-Saldo-Ansicht: Teilnehmer mit offenen Beträgen aus mehreren Turnieren
- [x] Zahlvorgang-Dialog: Eine Zahlung, Aufteilung auf Turniere sichtbar
- [x] Rechnungsvorschau: Zwei separate Rechnungen je Turnier als Tab
- [x] Ergebnis: `docs/06_Frontend/Wireframes/Kassa_Veranstaltung_v1.md`
---
## ✅ Sprint B — Abgeschlossen (3. April 2026)
- [x] **B-1 Abschluss** | Finale Design-Entscheidung Editier-Formulare
- [x] Review durch 🎨 Frontend Expert durchgeführt (bestätigt durch bestehende Implementierungen)
- [x] Entscheidung (AlertDialog / Side Sheet / Fullscreen) als verbindliche Richtlinie dokumentiert
- [x] Ergebnis: `docs/06_Frontend/Guidelines/Editier-Formulare_Dialog-vs-Fullscreen_v1.md` (Status: APPROVED)
- [x] **B-4** | Empty States für alle Listenansichten
- [x] Liste aller Screens mit möglichen leeren Zuständen erstellt (10 Screens, 3 Typen)
- [x] Icon-Konzept: Material Symbols Outlined — kein Custom-Illustration-Set für MVP
- [x] Texte (Titel, Beschreibung, CTA) für alle Screens und alle Typen definiert
- [x] Composable-API `MsEmptyState` spezifiziert (Ablageort, Parameter, Verhalten, Beispiel)
- [x] Ergebnis: `docs/06_Frontend/Guidelines/Empty-States_Spezifikation_v1.md` (Status: APPROVED)
---
## 🟠 Sprint C — Priorität 2 (nächste Woche)
- [ ] **C-1** | Wireframes aus Sprint B in Compose umsetzen
- [ ] Editier-Dialog / Fullscreen-Edit gemäß finaler Entscheidung (B-1) — Richtlinie: APPROVED ✅
- [ ] Bewerb-Anlegen-Dialog mit Abteilungs-Logik (B-2)
- [ ] Kassa-Screen (B-3)
- [ ] `MsEmptyState`-Composable implementieren (Spezifikation:
`docs/06_Frontend/Guidelines/Empty-States_Spezifikation_v1.md`)
- [ ] Empty States in alle 10 Listenansichten integrieren (Prioritätsreihenfolge laut Spezifikation)
- [ ] `PferdProfilEditDialog` zu Fullscreen-Edit migrieren (> 8 Felder, Async-Lookups — laut B-1 Mapping)
- [x] **C-2** | Design-System konsolidieren ✅ *12. April 2026*
- [x] Farb-Palette in `MaterialTheme` / `Theme.kt` vereinheitlichen (Tonal Elevation)
- [x] Typografie-Skala und Spacings in `Dimens.kt` / `Typography.kt` definiert
- [x] Eingabefelder (MsTextField) auf Enterprise-Standard (44.dp) optimiert
- [ ] **C-3** | Abteilungs-Ansicht: Startliste und Ergebnisliste
- [ ] Wireframe: Startliste einer Abteilung (Startnummer, Reiter, Pferd, Verein)
- [ ] Wireframe: Ergebnisliste einer Abteilung (Platz, Reiter, Pferd, Ergebnis)
- [ ] Wireframe: Ranglisten-Zusammenführung bei `ORGANISATORISCH`
> ⏸️ **Web-App / PWA Design** — Nach Desktop-MVP; Anforderungen noch nicht definiert
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|-------------------------------------|---------------|-----------------------------------|
| Domänen-Modell (Kassa, Abteilung) ✅ | 🏗️ Architect | B-3 Kassa-Wireframes ✅ |
| ViewModel-Struktur ✅ | 🎨 Frontend | B-1 Finale Entscheidung ✅ |
| Meine Richtlinie B-1 ✅ | 🎨 Frontend | C-1 Edit-Dialoge implementieren |
| Meine Spezifikation B-4 ✅ | 🎨 Frontend | C-1 `MsEmptyState` implementieren |
| Meine Wireframes (B-2, B-3) | 🎨 Frontend | C-1 Bewerb-Dialog, Kassa-Screen |
---
## 💡 Empfehlungen (nach Priorität)
1. **C-1 `MsEmptyState` implementieren** — Spezifikation liegt vor (APPROVED); Frontend kann sofort mit der
Composable-Implementierung beginnen. Alle 10 Listenansichten laut Prioritätsliste abarbeiten.
2. **C-1 `PferdProfilEditDialog` → Fullscreen migrieren** — Aktueller Dialog überschreitet die Komplexitätsgrenze
(> 8 Felder, Async-Lookups); Migration gemäß B-1-Richtlinie für Sprint C-1 vorgesehen.
3. **C-2 Design-System** — Frühzeitige Konsolidierung verhindert kostspielige Nacharbeit; am besten parallel zu C-1
erledigen.
-26
View File
@@ -1,26 +0,0 @@
# Session Log 30.03.2026
🧹 [Curator]
## Zusammenfassung
- Phasen AD laut MASTER_ROADMAP sind abgeschlossen und in den Docs reflektiert.
- Fokuswechsel bestätigt: „Cups & Meisterschaften“ verschoben; Vorbereitung „Reporting & Output“ priorisiert.
- Events/Turniere im Backend verifiziert; ausstehend: finale Migrationen und Seeds für Neumarkt.
## Aktualisierte/Neue Dokumente
- docs/01_Architecture/MASTER_ROADMAP.md → last_update auf 2026-03-30 gesetzt; Status bekräftigt.
- docs/01_Architecture/ROADMAP_2026-03-30_Nacht.md → Nightly Roadmap für heutige Arbeiten erstellt.
- Bestehende Roadmaps/Changelogs auf Konsistenz geprüft (keine fachlichen Änderungen nötig).
## Nächste Schritte (aus Nightly Roadmap)
1. Reporting & Output: Vorlagen (Owner), PDF-ADR-Entwurf (Arch/BE), UI-Placeholder Druckvorschau (FE)
2. Events/Turniere: Migrationen `turniere`/`ausschreibungen` finalisieren, Seeds „Neumarkt 2026“
3. Identity/Profil: E2E-Check ZNS-Link
4. Live-Ergebnisse: Owner-Skizze/Mock für Web-Ansicht
## Offene Punkte/Blocker
- Es fehlen die konkreten Layout-Vorlagen (Start-/Ergebnislisten, Spring-/Dressur-Protokolle) vom Owner.
@@ -1,130 +0,0 @@
# 🧹 Curator Log — Neumarkt 2026: Public Web + Desktop (Meldestelle)
Datum: 2026-03-27
Status: Arbeitsprotokoll (MVP bis 2026-04-07)
## Kontext & Ziel
- Bis Di, 07.04.2026: Öffentlich erreichbare Web-App mit Nennformular pro Turnier (26128, 26129) und Desktop-App (
offline-fähig) zur internen Steuerung (Toggles, Hinweise, Datenpflege).
- Prinzipien: Trennung Fach-Kontexte vs. TechOps/Monitoring; Offline-First; keine Annahmen ohne Rückfrage; Glossar ist
Quelle der Wahrheit.
## Begriffe & Quellen
- Glossar/UL: `docs/03_Domain/00_Glossary.md`, `docs/03_Domain/01_Glossary/Ubiquitous_Language.md`.
- Neumarkt-Referenzen: `docs/Neumarkt2026/*` (Turnierkarten, Dashboard-Skizzen).
- Kurzdefinitionen (zur Bestätigung):
- Veranstalter: Organisation (z. B. Verein Neumarkt).
- Veranstaltung: Rahmen (Ort/Zeitraum), fasst Turniere.
- Turnier: Einheit mit Bewerben/Prüfungen, Ausschreibung, Nennungen, Start-/Ergebnislisten.
- Bewerb/Prüfung: Klasse im Turnier; optional in Abteilungen.
- Abteilung: Unterteilung eines Bewerbs mit eigener Liste.
## Web-App — MVP Funktionsumfang
1) Landing www.mo-code.at
- Card-Liste der Veranstaltungen (aktuell: Neumarkt) mit Turnier-Cards (26128, 26129).
- Je Turnier-Card: Buttons „Ausschreibung (PDF)“, „Nennen“ (sichtbar, wenn `turnier.config.nennenEnabled`),
„Start-Ergebnisse“ (sichtbar, wenn `turnier.config.resultsEnabled`).
- Hinweis-Text `turnier.notice` (z. B. „Pferdepass-Kontrolle“, „Achtung Nennstopp“).
2) Prüfungs-Übersicht je Turnier
- Sortierte Liste aller Bewerbe (Datum, Uhrzeit, Platz); optional Abteilungen verschachtelt.
- Buttons je Card: „Startliste“ (geplant/laufend), „Ergebnisliste“ (abgeschlossen), „Live-Ergebnisse“ (Nice-to-have,
vorerst verborgen).
- Suche/Filter (Reiter/Pferd) Nice-to-have; nur Turnierteilnehmer.
3) Nennformular (pro Turnier generiert)
- Abschnitte: Reiter, Pferd, Bewerb, Einverständnisse.
- Client- und Server-Validierung; Bestätigungsseite; optional E-Mail-Bestätigung (abhängig Mailserver) oder
On-Screen-Referenz.
Pflichtfelder (Vorschlag, final durch 📜 Rulebook Expert):
- Reiter: Vorname, Nachname, Geburtsjahr/-datum, Nationalität, Verein/Club, E-Mail.
- Lizenz (bewerbsabhängig): Reiter-Lizenznummer (pflichtig, falls Regel verlangt).
- Pferd: Name, Jahrgang, mind. eines von UELN/Passnummer; Besitzer optional.
- Bewerbsauswahl (+ Abteilung ggf.), optional Kommentar.
- Einverständnisse: DSGVO/Teilnahmebedingungen, Tiergesundheit/Impfstatus (Checkboxen).
Öffentliche Minimal-APIs:
- GET `/api/veranstaltungen`
- GET `/api/turniere/{turnierId}`
- GET `/api/turniere/{turnierId}/bewerbe`
- GET `/api/turniere/{turnierId}/ausschreibung` (PDF)
- POST `/api/turniere/{turnierId}/nennungen`
## Desktop-App (Meldestelle) — MVP
- Offline-First: Lokale DB (z. B. SQLite) + Sync-Queue. Geräte „Meldestelle“ und „Richter-Turm“ im selben LAN.
- Statusleiste: Indikatoren „Internet erreichbar“ und „Peer verbunden“ (Heartbeat-basiert).
- Onboarding (Freischalten):
1) Gerätename setzen (z. B. „Meldestelle“, „Richter-Turm“).
2) Sicherheitsschlüssel setzen (gemeinsam, z. B. „Neumarkt2026“) für verschlüsselte LAN-Kopplung.
3) ZNS-Daten laden: automatisch via Internet/LAN oder Offline-Import `ZNS.zip` (Integritäts-/Versionsprüfung, Warnung
bei veraltetem Stand).
- Nach Freischalten: Navigation „Zu den Veranstaltern“ sichtbar.
- Geräte-Setup: Druckerauswahl (OS-Dialog), Persistenz pro Gerät.
- LAN-Kopplung: mDNS/Bonjour Discovery; Fallback manuelle IP/QR optional.
- Optional: Einfacher LAN-Chat zwischen Geräten (Store-and-forward bei kurzzeitigem Offline).
## Veranstalter Übersicht (neue Präzisierung)
- Nach Freischalten (Name + Schlüssel + ZNS vorhanden) ist „Zu den Veranstaltern“ aktiv.
- Screen-Inhalte:
- Auswahlliste bereits registrierter Veranstalter (online/LAN geladen), z. B. „Verein Neumarkt“.
- Aktion „Neuen Veranstalter anlegen“ für Fälle ohne Treffer/Neuanlage.
- Weiterer Fluss:
1) Veranstalter auswählen/neu anlegen.
2) Veranstaltung anlegen/auswählen (gemäß Glossar; falls Rahmen explizit geführt wird).
3) Turnier innerhalb der Veranstaltung anlegen (26128, 26129) und konfigurieren:
- Toggles: `nennenEnabled`, `resultsEnabled`
- Hinweis-Text (`notice`)
- Bewerbs-Regeln (Pflichtfelder-Flags), Nennstopp-Status
## TechOps-UI (separate Shell)
- Monitoring/Metriken/Logs + Ping-Service-Demo. Keine fachliche Vermischung.
- Kernmetriken (MVP): public endpoint availability, nennungen_submit_latency_p95, nennungen_submit_error_rate,
nennungen_created_count pro Turnier, pdf_delivery_success_rate.
## Qualitätsleitplanken (DoD, MVP)
- Modultrennung: Fach-Features getrennt von TechOps/Ping; keine Cross-Imports.
- Offline-First: Queue/Retry auf allen Netzwerkpfaden; klare UI-States für Offline/Sync.
- Observability: Traces, Key-Metrics, korrelierbare Request-IDs; keine PII in Logs.
- Security (MVP): gemeinsamer LAN-Schlüssel ausreichend; später erweiterbar (Pairing/QR).
- DSGVO: Minimaldatensatz; Einverständnis-Texte durch 📜 Rulebook Expert.
## Offene Punkte (für nächste Session)
1) Bestätigung/Korrektur Glossar-Definitionen.
2) Finalisierung Pflichtfelder Nennformular inkl. bewerbsabhängiger Regeln.
3) E-Mail-Bestätigung sofort vs. On-Screen-Only.
4) Gleich/abweichende Regeln zwischen 26128 und 26129.
5) LAN-Pairing-Fallback (reicht gemeinsamer Schlüssel vs. zusätzliche IP/QR-Option aktivieren).
6) UI-Details „Veranstalter Übersicht“ (Suche/Filter, Minimalfelder Neuanlage).
## Konkrete nächste Schritte (Umsetzung)
- Desktop:
- Onboarding-Checklist-Komponente (Gerätename, Schlüssel, ZNS-Status).
- Screen „Veranstalter Übersicht“: Liste (remote/LAN), „Neuen Veranstalter anlegen“.
- Formular „Veranstalter neu“: Minimalfelder, Persistenz lokal + Sync.
- Backend:
- Endpunkte Veranstalter-Query (public/internal), PDF-Auslieferung, Nennungs-Persistenz.
- Turnier-Config-API (Toggles, Notice), Bewerbs-Regel-Flags.
- Web-App:
- Landing + Turnier-Cards (26128, 26129) mit Toggles/Notice.
- Nennformular-Renderer aus Turnier-/Bewerbs-Definition; POST Nennung.
## Go/No-Go Checkliste Neumarkt
- [ ] Desktop: Onboarding (Name, Schlüssel, ZNS geladen)
- [ ] Desktop: Veranstalter sichtbar/neu anlegbar
- [ ] Backend: Turnierdaten 26128/26129 vorhanden; PDF-Links ok
- [ ] Web: Landing online; Turnier-Cards korrekt gesteuert
- [ ] Web: Nennformular 26128/26129; Validierung & Persistenz ok
- [ ] Observability: Basis-Metriken aktiv
@@ -1,36 +0,0 @@
# 🧹 Session Log — 2026-04-03
## Agent: 👷 Backend Developer
## Aufgabe
`EntriesIsolationIntegrationTest` schlägt fehl mit `ClassNotFoundException` und `No database specified`.
## Root Cause Analyse
### Problem 1: `ClassNotFoundException` (Spring Context Load)
- `springdoc-openapi` war auf Version `3.0.0` gesetzt
- Diese Version ist für Spring Boot 4.x / Spring 7 gedacht und zieht Spring Boot 4.x-Klassen transitiv rein
- Im Spring Boot 3.x-Kontext führt das zu `ClassNotFoundException` für `JacksonJsonHttpMessageConverter`
### Problem 2: `No database specified` (Exposed)
- `EntriesDatabaseConfiguration` ist mit `@Profile("!test")` annotiert → wird im Test nicht geladen
- Exposed braucht `Database.connect()` vor dem ersten `transaction {}`-Aufruf
- Im Test-Profil gab es keine Konfiguration, die Exposed mit der Spring `DataSource` (Testcontainer) verbindet
- `@ActiveProfiles("test")` fehlte am Test → `TestExposedConfiguration` wurde nicht geladen
## Änderungen
| Datei | Änderung |
|------------------------------------------------------------|----------------------------------------------------------------------------|
| `gradle/libs.versions.toml` | `springdoc` von `3.0.0``2.8.9` (Spring Boot 3.x kompatibel) |
| `entries-service/src/test/.../TestExposedConfiguration.kt` | Neu: `@Profile("test")` Bean der Exposed mit Spring `DataSource` verbindet |
| `EntriesIsolationIntegrationTest.kt` | `@ActiveProfiles("test")` hinzugefügt; Import sortiert |
| `Backend_Roadmap.md` | Bugfix dokumentiert unter A-1 |
## Ergebnis
- Alle Tests im `entries-service` grün ✅ (`BUILD SUCCESSFUL`)
- `EntriesIsolationIntegrationTest` läuft vollständig durch
@@ -1,63 +0,0 @@
# 🧹 Curator Log — Frontend B-2/B-3: Repositories & Live-Validierung
> **Datum:** 3. April 2026
> **Agent:** 🎨 Frontend Expert
> **Sprint:** B — Bewerbe-Management & Startlisten
> **Aufgaben:** B-2 BewerbRepository + AbteilungRepository; Koin-Module; B-3 Live-Validierung
---
## ✅ Erledigte Aufgaben
### B-2 — Repositories & Koin-Module
| Datei | Aktion | Beschreibung |
|-----------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------------------------|
| `core/network/src/commonMain/.../DomainErrors.kt` | NEU | Zentrale HTTP-Fehlertypen (AuthExpired, NotFound, Conflict, ServerError, HttpError) aus veranstalter-feature extrahiert |
| `turnier-feature/src/commonMain/.../dto/TurnierDto.kt` | NEU | DTOs für Turnier, Bewerb, Abteilung (kotlinx.serialization) |
| `turnier-feature/src/commonMain/.../mapper/TurnierMapper.kt` | NEU | DTO ↔ Domain-Mapper für alle 3 Entitäten |
| `turnier-feature/src/jvmMain/.../DefaultTurnierRepository.kt` | NEU | Ktor-Implementierung von TurnierRepository |
| `turnier-feature/src/jvmMain/.../DefaultBewerbRepository.kt` | NEU | Ktor-Implementierung von BewerbRepository (inkl. `ApiRoutes.Turniere.bewerbe()`) |
| `turnier-feature/src/jvmMain/.../DefaultAbteilungRepository.kt` | NEU | Ktor-Implementierung von AbteilungRepository (inkl. `ApiRoutes.Bewerbe.abteilungen()`) |
| `turnier-feature/src/jvmMain/.../di/TurnierFeatureModule.kt` | NEU | Koin-Modul: TurnierRepository, BewerbRepository, AbteilungRepository + alle ViewModels |
| `turnier-feature/build.gradle.kts` | GEÄNDERT | `core.network` + `ktor.client.core` als Dependency ergänzt |
| `veranstalter-feature/.../DefaultVeranstalterRepository.kt` | GEÄNDERT | Lokale Fehlertypen entfernt → Import aus `core.network.*` |
### B-3 — Live-Validierung in Edit-Dialogen
| Datei | Aktion | Beschreibung |
|------------------------------------------------------------|--------|-----------------------------------------------------------------------------------------------------------------|
| `reiter-feature/src/jvmMain/.../ReiterProfilEditDialog.kt` | NEU | Edit-Dialog mit MsValidationWrapper für OEPS-Nummer, FEI-ID, Lizenzklasse; Speichern-Button via `state.isValid` |
| `pferde-feature/src/jvmMain/.../PferdProfilEditDialog.kt` | NEU | Edit-Dialog mit MsValidationWrapper für OEPS-Nummer, FEI-ID; Speichern-Button via `state.isValid` |
---
## 📐 Architektur-Entscheidungen
- **DomainErrors zentral in `core.network`**: Verhindert Duplikation über Feature-Module hinweg.
- **`toMessages()`-Extension in Feature-Modulen**: `design-system` hat keine `core.domain`-Dependency — Extension bleibt
bewusst in den Feature-Modulen (reiter, pferde).
- **Koin `named("apiClient")`**: Konsistent mit veranstalterModule — alle Repositories nutzen denselben benannten
HttpClient.
- **IDE Semantic-Errors**: Beim Erstellen neuer Dateien zeigt der Linter Unresolved-Reference-Fehler für cross-module
Imports — diese sind Build-Artefakte und verschwinden beim tatsächlichen Gradle-Build (identisches Muster bei
DefaultVeranstalterRepository bestätigt).
---
## 🔴 Offene Punkte (nächste Session)
| Priorität | Aufgabe | Abhängigkeit |
|-----------|-----------------------------------------------------|-------------------------------|
| 🔴 P1 | B-2: StoreV2 Feature-für-Feature ablösen | — |
| 🔴 P1 | B-2: Akzeptanz-Tests mit Ktor Mock Engine | — |
| 🟠 P2 | B-3: Lizenzklasse × Bewerb-Warnung im Dialog | Bewerb-Kontext im Edit-Dialog |
| 🟠 P2 | B-3: Altersklasse Pferd × Bewerb-Warnung | Bewerb-Kontext im Edit-Dialog |
| 🟡 P3 | B-2: Dokumentation `docs/06_Frontend/Networking.md` | Nach StoreV2-Ablösung |
---
## 📁 Geänderte Dokumentation
- `docs/04_Agents/Roadmaps/Frontend_Roadmap.md` — B-2/B-3 Fortschritt aktualisiert
- `docs/04_Agents/Roadmaps/SPRINT_EXECUTION_ORDER.md` — Frontend-Zeile + Aufgabenliste aktualisiert
@@ -1,68 +0,0 @@
---
type: Session Log
date: 2026-04-03
agent: 🖌️ UI/UX Designer + 🧹 Curator
sprint: B (Abschluss)
status: COMPLETED
---
# Session Log — UI/UX Sprint B Abschluss: B-1 & B-4
## Zusammenfassung
Sprint B vollständig abgeschlossen. Zwei offene Punkte bearbeitet:
- **B-1:** Finale Entscheidung Editier-Formulare — Guideline von DRAFT auf APPROVED gesetzt, Screen-Mapping ergänzt.
- **B-4:** Empty States — vollständige Design-Spezifikation neu erstellt (Typen, Texte, Icons, Composable-API).
---
## Erledigte Aufgaben
### B-1 — Finale Entscheidung Editier-Formulare
- **Analyse:** Bestehendes Dokument `Editier-Formulare_Dialog-vs-Fullscreen_v1.md` war inhaltlich vollständig (DRAFT).
- **Review:** Frontend-Implementierungen (`ReiterProfilEditDialog`, `PferdProfilEditDialog`) bestätigen das
Side-Sheet-Muster — kein Widerspruch zur Richtlinie.
- **Entscheidung festgeschrieben:**
- ≤ 3 Felder, keine Async-Lookups → **AlertDialog**
- 38 Felder, Kontext relevant → **Side Sheet** (Desktop: rechts, ~420520 px)
- > 8 Felder oder starke Abhängigkeiten → **Fullscreen Edit**
- **Mapping aller Edit-Screens** auf die drei Varianten dokumentiert.
- **Hinweis:** `PferdProfilEditDialog` überschreitet die Grenze (810 Felder, Async-Lookups) → Migration zu Fullscreen
für C-1 vorgesehen.
- **Status:** APPROVED, verbindlich ab 2026-04-03.
### B-4 — Empty States für alle Listenansichten
- **Neu erstellt:** `docs/06_Frontend/Guidelines/Empty-States_Spezifikation_v1.md`
- **Inhalt:**
- 3 Empty-State-Typen definiert: `EMPTY_LIST`, `NO_RESULTS`, `ERROR`
- Visuelle Anatomie mit Maßen, Abständen, Typografie
- Icon-Konzept: Material Symbols Outlined (kein Custom-Illustration-Set für MVP)
- Texte (Titel, Beschreibung, CTA) für 10 Screens × 3 Typen
- Composable-API `MsEmptyState` vollständig spezifiziert
- Implementierungs-Reihenfolge für Sprint C-1 festgelegt
- Abgrenzung zu `MsLoadingIndicator`, `MsValidationWrapper`, `MsStatusBadge`
- **Status:** APPROVED.
---
## Geänderte Dateien
| Datei | Aktion | Beschreibung |
|----------------------------------------------------------------------------|--------------|------------------------------------------------------------------------------------------------|
| `docs/06_Frontend/Guidelines/Editier-Formulare_Dialog-vs-Fullscreen_v1.md` | Aktualisiert | Status DRAFT → APPROVED, Screen-Mapping + Freigabe-Abschnitt ergänzt |
| `docs/06_Frontend/Guidelines/Empty-States_Spezifikation_v1.md` | Neu erstellt | Vollständige Empty-State-Spezifikation (272 Zeilen) |
| `docs/04_Agents/Roadmaps/UIUX_Roadmap.md` | Aktualisiert | Sprint B als abgeschlossen markiert, C-1 erweitert, Abhängigkeiten + Empfehlungen aktualisiert |
---
## Übergabe an 🎨 Frontend Expert (Sprint C-1)
| Aufgabe | Grundlage | Priorität |
|----------------------------------------------------|----------------------------------------------------------|-----------|
| `MsEmptyState`-Composable implementieren | `Empty-States_Spezifikation_v1.md` § 6 | 🔴 Hoch |
| Empty States in 10 Listenansichten integrieren | `Empty-States_Spezifikation_v1.md` § 7 | 🔴 Hoch |
| `PferdProfilEditDialog` → Fullscreen migrieren | `Editier-Formulare_Dialog-vs-Fullscreen_v1.md` § Mapping | 🟠 Mittel |
| Verein/Funktionär/Bewerb/Turnier Edit → Side Sheet | `Editier-Formulare_Dialog-vs-Fullscreen_v1.md` § Mapping | 🟠 Mittel |
@@ -1,17 +0,0 @@
---
type: Archive
status: ARCHIVED
owner: QA Specialist
last_update: 2026-04-03
---
# 🧪 Postman Tests — Vollständige Dokumentation (ARCHIV)
Diese ausführliche Arbeitsversion wurde am 03.04.2026 im Rahmen einer QA/BackendSession erstellt.
Sie wurde inzwischen zu einem leicht verständlichen, zentralen Runbook konsolidiert.
Aktuelle Fassung:
- `docs/07_Infrastructure/runbooks/POSTMAN_API_Tests_Runbook.md`
Hinweis:
- Diese Archivdatei behält keinen Volltext der alten Fassung, um Duplikate zu vermeiden.
- Alle relevanten Inhalte sind im Runbook enthalten bzw. wurden aktualisiert.