From 9d59244655de6cb9d958271f76a107f7dbe1d303 Mon Sep 17 00:00:00 2001 From: cschlaefke Date: Mon, 2 Nov 2026 15:52:59 +0100 Subject: [PATCH] docs(requirements): apply R1 clarifications and add KTO-11, QUE-09 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- requirements/10-anforderungen.md | 22 ++- requirements/20-r1-akzeptanzkriterien.md | 233 +++++++++++++++-------- requirements/backlog.md | 197 +++++++++---------- requirements/r1-klaerungen.md | 59 ++++++ 4 files changed, 325 insertions(+), 186 deletions(-) create mode 100644 requirements/r1-klaerungen.md diff --git a/requirements/10-anforderungen.md b/requirements/10-anforderungen.md index 552f767..9b6f527 100644 --- a/requirements/10-anforderungen.md +++ b/requirements/10-anforderungen.md @@ -4,6 +4,8 @@ 2026-11-01 · Chris +> **Änderungsvermerk 2026-11-02:** R1-Entscheidungen aus [`r1-klaerungen.md`](r1-klaerungen.md) als Hinweise ergänzt (Stadt nur für den Nutzer selbst in R1, Offline nur in den Apps, Katalog manuell und Admin-Pflege per Supabase Studio, anonyme Reichweitenmessung, allgemeine Privatsphäre-Regel bei KTO-04, neue R1-Stories KTO-11 und QUE-09). Die R1-Akzeptanzkriterien stehen in `20-r1-akzeptanzkriterien.md`. + Entwurf zur Abstimmung: Deine 18 Punkte als 12 Epics mit Story-Titeln, einem Vorschlag für den Release-Schnitt und den Fragen, die vor der Architektur geklärt werden müssen. Akzeptanzkriterien schreiben wir erst für die Epics, die in den ersten Release kommen. ## Entscheidungen (Stand 2. November 2026) @@ -13,19 +15,19 @@ Die Grundsatzfragen F1 bis F7, drei Detailfragen für R1 und der Release-Schnitt | Nr | Entscheidung | Folge | | --- | --- | --- | | F1 | Markt und Sprachen: DACH, Deutsch und Englisch ab Start | Postleitzahlen für Deutschland, Österreich und Schweiz; zweisprachige Oberfläche von Anfang an | -| F2 | Katalog: BGG-Lizenz beantragen, den Katalog aber BGG-unabhängig bauen | Eigene Spiel-IDs, die BGG-Kennung nur als Zusatzfeld; ohne Lizenz läuft die App weiter. Laut [BGG-Bedingungen](https://boardgamegeek.com/wiki/page/XML_API_Terms_of_Use) und [Nutzungsleitfaden](https://boardgamegeek.com/using_the_xml_api) ist die Lizenz für kommerzielle Apps nötig, „Powered by BGG“ ist Pflicht, Anfragen laufen über den Server mit Zwischenspeicher | -| F3 | Offline: nur das Erfassen von Partien | Lokale Speicherung und Abgleich nur für Partien | +| F2 | Katalog: BGG-Lizenz beantragen, den Katalog aber BGG-unabhängig bauen | Eigene Spiel-IDs, die BGG-Kennung nur als Zusatzfeld; ohne Lizenz läuft die App weiter. Laut [BGG-Bedingungen](https://boardgamegeek.com/wiki/page/XML_API_Terms_of_Use) und [Nutzungsleitfaden](https://boardgamegeek.com/using_the_xml_api) ist die Lizenz für kommerzielle Apps nötig, „Powered by BGG“ ist Pflicht, Anfragen laufen über den Server mit Zwischenspeicher. **R1 (Klärungen 24, 44):** Der Katalog wird zum Start nur manuell gepflegt, ein Import-Job kommt erst mit der Lizenz; der Admin pflegt Katalog und Meldungen über Supabase Studio/SQL | +| F3 | Offline: nur das Erfassen von Partien | Lokale Speicherung und Abgleich nur für Partien. **R1 (Klärung 36):** Offline-Erfassung nur in den Apps (iOS, Android); im Browser erscheint der Hinweis „Verbindung nötig“ | | F4 | Premium: zunächst keine Premium-Funktionen, gegebenenfalls eine Spendenmöglichkeit | KI-Erkennung und Epic PRE sind zurückgestellt; laut BGG-Leitfaden braucht auch eine reine Spenden-App eine kommerzielle Lizenz, die vermutlich kostenlos ist | -| F5 | Standort: Stadt ist für andere sichtbar | Stadt wird aus der PLZ abgeleitet und angezeigt, die PLZ selbst bleibt verborgen. Ob Nutzer die Stadtangabe abschalten können, regelt KTO-04 | +| F5 | Standort: Stadt ist für andere sichtbar | Stadt wird aus der PLZ abgeleitet und angezeigt, die PLZ selbst bleibt verborgen. Ob Nutzer die Stadtangabe abschalten können, regelt KTO-04. **R1 (Klärung 9):** Die Stadt ist in R1 nur für den Nutzer selbst sichtbar | | F6 | Händler und Vereine: manuelle Prüfung durch dich, kostenlos | Freigabe-Ablauf im Admin-Bereich (QUE-08) | | F7 | Plattformen: Mobile zuerst, Web mit demselben Kern | Eine Codebasis, alle Kernfunktionen auch im Web | -| F8 | Mindestalter: ab 16 | Altersbestätigung bei der Registrierung (KTO-01); rechtliche Prüfung vor dem Start | +| F8 | Mindestalter: ab 16 | Altersbestätigung bei der Registrierung (KTO-01); rechtliche Prüfung vor dem Start. **R1 (Klärung 21/47):** Selbstbestätigung „mindestens 16“ reicht bis zur rechtlichen Prüfung | | F9 | BGG-Sync: nur Import, manuell auslösbar | Kein Zurückschreiben, keine automatischen Hintergrundabrufe (SAM-07 bis SAM-09) | | F11 | Partien: Gäste ohne Konto möglich, verknüpfte Nutzer müssen bestätigen | In R1 nur Gäste mit Namen; Verknüpfung und Bestätigung kommen mit R2 (PAR-02) | | S1 | BGG-Import bleibt in R1, wird aber als Letztes gebaut | Kommt die Lizenz nicht rechtzeitig, startet R1 ohne Import und er wird nachgeliefert | | S2 | KI-Erkennung aus Fotos ist zurückgestellt, bis die Finanzierung geklärt ist | SAM-10 und Epic PRE ruhen vorerst | | S3 | Reihenfolge: erst Gruppen (R2), dann Community (R3) | Gruppen liefern echte Nutzung am Spieltisch, bevor Shelfies und Reviews Inhalte brauchen | -| F18 | Startseite: persönliches Dashboard bis R3, News-Seite ab R4 | Dashboard zeigt zuletzt gespielt, Wunschliste, nächste Termine | +| F18 | Startseite: persönliches Dashboard bis R3, News-Seite ab R4 | Dashboard zeigt zuletzt gespielt, Wunschliste, nächste Termine. **R1 (Klärung 42):** eigene Story QUE-09 mit zuletzt gespielt und Wunschliste; nächste Termine erst mit den Gruppen (R2) | **Aufgabe für dich:** BGG-Anwendung registrieren und die Lizenz beantragen, damit die Antwort da ist, wenn R1 fertig wird. @@ -77,7 +79,9 @@ Konto, Katalog, Sammlung und Partien bilden R1. Stories ohne Zusatz gehören in - **KTO-02** Profil bearbeiten: Anzeigename, Avatar, Kurzbeschreibung, Lieblingsspiele/Genres - **KTO-03** Wohnort per PLZ angeben und festlegen, was andere davon sehen (R2) - **KTO-04** Privatsphäre je Bereich einstellen: privat, Freunde, öffentlich + - **Allgemeine Regel (Klärung 19):** Führt ein Release neue Freigaben ein, sind neue Bereiche standardmäßig privat, bis der Nutzer sie freigibt (Privacy by Default). Gilt für alle künftigen Freigabe-Stories (u. a. KTO-03, KTO-06 bis KTO-08, GRP, COM). In R1 besteht KTO-04 nur aus dem Hinweis „alles privat“. - **KTO-05** Konto und Daten löschen, Daten exportieren +- **KTO-11** Einstellungsbereich: Sprache, Abmelden, E-Mail und Passwort ändern, Privatsphäre-Hinweis, Einstieg Konto löschen und Export (neu in R1, Klärungen 22, 43) - **KTO-06** Lieblingsspiele im Profil festlegen (R3) - **KTO-07** Youtube-, BGG-, BGA-, Steam- und Discord-Name mit Link hinterlegen (R3) - **KTO-08** Profile anderer Nutzer ansehen (R3) @@ -90,7 +94,7 @@ Konto, Katalog, Sammlung und Partien bilden R1. Stories ohne Zusatz gehören in - **KAT-02** Spieldetailseite mit Cover, Eckdaten und Beschreibung - **KAT-03** Erweiterungen und Editionen eines Spiels abbilden - **KAT-04** Fehlendes Spiel melden oder anlegen -- **KAT-05** Katalogdaten aus der Quelle laden und aktuell halten +- **KAT-05** Katalogdaten aus der Quelle laden und aktuell halten (R1: nur manuelle Pflege durch den Admin über Supabase Studio/SQL, Import erst mit Lizenz; Klärungen 24, 44) ### SAM – Sammlung & Listen @@ -201,10 +205,14 @@ News und Events bilden R4, Premium ist zurückgestellt. Crowdfunding und Zubehö - **QUE-02** Inhalte und Nutzer melden, Nutzer blockieren - **QUE-03** Moderationsansicht für Admins: Meldungen prüfen, sperren, löschen - **QUE-04** Datenschutz: Einwilligungen, Datenschutzerklärung, Löschfristen + - **R1 (Klärung 21/47):** Nur anonyme, cookielose Reichweitenmessung ohne Geräte-IDs und ohne Einwilligung (z. B. selbst gehostet); keine weiteren Analyse- oder Tracking-Dienste. Datenschutzerklärung und Nutzungsbedingungen liefert Chris vor dem Release, rechtliche Prüfung vor dem Release nötig. Löschfrist 30 Tage inkl. Sicherungen (Klärung 20). - **QUE-05** Mehrsprachigkeit Deutsch und Englisch - **QUE-06** Barrierefreiheit - **QUE-07** Rollen und Rechte: Nutzer, Händler, Verein, Admin + - **R1 (Klärung 44):** Die Admin-Rolle existiert nur als Datenbankrolle (Zugriffsregeln), ohne eigene Story. - **QUE-08** Admin-Bereich für Katalog, News-Quellen und Verifizierung + - **R1 (Klärungen 24, 44):** Kein Admin-Bereich in der App bis QUE-08 (R4). Der Admin pflegt Katalog und Meldungen über Supabase Studio/SQL; der Ablauf wird im Repo dokumentiert. +- **QUE-09** Startseite: persönliches Dashboard mit zuletzt gespielt und Wunschliste (neu in R1, Klärung 42; ab R4 ersetzt durch NEW-01) ## Offene Fragen @@ -242,7 +250,7 @@ Die Features laufen auf ein relationales Datenmodell mit sauberen Zugriffsregeln | News und Feeds | Regelmäßiger Abruf externer Quellen, Zwischenspeicher, Quellenverwaltung | | Benachrichtigungen | Push für iOS, Android und Web sowie E-Mail, Einstellungen je Nutzer | | Premium | zurückgestellt; bei einer Spendenfunktion gelten die Store-Regeln (F4) | -| Partien offline erfassen | Lokale Speicherung auf dem Gerät und Abgleich bei nächster Verbindung (F3) | +| Partien offline erfassen | Lokale Speicherung auf dem Gerät und Abgleich bei nächster Verbindung (F3); in R1 nur in den Apps, im Web nicht (Klärung 36); bei Konflikten gilt die letzte Änderung mit Hinweis an den Nutzer | | Statistik | Auswertungen über viele Partien; anfangs reichen Datenbankabfragen | **Nächster Schritt:** F1 bis F7 und der Release-Schnitt sind entschieden. Du beantragst die BGG-Lizenz, ich schreibe die Akzeptanzkriterien für R1, danach gehen wir in die Architektur (ADR-0001 und folgende). diff --git a/requirements/20-r1-akzeptanzkriterien.md b/requirements/20-r1-akzeptanzkriterien.md index 88ff0b4..f55765a 100644 --- a/requirements/20-r1-akzeptanzkriterien.md +++ b/requirements/20-r1-akzeptanzkriterien.md @@ -4,28 +4,32 @@ 2026-11-02 · Chris -Akzeptanzkriterien für die 26 Stories von R1 im Format Gegeben/Wenn/Dann, abgeleitet aus dem [Anforderungsdokument](https://claude.ai/artifact/NvqzTVrcd2aA3uqwwnG1ry) und den dort getroffenen Entscheidungen. Jedes Kriterium soll sich als Test prüfen lassen; Zahlenwerte sind meine Annahmen und änderbar. +> **Änderungsvermerk 2026-11-02:** Die Klärungen aller 48 offenen Fragen aus `r1-story-entwurf.md` § 5 sind eingearbeitet (verbindliche Entscheidungen: [`r1-klaerungen.md`](r1-klaerungen.md)). Gestrichene Kriterien sind als „~~n.~~ entfällt (Klärung X)“ markiert, damit Nummern und Referenzen wie „SAM-02 Kriterium 3“ stabil bleiben. Neue Kriterien sind hinten angehängt. Bis zur BGG-Lizenz zurückgestellte Kriterien sind als „*zurückgestellt*“ markiert. Neu sind die Stories KTO-11 Einstellungsbereich (Klärung 43) und QUE-09 Startseite (Klärung 42). Verweise der Form „(Klärung X)“ beziehen sich auf die Nummern in `r1-klaerungen.md`. + +Akzeptanzkriterien für die 28 Stories von R1 im Format Gegeben/Wenn/Dann, abgeleitet aus dem [Anforderungsdokument](https://claude.ai/artifact/NvqzTVrcd2aA3uqwwnG1ry) und den dort getroffenen Entscheidungen. Jedes Kriterium soll sich als Test prüfen lassen; Zahlenwerte sind meine Annahmen und änderbar. ## Geltungsbereich und Annahmen -R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, kommt erst mit späteren Releases; in R1 sind alle Daten privat. +R1 umfasst 28 Stories aus vier Epics und dem Querschnitt. Alles, was andere Nutzer sehen könnten, kommt erst mit späteren Releases; in R1 sind alle Daten privat. | Epic | In R1 | Nicht in R1 | | --- | --- | --- | -| KTO Konto & Profil | KTO-01, KTO-02, KTO-04, KTO-05 | KTO-03 (R2), KTO-06 bis KTO-08 (R3), KTO-09 und KTO-10 (R4) | -| KAT Spielekatalog | KAT-01 bis KAT-05 | – | +| KTO Konto & Profil | KTO-01, KTO-02, KTO-04, KTO-05, KTO-11 (neu) | KTO-03 (R2), KTO-06 bis KTO-08 (R3), KTO-09 und KTO-10 (R4) | +| KAT Spielekatalog | KAT-01 bis KAT-05 (Import aus KAT-05 erst mit BGG-Lizenz) | – | | SAM Sammlung & Listen | SAM-01 bis SAM-09 | SAM-10 (zurückgestellt) | | PAR Partien & Statistik | PAR-01 bis PAR-08 | PAR-09 (R2), PAR-10 (R3) | +| QUE Querschnitt | QUE-09 Startseite (neu); QUE-04 bis QUE-06 als Querschnittskriterien | QUE-07/QUE-08 als App-Funktion (R4); Admin in R1 nur über Supabase Studio (Klärung 44) | **Annahmen, auf denen die Kriterien beruhen** 1. Lieblingsspiele und Genres gehören zum Profil in R1 (KTO-02), wie du es im Dokument ergänzt hast. KTO-06 beschränkt sich später auf die Anzeige im öffentlichen Profil. -2. In R1 sieht niemand fremde Profile, Sammlungen oder Partien. Deshalb besteht KTO-04 in R1 nur aus dem Hinweis, dass alles privat ist. +2. In R1 sieht niemand fremde Profile, Sammlungen oder Partien. Deshalb besteht KTO-04 in R1 nur aus dem Hinweis, dass alles privat ist. Auch die Stadt im Profil ist in R1 nur für den Nutzer selbst sichtbar (Klärung 9). 3. Gast-Mitspieler sind reine Namen ohne Konto (F11); Verknüpfung und Bestätigung folgen mit R2. -4. Alle Funktionen laufen auf iOS, Android und im Web (F7); nur Partien lassen sich offline erfassen (F3). -5. Die Oberfläche ist Deutsch und Englisch (F1), das Mindestalter ist 16 (F8). -6. Der BGG-Import hängt an der Lizenz und wird zuletzt gebaut (S1, F9). Der Katalog ist BGG-unabhängig mit eigenen IDs (F2). -7. Ein Spiel steht höchstens einmal in der Sammlung. Wunschliste heißt „habe ich gern“, Einkaufsliste „wird demnächst gekauft“. +4. Alle Funktionen laufen auf iOS, Android und im Web (F7); nur Partien lassen sich offline erfassen (F3), und das in R1 nur in den Apps, nicht im Browser (Klärung 36). +5. Die Oberfläche ist Deutsch und Englisch (F1), das Mindestalter ist 16 (F8); die Selbstbestätigung reicht bis zur rechtlichen Prüfung vor dem Release (Klärung 21/47). +6. Der BGG-Import hängt an der Lizenz und wird zuletzt gebaut (S1, F9). Der Katalog ist BGG-unabhängig mit eigenen IDs (F2) und wird zum Start nur manuell gepflegt, vom Admin über Supabase Studio/SQL (Klärungen 24, 44). +7. Ein Spiel steht in genau einer Liste: Sammlung, Wunschliste oder Einkaufsliste (Klärung 1). Wunschliste heißt „habe ich gern“, Einkaufsliste „wird demnächst gekauft“. +8. Kaufpreis, Händler, geplanter Preis, Link und Summe der Einkaufsliste kommen nach R1 (Klärung 2). **Lesehilfe:** Jede Story hat nummerierte Kriterien. Sie lassen sich als „KTO-01 Kriterium 3“ ansprechen und werden später zu Tests und zu Haken im Pull Request. @@ -39,9 +43,13 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 4. Gegeben die E-Mail-Adresse ist schon registriert, wenn ich mich damit registriere, dann erfahre ich nicht, ob ein Konto existiert, und es entsteht kein zweites Konto. 5. Gegeben ein bestätigtes Konto, wenn ich die richtigen Zugangsdaten eingebe, dann bin ich angemeldet und bleibe es auf diesem Gerät, bis ich mich abmelde. 6. Gegeben ein unbestätigtes Konto, wenn ich mich anmelde, dann werde ich auf die ausstehende Bestätigung hingewiesen und kann die E-Mail erneut senden lassen. -7. Gegeben falsche Zugangsdaten, wenn ich mich anmelde, dann sehe ich eine allgemeine Fehlermeldung, die nicht verrät, ob E-Mail oder Passwort falsch war; nach mehreren Fehlversuchen wird der Zugang zeitweise gebremst. -8. Gegeben ich habe das Passwort vergessen, wenn ich das Zurücksetzen anfordere, dann erhalte ich einen zeitlich begrenzten Link, mit dem ich ein neues Passwort setze; der Link funktioniert nur einmal. +7. Gegeben falsche Zugangsdaten, wenn ich mich anmelde, dann sehe ich eine allgemeine Fehlermeldung, die nicht verrät, ob E-Mail oder Passwort falsch war; nach mehreren Fehlversuchen wird der Zugang zeitweise gebremst. Anzahl der Versuche und Dauer der Bremse folgen den Standards der Supabase-Auth-Konfiguration (self-hosted); die Werte sind im Repo dokumentiert und in den Tests referenziert (Klärung 18). +8. Gegeben ich habe das Passwort vergessen, wenn ich das Zurücksetzen anfordere, dann erhalte ich einen zeitlich begrenzten Link, mit dem ich ein neues Passwort setze; der Link funktioniert nur einmal. Die Gültigkeit von Reset- und Bestätigungslink folgt der Supabase-Auth-Konfiguration und ist im Repo dokumentiert (Klärung 18). 9. Gegeben ich habe das Passwort zurückgesetzt, dann bin ich auf allen anderen Geräten abgemeldet. +10. Gegeben ich registriere mich, wenn der Anzeigename leer ist oder länger als 30 Zeichen, dann kann ich mich nicht registrieren und sehe den Fehler am Feld; es gelten dieselben Regeln wie in KTO-02 Kriterium 1 (Klärung 22). +11. Gegeben Shuffle sendet mir eine E-Mail zur Bestätigung oder zum Zurücksetzen des Passworts, dann ist sie in der Sprache meines Profils; andere E-Mails verschickt Shuffle in R1 nicht (Klärung 45). + +Abmelden sowie E-Mail-Adresse und Passwort ändern gehören zu KTO-11 (Klärung 22). ### KTO-02 Profil bearbeiten @@ -49,69 +57,96 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 2. Gegeben ich wähle ein Bild als Avatar (JPG oder PNG, höchstens 5 MB), wenn ich speichere, dann wird es quadratisch zugeschnitten angezeigt; ein zu großes oder falsches Format wird mit Hinweis abgelehnt. 3. Gegeben ich habe keinen Avatar, dann sehe ich einen Platzhalter mit meinen Initialen. 4. Gegeben ich schreibe eine Kurzbeschreibung, wenn sie länger als 300 Zeichen ist, dann kann ich nicht speichern. -5. Gegeben ich suche im Katalog, wenn ich bis zu 5 Spiele als Lieblingsspiele auswähle, dann werden sie in dieser Reihenfolge in meinem Profil gespeichert; ein sechstes wird abgelehnt. -6. Gegeben ich wähle Genres aus einer festen Liste, dann werden sie im Profil gespeichert und lassen sich wieder entfernen. +5. Gegeben ich suche im Katalog, wenn ich bis zu 5 Spiele als Lieblingsspiele auswähle, dann werden sie in dieser Reihenfolge in meinem Profil gespeichert; ein sechstes wird abgelehnt. Wählbar sind nur Katalogspiele, keine vorläufigen Spiele aus KAT-04 (Klärung 23). +6. Gegeben ich wähle Genres aus derselben Genre-Liste, die auch der Katalog verwendet, dann werden sie im Profil gespeichert und lassen sich wieder entfernen (Klärung 8). 7. Gegeben ich habe gespeichert, wenn ich mich auf einem anderen Gerät anmelde, dann sehe ich dieselben Profilangaben. +8. Gegeben ich habe mindestens zwei Lieblingsspiele, wenn ich die Reihenfolge per Ziehen oder per Aktion „nach oben“/„nach unten“ ändere, dann wird die neue Reihenfolge gespeichert; die Aktionen „nach oben“/„nach unten“ sind auch per Screenreader und Tastatur bedienbar (Klärung 23). +9. Gegeben in meinem Profil ist eine Stadt hinterlegt, dann ist sie in R1 nur für mich sichtbar; ein anderer Nutzer kann sie weder über die App noch über die Schnittstelle lesen (Klärung 9). ### KTO-04 Privatsphäre (in R1 nur der Hinweis) -1. Gegeben ich öffne die Einstellungen, dann steht dort, dass Profil, Sammlung, Listen und Partien nur für mich sichtbar sind. -2. Gegeben ein späterer Release führt neue Freigaben ein, dann sind neue Bereiche standardmäßig privat, bis ich sie freigebe. +1. Gegeben ich öffne die Einstellungen (KTO-11), dann steht dort, dass Profil (einschließlich Stadt), Sammlung, Listen und Partien nur für mich sichtbar sind. + +~~2.~~ entfällt (Klärung 19): Die Regel „neue Freigabebereiche sind standardmäßig privat, bis ich sie freigebe“ steht jetzt als allgemeine Regel in `10-anforderungen.md` bei KTO-04 und ist in R1 nicht testbar. ### KTO-05 Konto löschen und Daten exportieren -1. Gegeben ich bin angemeldet, wenn ich „Konto löschen“ wähle, die Folgen bestätige und mein Passwort eingebe, dann bin ich sofort abgemeldet und mein Konto ist nicht mehr nutzbar. -2. Gegeben ich habe mein Konto gelöscht, dann sind Profil, Sammlung, Listen, Partien und Gast-Namen innerhalb der in der Datenschutzerklärung genannten Frist endgültig gelöscht, auch aus den Sicherungen. -3. Gegeben mein Konto ist gelöscht, wenn ich mich anmelden will, dann ist das nicht möglich; dieselbe E-Mail-Adresse kann ich neu registrieren. -4. Gegeben ich fordere einen Datenexport an, wenn er fertig ist, dann erhalte ich eine Datei in einem maschinenlesbaren Format (JSON oder CSV) mit Profil, Sammlung, Listen und Partien. -5. Gegeben der Export ist fertig, dann ist er nur über mein angemeldetes Konto abrufbar und läuft nach einer begrenzten Zeit ab. +1. Gegeben ich bin angemeldet, wenn ich in den Einstellungen (KTO-11) „Konto löschen“ wähle, die Folgen bestätige und mein Passwort eingebe, dann bin ich sofort abgemeldet und mein Konto ist nicht mehr nutzbar. +2. Gegeben ich habe mein Konto gelöscht, dann sind innerhalb von 30 Tagen alle meine Daten endgültig gelöscht, auch aus den Sicherungen: Profil, Sammlung, Listen, Partien, Gäste, Wertungsbögen, meine vorläufigen privaten Katalogeinträge und meine offenen Meldungen (Klärungen 10, 20). +3. Gegeben mein Konto ist gelöscht, wenn ich mich anmelden will, dann ist das nicht möglich; dieselbe E-Mail-Adresse kann ich sofort neu registrieren (Klärung 20). +4. Gegeben ich fordere in der App einen Datenexport an, wenn er fertig ist, dann sehe ich einen Hinweis in der App (keine E-Mail) und erhalte eine JSON-Datei mit allen meinen Daten, insbesondere Profil mit Avatar-Link, Sammlung, Listen, Partien, Gäste, Wertungsbögen und vorläufige Spiele (Klärungen 20, 45). +5. Gegeben der Export ist fertig, dann ist er nur in der App über mein angemeldetes Konto abrufbar und 7 Tage lang gültig; danach ist er nicht mehr abrufbar (Klärung 20). + +### KTO-11 Einstellungsbereich (neu, Klärung 43) + +Als angemeldeter Nutzer möchte ich einen Einstellungsbereich, in dem ich Sprache, Zugangsdaten und Datenschutzthemen an einem Ort finde, damit ich mein Konto selbst verwalten kann. + +1. Gegeben ich bin angemeldet, wenn ich die Einstellungen öffne, dann finde ich dort: Sprache, E-Mail-Adresse ändern, Passwort ändern, Abmelden, den Privatsphäre-Hinweis (KTO-04 Kriterium 1) und den Einstieg zu Datenexport und Konto löschen (KTO-05). +2. Gegeben ich wähle in den Einstellungen Deutsch oder Englisch, dann wechselt die Oberfläche sofort in diese Sprache; die Wahl bleibt nach einem Neustart erhalten und wird als Sprache meines Profils gespeichert, die auch für System-E-Mails gilt (QUE-05 Kriterium 1, Klärung 45). +3. Gegeben ich wähle „Abmelden“, dann bin ich auf diesem Gerät abgemeldet und die App zeigt keine privaten Daten meines Kontos mehr. +4. Gegeben ich will meine E-Mail-Adresse ändern, wenn ich eine neue Adresse eingebe, dann erhalte ich an die neue Adresse eine Bestätigungs-E-Mail; erst nach der Bestätigung gilt die neue Adresse für die Anmeldung, bis dahin die alte (Klärung 22). +5. Gegeben die neue E-Mail-Adresse ist schon für ein anderes Konto registriert, wenn ich sie eintrage, dann erfahre ich nicht, ob dazu ein Konto existiert (wie KTO-01 Kriterium 4), und meine Adresse bleibt unverändert. +6. Gegeben ich will mein Passwort ändern, wenn ich mein aktuelles Passwort und ein neues Passwort eingebe, das die Regeln aus KTO-01 Kriterium 3 erfüllt, dann gilt ab sofort das neue Passwort (Klärung 22; Abfrage des aktuellen Passworts ist Annahme, offene Frage N13 in `backlog.md`). +7. Gegeben das aktuelle Passwort ist falsch oder das neue erfüllt die Regeln nicht, wenn ich speichere, dann wird nichts geändert und ich sehe den Fehler am Feld. +8. Gegeben ich bin offline, wenn ich E-Mail-Adresse oder Passwort ändern will, dann sehe ich einen Hinweis, dass dafür eine Verbindung nötig ist. ## KAT – Spielekatalog ### KAT-01 Spiele suchen 1. Gegeben der Katalog enthält Spiele, wenn ich einen Titel oder einen Teil davon eingebe, dann erhalte ich passende Treffer nach Relevanz sortiert, unabhängig von Groß- und Kleinschreibung und Sonderzeichen. -2. Gegeben ein Spiel hat einen deutschen und einen englischen Titel, wenn ich nach einem von beiden suche, dann finde ich dasselbe Spiel. -3. Gegeben ich suche nach einem Verlag, dann erhalte ich dessen Spiele. -4. Gegeben eine Trefferliste, wenn ich nach Spielerzahl, Spieldauer oder Mindestalter filtere, dann enthält sie nur Spiele, die zu allen gewählten Filtern passen. +2. Gegeben ein Spiel hat neben dem Haupttitel alternative Titel (je mit Sprache, zum Beispiel einen deutschen und einen englischen), wenn ich nach einem davon suche, dann finde ich dasselbe Spiel (Klärung 3). +3. Gegeben ich suche nach einem Verlag, dann erhalte ich dessen Spiele; ein Spiel kann mehreren Verlagen zugeordnet sein (Klärung 4). +4. Gegeben eine Trefferliste, wenn ich nach Spielerzahl, Spieldauer, Mindestalter, Genre oder Mechanik filtere, dann enthält sie nur Spiele, die zu allen gewählten Filtern passen (Klärung 13). 5. Gegeben mehr Treffer als auf eine Seite passen, wenn ich bis zum Ende scrolle, dann werden weitere nachgeladen. 6. Gegeben ich suche ohne Treffer, dann sehe ich einen Hinweis und die Möglichkeit, das Spiel zu melden (KAT-04). -7. Gegeben eine normale Verbindung, dann erscheinen die ersten Treffer innerhalb von 2 Sekunden. -8. Gegeben mehrere Filtereinstellungen wie Genre, Spieleranzahl, Spieldauer etc, mit denen ich neue Spiele entdecken kann +7. Gegeben ein mobiles 4G-Profil (mindestens 10 Mbit/s, etwa 100 ms Round-Trip-Zeit), dann liefern 95 Prozent der Suchen gegen Staging die ersten Treffer in höchstens 2 Sekunden (Klärung 14). +8. Gegeben ich habe keinen Suchbegriff eingegeben, wenn ich einen oder mehrere Filter (Genre, Mechanik, Spielerzahl, Spieldauer, Mindestalter) wähle, dann sehe ich alle Katalogspiele, die zu allen gewählten Filtern passen, und kann so neue Spiele entdecken (Klärung 13). ### KAT-02 Spieldetailseite 1. Gegeben ich öffne ein Spiel, dann sehe ich Titel, Cover, Erscheinungsjahr, Verlag, Spielerzahl, Spieldauer, Mindestalter, Genre, Mechanik, Kategorie und Beschreibung. 2. Gegeben eine Angabe fehlt im Katalog, dann wird sie weggelassen statt als leere Zeile gezeigt. -3. Gegeben das Spiel steht in meiner Sammlung, auf der Wunschliste oder der Einkaufsliste, dann sehe ich den Status und kann ihn von dort ändern. +3. Gegeben das Spiel steht in meiner Sammlung, auf der Wunschliste oder der Einkaufsliste, dann sehe ich den Status und kann ihn von dort ändern; ein Spiel steht dabei immer in genau einer Liste (Klärung 1). 4. Gegeben ich habe das Spiel nirgends eingetragen, dann kann ich es mit einer Aktion zur Sammlung, Wunschliste oder Einkaufsliste hinzufügen. -5. Gegeben Angaben stammen von BGG, dann zeigt die Seite „Powered by BGG“ mit Link, sobald die Lizenz das verlangt. +5. Gegeben Angaben stammen von BGG, dann zeigt die Seite „Powered by BGG“ mit Link, sobald die Lizenz das verlangt. In R1 ist der Katalog manuell gepflegt; das Kriterium greift erst mit Daten aus BGG (Klärung 24). 6. Gegeben ich habe Partien zu diesem Spiel, dann sehe ich einen Einstieg zur Spielstatistik (PAR-08). +7. Gegeben Titel oder Beschreibung liegen nur in einer anderen Sprache als der Oberfläche vor, dann sehe ich einen sichtbaren Sprachhinweis, zum Beispiel „Beschreibung auf Englisch“ (Klärung 48). ### KAT-03 Erweiterungen und Editionen -1. Gegeben ein Basisspiel hat Erweiterungen, wenn ich seine Detailseite öffne, dann sehe ich die Erweiterungen verlinkt; bei einer Erweiterung sehe ich das Basisspiel. +1. Gegeben ein Basisspiel hat Erweiterungen, wenn ich seine Detailseite öffne, dann sehe ich die Erweiterungen verlinkt; eine Erweiterung ist ein eigener Katalogeintrag mit Verweis auf ihr Basisspiel, und auf ihrer Detailseite sehe ich das Basisspiel verlinkt (Klärung 5). 2. Gegeben ein Spiel gibt es in mehreren Editionen oder Sprachfassungen, dann sind sie als Varianten desselben Spiels erkennbar. -3. Gegeben ich füge ein Spiel mit Varianten zur Sammlung hinzu, dann kann ich die Edition wählen, die ich besitze. +3. Gegeben ich füge ein Spiel mit Varianten zur Sammlung hinzu, dann kann ich optional die Edition wählen, die ich besitze; ohne Auswahl wird das Spiel ohne Edition gespeichert (Klärung 28). 4. Gegeben ich besitze das Basisspiel und füge eine Erweiterung hinzu, dann wird sie in meiner Sammlung beim Basisspiel zugeordnet angezeigt. 5. Gegeben ich besitze eine Erweiterung ohne Basisspiel, dann ist das erlaubt und wird nicht als Fehler behandelt. +6. Gegeben ich erfasse eine Partie zu einem Spiel mit Varianten, dann kann ich optional die Edition wählen (Klärung 28). +7. Gegeben ich setze ein Spiel auf die Wunsch- oder Einkaufsliste, dann wird keine Edition abgefragt oder gespeichert (Klärung 28). ### KAT-04 Fehlendes Spiel melden 1. Gegeben ich finde ein Spiel nicht, wenn ich Titel (Pflicht), Verlag, Erscheinungsjahr und optional einen Link angebe, dann wird die Meldung gespeichert und ich erhalte eine Bestätigung. -2. Gegeben es gibt schon einen sehr ähnlichen Katalogeintrag, wenn ich melden will, dann sehe ich ihn zuerst und muss ausdrücklich bestätigen, dass mein Spiel ein anderes ist. +2. Gegeben es gibt schon einen sehr ähnlichen Katalogeintrag, wenn ich melden will, dann sehe ich ihn zuerst und muss ausdrücklich bestätigen, dass mein Spiel ein anderes ist. „Sehr ähnlich“ heißt: gleicher normalisierter Titel (Groß-/Kleinschreibung, Sonderzeichen und Artikel ignoriert) oder Titel-Ähnlichkeit von mindestens 0,8 (Trigramm) bei Erscheinungsjahr ± 1 (Klärung 15). 3. Gegeben ich habe ein Spiel gemeldet, dann kann ich es als vorläufigen Eintrag in meine Sammlung oder Listen aufnehmen; der Eintrag ist nur für mich sichtbar. -4. Gegeben die Meldung wurde freigegeben, dann ersetzt der Katalogeintrag meinen vorläufigen Eintrag, ohne dass meine eigenen Angaben verloren gehen. -5. Gegeben die Meldung wurde abgelehnt oder mit einem anderen Eintrag zusammengeführt, dann erfahre ich das und mein vorläufiger Eintrag verweist auf den richtigen Eintrag. +4. Gegeben die Meldung wurde freigegeben, dann ersetzt der Katalogeintrag meinen vorläufigen Eintrag, ohne dass meine eigenen Angaben verloren gehen, und ich sehe das als Hinweis in der App am Eintrag (Klärung 26). +5. Gegeben die Meldung wurde mit einem anderen Eintrag zusammengeführt oder unter Verweis auf einen vorhandenen Eintrag abgelehnt, dann sehe ich das als Hinweis in der App am vorläufigen Eintrag (keine E-Mail), und mein vorläufiger Eintrag verweist auf den richtigen Eintrag (Klärungen 26, 45). +6. Gegeben die Meldung wurde ohne Zieleintrag abgelehnt, dann bleibt mein vorläufiger Eintrag privat bestehen und ist als „abgelehnt“ markiert (Klärung 26). +7. Gegeben ich habe heute schon 10 Meldungen abgeschickt, wenn ich eine weitere melden will, dann wird sie nicht gespeichert und ich sehe einen Hinweis auf das Tageslimit (Klärung 27). +8. Gegeben ich habe eine Meldung abgeschickt, dann bleibt sie im Status „offen“, bis der Admin sie manuell bearbeitet; eine automatische Freigabe gibt es nicht (Klärungen 6, 27, 44). ### KAT-05 Katalogdaten laden und aktuell halten -1. Gegeben eine zugelassene Quelle, wenn der Import läuft, dann werden neue Spiele angelegt und geänderte aktualisiert, ohne manuell gepflegte Felder zu überschreiben. -2. Gegeben ein Katalogeintrag, dann hat er eine eigene Shuffle-ID und optional die Kennung der Quelle (zum Beispiel BGG) samt Quellenangabe. -3. Gegeben die Quelle ist nicht erreichbar oder liefert fehlerhafte Daten, dann bleibt der Katalog unverändert, der Fehler wird protokolliert und die App funktioniert normal weiter. -4. Gegeben ein Admin bearbeitet, blendet aus oder führt Einträge zusammen, dann bleiben diese Änderungen beim nächsten Import erhalten. -5. Gegeben Meldungen aus KAT-04, dann kann ein Admin sie freigeben, mit einem Eintrag zusammenführen oder ablehnen. -6. Gegeben Cover und Texte einer Quelle, dann werden sie nur angezeigt, wenn deren Nutzungsbedingungen es erlauben; die Erlaubnis ist je Quelle vermerkt. +In R1 wird der Katalog nur manuell gepflegt; ein Import kommt erst mit einer zugelassenen Quelle bzw. der BGG-Lizenz (Klärung 24). Der Admin pflegt Katalog und Meldungen über Supabase Studio/SQL; eine Admin-Oberfläche in der App gibt es bis QUE-08 (R4) nicht (Klärung 44). Das Datenmodell für den späteren Import entsteht trotzdem schon in R1 (Klärung 7). + +1. *Zurückgestellt bis zur Lizenz (Klärung 24):* Gegeben eine zugelassene Quelle, wenn der Import läuft, dann werden neue Spiele angelegt und geänderte aktualisiert, ohne manuell gepflegte Felder zu überschreiben. +2. Gegeben ein Katalogeintrag, dann hat er eine eigene Shuffle-ID (F2). *Zurückgestellt bis zur Lizenz (Klärung 24):* optional die Kennung der Quelle (zum Beispiel BGG) samt Quellenangabe; die Felder dafür sind ab R1 im Datenmodell vorhanden (Klärung 7). +3. *Zurückgestellt bis zur Lizenz (Klärung 24):* Gegeben die Quelle ist nicht erreichbar oder liefert fehlerhafte Daten, dann bleibt der Katalog unverändert, der Fehler wird protokolliert und die App funktioniert normal weiter. +4. Gegeben der Admin bearbeitet, blendet aus oder führt Einträge zusammen (in R1 über Supabase Studio/SQL), dann sind ausgeblendete Einträge in der App nicht mehr auffindbar, und manuell gepflegte Felder sind als solche gekennzeichnet, damit ein späterer Import sie nicht überschreibt (Klärungen 7, 44). +5. Gegeben Meldungen aus KAT-04, dann kann der Admin sie über Supabase Studio/SQL freigeben, mit einem Eintrag zusammenführen oder ablehnen; Status (offen, freigegeben, abgelehnt, zusammengeführt) und gegebenenfalls der Zieleintrag werden gespeichert (Klärungen 6, 44). +6. *Zurückgestellt bis zur Lizenz (Klärung 24):* Gegeben Cover und Texte einer Quelle, dann werden sie nur angezeigt, wenn deren Nutzungsbedingungen es erlauben; die Erlaubnis ist je Quelle vermerkt. Das Feld für die Erlaubnis je Quelle ist ab R1 im Datenmodell vorhanden (Klärung 7). +7. Gegeben R1 geht live, dann enthält der Katalog einen manuell gepflegten Startbestand (Klärung 24; Umfang offen, siehe `backlog.md`). +8. Gegeben die Admin-Pflege über Supabase Studio/SQL, dann ist der Ablauf für Bearbeiten, Ausblenden, Zusammenführen und das Bearbeiten von Meldungen im Repo dokumentiert (Klärung 44). +9. Gegeben ein Nutzer ohne Admin-Rolle, wenn er über die App oder direkt über die Schnittstelle Katalogeinträge oder fremde Meldungen ändern will, dann wird der Zugriff verweigert; die Admin-Rolle existiert in R1 nur als Datenbankrolle (Klärung 44). ## SAM – Sammlung & Listen @@ -121,43 +156,53 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 2. Gegeben das Spiel ist schon in meiner Sammlung, dann entsteht kein zweiter Eintrag, sondern ich sehe den vorhandenen. 3. Gegeben ich bin offline, wenn ich ein Spiel hinzufügen will, dann sehe ich einen Hinweis, dass dies eine Verbindung braucht. 4. Gegeben ich suche ein Spiel, dann gelange ich in höchstens zwei Schritten vom Suchergebnis zum Eintrag in der Sammlung. +5. Gegeben das Spiel steht auf meiner Wunsch- oder Einkaufsliste, wenn ich „Zur Sammlung“ wähle, dann wird es wie in SAM-06 übernommen und steht danach nur noch in der Sammlung (Klärung 1). ### SAM-02 Eigene Angaben pro Spiel -1. Gegeben ein Spiel in meiner Sammlung, wenn ich es bearbeite, dann kann ich Zustand (aus fester Liste), Kaufdatum, Kaufpreis in Euro, Notiz (bis 1000 Zeichen), Standort (Freitext) und Tags erfassen. +1. Gegeben ein Spiel in meiner Sammlung, wenn ich es bearbeite, dann kann ich Zustand (neu/eingeschweißt, sehr gut, gut, gebraucht, beschädigt), Kaufdatum, Notiz (bis 1000 Zeichen), Standort (Freitext) und Tags erfassen. Der Kaufpreis entfällt in R1 (Klärungen 2, 29). 2. Gegeben ich lasse Felder leer, dann ist das erlaubt; alle Angaben sind optional. -3. Gegeben das Kaufdatum liegt in der Zukunft oder der Preis ist negativ, dann kann ich nicht speichern und sehe den Fehler am Feld. +3. Gegeben das Kaufdatum liegt in der Zukunft, dann kann ich nicht speichern und sehe den Fehler am Feld. Die Prüfung „Preis negativ“ entfällt mit dem Kaufpreis (Klärung 2). 4. Gegeben ich vergebe Tags, dann schlägt die App meine bisherigen Tags vor, damit sich Schreibweisen nicht verdoppeln. 5. Gegeben ich ändere Angaben, dann bleiben sie beim BGG-Import erhalten (SAM-09). +6. Gegeben ich erfasse einen Standort, dann schlägt die App meine bisherigen Standorte vor; Tags und Standorte haben in R1 keine eigene Verwaltung, sie entstehen durch Nutzung (Klärung 29). ### SAM-03 Sammlung durchsuchen, filtern und sortieren 1. Gegeben meine Sammlung, wenn ich einen Titel eingebe, dann zeigt die Liste nur passende Spiele. 2. Gegeben ich filtere nach Spielerzahl, Spieldauer, Tags, Standort oder Zustand, dann zeigt die Liste nur Spiele, die zu allen Filtern passen, und ich sehe die Zahl der Treffer. 3. Gegeben ich sortiere nach Titel, Hinzufügedatum, Erscheinungsjahr oder Spieldauer, dann ändert sich die Reihenfolge entsprechend. -4. Gegeben meine Sammlung hat 1000 Spiele, dann bleibt Scrollen, Suchen und Filtern flüssig. -5. Gegeben meine Sammlung ist leer, dann sehe ich einen Hinweis mit dem Weg zum Hinzufügen und, sofern verfügbar, zum BGG-Import. +4. Gegeben meine Sammlung hat 1000 Spiele, dann liegt ein Such- oder Filterergebnis auf einem Mittelklasse-Gerät in höchstens 300 ms vor, und das Scrollen läuft ohne sichtbares Ruckeln (Klärung 16). +5. Gegeben meine Sammlung ist leer, dann sehe ich einen Hinweis mit dem Weg zum Hinzufügen; den Weg zum BGG-Import sehe ich nur, wenn der Import verfügbar ist (BGG-Lizenz) (Klärung 30). +6. Gegeben meine Wunsch- oder Einkaufsliste, dann kann ich nach Titel suchen und sortieren; Filter gibt es dort nicht (Klärung 30). ### SAM-04 Wunschliste mit Priorität 1. Gegeben ein Spiel, wenn ich es auf die Wunschliste setze, dann kann ich eine Priorität (hoch, mittel, niedrig) und eine Notiz angeben. -2. Gegeben das Spiel ist schon in meiner Sammlung, dann sehe ich einen Hinweis, kann es aber trotzdem auf die Wunschliste setzen, etwa für eine andere Edition. +2. Gegeben das Spiel ist schon in meiner Sammlung, wenn ich es auf die Wunschliste setzen will, dann sehe ich einen Hinweis und kann es nicht auf die Wunschliste setzen (Klärung 1). 3. Gegeben meine Wunschliste, dann kann ich nach Priorität oder Datum sortieren. -4. Gegeben ich entferne ein Spiel von der Wunschliste, dann kann ich das für einige Sekunden rückgängig machen. +4. Gegeben ich entferne ein Spiel von der Wunschliste, dann kann ich das 5 Sekunden lang rückgängig machen (Klärung 17). ### SAM-05 Einkaufsliste führen -1. Gegeben ein Spiel, wenn ich es auf die Einkaufsliste setze, dann kann ich Händler (Freitext), geplanten Preis in Euro und einen Link angeben. -2. Gegeben die Einkaufsliste, dann sehe ich die Summe der geplanten Preise. +~~1.~~ entfällt (Klärung 2): Händler, geplanter Preis und Link kommen nach R1. Das Hinzufügen selbst regelt jetzt Kriterium 5. + +~~2.~~ entfällt (Klärungen 2, 31): Die Summe der geplanten Preise kommt nach R1. + 3. Gegeben ich hake ein Spiel als gekauft ab, dann fragt mich die App, ob ich es in die Sammlung übernehmen will (SAM-06). -4. Gegeben ich entferne ein Spiel von der Einkaufsliste, dann kann ich das für einige Sekunden rückgängig machen. +4. Gegeben ich entferne ein Spiel von der Einkaufsliste, dann kann ich das 5 Sekunden lang rückgängig machen (Klärung 17). +5. Gegeben ein Spiel, wenn ich es auf die Einkaufsliste setze, dann steht es dort mit dem Datum des Hinzufügens, und ich kann eine Notiz angeben (Klärungen 2, 32). +6. Gegeben das Spiel ist schon in meiner Sammlung, wenn ich es auf die Einkaufsliste setzen will, dann sehe ich einen Hinweis und kann es nicht auf die Einkaufsliste setzen (Klärung 1). +7. Gegeben ich habe ein Spiel als gekauft abgehakt, wenn ich die Übernahme in die Sammlung ablehne, dann bleibt es unverändert auf der Einkaufsliste (Klärung 31). ### SAM-06 In die Sammlung übernehmen 1. Gegeben ein Spiel auf der Wunsch- oder Einkaufsliste, wenn ich es übernehme, dann steht es in der Sammlung und ist von der Liste verschwunden. -2. Gegeben das Spiel hatte Notiz oder geplanten Preis, dann werden Notiz und Preis übernommen, der Preis als Kaufpreis; als Kaufdatum steht heute und ist änderbar. -3. Gegeben das Spiel ist schon in der Sammlung, dann entsteht kein Duplikat und ich sehe einen Hinweis. -4. Gegeben ich habe übernommen, dann kann ich das für einige Sekunden rückgängig machen. +2. Gegeben das Spiel hatte eine Notiz, dann wird sie in die Sammlung übernommen; als Kaufdatum steht heute und ist änderbar. Eine Preisübernahme entfällt (Klärungen 2, 32). + +~~3.~~ entfällt (Klärungen 1, 32): Ein Spiel kann nicht gleichzeitig in Sammlung und Liste stehen, ein Duplikat ist ausgeschlossen. + +4. Gegeben ich habe übernommen, dann kann ich das 5 Sekunden lang rückgängig machen; das Spiel steht danach wieder auf der ursprünglichen Liste (Klärung 17). ### SAM-07 BGG-Konto verknüpfen (abhängig von der Lizenz) @@ -166,64 +211,76 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 3. Gegeben die BGG-Sammlung lässt sich nicht abrufen, dann erklärt mir die App, was ich auf der BGG-Seite prüfen kann. 4. Gegeben ich löse die Verknüpfung, dann wird der Name entfernt und bereits importierte Spiele bleiben erhalten. 5. Gegeben die Verknüpfung, dann fragt und speichert die App niemals mein BGG-Passwort. +6. Gegeben mein Konto ist schon mit einem BGG-Namen verknüpft, dann kann ich keinen zweiten zusätzlich verknüpfen; ein Konto hat höchstens eine BGG-Verknüpfung (Klärung 33). +7. Gegeben derselbe BGG-Name ist schon mit einem anderen Shuffle-Konto verknüpft, wenn ich ihn verknüpfe, dann ist das erlaubt (BGG-Sammlungen sind öffentlich) (Klärung 33). ### SAM-08 Sammlung und Wunschliste aus BGG importieren -1. Gegeben ein verknüpftes BGG-Konto, wenn ich den Import starte, dann sehe ich den Fortschritt und danach eine Zusammenfassung: übernommen, bereits vorhanden, nicht gefunden. -2. Gegeben der Import, dann werden Spiele, die ich bei BGG besitze, in meine Sammlung übernommen und Spiele meiner BGG-Wunschliste auf meine Wunschliste. +1. Gegeben ein verknüpftes BGG-Konto, wenn ich den Import starte, dann sehe ich den Fortschritt und danach eine Zusammenfassung: übernommen, bereits vorhanden, vorläufig angelegt (Klärung 12). +2. Gegeben der Import, dann werden die BGG-Status so übernommen: „owned“ → Sammlung; „wishlist“ und „want to buy“ → Wunschliste; „preordered“ → Einkaufsliste; „want to play“ wird ignoriert. Ist ein Spiel bei BGG zugleich besessen und gewünscht, kommt es in die Sammlung (Klärungen 1, 34). 3. Gegeben ein BGG-Spiel ist im Katalog über seine BGG-Kennung bekannt, dann wird es diesem Eintrag zugeordnet. -4. Gegeben ein BGG-Spiel fehlt im Katalog, dann steht es in der Liste der nicht gefundenen Spiele, und ich kann es melden (KAT-04). +4. Gegeben ein BGG-Spiel fehlt im Katalog, dann wird es automatisch als vorläufiger privater Eintrag (KAT-04) angelegt und übernommen, in der Zusammenfassung als „vorläufig angelegt“ gezeigt, und eine Meldung an den Admin entsteht automatisch (Klärung 12). 5. Gegeben ich breche den Import ab oder er schlägt fehl, dann bleibt mein Bestand in einem konsistenten Zustand: nichts ist halb übernommen. 6. Gegeben BGG antwortet mit einem Fehler oder einer Begrenzung, dann sehe ich eine verständliche Meldung und kann es später erneut versuchen. 7. Gegeben der Importdialog, dann zeigt er „Powered by BGG“ mit Link. +8. Gegeben ein Spiel meiner BGG-Wunschliste hat eine BGG-Priorität, dann wird sie so übernommen: 1–2 → hoch, 3 → mittel, 4–5 → niedrig (Klärung 34). +9. Gegeben meine BGG-Sammlung oder -Wunschliste enthält Erweiterungen, dann werden sie ebenfalls importiert (Klärung 34). ### SAM-09 BGG-Import wiederholen und abgleichen -1. Gegeben der Import lief schon einmal, wenn ich ihn erneut starte, dann erkennt die App nur die Änderungen: neue Spiele, bei BGG entfernte Spiele und Wechsel zwischen Sammlung und Wunschliste. +1. Gegeben der Import lief schon einmal, wenn ich ihn erneut starte, dann erkennt die App nur die Änderungen: neue Spiele, bei BGG entfernte Spiele und Wechsel zwischen Sammlung, Wunschliste und Einkaufsliste (Zuordnung wie SAM-08 Kriterium 2). 2. Gegeben Änderungen wurden erkannt, dann sehe ich sie als Liste und übernehme sie erst nach meiner Bestätigung. 3. Gegeben der Abgleich, dann werden meine eigenen Angaben (SAM-02) nie überschrieben. -4. Gegeben ich habe ein Spiel in Shuffle selbst hinzugefügt, dann wird es nicht entfernt, nur weil es bei BGG fehlt. +4. Gegeben ich habe ein Spiel in Shuffle selbst hinzugefügt, also nicht aus einem BGG-Import übernommen, dann wird es nicht entfernt, nur weil es bei BGG fehlt (Klärung 35). 5. Gegeben ein Spiel wurde bei BGG entfernt, dann wird es in Shuffle nur nach meiner Bestätigung entfernt. -6. Gegeben in Shuffle sind Spiele aufgeführt, die in BGG fehlen, dann werden diese Spiele hervorgehoben, damit der User diese ggf. in BGG nachpflegen kann +6. Gegeben in Shuffle stehen selbst hinzugefügte Spiele, die bei BGG fehlen, wenn ich den Abgleich starte, dann werden sie im Abgleichsdialog hervorgehoben, damit ich sie bei BGG nachpflegen kann; außerhalb des Abgleichsdialogs gibt es keine Hervorhebung (Klärung 35). ## PAR – Partien & Statistik ### PAR-01 Partie erfassen -1. Gegeben ich erfasse eine Partie, wenn ich ein Spiel und ein Datum angebe (Standard: heute), dann wird sie gespeichert und erscheint im Verlauf; Dauer in Minuten, Ort und Notiz sind optional. +1. Gegeben ich erfasse eine Partie, wenn ich ein Spiel und ein Datum ohne Uhrzeit angebe (Standard: heute), dann wird sie gespeichert und erscheint im Verlauf; Dauer in Minuten, Ort und Notiz sind optional (Klärungen 11, 36). 2. Gegeben das Datum liegt in der Zukunft, dann kann ich nicht speichern. -3. Gegeben ich wähle das Spiel, dann werden Spiele aus meiner Sammlung zuerst angeboten, weitere über die Katalogsuche. -4. Gegeben ich bin offline, dann wird die Partie lokal gespeichert, ist als „noch nicht synchronisiert“ gekennzeichnet und wird bei Verbindung automatisch übertragen. +3. Gegeben ich wähle das Spiel, dann werden Spiele aus meiner Sammlung zuerst angeboten; meine vorläufigen Spiele (KAT-04) sind ebenfalls wählbar; weitere Spiele, auch solche von meiner Wunschliste, finde ich über die Katalogsuche (Klärung 36). +4. Gegeben ich bin in der iOS- oder Android-App offline, dann wird die Partie lokal gespeichert, ist als „noch nicht synchronisiert“ gekennzeichnet und wird bei Verbindung automatisch übertragen. 5. Gegeben eine nicht synchronisierte Partie, wenn ich die App schließe oder das Gerät neu starte, dann geht sie nicht verloren. -6. Gegeben ich bin offline, dann kann ich Spiele aus meiner Sammlung wählen; die Katalogsuche braucht eine Verbindung und zeigt das als Hinweis an. +6. Gegeben ich bin in der App offline, dann kann ich Spiele aus meiner Sammlung wählen; die Katalogsuche braucht eine Verbindung und zeigt das als Hinweis an. 7. Gegeben die Übertragung einer Offline-Partie schlägt wiederholt fehl, dann bleibt sie erhalten, und ich sehe, dass sie noch aussteht. +8. Gegeben eine nicht synchronisierte Partie, dann zählt sie lokal schon in Verlauf (PAR-06) und Statistik (PAR-07, PAR-08) mit und ist dort als „noch nicht synchronisiert“ gekennzeichnet (Klärung 36). +9. Gegeben ich bin in der App offline, dann funktionieren Gastvorschläge (PAR-02) und Wertungsbögen (PAR-04) aus dem lokalen Speicher (Klärung 36). +10. Gegeben ich nutze Shuffle im Browser und bin offline, wenn ich eine Partie erfassen will, dann sehe ich den Hinweis „Verbindung nötig“; die Offline-Erfassung gibt es in R1 nur in den Apps (Klärung 36, Abweichung im PR begründen). ### PAR-02 Mitspieler hinzufügen 1. Gegeben ich erfasse eine Partie, dann bin ich standardmäßig als Mitspieler eingetragen und kann mich entfernen. 2. Gegeben ich füge einen Gast mit Namen hinzu, dann braucht er kein Konto; der Name ist nur für mich sichtbar. 3. Gegeben ich habe einen Gast schon einmal eingetragen, dann wird er mir bei der nächsten Partie vorgeschlagen. -4. Gegeben ein Mitspielername kommt in der Partie schon vor, dann kann ich ihn nicht doppelt hinzufügen und sehe einen Hinweis. +4. Gegeben ein Mitspielername kommt in der Partie schon vor (Vergleich ohne Groß- und Kleinschreibung), dann kann ich ihn nicht doppelt hinzufügen und sehe einen Hinweis; ein Gast darf aber so heißen wie ich (Klärung 37). 5. Gegeben eine Partie, dann kann sie bis zu 20 Mitspieler haben und mindestens einen. 6. Gegeben ich bearbeite den Namen eines Gastes in der Gästeliste, dann ändert er sich in meinen bisherigen Partien mit. +7. Gegeben ein Gast in meiner Gästeliste, wenn er in keiner Partie vorkommt, dann kann ich ihn löschen; kommt er in mindestens einer Partie vor, kann ich ihn nur umbenennen (Klärung 37). +8. Gegeben ich gebe einen Gastnamen ein, wenn er leer ist oder länger als 30 Zeichen, dann kann ich ihn nicht speichern und sehe den Fehler am Feld (Klärung 37). ### PAR-03 Ergebnis erfassen -1. Gegeben eine Partie, wenn ich je Mitspieler eine Punktzahl eintrage (ganze oder Dezimalzahl, auch negativ), dann wird die Platzierung automatisch daraus abgeleitet. +1. Gegeben eine Partie, wenn ich je Mitspieler eine Punktzahl eintrage (ganze oder Dezimalzahl, auch negativ), dann wird die Platzierung automatisch daraus abgeleitet, gemäß der Wertungsrichtung des Spiels (Kriterium 8). 2. Gegeben zwei Mitspieler haben gleich viele Punkte, dann teilen sie sich den Platz. 3. Gegeben ein Spiel ohne Punkte, wenn ich Platzierungen oder nur den Sieger angebe, dann wird das Ergebnis so gespeichert. -4. Gegeben ein kooperatives Spiel, wenn ich es als kooperativ markiere, dann erfasse ich nur „gewonnen“ oder „verloren“ für alle gemeinsam. -5. Gegeben ein Teamspiel, wenn ich Mitspieler Teams zuordne, dann gilt das Ergebnis je Team, und in der Statistik zählt ein Sieg für alle Mitglieder des Teams. +4. Gegeben ein kooperatives Spiel, wenn ich es als kooperativ markiere, dann erfasse ich nur „gewonnen“ oder „verloren“ für alle gemeinsam; ein gemeinsamer Sieg zählt in der Statistik für alle Mitspieler als Sieg (Klärung 38). +5. Gegeben ein Teamspiel, wenn ich Mitspieler Teams zuordne, dann erfasse ich Punkte und Ergebnis je Team, und in der Statistik zählt ein Sieg für alle Mitglieder des Teams (Klärung 38). 6. Gegeben ich lasse das Ergebnis leer, dann wird die Partie ohne Ergebnis gespeichert; sie zählt in der Statistik als gespielt, aber nicht für Siegquote und Bestwerte. 7. Gegeben ich überschreibe die automatisch berechnete Platzierung, dann gilt meine Eingabe. +8. Gegeben ein Spiel, dann kann ich je Spiel einstellen, ob die höchste oder die niedrigste Punktzahl gewinnt; die Einstellung gilt für die Ableitung der Platzierung (Kriterium 1) und für Bestwerte (PAR-08) (Klärung 38). ### PAR-04 Wertungsbogen je Spiel 1. Gegeben ich lege für ein Spiel Wertungskategorien an (zum Beispiel Siedlungen, Straßen), dann kann ich je Mitspieler und Kategorie Punkte eintragen, und die Summe wird automatisch gebildet. 2. Gegeben ich habe Kategorien einmal angelegt, wenn ich dieses Spiel wieder erfasse, dann werden sie mir vorgeschlagen, in der gespeicherten Reihenfolge. -3. Gegeben ich ändere die Kategorien, dann behalten bereits erfasste Partien ihre Werte. +3. Gegeben ich ändere die Kategorien, dann behalten bereits erfasste Partien ihre Werte; gelöschte Kategorien bleiben in alten Partien sichtbar und sind als „gelöscht“ markiert (Klärung 39). 4. Gegeben ich will keinen Wertungsbogen, dann kann ich die Gesamtpunktzahl direkt eintragen (PAR-03). 5. Gegeben Wertungsbögen, dann sind sie in R1 nur für mich sichtbar. +6. Gegeben ein Spiel, dann habe ich genau einen Wertungsbogen dafür (Klärung 39). +7. Gegeben ich trage in einer Kategorie negative Punkte ein, dann ist das erlaubt und fließt so in die Summe ein (Klärung 39). ### PAR-05 Partie bearbeiten und löschen @@ -231,6 +288,7 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 2. Gegeben ich lösche eine Partie, wenn ich die Rückfrage bestätige, dann ist sie weg und zählt nicht mehr in Verlauf und Statistik. 3. Gegeben ich ändere oder lösche eine Partie, dann stimmt die Statistik sofort danach. 4. Gegeben eine noch nicht synchronisierte Partie, dann kann ich sie bearbeiten und löschen wie jede andere. +5. Gegeben ich habe dieselbe Partie offline auf zwei Geräten bearbeitet, wenn beide synchronisieren, dann gilt die letzte Änderung, und ich sehe einen Hinweis, dass eine andere Änderung überschrieben wurde (Klärung 36). ### PAR-06 Partienverlauf @@ -239,24 +297,43 @@ R1 umfasst 26 Stories aus vier Epics. Alles, was andere Nutzer sehen könnte, ko 3. Gegeben ich tippe eine Partie an, dann sehe ich alle Details inklusive Ergebnis und Wertungsbogen. 4. Gegeben ich habe noch keine Partie erfasst, dann sehe ich einen Hinweis mit dem Weg zur ersten Partie. 5. Gegeben sehr viele Partien, dann werden weitere beim Scrollen nachgeladen. +6. Gegeben nicht synchronisierte Partien, dann erscheinen sie im Verlauf und sind als „noch nicht synchronisiert“ gekennzeichnet (Klärung 36). ### PAR-07 Persönliche Statistik 1. Gegeben ich wähle einen Zeitraum (gesamt, Jahr, Monat oder frei), dann sehe ich Anzahl der Partien, Anzahl verschiedener gespielter Spiele, Gesamtspielzeit in Stunden und Siegquote. -2. Gegeben die Siegquote, dann ist sie der Anteil der Partien mit Platz 1 an allen Partien mit Ergebnis; ein geteilter erster Platz zählt als Sieg. +2. Gegeben die Siegquote, dann ist sie der Anteil der Partien mit Sieg an allen Partien mit Ergebnis, in denen ich Mitspieler bin; als Sieg zählen Platz 1 (auch geteilt), ein gewonnenes kooperatives Spiel und ein Sieg meines Teams (Klärungen 37, 38). 3. Gegeben Partien ohne Dauer, dann zählen sie nicht in die Gesamtspielzeit, und ich sehe, wie viele es sind. 4. Gegeben ich sehe die meistgespielten Spiele, dann gibt es zwei Ranglisten (Top 10): nach Anzahl der Partien und nach Spielzeit. -5. Gegeben der Verlauf, dann sehe ich die Partien pro Monat als Diagramm. -6. Gegeben die Statistik, dann stimmen ihre Zahlen mit dem Partienverlauf (PAR-06) im selben Zeitraum überein. +5. Gegeben der Verlauf, dann sehe ich die Partien pro Monat als Diagramm; beim Zeitraum „gesamt“ zeigt es die letzten 24 Monate (Klärung 40). +6. Gegeben die Statistik, dann stimmen ihre Zahlen mit dem Partienverlauf (PAR-06) im selben Zeitraum überein, gefiltert auf Partien, in denen ich Mitspieler bin (Klärung 37). 7. Gegeben ich habe keine Partien im Zeitraum, dann sehe ich einen Leerzustand statt Nullen und leerer Diagramme. +8. Gegeben Partien, in denen ich nicht Mitspieler bin, dann zählen sie in keine Zahl der persönlichen Statistik, auch nicht in die Spielzeit (Klärungen 37, 40). +9. Gegeben ein Diagramm, dann gibt es eine Tabellenansicht als Alternative und eine Zusammenfassung als Screenreader-Text (Klärung 46). ### PAR-08 Statistik je Spiel -1. Gegeben ein Spiel mit Partien, dann sehe ich Anzahl der Partien, durchschnittliche Dauer, Gesamtdauer und Siegquote für dieses Spiel. -2. Gegeben ein Spiel mit Punkten, dann sehe ich den Bestwert mit Datum der Partie. +1. Gegeben ein Spiel mit Partien, dann sehe ich Anzahl der Partien, durchschnittliche Dauer, Gesamtdauer und Siegquote für dieses Spiel; die Siegquote zählt wie in PAR-07 Kriterium 2. +2. Gegeben ein Spiel mit Punkten, dann sehe ich als Bestwert meine eigene beste Punktzahl gemäß Wertungsrichtung (PAR-03 Kriterium 8) mit Datum der Partie (Klärung 41). 3. Gegeben ein Spiel ohne Punkte, dann wird kein Bestwert angezeigt. -4. Gegeben das Spiel, dann sehe ich die fünf häufigsten Mitspieler. +4. Gegeben das Spiel, dann sehe ich die fünf häufigsten Mitspieler; Gäste zählen dazu (Klärung 41). 5. Gegeben die Detailseite eines Spiels (KAT-02), dann komme ich von dort zur Statistik des Spiels. +6. Gegeben Partien dieses Spiels, in denen ich nicht Mitspieler bin, dann zählen sie wie in PAR-07 Kriterium 8 nicht in die Statistik je Spiel (abgeleitet aus Klärungen 37, 40, 41). + +## QUE – Querschnitt-Stories + +### QUE-09 Startseite: persönliches Dashboard (neu, Klärung 42) + +Als angemeldeter Nutzer möchte ich beim Öffnen der App eine persönliche Startseite mit meinen zuletzt gespielten Partien und meiner Wunschliste sehen, damit ich schnell dort weitermache, wo ich zuletzt war (F18). Nächste Termine (F18) kommen erst mit den Gruppen in R2. + +1. Gegeben ich bin angemeldet, wenn ich die App öffne, dann sehe ich als Startseite mein persönliches Dashboard mit den Bereichen „Zuletzt gespielt“ und „Wunschliste“. +2. Gegeben ich habe Partien erfasst, dann zeigt „Zuletzt gespielt“ meine neuesten Partien, neueste zuerst, mit Spiel, Datum und Sieger wie im Partienverlauf (PAR-06 Kriterium 1). +3. Gegeben ich tippe eine Partie unter „Zuletzt gespielt“ an, dann sehe ich ihre Details (PAR-06 Kriterium 3); über „Alle anzeigen“ gelange ich zum Partienverlauf. +4. Gegeben meine Wunschliste enthält Spiele, dann zeigt der Bereich „Wunschliste“ Spiele daraus mit Titel, Cover und Priorität; ein Tipp auf ein Spiel öffnet seine Detailseite (KAT-02), „Alle anzeigen“ öffnet die Wunschliste. +5. Gegeben ich habe noch keine Partie erfasst, dann zeigt „Zuletzt gespielt“ einen Hinweis mit dem Weg zur ersten Partie. +6. Gegeben meine Wunschliste ist leer, dann zeigt der Bereich „Wunschliste“ einen Hinweis mit dem Weg zur Katalogsuche. +7. Gegeben ich habe eine Partie erfasst, bearbeitet oder gelöscht oder meine Wunschliste geändert, wenn ich zur Startseite zurückkehre, dann sind die Änderungen ohne manuelles Neuladen sichtbar. +8. Gegeben ich bin in der App offline, dann zeigt „Zuletzt gespielt“ auch nicht synchronisierte Partien, gekennzeichnet wie in PAR-01 Kriterium 8; der Bereich „Wunschliste“ zeigt einen Hinweis, dass eine Verbindung nötig ist. ## Querschnitt für R1 @@ -264,9 +341,12 @@ Diese Kriterien gelten für jede Story in R1 und werden bei jedem Pull Request m ### Datenschutz (QUE-04) +Datenschutzerklärung und Nutzungsbedingungen liefert Chris vor dem Release; eine rechtliche Prüfung (inkl. Mindestalter 16 per Selbstbestätigung) ist vor dem Release nötig (Klärung 21/47). + 1. Gegeben ich registriere mich, dann sehe ich vorher Datenschutzerklärung und Nutzungsbedingungen und stimme ihnen ausdrücklich zu. -2. Gegeben optionale Dienste wie Nutzungsanalyse, dann sind sie standardmäßig aus und werden erst nach meiner Einwilligung aktiv. -3. Gegeben die Datenschutzerklärung, dann nennt sie Zwecke, Speicherdauer, Empfänger und die Löschfrist aus KTO-05. +2. Gegeben optionale Dienste, die personenbeziehbare Daten verarbeiten, dann sind sie standardmäßig aus und werden erst nach meiner Einwilligung aktiv. Ausgenommen ist die anonyme Reichweitenmessung nach Kriterium 4 (Klärung 21/47). +3. Gegeben die Datenschutzerklärung, dann nennt sie Zwecke, Speicherdauer, Empfänger und die Löschfrist von 30 Tagen aus KTO-05 (Klärung 20). +4. Gegeben die Reichweitenmessung in R1, dann ist sie anonym und cookielos, nutzt keine Geräte-IDs und braucht keine Einwilligung; andere Analyse- oder Tracking-Dienste gibt es in R1 nicht (Klärung 21/47). ### Sicherheit der Daten @@ -276,7 +356,7 @@ Diese Kriterien gelten für jede Story in R1 und werden bei jedem Pull Request m ### Sprachen (QUE-05) -1. Gegeben die App startet, dann folgt die Sprache der Geräteeinstellung (Deutsch oder Englisch, sonst Englisch) und lässt sich in den Einstellungen ändern. +1. Gegeben die App startet, dann folgt die Sprache der Geräteeinstellung (Deutsch oder Englisch, sonst Englisch) und lässt sich in den Einstellungen (KTO-11) ändern. 2. Gegeben jeder sichtbare Text, dann kommt er aus den Übersetzungsdateien, nicht aus dem Code. 3. Gegeben Datum, Zahlen und Währung, dann werden sie nach Sprache und Region formatiert. 4. Gegeben eine Übersetzung fehlt, dann erscheint der englische Text, niemals ein technischer Schlüssel. @@ -296,12 +376,12 @@ Diese Kriterien gelten für jede Story in R1 und werden bei jedem Pull Request m ### Plattformen -1. Gegeben jede R1-Story, dann funktioniert sie auf iOS, Android und im Web mit denselben Kriterien; Abweichungen werden im Pull Request begründet. +1. Gegeben jede R1-Story, dann funktioniert sie auf iOS, Android und im Web mit denselben Kriterien; Abweichungen werden im Pull Request begründet. Bekannte Abweichung: Die Offline-Erfassung von Partien gibt es in R1 nur in den Apps (PAR-01 Kriterium 10, Klärung 36). 2. Gegeben ein großer Bildschirm im Web oder auf einem Tablet, dann nutzt das Layout die Breite sinnvoll, statt eine gestreckte Handy-Ansicht zu zeigen. ## Entscheidungen zu den offenen Punkten -Beim Schreiben sind zehn Fragen entstanden, die R1 selbst betreffen. Alle zehn sind am 2. November 2026 entschieden; die Spalte „Entscheidung“ gilt als verbindlich. +Beim Schreiben sind zehn Fragen entstanden, die R1 selbst betreffen. Alle zehn sind am 2. November 2026 entschieden; die Spalte „Entscheidung“ gilt als verbindlich. Die 48 Folgefragen aus dem Story-Schnitt sind ebenfalls entschieden, siehe [`r1-klaerungen.md`](r1-klaerungen.md). | Nr | Frage | Entscheidung | Betrifft | | --- | --- | --- | --- | @@ -315,4 +395,3 @@ Beim Schreiben sind zehn Fragen entstanden, die R1 selbst betreffen. Alle zehn s | O8 | Mehrfachbesitz, etwa zwei Exemplare desselben Spiels? | Nein in R1, ein Eintrag je Spiel | SAM-01 | | O9 | Wertungsbögen: privat je Nutzer oder als Vorlagen im Katalog? | Privat in R1, gemeinsame Vorlagen später | PAR-04 | | O10 | Passen die Zahlenwerte: Passwort ab 10 Zeichen, Anzeigename 30, Kurzbeschreibung 300, 5 Lieblingsspiele, 20 Mitspieler, Notiz 1000 Zeichen, Avatar 5 MB? | So übernehmen | KTO, SAM, PAR | - diff --git a/requirements/backlog.md b/requirements/backlog.md index 7c2aae1..13b2f6b 100644 --- a/requirements/backlog.md +++ b/requirements/backlog.md @@ -1,75 +1,78 @@ # Backlog R1 -Stand: 2026-11-02 · Pflege: requirements-analyst · Quelle: `requirements/r1-story-entwurf.md` (freigegeben durch Chris am 2026-11-02), Akzeptanzkriterien in `requirements/20-r1-akzeptanzkriterien.md`. +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** (in Forgejo noch nicht angelegt, Issues aktuell ohne Milestone) · 4 Epics, 26 Stories, 26 Issues. +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). -Akzeptanzkriterien stehen 1:1 als nummerierte Checkliste in den Issues und werden als „KTO-01 Kriterium 3“ referenziert. Die Querschnittskriterien (Datenschutz, Sicherheit, Sprachen, Barrierefreiheit, Zustände/Netz, Plattformen) gelten für jede Story. +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 Fragen als Kommentar im Issue). +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 | ja | -| KAT-05 | [#2](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/2) | Katalogdaten laden und aktuell halten | Katalog | Must | XL | R1.1 (Import), R1.2 (Admin-Pflege, Meldungen) | offen | ja | -| KAT-01 | [#3](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/3) | Spiele suchen | Katalog | Must | L | R1.1 | offen | ja | -| KAT-02 | [#4](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/4) | Spieldetailseite | Katalog | Must | M | R1.1 | offen | ja | -| KTO-04 | [#5](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/5) | Privatsphäre (in R1 nur der Hinweis) | Konto | Must | S | R1.1 | offen | ja | +| 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 | ja | -| SAM-04 | [#8](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/8) | Wunschliste mit Priorität | Sammlung | Must | M | R1.2 | offen | ja | -| SAM-05 | [#9](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/9) | Einkaufsliste führen | Sammlung | Must | M | R1.2 | offen | ja | -| SAM-06 | [#10](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/10) | In die Sammlung übernehmen | Sammlung | Must | S | R1.2 | offen | ja | -| SAM-03 | [#11](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/11) | Sammlung durchsuchen, filtern und sortieren | Sammlung | Must | L | R1.2 | offen | ja | -| KAT-03 | [#12](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/12) | Erweiterungen und Editionen | Katalog | Must | M | R1.2 | offen | ja | -| KAT-04 | [#13](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/13) | Fehlendes Spiel melden | Katalog | Must | L | R1.2 | offen | ja | -| KTO-02 | [#14](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/14) | Profil bearbeiten | Konto | Must | L | R1.2 | offen | ja | -| PAR-01 | [#15](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/15) | Partie erfassen | Partien | Must | XL | R1.3 | offen | ja | -| PAR-02 | [#16](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/16) | Mitspieler hinzufügen | Partien | Must | M | R1.3 | offen | ja | -| PAR-03 | [#17](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/17) | Ergebnis erfassen | Partien | Must | L | R1.3 | offen | ja | -| PAR-04 | [#18](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/18) | Wertungsbogen je Spiel | Partien | Must | M | R1.3 | offen | ja | -| PAR-05 | [#19](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/19) | Partie bearbeiten und löschen | Partien | Must | M | R1.3 | offen | ja | -| PAR-06 | [#20](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/20) | Partienverlauf | Partien | Must | M | R1.3 | offen | ja | -| PAR-07 | [#21](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/21) | Persönliche Statistik | Partien | Must | L | R1.3 | offen | ja | -| PAR-08 | [#22](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/22) | Statistik je Spiel | Partien | Must | M | R1.3 | offen | ja | -| KTO-05 | [#23](https://git.cshomelabs.work/cschlaefke/Shuffle/issues/23) | Konto löschen und Daten exportieren | Konto | Must | XL | R1.4 | offen | ja | -| 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 | ja | -| 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 | -| 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 | ja | +| 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 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 (Import), #3, #4, #5 | -| R1.2 Sammlung | #6, #7, #8, #9, #10, #11, #12, #13, #2 (Admin-Pflege, Meldungen), #14 | -| R1.3 Partien | #15, #16, #17, #18, #19, #20, #21, #22 | +| 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). +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 …): +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 | +| #5 KTO-04 | #1, #28 *(neu)* | | #6 SAM-01 | #1, #3, #4 | | #7 SAM-02 | #6 | | #8 SAM-04 | #1, #4 | @@ -87,87 +90,77 @@ In Forgejo als blockierende Abhängigkeiten gesetzt (Issue hängt ab von …): | #20 PAR-06 | #15, #16, #17 | | #21 PAR-07 | #17, #20 | | #22 PAR-08 | #4, #17 | -| #23 KTO-05 | #1 | +| #23 KTO-05 | #1, #28 *(neu)* | | #24 SAM-07 | #1 | -| #25 SAM-08 | #2, #6, #8, #13, #24 | +| #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; Admin-Rolle für #2 und #13 +- 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 -Nummerierung wie in `requirements/r1-story-entwurf.md` § 5. Der Wortlaut steht als Kommentar im jeweiligen Issue. +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. -### A. Widersprüche zwischen Akzeptanzkriterien und Datenmodell/Migrationen +### Neue offene Punkte (Stand 2026-11-02) -| Nr | Thema | Issues | +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 | | --- | --- | --- | -| 1 | Spiel gleichzeitig in Sammlung, Wunsch- und Einkaufsliste? (`unique (owner_id, game_id)`) | #8, #10, #25 | -| 2 | Felder für SAM-02/04/05 fehlen im Datenmodell | #7, #8, #9 | -| 3 | Deutscher und englischer Titel (alternative Titel) | #3 | -| 4 | Verlagsfeld fehlt | #3, #4 | -| 5 | Beziehung Erweiterung ↔ Basisspiel fehlt | #12 | -| 6 | Tabelle für Meldungen fehlt | #13 | -| 7 | Ausblenden, manuell gepflegte Felder, Erlaubnis je Quelle | #2 | -| 8 | Profil-Genres fehlen, gleiche Liste wie Katalog? | #14 | -| 9 | Stadt im Profil vs. „alles privat“ | #5 | -| 10 | Löschumfang Partien, private Katalogeinträge, Meldungen | #23 | -| 11 | Ort, Gästeliste, kooperativ/Teams fehlen im Modell | #15, #16, #17, #20 | -| 12 | BGG-Import: „nicht gefunden“ vs. automatische private Einträge | #25 | +| 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 | -### B. Unklare oder nicht testbare Kriterien +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. -| Nr | Thema | Issues | +## 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 | | --- | --- | --- | -| 13 | KAT-01 Kriterium 8 unvollständig, Filterumfang | #3 | -| 14 | „Normale Verbindung“ für 2 s | #3 | -| 15 | Wann ist ein Eintrag „sehr ähnlich“? | #13 | -| 16 | „Flüssig“ bei 1000 Spielen – Zielwert | #11 | -| 17 | „Einige Sekunden“ für Rückgängig | #8, #9, #10 | -| 18 | Drosselung, Gültigkeit Reset- und Bestätigungslink | #1 | -| 19 | KTO-04 Kriterium 2 in R1 nicht testbar | #5 | -| 20 | Löschfrist, Exportformat und -umfang, Benachrichtigung, Neuregistrierung | #23 | -| 21 | Datenschutzerklärung/AGB, Prüfung Mindestalter, optionale Dienste | #1 | - -### C. Fachliche Lücken je Story - -| Nr | Thema | Issues | -| --- | --- | --- | -| 22 | Regeln Anzeigename bei Registrierung, Abmelden/E-Mail/Passwort ändern | #1 | -| 23 | Vorläufige Spiele als Lieblingsspiele, Reihenfolge ändern | #14 | -| 24 | Zugelassene Datenquellen ohne BGG-Lizenz (kritisch für R1) | #2, #4 | -| 25 | Admin-Bereich in der App oder internes Werkzeug, wer ist Admin | #2 | -| 26 | Rückmeldung zu Meldungen, Ablehnung ohne Zieleintrag | #13 | -| 27 | Moderation und Spam-Limit für Meldungen | #13 | -| 28 | Edition Pflicht/optional, auch für Listen und Partien | #12 | -| 29 | Werte der Zustandsliste, Verwaltung von Tags/Standorten | #7 | -| 30 | Suche/Filter auch für Wunsch- und Einkaufsliste, Leerzustand ohne Lizenz | #11 | -| 31 | Summe der Einkaufsliste, Verhalten bei abgelehnter Übernahme | #9 | -| 32 | Umgang mit Listen-Notiz bei vorhandener Sammlungsnotiz | #10 | -| 33 | Eine BGG-Verknüpfung je Konto, mehrfach verknüpfter BGG-Name | #24 | -| 34 | Zählende BGG-Status, Prioritätsabbildung, Erweiterungen | #25 | -| 35 | „In Shuffle selbst hinzugefügt“, Dauer der Hervorhebung | #26 | -| 36 | Datum/Uhrzeit, wählbare Spiele, Offline-Konflikte, Offline im Web | #15, #19 | -| 37 | Selbst entfernen, Namensvergleich, Gäste löschen, Längenbegrenzung | #16 | -| 38 | Kooperativer Sieg in Siegquote, Teampunkte, niedrigste Punktzahl gewinnt | #17, #21 | -| 39 | Mehrere Wertungsbögen, Kategorien löschen, Minus-Kategorien | #18 | -| 40 | Siegquote ohne eigene Teilnahme, Diagrammzeitraum, Spielzeit | #21 | -| 41 | Definition Bestwert, Gäste als häufigste Mitspieler | #22 | - -### D. Querschnitt und fehlende Stories - -| Nr | Thema | Issues | -| --- | --- | --- | -| 42 | Startseite/Dashboard (F18) – keine Story | keinem Issue zugeordnet, Entscheidung Chris offen | -| 43 | Einstellungsbereich (Sprachwechsel, Abmelden, Hinweis, Konto löschen) – keine Story | keinem Issue zugeordnet, Entscheidung Chris offen | -| 44 | Admin-Rolle (QUE-07) und Admin-Bereich (QUE-08) – keine Story, von KAT-04/KAT-05 vorausgesetzt | keinem Issue zugeordnet, Entscheidung Chris offen | -| 45 | E-Mails in R1, Sprache der Mails | #1, #13, #23 | -| 46 | Diagramme für Screenreader | #21 | -| 47 | Selbstbestätigung Mindestalter 16 ausreichend? | #1 | -| 48 | Kennzeichnung fremdsprachiger Katalogtexte | #4 | +| 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 | diff --git a/requirements/r1-klaerungen.md b/requirements/r1-klaerungen.md new file mode 100644 index 0000000..c7a982d --- /dev/null +++ b/requirements/r1-klaerungen.md @@ -0,0 +1,59 @@ +# R1 – Klärungen offener Fragen + +Antworten von Chris auf die offenen Fragen aus `r1-story-entwurf.md` § 5 (Nummerierung wie dort). +Stand: 2026-11-02 – **alle 48 Fragen beantwortet**. Als Nächstes werden Akzeptanzkriterien, Datenmodell und Issues entsprechend angepasst. + +| Nr | Story/Issue | Entscheidung | Folge | +|---|---|---|---| +| 1 | SAM-04 #8, SAM-06 #10, SAM-08 #25 | Ein Spiel steht in genau **einer** Liste (Sammlung, Wunsch- oder Einkaufsliste). | Datenmodell bleibt (`unique (owner_id, game_id)`). SAM-04 Kriterium 2 wird gestrichen bzw. umformuliert: Steht das Spiel schon in der Sammlung, sehe ich einen Hinweis und kann es nicht auf die Wunschliste setzen. | +| 2 | SAM-02 #7, SAM-04 #8, SAM-05 #9 | R1: Zustand, Standort, Tags, Notiz, Priorität. **Kaufpreis, Händler, geplanter Preis, Link und Summe kommen später.** | Datenmodell um Zustand, Standort, Tags, Priorität erweitern. Streichen: SAM-02 Krit. 1 (Kaufpreis) und Krit. 3 (Preis negativ), SAM-05 Krit. 1 (Händler, Preis, Link) und Krit. 2 (Summe), SAM-06 Krit. 2 (Preisübernahme). | +| 9 | KTO-04 #5, KTO-02 #14 | Stadt bleibt in R1, ist aber **nur für den Nutzer selbst sichtbar**. | Datenmodell/RLS: keine Sichtbarkeit von Profilfeldern für Fremde in R1. | +| 10 | KTO-05 #23 | Beim Konto-Löschen wird in R1 **alles hart gelöscht**: Partien, Gäste, Wertungsbögen, private Katalogeinträge, offene Meldungen. | Regel „Gelöschter Nutzer“ im Datenmodell gilt erst ab R2 (verknüpfte Mitspieler). | +| 11 | PAR-01 #15, PAR-02 #16, PAR-03 #17, PAR-06 #20 | **Alles in R1**: Ort, Gästeliste, kooperativ, Teams. | Datenmodell erweitern. | +| 12 | SAM-08 #25 | Fehlende BGG-Spiele werden beim Import **automatisch als vorläufige private Einträge** angelegt (wie Datenmodell). | SAM-08 Kriterium 4 anpassen: Zusammenfassung zeigt sie als „vorläufig angelegt“; Meldung an Admin entsteht automatisch. | +| 24 | KAT-05 #2, KAT-02 #4 | Katalog zum Start **nur manuell gepflegt**, kein Import-Job in R1.1 (bis BGG-Lizenz vorliegt). | KAT-05 Kriterien 1–3, 6 (Import) werden erst mit Lizenz relevant; R1.1 braucht manuelle Pflege und einen Startbestand. | +| 42 | neu | **Startseite/Dashboard wird eigene R1-Story.** | Neue Story + Issue anlegen. | +| 43 | neu | **Einstellungsbereich wird eigene R1-Story.** | Neue Story + Issue anlegen. | +| 44 | KAT-04 #13, KAT-05 #2 | Admin-Rolle/-Bereich wird **keine** eigene Story. Der Admin pflegt Katalog und Meldungen in R1 **über Supabase Studio/SQL**; die Admin-Rolle existiert nur als DB-Rolle (RLS). | Keine Admin-UI in der App bis QUE-08 (R4). KAT-05 Kriterien 4–5 werden über Studio erfüllt; Ablauf im Repo dokumentieren. | +| 25 | KAT-04 #13, KAT-05 #2 | Siehe 44: Admin-Pflege per Supabase Studio. | – | +| 13 | KAT-01 #3 | Kriterium 8: zusätzliche Filter **Genre und Mechanik**; Filtern funktioniert **auch ohne Suchbegriff** (Entdecken). | Kriterium 8 als Wenn/Dann neu formulieren. | +| 17 | SAM-04 #8, SAM-05 #9, SAM-06 #10 | Rückgängig machen ist **5 Sekunden** lang möglich. | „Einige Sekunden“ durch „5 Sekunden“ ersetzen. | +| 18 | KTO-01 #1 | Drosselung und Gültigkeit von Reset- und Bestätigungslink nach **Supabase-Auth-Standards** (self-hosted Config). | Werte aus der Config im Repo dokumentieren und in Tests referenzieren. | +| 3 | KAT-01 #3 | **Alternative Titel** je Spiel (mit Sprache); die Suche findet alle. | Datenmodell: Tabelle für alternative Titel. | +| 4 | KAT-01 #3, KAT-02 #4 | **Verlag** wird aufgenommen. | Datenmodell: Verlag(e) je Spiel. | +| 5 | KAT-03 #12 | **Erweiterung ↔ Basisspiel** wird aufgenommen: Erweiterung ist eigenes Spiel mit Verweis aufs Basisspiel. | Datenmodell erweitern. | +| 20 | KTO-05 #23 | Löschfrist **30 Tage** inkl. Backups. Export als **JSON** mit allen eigenen Daten (inkl. Gäste, Wertungsbögen, Avatar-Link, vorläufige Spiele); Abruf in der App, **7 Tage** gültig. Neuregistrierung mit derselben E-Mail **sofort** möglich. | KTO-05 Kriterien 2, 4, 5 konkretisieren; Datenschutzerklärung nennt 30 Tage. | +| 21/47 | KTO-01 #1, QUE-04 | Datenschutzerklärung und Nutzungsbedingungen liefert Chris vor Release. Selbstbestätigung „mindestens 16“ reicht bis zur rechtlichen Prüfung. R1 enthält **nur anonyme, cookielose Reichweitenmessung ohne Geräte-IDs und ohne Einwilligung** (z. B. selbst gehostet). | QUE-04 Kriterium 2 präzisieren: Gilt für personenbeziehbare optionale Dienste; anonyme Messung ist ausgenommen. **Rechtliche Prüfung vor Release nötig.** | + +## Weitere Entscheidungen (einzeln mit Chris durchgegangen, 2026-11-02) + +| Nr | Story/Issue | Entscheidung | +|---|---|---| +| 6 | KAT-04 #13 | Neue Tabelle für Meldungen in R1 (Status offen/freigegeben/abgelehnt/zusammengeführt, Link, Verweis auf Zieleintrag). | +| 7 | KAT-05 #2 | **Alles schon in R1 modellieren:** Flag „ausgeblendet“, Kennzeichnung manuell gepflegter Felder und Erlaubnis je Quelle, damit der spätere Import keine Migration braucht. | +| 8 | KTO-02 #14 | Profil-Genres nutzen dieselbe Genre-Liste wie der Katalog. | +| 14 | KAT-01 #3 | „Normale Verbindung“ = mobil 4G-Profil (≥ 10 Mbit/s, ~100 ms RTT); 95 % der Suchen liefern erste Treffer in ≤ 2 s, gemessen gegen Staging. | +| 15 | KAT-04 #13 | „Sehr ähnlich“ = gleicher normalisierter Titel (Groß/Klein, Sonderzeichen, Artikel ignoriert) oder Titel-Ähnlichkeit ≥ 0,8 (Trigramm) bei Erscheinungsjahr ± 1. | +| 16 | SAM-03 #11 | „Flüssig“ bei 1000 Spielen = Such-/Filterergebnis in ≤ 300 ms, Scrollen ohne sichtbares Ruckeln auf einem Mittelklasse-Gerät. | +| 19 | KTO-04 #5 | Kriterium 2 wird als Regel in `10-anforderungen.md` verschoben; KTO-04 hat in R1 nur Kriterium 1. | +| 22 | KTO-01 #1 | Anzeigename bei Registrierung: dieselben Regeln wie KTO-02 (1–30 Zeichen). Abmelden sowie E-Mail/Passwort ändern gehören in die neue Story „Einstellungsbereich“ (43). | +| 23 | KTO-02 #14 | **Nur Katalogspiele** dürfen Lieblingsspiele sein (keine vorläufigen Spiele). Reihenfolge per Ziehen und zusätzlich per „nach oben/unten“-Aktion (barrierefrei). | +| 26 | KAT-04 #13 | Ergebnis einer Meldung als Hinweis in der App am vorläufigen Eintrag, keine E-Mail. Bei Ablehnung ohne Zieleintrag bleibt der vorläufige Eintrag privat bestehen und ist als „abgelehnt“ markiert. | +| 27 | KAT-04 #13 | Chris prüft jede Meldung manuell. Limit: 10 Meldungen je Nutzer und Tag. | +| 28 | KAT-03 #12 | Edition ist optional und wird nur in Sammlung und Partien gewählt, nicht in Wunsch-/Einkaufsliste. | +| 29 | SAM-02 #7 | Zustandsliste: neu/eingeschweißt, sehr gut, gut, gebraucht, beschädigt. Tags und Standorte ohne eigene Verwaltung in R1 (entstehen durch Nutzung, Vorschläge aus bisherigen Werten). | +| 30 | SAM-03 #11 | Wunsch- und Einkaufsliste: nur Titelsuche und Sortierung, keine Filter. Leerzustand ohne Lizenz zeigt nur den Weg zum Hinzufügen. | +| 31 | SAM-05 #9 | Summe entfällt (Frage 2). Lehnt der Nutzer nach „gekauft“ die Übernahme ab, bleibt das Spiel unverändert auf der Einkaufsliste. | +| 32 | SAM-06 #10 | Entfällt als Folge von Frage 1: Nach Frage 1 kann ein Spiel nicht gleichzeitig in Sammlung und Liste stehen; die Notiz wird einfach übernommen. | +| 33 | SAM-07 #24 | Eine BGG-Verknüpfung je Konto; derselbe BGG-Name darf an mehreren Konten hängen (BGG-Sammlungen sind öffentlich). | +| 34 | SAM-08 #25 | owned → Sammlung; wishlist und want to buy → Wunschliste; preordered → Einkaufsliste; want to play wird ignoriert. BGG-Priorität 1–2 → hoch, 3 → mittel, 4–5 → niedrig. Besessen und gewünscht → Sammlung (Frage 1). Erweiterungen werden importiert. | +| 35 | SAM-09 #26 | „Selbst hinzugefügt“ = Eintrag, der nicht aus einem BGG-Import stammt. Hervorhebung nur im Abgleichsdialog. | +| 36 | PAR-01 #15, PAR-05 #19 | Datum ohne Uhrzeit. Vorläufige Spiele wählbar; Wunschlisten-Spiele über die Katalogsuche. Konflikt bei Offline-Bearbeitung auf zwei Geräten: letzte Änderung gewinnt, Hinweis an den Nutzer. Nicht synchronisierte Partien zählen lokal schon in Verlauf und Statistik (gekennzeichnet). Gastvorschläge und Wertungsbögen funktionieren offline aus dem lokalen Speicher. **Web: Offline-Erfassung in R1 nur in den Apps, im Browser mit Hinweis „Verbindung nötig“** (Abweichung im PR begründen). | +| 37 | PAR-02 #16 | Die persönliche Statistik zählt nur Partien, in denen ich Mitspieler bin. Namensvergleich ohne Groß-/Kleinschreibung; ein Gast darf wie ich heißen. Gäste lassen sich löschen, wenn sie in keiner Partie vorkommen, sonst nur umbenennen. Gastname 1–30 Zeichen. | +| 38 | PAR-03 #17, PAR-07 #21 | Kooperativer Sieg zählt als Sieg in der Siegquote. Bei Teams werden Punkte je Team erfasst. Je Spiel einstellbare Wertungsrichtung „höchste“ oder „niedrigste Punktzahl gewinnt“. | +| 39 | PAR-04 #18 | Ein Wertungsbogen je Spiel und Nutzer. Gelöschte Kategorien bleiben in alten Partien sichtbar (als „gelöscht“ markiert). Negative Punkte in Kategorien erlaubt. | +| 40 | PAR-07 #21 | Wie 37: nur Partien mit mir (auch für Spielzeit). Diagramm bei „gesamt“: letzte 24 Monate. | +| 41 | PAR-08 #22 | Bestwert = meine eigene beste Punktzahl, gemäß Wertungsrichtung (38). Gäste zählen zu den häufigsten Mitspielern. | +| 45 | KTO-01 #1, KAT-04 #13, KTO-05 #23 | E-Mails nur für Bestätigung und Passwort-Reset (Supabase-Systemmails) in der Sprache des Profils. Export fertig und Meldungsergebnis nur als Hinweis in der App. | +| 46 | PAR-07 #21 | Diagramme bekommen eine Tabellenansicht als Alternative und eine Zusammenfassung als Screenreader-Text. | +| 48 | KAT-02 #4 | Katalogtexte in anderer Sprache als die Oberfläche bekommen einen sichtbaren Sprachhinweis (z. B. „Beschreibung auf Englisch“). |