# Backlog R1 Stand: 2026-11-02 (Klärungen 1–48 und N1–N14 eingearbeitet) · Pflege: requirements-analyst · Quelle: `requirements/r1-story-entwurf.md` (freigegeben durch Chris am 2026-11-02), Akzeptanzkriterien in `requirements/20-r1-akzeptanzkriterien.md`, verbindliche Entscheidungen zu den 48 offenen Fragen und zu N1–N14 in `requirements/r1-klaerungen.md`. Repo: [cschlaefke/Shuffle](https://git.cshomelabs.work/cschlaefke/Shuffle/issues) · Milestone: **R1** (ID 1, alle Story-Issues zugeordnet) · 4 Epics + Querschnitt, 28 Stories, 28 Issues (#1–#26, #28, #29; #27 ist der PR zum Intake). Die Akzeptanzkriterien stehen 1:1 als nummerierte Checkliste in den Issues und werden als „KTO-01 Kriterium 3“ referenziert. Gestrichene Kriterien behalten ihre Nummer („~~n.~~ entfällt“), neue werden hinten angehängt. Die Querschnittskriterien (Datenschutz, Sicherheit, Sprachen, Barrierefreiheit, Zustände/Netz, Plattformen) gelten für jede Story. ## Stories nach Umsetzungsreihenfolge Status: `offen` = Issue angelegt, noch keine Spec. Clarification = Label `needs-clarification` gesetzt (offene Frage als Kommentar im Issue, siehe unten). | Story-ID | Issue | Titel | Epic | Prio | Größe | Etappe | Status | Clarification | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | KTO-01 | [#1](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/1) | Registrieren, anmelden und Passwort zurücksetzen | Konto | Must | XL | R1.1 | offen | nein | | KAT-05 | [#2](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/2) | Katalogdaten laden und aktuell halten | Katalog | Must | XL | R1.1 (Datenmodell, Startbestand), R1.2 (Admin-Pflege per Studio, Meldungen); Import erst mit Lizenz | offen | nein (N11 entschieden) | | KAT-01 | [#3](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/3) | Spiele suchen | Katalog | Must | L | R1.1 | offen | nein | | KAT-02 | [#4](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/4) | Spieldetailseite | Katalog | Must | M | R1.1 | offen | nein | | KTO-11 | [#28](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/28) | Einstellungsbereich (neu) | Konto | Must | L | R1.1 | offen | nein (N1–N5, N13, N14 entschieden) | | KTO-04 | [#5](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/5) | Privatsphäre (in R1 nur der Hinweis) | Konto | Must | S | R1.1 | offen | nein | | SAM-01 | [#6](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/6) | Spiel zur Sammlung hinzufügen | Sammlung | Must | S | R1.2 | offen | nein | | SAM-02 | [#7](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/7) | Eigene Angaben pro Spiel | Sammlung | Must | M | R1.2 | offen | nein | | SAM-04 | [#8](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/8) | Wunschliste mit Priorität | Sammlung | Must | M | R1.2 | offen | nein | | SAM-05 | [#9](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/9) | Einkaufsliste führen | Sammlung | Must | M | R1.2 | offen | nein | | SAM-06 | [#10](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/10) | In die Sammlung übernehmen | Sammlung | Must | S | R1.2 | offen | nein | | SAM-03 | [#11](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/11) | Sammlung durchsuchen, filtern und sortieren | Sammlung | Must | L | R1.2 | offen | nein | | KAT-03 | [#12](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/12) | Erweiterungen und Editionen | Katalog | Must | M | R1.2 | offen | nein | | KAT-04 | [#13](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/13) | Fehlendes Spiel melden | Katalog | Must | L | R1.2 | offen | nein | | KTO-02 | [#14](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/14) | Profil bearbeiten | Konto | Must | L | R1.2 | offen | nein | | PAR-01 | [#15](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/15) | Partie erfassen | Partien | Must | XL | R1.3 | offen | nein | | PAR-02 | [#16](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/16) | Mitspieler hinzufügen | Partien | Must | M | R1.3 | offen | nein | | PAR-03 | [#17](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/17) | Ergebnis erfassen | Partien | Must | L | R1.3 | offen | nein | | PAR-04 | [#18](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/18) | Wertungsbogen je Spiel | Partien | Must | M | R1.3 | offen | nein | | PAR-05 | [#19](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/19) | Partie bearbeiten und löschen | Partien | Must | M | R1.3 | offen | nein | | PAR-06 | [#20](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/20) | Partienverlauf | Partien | Must | M | R1.3 | offen | nein | | PAR-07 | [#21](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/21) | Persönliche Statistik | Partien | Must | L | R1.3 | offen | nein | | PAR-08 | [#22](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/22) | Statistik je Spiel | Partien | Must | M | R1.3 | offen | nein | | QUE-09 | [#29](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/29) | Startseite: persönliches Dashboard (neu) | Querschnitt | Must | M | R1.3 | offen | nein (N6–N10 entschieden) | | KTO-05 | [#23](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/23) | Konto löschen und Daten exportieren | Konto | Must | XL | R1.4 | offen | nein | | SAM-07 | [#24](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/24) | BGG-Konto verknüpfen | Sammlung | Should | S | R1.4 (nur mit BGG-Lizenz) | offen | nein | | SAM-08 | [#25](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/25) | Sammlung und Wunschliste aus BGG importieren | Sammlung | Should | XL | R1.4 (nur mit BGG-Lizenz) | offen | nein | | SAM-09 | [#26](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/26) | BGG-Import wiederholen und abgleichen | Sammlung | Should | L | R1.4 (nur mit BGG-Lizenz) | offen | nein | ## Epics | Epic | Label | Stories (Issues) | | --- | --- | --- | | KTO Konto & Profil | `epic/konto` | KTO-01 (#1), KTO-02 (#14), KTO-04 (#5), KTO-05 (#23), KTO-11 (#28) | | KAT Spielekatalog | `epic/katalog` | KAT-01 (#3), KAT-02 (#4), KAT-03 (#12), KAT-04 (#13), KAT-05 (#2) | | SAM Sammlung & Listen | `epic/sammlung` | SAM-01 (#6), SAM-02 (#7), SAM-03 (#11), SAM-04 (#8), SAM-05 (#9), SAM-06 (#10), SAM-07 (#24), SAM-08 (#25), SAM-09 (#26) | | PAR Partien & Statistik | `epic/partien` | PAR-01 (#15), PAR-02 (#16), PAR-03 (#17), PAR-04 (#18), PAR-05 (#19), PAR-06 (#20), PAR-07 (#21), PAR-08 (#22) | | QUE Querschnitt | `epic/querschnitt` (neu, N10) | QUE-09 (#29) | ## Etappen (im Milestone R1) | Etappe | Issues | | --- | --- | | R1.1 Fundament | #1, #2 (Datenmodell, Startbestand, Rechte), #3, #4, #28, #5 | | R1.2 Sammlung | #6, #7, #8, #9, #10, #11, #12, #13, #2 (Admin-Pflege per Studio, Meldungen), #14 | | R1.3 Partien | #15, #16, #17, #18, #19, #20, #21, #22, #29 | | R1.4 Abschluss | #23, #24, #25, #26 (BGG-Block nur mit Lizenz, S1) | ## XL-Stories Nicht geteilt (Entscheidung Chris, Label `size/xl`). Die Schnittvorschläge stehen im Issue unter „Mögliche Schnitte für die Spec“ und werden in der Spec (architect) entschieden: KTO-01 (#1), KTO-05 (#23), KAT-05 (#2), SAM-08 (#25), PAR-01 (#15). KAT-05 wird durch die Zurückstellung des Imports (Klärung 24) in R1 voraussichtlich kleiner; Neubewertung in der Spec. ## Abhängigkeiten In Forgejo als blockierende Abhängigkeiten gesetzt (Issue hängt ab von …). Neu am 2026-11-02 markiert mit *(neu)*. | Issue | hängt ab von | | --- | --- | | #3 KAT-01 | #2 | | #4 KAT-02 | #3 | | #5 KTO-04 | #1, #28 *(neu)* | | #6 SAM-01 | #1, #3, #4 | | #7 SAM-02 | #6 | | #8 SAM-04 | #1, #4 | | #9 SAM-05 | #1, #4 | | #10 SAM-06 | #6, #8, #9 | | #11 SAM-03 | #6, #7 | | #12 KAT-03 | #4, #6 | | #13 KAT-04 | #1, #2, #3 | | #14 KTO-02 | #1, #3 | | #15 PAR-01 | #1, #3, #6 | | #16 PAR-02 | #15 | | #17 PAR-03 | #16 | | #18 PAR-04 | #17 | | #19 PAR-05 | #15, #16, #17, #18 | | #20 PAR-06 | #15, #16, #17 | | #21 PAR-07 | #17, #20 | | #22 PAR-08 | #4, #17 | | #23 KTO-05 | #1, #28 *(neu)* | | #24 SAM-07 | #1 | | #25 SAM-08 | #2, #6, #8, #9 *(neu, „preordered“ → Einkaufsliste)*, #13, #24 | | #26 SAM-09 | #7, #25 | | #28 KTO-11 *(neu)* | #1 | | #29 QUE-09 *(neu)* | #8, #20, #15 *(neu, N8 Schnellaktion)*, #21 *(neu, N8 Kurzstatistik)* | Nur im Issue-Text vermerkt (kriterienbezogene Rückverweise, die als blockierende Abhängigkeit Zyklen erzeugen würden): - KAT-01 (#3) Kriterium 6 → KAT-04 (#13) - KAT-02 (#4) Kriterien 3–4 → SAM-01 (#6), SAM-04 (#8), SAM-05 (#9); Kriterium 6 → PAR-08 (#22) - KAT-03 (#12) Kriterium 6 (Edition bei Partien) → PAR-01 (#15) - SAM-01 (#6) Kriterium 5 → SAM-06 (#10) - SAM-05 (#9) Kriterium 3 → SAM-06 (#10) - ~~KTO-11 (#28) Kriterium 1 → KTO-05 (#23)~~ entfällt (N14): Den Einstieg zu Export/Konto löschen ergänzt KTO-05 selbst (KTO-05 Kriterium 6); #23 hängt weiterhin blockierend von #28 ab - KAT-04 (#13) Kriterium 7 (Import-Meldungen zählen nicht aufs Limit) ↔ SAM-08 (#25) Kriterium 10 (N12) - KTO-11 (#28, R1.1) Kriterium 12 (nicht synchronisierte Partien beim Abmelden) → PAR-01 (#15, R1.3); wird mit PAR-01 geprüft (N4) - KTO-05 (#23) inhaltlich → alle Daten-Stories (u. a. #6–#11, #13, #14, #15–#18) - Externe Voraussetzung BGG-Lizenz (S1) für #24, #25, #26 sowie für die zurückgestellten Kriterien KAT-05 1, 2 (Quellenteil), 3, 6 ## Offene Fragen Alle 48 Fragen aus `r1-story-entwurf.md` § 5 sind am 2026-11-02 von Chris entschieden; die verbindlichen Antworten stehen in [`r1-klaerungen.md`](r1-klaerungen.md) und sind in `20-r1-akzeptanzkriterien.md` und den Issues (Abschnitt „Klärungen“) eingearbeitet. ### Neue offene Punkte N1–N14 – erledigt (2026-11-02) Alle 14 Fragen aus dem Einarbeiten und die PAR-08-Annahme sind von Chris entschieden; verbindlich ist der Abschnitt „Neue Fragen aus dem Einarbeiten (N1–N14 …)“ in [`r1-klaerungen.md`](r1-klaerungen.md). Eingearbeitet in `20-r1-akzeptanzkriterien.md` und die Issues (je Kommentar „Klärungen N… eingearbeitet (2026-11-02)“). | Nr | Thema | Issue | Status | Eingearbeitet in | | --- | --- | --- | --- | --- | | N1 | Andere Geräte abmelden nach Passwort-/E-Mail-Wechsel | #28 | erledigt | KTO-11 Kriterium 9 | | N2 | Secure email change: Link an neue, Info-Mail an alte Adresse | #28 (#1) | erledigt | KTO-11 Kriterium 4, KTO-01 Kriterium 11 | | N3 | Sprache ohne/mit Anmeldung, keine Option „wie Gerät“ | #28 | erledigt | KTO-11 Kriterien 2, 10, 11; QUE-05 Kriterium 1 | | N4 | Abmelden mit nicht synchronisierten Partien: lokal behalten, nur für dasselbe Konto | #28 | erledigt | KTO-11 Kriterium 12 | | N5 | Rechtstexte verlinken; Hinweis + freiwilliger Ausschalter für anonyme Messung | #28 | erledigt | KTO-11 Kriterien 13, 14; QUE-04 Kriterium 4 | | N6 | 5 Einträge je Dashboard-Bereich | #29 | erledigt | QUE-09 Kriterien 2, 4 | | N7 | Wunschliste nach Priorität, dann neueste | #29 | erledigt | QUE-09 Kriterium 4 | | N8 | Schnellaktion „Partie erfassen“, Kurzstatistik; keine Einkaufsliste | #29 | erledigt | QUE-09 Kriterien 1, 9–12 | | N9 | Ohne Anmeldung: Katalogsuche + Anmelde-Hinweis | #29 | erledigt | QUE-09 Kriterium 13 | | N10 | Story-ID QUE-09, Label `epic/querschnitt` | #29 | erledigt | Labels #29 | | N11 | Startbestand ca. 200 Spiele, nur Fakten, Platzhalter-Cover, eigene Kurztexte | #2 | erledigt | KAT-05 Kriterien 7, 10 | | N12 | Import-Meldungen zählen nicht aufs Tageslimit, dedupliziert je BGG-ID, Kennzeichen „aus Import“ | #25, #13 | erledigt (N12a: je Nutzer) | KAT-04 Kriterium 7, SAM-08 Kriterium 10 | | N13 | Aktuelles Passwort für Passwort- und E-Mail-Wechsel | #28 | erledigt | KTO-11 Kriterien 4, 6, 7 | | N14 | Einstieg Export/Löschen gehört zu KTO-05 | #28, #23 | erledigt | KTO-11 Kriterium 1, KTO-05 Kriterium 6 | | PAR-08 | Partien ohne mich zählen nicht in die Statistik je Spiel | #22 | bestätigt | PAR-08 Kriterium 6 | ### Offen nach N1–N14 | Nr | Thema | Issue | Label | | --- | --- | --- | --- | | N12a | Deduplizierung der Import-Meldungen „je Spiel (BGG-ID)“: je Nutzer oder über alle Nutzer? Bei globaler Deduplizierung kollidiert die harte Löschung „meiner offenen Meldungen“ (KTO-05 Kriterium 2) mit Meldungen, an denen auch andere Nutzer hängen, und der Ergebnishinweis (KAT-04 Kriterien 4–5) muss alle betroffenen vorläufigen Einträge erreichen. | #25 | erledigt: je Nutzer (siehe `r1-klaerungen.md`) | Bestätigt bzw. korrigiert durch Chris (2026-11-02): - KTO-11 (#28) Kriterium 11: Bei der Registrierung wird die gerade aktive Oberflächensprache zur Profilsprache – bestätigt. - QUE-09 (#29) Kriterium 10: Die Siegquote in der Kurzstatistik gilt **gesamt**, die Partienzahl für den laufenden Monat (N8a). ## Datenmodell-Änderungen für architect `docs/datenmodell-r1.md` und die Migrationen werden hier **nicht** geändert. Die folgenden Änderungen ergeben sich aus `r1-klaerungen.md`. Sie landen beim `architect` in den Specs der betroffenen Issues und danach als neue, additive Migrationen. | Klärung | Änderung | Issues | | --- | --- | --- | | 1 | Sammlung, Wunsch- und Einkaufsliste bleiben ein Eintrag je Nutzer und Spiel (`unique (owner_id, game_id)`) mit Listenstatus; Wechsel = Statusänderung | #6, #8, #9, #10, #25 | | 2, 29 | Sammlungseintrag: Zustand (Liste: neu/eingeschweißt, sehr gut, gut, gebraucht, beschädigt), Kaufdatum, Notiz (≤ 1000), Standort (Freitext), Tags (Freitext, Vorschläge aus bisherigen Werten, keine eigene Verwaltung). Wunschliste: Priorität (hoch/mittel/niedrig), Notiz. Einkaufsliste: Notiz. **Kein** Kaufpreis, Händler, geplanter Preis, Link in R1 | #7, #8, #9, #10 | | 3 | Alternative Titel je Spiel mit Sprache (eigene Tabelle), in der Suche berücksichtigt | #3 | | 4 | Verlag(e) je Spiel (mehrere möglich) | #3, #4 | | 5 | Erweiterung als eigenes Spiel mit Verweis auf das Basisspiel | #12 | | 6, 27 | Neue Tabelle für Meldungen: Status offen/freigegeben/abgelehnt/zusammengeführt, Titel, Verlag, Jahr, Link, Verweis auf Zieleintrag; Limit 10 je Nutzer und Tag; Ergebnis als Hinweis am vorläufigen Eintrag | #13, #2 | | 7 | Katalog: Flag „ausgeblendet“, Kennzeichnung manuell gepflegter Felder, Quellenkennung + Quellenangabe, Anzeige-Erlaubnis je Quelle – schon in R1, damit der spätere Import keine Migration braucht | #2 | | 8 | Profil-Genres referenzieren dieselbe Genre-Liste wie der Katalog | #14 | | 9 | Stadt im Profil nur für den Nutzer selbst lesbar (RLS); keine Sichtbarkeit von Profilfeldern für Fremde in R1 | #14, #5 | | 10, 20 | Konto-Löschung: harte Löschung aller Nutzerdaten (Partien, Gäste, Wertungsbögen, vorläufige Einträge, offene Meldungen) innerhalb von 30 Tagen inkl. Sicherungen; Regel „Gelöschter Nutzer“ erst ab R2. Datenexport als JSON, abrufbar in der App, 7 Tage gültig (Ablageort, Ablauf) | #23 | | 11 | Partie: Ort; Gästeliste als eigene Entität; kooperativ (gewonnen/verloren gemeinsam); Teams mit Punkten/Ergebnis je Team | #15, #16, #17, #20 | | 12 | Vorläufige private Spieleinträge auch automatisch aus dem BGG-Import, inkl. automatischer Meldung; Herkunftskennzeichen „aus BGG-Import“ (für Klärung 35) | #25, #26, #13 | | 23 | Lieblingsspiele: nur Katalogspiele (keine vorläufigen), höchstens 5, mit Reihenfolge | #14 | | 28 | Edition optional bei Sammlungseintrag und Partie, nicht bei Wunsch-/Einkaufsliste | #12, #6, #15 | | 33 | BGG-Verknüpfung: höchstens eine je Konto; **kein** Unique-Constraint auf den BGG-Namen über Konten hinweg | #24 | | 34 | BGG-Import: Zuordnung der Status (owned/wishlist/want to buy/preordered), Prioritätsabbildung 1–5 → hoch/mittel/niedrig, Erweiterungen importieren | #25, #26 | | 36 | Partie: Datum ohne Uhrzeit; Offline-Sync mit „letzte Änderung gewinnt“ (Änderungszeitpunkt je Partie nötig) und Hinweis an den Nutzer | #15, #19 | | 37 | Gastname 1–30 Zeichen; Gast nur löschbar, wenn er in keiner Partie vorkommt | #16 | | 38 | Wertungsrichtung („höchste“ oder „niedrigste Punktzahl gewinnt“) je Spiel und Nutzer | #17, #22 | | 39 | Ein Wertungsbogen je Spiel und Nutzer; Kategorien weich löschen (in alten Partien als „gelöscht“ sichtbar); negative Punkte erlaubt | #18 | | 44 | Admin-Rolle nur als Datenbankrolle (RLS); Pflege über Supabase Studio/SQL, Ablauf im Repo dokumentieren | #2, #13 | | 45 | Sprache im Profil speichern (für Systemmails und Sprachwahl in KTO-11) | #1, #28 | | 48 | Sprache von Katalogtexten (Titel/Beschreibung) speichern, um den Sprachhinweis zu zeigen | #4 | | N3 | Sprache vor der Anmeldung lokal auf dem Gerät halten (Gerätesprache als Vorgabe, änderbar); nach der Anmeldung gilt die Profilsprache aus Klärung 45 auf allen Geräten; bei Registrierung wird die aktive Sprache als Profilsprache übernommen (abgeleitet) | #28, #1 | | N5 | Opt-out-Flag für die anonyme Reichweitenmessung; Speicherort (Gerät oder Profil) in der Spec entscheiden, die Messung selbst bleibt ohne Konto- oder Gerätebezug | #28 | | N4 | Lokale Offline-Daten (nicht synchronisierte Partien inkl. Gäste/Wertungsbögen) je Konto getrennt auf dem Gerät halten; beim Abmelden nicht löschen, für andere Konten nicht sichtbar, Übertragung erst nach erneuter Anmeldung desselben Kontos | #28, #15 | | N11 | Startbestand ca. 200 Spiele als Seed bzw. per Studio; Platzhalter-Cover und eigener Kurztext je Spiel (keine fremden Cover/Texte) | #2 | | N12 | Meldungen: Kennzeichen „aus Import“ (Herkunft Nutzer/Import), BGG-Kennung an der Meldung für die Deduplizierung; Tageslimit zählt nur Nutzer-Meldungen. Deduplizierung je Nutzer und BGG-ID (N12a), also eine Meldung je vorläufigem Eintrag | #13, #25 | | N1, N2, N13 | Keine Tabellenänderung erwartet; Supabase „secure email change“ und Abmelden anderer Sitzungen in der Auth-Konfiguration aktivieren und im Repo dokumentieren | #28 |