Laden
Neuer Stand wird geladen
Page Of Truth
Referenz für abgeschlossene Turniere: erst Cache prüfen, dann gezielt Bundle laden und Snapshot persistent halten.
Diese Seite ist die lesbare Referenz dafür, wie dieser Turniertyp geladen, aus Cache/Storage wiederverwendet, aufbereitet und dargestellt werden soll.
Schutzregel: Die aktuell funktionierende completed `matchplay`-Logik ist ein geschützter Referenzpfad. Änderungen an anderen Turniertypen, Statuspfaden oder Shared-Loadern dürfen diesen Pfad nicht ohne explizite Verifikation kaputtmachen.
Pflegbarer Status
Diese Auswahl lebt bewusst im Browser-Storage, damit die Seite als Arbeitsfläche für die echte Implementierung genutzt werden kann.
Diese Dateien im privaten Repo sind die primären Wartungsorte für diesen Turniertyp. Erkenntnisse sollen zuerst dort gepflegt und dann in der UI-Doku gespiegelt werden.
.opencode/skills/matchplay-tournament-type-completed/SKILL.md.opencode/skills/matchplay-tournament-types-memory/SKILL.md.opencode/skills/matchplay-tournament-type-best-game/SKILL.md.opencode/skills/matchplay-tournament-type-golf/SKILL.md.opencode/agents/matchplay-tournament-types.md.opencode/agents/matchplay-tournament-type-maintainer.mdWas dieser Flow leisten soll, bevor wir daran weiter implementieren.
Diese Regeln sind der aktuell verbindliche Minimalpfad. Erst dokumentieren und verifizieren, bevor hiervon abgewichen wird.
Von Endpoint zu Endpoint, inklusive Datenentnahme und Aufbereitung.
`getLiveTournamentOverview()` prüft zuerst `matchplay:live-overview:{cacheKey}`. Frische Treffer werden direkt zurückgegeben, completed-Treffer dürfen sogar stale wiederverwendet werden.
Overview aus exact cache oder Entscheidung zum NetzwerkpfadFalls kein passender Cache existiert, wird wie gewohnt das Zielturnier aus `played tournaments` und `tournament detail` bestimmt.
playerIdoptional tournamentIdresolved tournament detailAus Players und Standings wird die Match Play ID des Users auf den Tournament Player gemappt.
detail.playersstandingsrequestedMatchplayIdviewedMatchplayIdwatchedPlayer.playerIdrequestedTournamentPlayerId`getTournamentDataBundle(watchedPlayer.playerId, tournamentId)` lädt detail und rounds immer, dazu nur formatabhängig games, single-player-games, cards, standings und summaries.
watched tournament player idtournamentIdverlässliche completed RohdatenDie Anzeige entsteht aus `buildCompletedTournamentMatches(...)`; für Multiplayer ist genau ein watched-player `/games` die Minimalbasis für sofort renderbare Round/Game-Shells. Falls später noch Matchdetails fehlen, dürfen sie nur lazy, row-scoped und storage-backed nachgezogen werden.
bundle detailbundle roundsbundle gamesbundle summariestournamentTypematchesbestGameOverviewactive/latest match references`CompletedTournamentContextSync` speichert die finale Overview im Browser in `matchplayCompletedTournamentContext`.
finale OverviewplayerIdviewPlayerIdtournamentIdlokaler Snapshot für /storage und /storage/view`CompletedTournamentContextSync` lädt für completed genau einmal CSV und Standings, speichert beides komprimiert im Browser und nutzt die Standings später für Platzierung und Dialog ohne weiteren Request.
tournamentIdtypestatusupdatedAtmatchplayCompletedTournamentCsvmatchplayCompletedTournamentStandingsWenn lazy Match-History später geladen wurde, wird die angereicherte Completed-Overview erneut in `matchplayCompletedTournamentContext` geschrieben, damit spätere Reuse direkt aus Storage kommen kann.
lazy nachgeladene Historycompleted overviewreicherer lokaler Snapshot`shouldUseStoredTournamentSnapshot()` validiert completed-Snapshots via `/api/matchplay/tournaments/{tournamentId}/state`; bei unverändertem Status/updatedAt darf direkt aus Storage gerendert werden.
stored snapshottournament state endpointNavigation zu /storage/view oder /?playerId=...&tournamentId=...Welcher Endpunkt liefert was und welche Felder wir daraus wirklich ziehen.
/tournaments?played={playerId}Nur für automatische Turnier-Auflösung ohne explizite `tournamentId` oder später für die lazy Tournament-Select-Liste.
tournamentIdnamestatusupdatedAt/tournaments/{tournamentId}?includePlayers=true&includeArenas=true&includeLocation=trueGrunddaten des Turniers laden und Typ bestimmen.
typestatusplayersarenaslocationupdatedAt/tournaments/{tournamentId}/roundsRunden/Holes/Brackets aufbauen, wenn das Format sie benoetigt.
roundIdnameindexstatusarenaId/tournaments/{tournamentId}/standingsPositionen, Punkte und Spielerbezug herstellen.
playerIdpositionpointsgamesPlayedentriesPlayed/games?tournaments={tournamentId}&player={playerId}Multiplayer-Games des betrachteten Tournament-Players für den Bundle-Teil laden.
gameIdroundIdarenaIdstatusplayers/results/tournaments/{tournamentId}/single-player-games?player={playerId}Best Game / Pingolf / Amazing Race Attempts für completed laden.
singlePlayerGameIdroundIdarenaIdplayerIdscorestatus/tournaments/{tournamentId}/cards?player={playerId}Card-basierte Best-Game Daten im Bundle aufnehmen.
cardIdplayerIdentriesscore/tournaments/{tournamentId}/summary/arenasStabile Arena-Statistiken für completed anzeigen oder ableiten.
arenaIdwinslossesplays/tournaments/{tournamentId}/summary/player-arenasPlayer/Arena-Kombinationen für Auswertungen und Doku nutzen.
playerIdarenaIdplayswinslosses/tournaments/{tournamentId}/summary/matchesGegner- und Match-Zusammenfassung für completed, beste Quelle für Stats gegen Opponents.
playerIdopponentIdarenaIdwinslossesplays/api/matchplay/tournaments/{tournamentId}/stateVor Storage-Reuse prüfen, ob Status oder updatedAt des Turniers sich geändert haben.
statusupdatedAtcompletedAtWann Daten aus Storage kommen, was dort drinsteht und wie Wiederverwendung entschieden wird.
Beim Eingeben oder Wiederverwenden von Player IDs auf der Startseite.
player idplayer nameifpaIdclaimedBycountrycitystateZur Priorisierung haeufig geladener Spieler in der UI.
player idplayer nameloadCountlastLoadedAtServerseitiger Overview-Cache vor Netzwerkanfragen.
komplette LiveTournamentOverviewcachedAtexpiresAtFallback bei 429 oder wenn kein exakter Cache-Hit verfuegbar ist.
letzte erfolgreiche Overview je PlayercachedAtexpiresAtWiederverwendung einzelner Match Play Responses für Tournament-Details.
raw API responsecachedAtexpiresAtSobald eine completed Overview erfolgreich geladen wurde und via CompletedTournamentContextSync persistiert wird.
playerIdviewPlayerIdtournamentIdtournamentNameplayerNamesnapshotStatussnapshotUpdatedAtupdatedAtsnapshot (komprimierte LiveTournamentOverview)Wenn sparse Match-Zeilen später on demand angereichert wurden und für spätere Completed- oder unveränderte In-Progress-Loads wiederverwendet werden sollen.
tournamentIdgameIdtournamentStatustournamentUpdatedAtmatch (hydrated LiveTournamentMatch)Welche Daten aus dem Rohmaterial extrahiert werden und wie daraus die sichtbare Darstellung entsteht.
Typ, Status, Players, Arenas, Banks, Location, Event, Series und Timestamp-Grunddaten werden zentral aus `/tournaments/{tournamentId}` gelesen.
Round- und Game-Shells kommen zunächst direkt aus genau einem watched-player `/games`. Weitere Stats kommen aus `/summary/matches`, `/summary/player-arenas` und `/summary/arenas`. Falls einzelne Matchdetails später hydriert werden, bleiben sie storage-backed und timestamp-/status-sicher wiederverwendbar.
`matchplayCompletedTournamentContext` enthält den komprimierten Snapshot der kompletten Overview und ist der schnellste Wiedereinstieg für completed. `matchplayCompletedTournamentStandings` liefert Platzierung und Standings-Dialog direkt aus localStorage. `matchplayStoredRoundMatchDetails` hält zusätzlich einzelne hydratisierte Match-Zeilen für Wiederverwendung bereit.
Titel, Player, Type, Status und Location kommen aus Overview/Bundle-Detail.
`matches` stammen aus dem completed Bundle. Für Multiplayer müssen Round- und Game-Shells bereits aus dem einen watched-player `/games` renderbar sein; zusätzliche Detailhydration bleibt nur lazy, row-scoped und storage-backed erlaubt. In der Completed-Match-History ist die aktuelle Sortierung ein geschütztes Verhalten, und generische API-Labels wie `Round N` dürfen nur auf die sichtbare History-Rundennummer umgebogen werden, ohne die bestehende Reihenfolge zu verändern.
`bestGameOverview` oder formatspezifische Match-Builds werden direkt aus den Bundle-Datasets erzeugt.
Wenn ein Snapshot vorhanden und gültig ist, kann `/storage/view` dieselbe Overview direkt ohne neues API-Build rendern.
Completed Direktlade-Test
Diese Eingabe soll den echten Completed-Flow reproduzierbar machen. Der Hauptlink lädt das Turnier regulär über die App, der zweite Link springt direkt in die Snapshot-Ansicht, falls bereits ein gespeicherter Context existiert.
Diese Reihenfolge bildet die echten `flowSteps` aus `live-tournament.ts` auf hoher Ebene ab.
memory-or-kvFrische Completed-Overview direkt aus Cache verwenden, wenn vorhanden.
exact-cacheCompleted-Overview darf auch stale wiederverwendet werden.
query-paramsplayerId, viewPlayerId und tournamentId aus Query lesen.
matchplay:/tournaments?played={playerId}/tournamentsGrundlage für Auswahl und Status des Turniers.
matchplay:/tournaments/{tournamentId}/tournaments/{tournamentId}Basisdetail laden, um Typ und Spielerbezug zu bestimmen.
players+standingsMatch Play ID auf Tournament Player mappen.
completed-tournament-bundleVerlässliches Gesamtpaket für completed laden: detail, rounds sowie nur noch formatabhängig games, cards und standings.
completed-bundleMatches nur dann initial bauen, wenn die UI sie sofort braucht; ausgeblendete History kann allgemein lazy nachgeladen werden.
disabled-until-verified-endpointKeine breite per-game Detailflut: initial nur die minimalen Shells bauen, spätere Detailhydration bleibt lazy, row-scoped und storage-backed.
completed-flowFinale Overview erzeugen und für Storage/Klickpfade vorbereiten.
Was an diesem Flow bewusst so ist und wo wir bei Änderungen aufpassen müssen.
Diese Formate teilen sich denselben dokumentierten Pfad oder dieselbe Referenzlogik. Die repo-lokalen Skills sind der erste Pflegeort, der Quellcode die technische Umsetzung.
src/lib/matchplay/live-tournament.tssrc/lib/matchplay/tournament-details.tssrc/lib/stored-tournament-context.tssrc/components/completed-tournament-context-sync.tsxsrc/components/stored-tournament-view.tsx