chore(docs): füge ADRs 0025–0027 und Wizard-DSL-Referenz hinzu, aktualisiere Roadmap und ADR-Index

Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
Stefan Mogeritsch 2026-04-21 16:21:19 +02:00
parent 0ab1807235
commit ec124e9acd
7 changed files with 281 additions and 1 deletions

View File

@ -2,7 +2,7 @@
type: Roadmap
status: ACTIVE
owner: Lead Architect
last_update: 2026-04-20
last_update: 2026-04-21
---
# MASTER ROADMAP: Meldestelle
@ -175,6 +175,58 @@ und über definierte Schnittstellen kommunizieren.
---
## 3. Initiative: Wizard-Orchestrator & Offline-Drafts (Q2/Q3 2026)
🏗️ Verantwortlich: Lead Architect · 🎨 Frontend · 🖌️ UI/UX · 👷 Backend · 🧐 QA · 🧹 Curator
Ziel: Konsolidierung aller „Wizards“ auf ein deklaratives Orchestrierungs-Framework (Graph + Guards + Effects), vereinheitlichte Validierung und Offline-Draft-Fähigkeit inkl. DeltaSync. Desktop-first, tastaturbedienbar, testbar.
### 3.1 Kernbausteine
- Orchestrator Runtime & DSL: `StepId`, `WizardContext`, `WizardState`, `Guard`, `Transition`, `StepEffects`.
- WizardScaffold: Breadcrumb, Kontext-Chips, Footer mit Hotkeys (Enter/Shift+Enter/Alt+S), Fehler-Summary.
- DraftStore: Autosave pro Step (`onLeave`), Resume, `flowVersion`, Konfliktanzeige.
- DevTools: strukturierte Transition-Logs, Graph-Export (DOT/PlantUML).
Referenzen/Dokumente:
- ADR0025: Wizard-Orchestrator (StateMachine, DSL, Guards, Effects) → `docs/01_Architecture/adr/0025-wizard-orchestrator-de.md`
- ADR0026: Step-Validation-Policy (sync vs. async, Fehlersichtbarkeit, Hotkeys) → `docs/01_Architecture/adr/0026-validation-policy-de.md`
- ADR0027: Draft-Domain & DeltaSync (Versionierung, Konfliktlösung, Idempotenz) → `docs/01_Architecture/adr/0027-draft-domain-and-delta-sync-de.md`
- Reference: WizardDSL README (Beispiel-Flow Event) → `docs/01_Architecture/Reference/Wizard-DSL-README.md`
### 3.2 Migrationsstrategie (Strangler)
1) Parallelbetrieb: Neuer Orchestrator in `frontend/core/wizard`; bestehende VMs delegieren schrittweise.
2) Inkrement 1: EventFlow zunächst 2 Steps (ZNS_CHECK, VERANSTALTER_SELECTION), dann alle 6 Steps.
3) FeatureFlag `WizardRuntimeEnabled` für risikoarmen Rollout.
### 3.3 Phasenplanung (Auszug)
- Phase 1 (Core & Tooling, 23 Wochen): Runtime/DSL, DevLogs, GraphExport, ScaffoldMVP, UnitTests.
- Phase 2 (EventFlow, 23 Wochen): `EventStep/Acc/Guards`, FlowDSL, VMDelegation, Validierung, Autosave/Resume.
- Phase 3 (Backend, 24 Wochen): Draft-/ValidateAPIs, OfflineQueue, DeltaSync für Turniere.
- Phase 4 (Skalierung, 610 Wochen, parallel): Weitere Flows je Bounded Context.
- Phase 57 (23 + 12 + 12 Wochen): UXHärtung, Observability/RolloutGates, Stabilisierung & Abschaltung Altlogik.
Grobe Gesamtdauer: 1729 Wochen je nach Parallelisierung.
### 3.4 Akzeptanzkriterien (DoD Initiative)
- Alle priorisierten Flows laufen über Orchestrator; Next/Back/History deterministisch; GraphExport aktuell.
- DraftStore produktiv; Resume deterministisch; DeltaSync idempotent; Konflikte nichtblockierend sichtbar.
- ValidierungsPolicy konsistent; TastaturBedienung vollständig; PerformanceGates eingehalten.
- ADR0025/0026/0027 veröffentlicht; WizardDSLReference vorhanden; CI grün; Metriken/Alerts aktiv.
### 3.5 10TageStartplan
- Tag 12: Runtime/DSLSkelett, ScaffoldMVP, FeatureFlag, README Skeleton.
- Tag 3: EventStep/Acc/Guards, EventFlow (2 Steps), VMDelegation minimal.
- Tag 4: Tests Runtime/Guards, GraphExport, DevLogs.
- Tag 56: META_DATA/ANSPRECHPERSON migrieren, ValidierungsAPI, FehlerSummary.
- Tag 7: DraftStore lokal (Autosave/Resume), PropertyTest Resume.
- Tag 8: TURNIER_ANLAGE einbetten, Sync via `onComplete`.
- Tag 9: SUMMARY + Finalisierung, Offload in OfflineQueue (Stub).
- Tag 10: ADR0025/0026/0027 Review+Merge; JournalEintrag.
Journal: `docs/99_Journal/2026-04-21_Wizard-Orchestrator_Roadmap_Anchoring.md`
---
## 3. Aktuelle Phase
### PHASE 5: P2-Contexts & Integration ✅ ABGESCHLOSSEN

View File

@ -0,0 +1,107 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
date: 2026-04-21
---
# WizardDSL & Orchestrator Referenz
## Ziel
Deklarative Beschreibung von WizardFlows als Graph (Steps, Guards, Transitions) mit klaren SideEffects und OfflineDraftUnterstützung.
## KernInterfaces (Skizze)
```kotlin
interface StepId
data class WizardContext(
val origin: AppScreen,
val role: String?,
val isOnline: Boolean,
val stats: MasterdataStats?
)
data class WizardState<S: StepId, A>(
val current: S,
val history: List<S> = emptyList(),
val acc: A,
val errors: List<String> = emptyList()
)
typealias Guard<S, A> = (WizardContext, A) -> Boolean
data class Transition<S: StepId>(val target: S, val guard: Guard<S, *>? = null, val id: String)
interface StepEffects<S: StepId, A> {
suspend fun onEnter(ctx: WizardContext, state: WizardState<S, A>) {}
suspend fun onLeave(ctx: WizardContext, state: WizardState<S, A>) {}
suspend fun onComplete(ctx: WizardContext, state: WizardState<S, A>) {}
}
```
## DSL (Skizze)
```kotlin
class FlowBuilder<S: StepId, A> {
fun step(id: S, block: StepBuilder<S, A>.() -> Unit) { /* … */ }
}
class StepBuilder<S: StepId, A> {
fun onEnter(block: suspend (WizardContext, WizardState<S, A>) -> Unit) { /* … */ }
fun whenGuard(id: String, g: Guard<S, A>, go: S) { /* … */ }
fun otherwise(go: S) { /* … */ }
}
fun <S: StepId, A> flow(start: S, build: FlowBuilder<S, A>.() -> Unit): WizardRuntime<S, A> { /* … */ }
```
## Beispiel EventFlow (Auszug)
```kotlin
sealed interface EventStep: StepId {
data object ZnsCheck: EventStep
data object VeranstalterSelection: EventStep
data object AnsprechpersonMapping: EventStep
data object MetaData: EventStep
data object TurnierAnlage: EventStep
data object Summary: EventStep
}
data class EventAcc(
val veranstalterId: Uuid? = null,
val veranstalterNr: String = "",
val veranstalterName: String = "",
val ansprechpersonSatznr: String = "",
val name: String = "",
val ort: String = "",
val start: LocalDate? = null,
val end: LocalDate? = null,
val turniere: List<TurnierEntry> = emptyList()
)
object EventGuards {
val hasZns: Guard<EventStep, EventAcc> = { ctx, _ -> (ctx.stats?.vereinCount ?: 0) > 0 }
val needsContactPerson: Guard<EventStep, EventAcc> = { _, acc -> acc.veranstalterId == null || acc.veranstalterNr.startsWith("ORG-") }
}
val EventFlow = flow<EventStep, EventAcc>(start = EventStep.ZnsCheck) {
step(EventStep.ZnsCheck) {
onEnter { ctx, _ -> /* prefetch stats */ }
whenGuard("hasZns", EventGuards.hasZns, go = EventStep.VeranstalterSelection)
otherwise(go = EventStep.VeranstalterSelection)
}
step(EventStep.VeranstalterSelection) {
whenGuard("needsContact", EventGuards.needsContactPerson, go = EventStep.AnsprechpersonMapping)
otherwise(go = EventStep.MetaData)
}
}
```
## DevTools
- Strukturierte Logs je Transition (from, to, guard-id, result, duration).
- GraphExport (DOT/PlantUML) aus der DSL für Doku & Reviews.
## Tests (Empfehlungen)
- Unit: Guards (100% BranchAbdeckung), RuntimeHistory.
- Property: ResumeDeterminismus (Draft → korrekter Step).
- Snapshot: ComposePanels mit Beispielkontexten.
## Verweise
- ADR0025 Orchestrator · ADR0026 ValidationPolicy · ADR0027 DraftDomain & DeltaSync
- Roadmap: `docs/01_Architecture/MASTER_ROADMAP.md#3-initiative-wizard-orchestrator--offline-drafts-q2q3-2026`

View File

@ -0,0 +1,30 @@
---
type: ADR
status: PROPOSED
owner: Lead Architect
date: 2026-04-21
---
# ADR-0025 — Wizard-Orchestrator (State-Machine, DSL, Guards, Effects)
## Kontext
- Aktuelle Wizard-Implementierungen sind linear (`next/previous`) und hart verdrahtet in ViewModels.
- Anforderungen: Kontextabhängige Pfade, OfflineFirst (Autosave/Resume), testbare Regeln, einheitliche UX.
## Entscheidung
- Einführung eines generischen Orchestrators mit deklarativem Flow:
- `StepId` (typsicher je Flow), `WizardContext`, `WizardState`, `Guard`, `Transition`, `StepEffects`.
- KotlinDSL: `flow { step { whenGuard(id) go target; otherwise go … } }`.
- SideEffects an Hooks (`onEnter/onLeave/onComplete`) für Prefetch, Autosave, Finalisierung.
## Konsequenzen
- Vorteile: zentrale, testbare Navigationslogik; konsistente DraftPolicy; bessere Übersicht/Erweiterbarkeit.
- Risiken: Initialer Overhead, Lernkurve, GuardSprawl; mitigiert durch README, DevTools, Linting/Namenskonventionen.
## Umsetzung
- Modul `frontend/core/wizard` (runtime, dsl, devtools, draft) und `WizardScaffold` (Breadcrumb, Footer, Hotkeys).
- StranglerMigration beginnend mit EventFlow; FeatureFlag `WizardRuntimeEnabled`.
## Verweise
- RoadmapAbschnitt: `docs/01_Architecture/MASTER_ROADMAP.md#3-initiative-wizard-orchestrator--offline-drafts-q2q3-2026`
- Reference: `docs/01_Architecture/Reference/Wizard-DSL-README.md`

View File

@ -0,0 +1,28 @@
---
type: ADR
status: PROPOSED
owner: Lead Architect
date: 2026-04-21
---
# ADR-0026 — Step-Validation-Policy (Sync vs. Async, Fehlersichtbarkeit, Hotkeys)
## Kontext
- Validierungen sind heute uneinheitlich verteilt (UI/Backend) und nicht klar priorisiert (blockierend vs. Hinweis).
## Entscheidung
- Sync-Validierung pro Step als pure Funktion (schnell, offline, blockierend für „Weiter“).
- Async-Validierungen (Server/DB) als nicht-blockierende Hinweise mit Retry; Ergebnisse im Footer aggregiert.
- Einheitliche Hotkeys: Enter=Weiter, Shift+Enter=Zurück, Alt+S=Speichern (Draft), Alt+J=Step-Sprung.
## Konsequenzen
- Konsistente Nutzererwartung, klare Trennung von Fehlerklassen, bessere Testbarkeit.
- Erfordert Footer-Fehlersummary und Dev-Overlay (Guard/Validation-Trace).
## Umsetzung
- API `validate(accumulator): ValidationResult` je Step.
- Async-Pipeline mit Debounce (250ms) und Status-Pills; keine UI-Blocker bei Netzwerkfehlern.
## Verweise
- RoadmapAbschnitt: `docs/01_Architecture/MASTER_ROADMAP.md#3-initiative-wizard-orchestrator--offline-drafts-q2q3-2026`
- Reference: `docs/01_Architecture/Reference/Wizard-DSL-README.md`

View File

@ -0,0 +1,31 @@
---
type: ADR
status: PROPOSED
owner: Lead Architect
date: 2026-04-21
---
# ADR-0027 — Draft-Domain & DeltaSync (Versionierung, Konfliktlösung, Idempotenz)
## Kontext
- OfflineFirst verlangt lokale Drafts, ResumeFähigkeit und robuste Synchronisation bei instabiler Konnektivität.
- Heute: kein einheitliches DraftModell, keine standardisierte Schrittweise Speicherung.
## Entscheidung
- Einführung einer DraftDomain mit Version/ETag und SchrittPatchs:
- `POST /api/events/drafts` (idempotent über IdempotencyKey) erstellt/vereinigt Drafts.
- `PATCH /api/events/drafts/{id}` speichert stepweise Deltas (nur geänderte Felder seit `version`).
- `POST /api/events` finalisiert (ServerValidierung, Erstellung `veranstaltungId`).
- Client OfflineQueue mit Retry/Backoff; Konflikte als nichtblockierende Hinweise.
## Konsequenzen
- Reproduzierbare, idempotente Speicherung; geringere Payloads; klare Konfliktauflösung.
- Erfordert Versionierung im DraftStore und Migrationspfade bei FlowÄnderungen (`flowVersion`).
## Umsetzung
- Frontend: DraftStore (Autosave `onLeave`), DeltaBuilder je Step, Queue mit IdempotencyKey.
- Backend: Versionsverwaltung, IfMatch/ETag Unterstützung, ConflictDetect (409) mit MergeHinweisen.
## Verweise
- RoadmapAbschnitt: `docs/01_Architecture/MASTER_ROADMAP.md#3-initiative-wizard-orchestrator--offline-drafts-q2q3-2026`
- Contracts: folgen nach APISkizzierung (`contracts/` Verzeichnis)

View File

@ -19,4 +19,8 @@ Namensschema: ADR-XXX-title.md mit fortlaufender Nummerierung.
- ADR-0016 API-Design & Anti-Corruption Layer (ACL)
- ADR-0020 Lokale Netzwerk-Kommunikation und Daten-Isolierung
- ADR-0025 Wizard-Orchestrator (State-Machine, DSL, Guards, Effects)
- ADR-0026 Step-Validation-Policy (Sync vs. Async, Fehlersichtbarkeit, Hotkeys)
- ADR-0027 Draft-Domain & DeltaSync (Versionierung, Konfliktlösung, Idempotenz)
Siehe Template: ADR-000-template.md.

View File

@ -0,0 +1,28 @@
---
type: Journal
status: DONE
owner: Curator
date: 2026-04-21
---
# Journal — Roadmap „WizardOrchestrator & OfflineDrafts“ verankert
## Kontext
Die in der Session ausgearbeitete Roadmap zur Migration auf einen WizardOrchestrator wurde in `docs/` verankert.
## Artefakte
- MASTER_ROADMAP aktualisiert (Initiative Abschnitt):
- `docs/01_Architecture/MASTER_ROADMAP.md#3-initiative-wizard-orchestrator--offline-drafts-q2q3-2026`
- Neue ADRs (Status: PROPOSED):
- ADR0025 WizardOrchestrator → `docs/01_Architecture/adr/0025-wizard-orchestrator-de.md`
- ADR0026 StepValidationPolicy → `docs/01_Architecture/adr/0026-validation-policy-de.md`
- ADR0027 DraftDomain & DeltaSync → `docs/01_Architecture/adr/0027-draft-domain-and-delta-sync-de.md`
- Referenz:
- WizardDSL README → `docs/01_Architecture/Reference/Wizard-DSL-README.md`
- ADRIndex ergänzt:
- `docs/01_Architecture/adr/README.md`
## Nächste Schritte (Review)
- Lead Architect: ADR0025/26/27 Review & Nummernfreigabe.
- Frontend: Spike „Runtime/DSLSkelett“ gemäß Roadmap (Tag 12).
- Backend: APISkizzen für Drafts/Validate in `contracts/` vorbereiten.