Shuffle/requirements/backlog.md
cschlaefke 9d59244655
Some checks failed
CI / flutter (pull_request) Failing after 3s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Failing after 20s
docs(requirements): apply R1 clarifications and add KTO-11, QUE-09
All 48 open questions from the R1 intake are answered in
requirements/r1-klaerungen.md. Acceptance criteria, requirements and
backlog are updated accordingly; removed criteria stay marked as
"entfällt" so references keep their numbers. New stories KTO-11
(settings, #28) and QUE-09 (dashboard, #29). backlog.md lists the data
model changes for the architect and new open questions N1-N14.

Refs #2, #25, #28, #29

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 15:52:59 +01:00

166 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Backlog R1
Stand: 2026-11-02 (Klärungen 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 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 | **ja** (N11) |
| 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 | **ja** (N1–N5, N13, N14) |
| 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 (Labels Partien + Sammlung) | Must | M | R1.3 | offen | **ja** (N6–N10) |
| 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 | **ja** (N12) |
| 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 | – (kein eigenes Label; #29 trägt `epic/partien` + `epic/sammlung`, siehe 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 |
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 (Einstieg Datenexport/Konto löschen) → KTO-05 (#23, R1.4); umgekehrt hängt #23 blockierend von #28 ab
- 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 (Stand 2026-11-02)
Beim Einarbeiten und beim Schneiden der zwei neuen Stories sind diese Fragen entstanden. Der Wortlaut steht als Kommentar im jeweiligen Issue, das Label `needs-clarification` ist gesetzt.
| Nr | Thema | Issue |
| --- | --- | --- |
| N1 | Andere Geräte abmelden nach Passwort- oder E-Mail-Änderung? | #28 |
| N2 | E-Mail-Änderung: Bestätigung nur an neue oder auch Info/Bestätigung an alte Adresse? | #28 |
| N3 | Sprache: Option „wie Gerät“, Vorrang Profilsprache vor Gerätesprache auf neuem Gerät, Sprachwahl ohne Anmeldung? | #28 |
| N4 | Abmelden mit nicht synchronisierten Partien: warnen, blockieren oder lokal behalten? | #28 |
| N5 | Datenschutzerklärung/Nutzungsbedingungen/Impressum in den Einstellungen verlinken; Info oder Opt-out zur anonymen Messung? | #28 |
| N6 | Anzahl der Einträge je Dashboard-Bereich | #29 |
| N7 | Reihenfolge der Wunschliste auf dem Dashboard | #29 |
| N8 | Weitere R1-Inhalte auf der Startseite (Einkaufsliste, Kurzstatistik, Schnellaktionen)? | #29 |
| N9 | Startseite für nicht angemeldete Nutzer (Web, Katalog ohne Anmeldung lesbar) | #29 |
| N10 | Story-ID QUE-09 und Epic-Label (eigenes `epic/querschnitt`?) | #29 |
| N11 | Startbestand des Katalogs: Umfang, wer pflegt ein, Herkunft und Rechte von Covern und Texten ohne BGG-Lizenz | #2 |
| N12 | Zählen automatisch beim BGG-Import erzeugte Meldungen auf das Tageslimit von 10 (KAT-04 Kriterium 7)? | #25 (betrifft #13) |
| N13 | Aktuelles Passwort beim Passwortwechsel (und ggf. E-Mail-Änderung) abfragen? (KTO-11 Kriterium 6 ist Annahme) | #28 |
| N14 | Einstieg Export/Konto löschen in KTO-11 (R1.1), solange KTO-05 (R1.4) fehlt: ausblenden oder nachträglich ergänzen? | #28 |
Zur Kenntnis, ohne eigenes Label: PAR-08 (#22) Kriterium 6 („Partien ohne mich zählen nicht in die Statistik je Spiel“) ist aus den Klärungen 37, 40 und 41 abgeleitet, nicht ausdrücklich entschieden. Bitte widersprechen, falls es anders gemeint ist.
## 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 |