docs(catalog): Spec für KAT-01 Spiele suchen (Issue #3) #59

Merged
cschlaefke merged 4 commits from docs/3-kat01-spec into main 2026-11-04 00:30:09 +00:00
Owner

Refs #3 (kein Closes). Spec: docs/specs/3-katalog-suche.md, zur Freigabe durch Chris vor jeder Umsetzung.

Kern der Spec

  • Eine RPC search_catalog_games (security invoker, stable) liest über die View catalog_games (ausgeblendete/zusammengeführte Spiele fehlen, Maskierung bleibt wirksam); erste Funktion mit execute für anon/authenticated. Seitengröße 30, Filter UND-verknüpft, ohne Suchbegriff/Filter der ganze Katalog alphabetisch.
  • Neue Tabelle game_alt_titles; Basisfunktion public.search_normalize (Symbole entfernen, unaccent mit festem Wörterbuch, lower, …) für anon/authenticated/service_role ausführbar; generierte Spalten title_search; pg_trgm/unaccent im Schema extensions (im self-hosted Image unverifiziert, Prüfung in B5, Rückfall beschrieben).
  • App: neues Feature features/catalog/, rein lesende Datenklassen (createToJson: false), öffentliche Route /catalog.
  • Messung Krit. 7: eigenes Playwright-Projekt perf, p95 ≤ 2 s bei gedrosselter Verbindung.
  • Schnitt: 3a Backend, 3b App (Merge nach 3a), 3c E2E/Messung. 3a wird nach 2b gemergt (nicht auf 2c warten); 13a (Spec #13, PR #58) braucht 3a.

Review

code-reviewer zweimal (Fachreview, gemeinsame Konsistenzprüfung mit Spec #13): Blocker behoben (fehlendes execute auf search_normalize hätte Insert/Update privater Spiele und jede Suche gebrochen; CATAN®/™/½-Normalisierung; Vereinheitlichung mit #13); Spec zuletzt „freigabefähig“ bewertet. Die letzte Nacharbeit (2513ed8, nur Hinweise) hat kein Reviewer erneut gelesen.

Entscheidungen für Chris

  • Spec-F4 (Abschluss von #3): Option A (Empfehlung): 3c schließt #3 mit vorläufiger Messung gegen den lokalen/CI-Stack mit Startbestand + synthetischem Volumen; Staging-Messung wird Freigabebedingung in docs/release-checkliste.md (PR #54, noch offen). Option B: #3 bleibt wegen Krit. 7 offen. Staging existiert noch nicht.
  • Spec-F1–F3, F5–F7 und Designwahlen W1–W8 mit Empfehlung in § 9 (u. a. UND bei mehreren Genres, Filtersemantik Spielerzahl/Dauer/Alter, „ae/oe/ue“ in R1 nicht gleich ä/ö/ü, nur de/en bei alternativen Titeln).
  • Vor Go-live: Rate-Limit für anonyme Suchen (Kong rate-limiting oder Proxy limit_req); statement_timeout anon 3 s/authenticated 8 s lokal, im Self-Hosting zu bestätigen.

Nicht geprüft

Keine Implementierung, kein Ausführungsplan bei 10.000 Spielen (Indizes greifen nur teilweise; B5 misst als anon mit RLS), Erweiterungen auf Hetzner, go_router-18-Verhalten beim URL-Ersetzen, Screenreader.

🤖 Generated with Claude Code

Refs #3 (kein `Closes`). Spec: `docs/specs/3-katalog-suche.md`, zur **Freigabe durch Chris** vor jeder Umsetzung. ## Kern der Spec - Eine RPC `search_catalog_games` (`security invoker`, `stable`) liest über die View `catalog_games` (ausgeblendete/zusammengeführte Spiele fehlen, Maskierung bleibt wirksam); erste Funktion mit `execute` für `anon`/`authenticated`. Seitengröße 30, Filter UND-verknüpft, ohne Suchbegriff/Filter der ganze Katalog alphabetisch. - Neue Tabelle `game_alt_titles`; Basisfunktion `public.search_normalize` (Symbole entfernen, `unaccent` mit festem Wörterbuch, `lower`, …) für `anon`/`authenticated`/`service_role` ausführbar; generierte Spalten `title_search`; `pg_trgm`/`unaccent` im Schema `extensions` (im self-hosted Image unverifiziert, Prüfung in B5, Rückfall beschrieben). - App: neues Feature `features/catalog/`, rein lesende Datenklassen (`createToJson: false`), öffentliche Route `/catalog`. - Messung Krit. 7: eigenes Playwright-Projekt `perf`, p95 ≤ 2 s bei gedrosselter Verbindung. - Schnitt: 3a Backend, 3b App (Merge nach 3a), 3c E2E/Messung. 3a wird nach 2b gemergt (nicht auf 2c warten); 13a (Spec #13, PR #58) braucht 3a. ## Review `code-reviewer` zweimal (Fachreview, gemeinsame Konsistenzprüfung mit Spec #13): Blocker behoben (fehlendes `execute` auf `search_normalize` hätte Insert/Update privater Spiele und jede Suche gebrochen; `CATAN®`/`™`/`½`-Normalisierung; Vereinheitlichung mit #13); Spec zuletzt „freigabefähig“ bewertet. Die letzte Nacharbeit (2513ed8, nur Hinweise) hat kein Reviewer erneut gelesen. ## Entscheidungen für Chris - **Spec-F4 (Abschluss von #3):** Option A (Empfehlung): 3c schließt #3 mit vorläufiger Messung gegen den lokalen/CI-Stack mit Startbestand + synthetischem Volumen; Staging-Messung wird Freigabebedingung in `docs/release-checkliste.md` (PR #54, noch offen). Option B: #3 bleibt wegen Krit. 7 offen. Staging existiert noch nicht. - Spec-F1–F3, F5–F7 und Designwahlen W1–W8 mit Empfehlung in § 9 (u. a. UND bei mehreren Genres, Filtersemantik Spielerzahl/Dauer/Alter, „ae/oe/ue“ in R1 nicht gleich ä/ö/ü, nur de/en bei alternativen Titeln). - Vor Go-live: Rate-Limit für anonyme Suchen (Kong `rate-limiting` oder Proxy `limit_req`); `statement_timeout` anon 3 s/authenticated 8 s lokal, im Self-Hosting zu bestätigen. ## Nicht geprüft Keine Implementierung, kein Ausführungsplan bei 10.000 Spielen (Indizes greifen nur teilweise; B5 misst als `anon` mit RLS), Erweiterungen auf Hetzner, go_router-18-Verhalten beim URL-Ersetzen, Screenreader. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 4 commits 2026-11-03 20:32:43 +00:00
Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Idempotenz der alternativen Titel in pgTAP statt Deno, Auswirkung auf
06/00_schema, alternative Titel an Testspiel B, Merge-Reihenfolge
2b -> 2c -> 3a und Erweiterung des Fremdschlüssel-Wächters in 07.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
search_normalize für alle API-Rollen ausführbar, Symbole vor unaccent
entfernen, eine Basisfunktion gemeinsam mit #13, Reihenfolge 3a nach 2b,
Spec-F4 mit vorläufiger Messung ohne Staging, Indizes nicht als
Begründung, Grenzen und Hinweise aus dem Review.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
docs(catalog): Hinweise aus dem Konsistenz-Review in die KAT-01-Spec
All checks were successful
CI / flutter (pull_request) Successful in 1m17s
CI / web-build (pull_request) Successful in 57s
CI / supabase (pull_request) Successful in 8s
CI / supabase-tests (pull_request) Successful in 30s
CI / e2e (pull_request) Successful in 2m52s
2513ed8ef2
Stand von 2c (PR #57) und Fremdschlüssel-Wächter in 07 und 08,
normalize_game_title ausgeschrieben, Release-Checkliste als offener
PR #54 gekennzeichnet, Änderungsprotokoll nur ergänzt.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added the
status/ready-for-merge
label 2026-11-03 21:22:52 +00:00
Author
Owner

Freigabe (Chris, 2026-11-04): Spec #3 ist angenommen, alle Entscheidungen Spec-F1–F7 und Designwahlen W1–W8 wie empfohlen, Spec-F4 als Option A: 3c schließt #3 mit vorläufiger Messung gegen den lokalen/CI-Stack; die Staging-Messung wird Freigabebedingung in der Release-Checkliste. Rate-Limit für anonyme Suchen wird vor Go-live entschieden (D1). Umsetzung 3a und 3b starten.

**Freigabe (Chris, 2026-11-04):** Spec #3 ist angenommen, alle Entscheidungen Spec-F1–F7 und Designwahlen W1–W8 wie empfohlen, Spec-F4 als Option A: 3c schließt #3 mit vorläufiger Messung gegen den lokalen/CI-Stack; die Staging-Messung wird Freigabebedingung in der Release-Checkliste. Rate-Limit für anonyme Suchen wird vor Go-live entschieden (D1). Umsetzung 3a und 3b starten.
cschlaefke merged commit 2fa797020a into main 2026-11-04 00:30:09 +00:00
cschlaefke deleted branch docs/3-kat01-spec 2026-11-04 00:30:09 +00:00
Sign in to join this conversation.
No description provided.