ChatGPT-Liste · Abgleich mit Build 78
Stand 16.10.2026. Geprüft sind die App-Punkte aus ChatGPTs Übergabe (Abschnitte 6 bis 9 und 13) gegen Hedis Build 78, der auf TestFlight ist, und gegen unseren Zweig. Durchgestrichen ist, was Build 78 schon kann; jede dieser Aussagen hat ein zweiter Prüfer gezielt anzuzweifeln versucht, 14 von 41 hat er zurückgestuft. Mails, Website und Marketing (Abschnitte 10 bis 12) sind hier nicht dabei.
4 offen · 32 teilweise · 30 liegt in unserem Paket · 19 nur am Gerät oder Server prüfbar · 17 Hinweis, kein Auftrag · 28 erledigt in Build 78
6 · Einheitliche Gestaltung 1 von 17 erledigt
- 9teilweiseEigene Maskottchen-Avatare statt bloßer BuchstabenFehlt: Weitere Buchstabenkreise in beiden Ständen: player_selection_page.dart:712 (Spieler ohne avatarKey/Foto), freunde_finden_page.dart:893 (Telefonkontakte, da vertretbar). PsAvatar nimmt einen Blob schon dann, wenn name übergeben wird. Der Buchstabe kommt nur, wenn der Aufrufer allein initialsFrom überZweitprüfung: ps_avatar.dart:299-304 (78, im Zweig unverändert); der Zweig ersetzt den Buchstabenkreis in match_progress_page durch PsAvatar
- 11teilweiseOhne Split nur Zusagen, keine Zahlungszusage, kein „Zusagen und zahlen“Fehlt: Kern erfüllt (bei organizerPaysAll kein Betrag, kein Zusagen & zahlen). Es fehlt: Knopf heißt 'Annehmen' statt 'Zusagen' (Hedi hat in V78 bewusst 'Annehmen' gewählt, Widerspruch zu klären); Buchungsseite zeigt dem Mitspieler ohne Split 'Dein Anteil 0,00 €'; Stornoseite spricht ohne Split von 'dein Anteil'. Älterer Server ohne organizerPaysAll/paymentMode fällt weiter in den Zweig 'Zusagen & zahlen' (v3_copy.dart:734). Unser Zweig ändert Einladungskarte und Stornotexte, die Buchungsseite bleibt auch dort bei 'Annehmen'.Gegenprüfung: c6a9b0a7 invitations_page.dart:312-345 Knopf NotificationsCopy.annehmen = 'Annehmen'; split_v54_widgets.dart:536 Mitspieler-Geldkarte 'Dein Anteil' 0,00 €, :743 splitV58AcceptCta = 'Annehmen' (strings.dart:7632); cancel_booking_page.dart:441/448/651 'Gebühr (x %) · dein Anteil' / 'Erstattung · dein Anteil' ohne Ausnahme für ORGANIZER_PAYS_ALL (strings.dart:3715-3717)
- 14teilweiseStorniert, Erstattung läuft und Erstattet getrennt anzeigenFehlt: In 78 stehen die Zustände nur pro Zeile (Titel 'Storniert', darunter 'Erstattung läuft · x €' / 'Erstattet · x €'). Die beauftragte Trennung in eigene Kategorien (Feedback 13.10.: separate cancelled and refunded categories) fehlt: eine erstattete stornierte Buchung steht weiter unter 'Storniert', kein Filter 'Erstattet'. Eine eigene Gruppe 'Erstattung läuft' hat auch unser Zweig nicht.Gegenprüfung: c6a9b0a7 my_bookings_page.dart:380-425 nur Gruppen Kommend/Vergangen/Storniert; booking_list_filter.dart:21 enum BookingArt ohne erstattet; _PastRow zeigt 'Storniert' plus eigene Zeile erstattungListenText (booking_refund_text.dart:104, Serverdaten viewerRefund); 9a879999 ergänzt BookingArt.erstattet, eigene Gruppe und Filter
- 16teilweiseOffene Reservierung auf Home klein, farblich abgesetzt, Serverrestzeit, X mit Rückfrage und BehaltenZweitprüfung: 78 home_halt_kachel.dart:36/52 (expiresAt Serverfrist), warte_kachel_kreuz.dart:129-151 (Rückfrage, Behalten), d1897cf8 in 78; 9a879999 compact_reservation_card.dart nirgends importiert (git grep nur in l10n_en json)
- 1liegt in unserem PaketKalender-Icons überall gleich, auch die Farbe, Vorbild Wann-Bereichdesign_system/icons/calendar_icon.dart neu; v3_icons.dart:701 leitet calendar und booking dorthin um; booking_svg_icons.dart erzwingt Markenfarbe
- 2liegt in unserem PaketGemeinsame Überschrift für Hey Max, Wann, Benutzername, Dauerbuchung, Deine Buchungen; lange Namen skalierenps_screen_heading_v2.dart (24 px, FittedBox scaleDown), über ViewHeaderV2 an 115 Stellen; Gruß home_v2_page.dart:1158, Profil profile_parts.dart:100
- 3liegt in unserem PaketKleine Zeilen wie Rookie aktiv und Freunde finden optisch einheitlichFehlt: Rookie aktiv und Freunde finden teilen in 78 zwar dieselbe Kachel, aber der ausgearbeitete Wunsch (gemeinsame Überschrift, lange Namen skalieren) ist dort nicht drin: Titel 17 px statt der gemeinsamen 24-px-Überschrift, lange Partner-Titel (Rookie · TRIWO Technopark) brechen um statt zu skalieren. Erst unser Zweig 9a879999 hat das.Gegenprüfung: c6a9b0a7 home_v2_page.dart:3642-3700 (_HomeShortcutRow Titel fest 17 px, ohne maxLines/Skalierung); 9a879999 und ChatGPT-Stand b6cf9933 setzen Titel auf AppTextV2.pageTitle 24 px einzeilig (typography.dart:96 "Owner 09.10.2026: one primary heading style")
- 4liegt in unserem PaketSchrittleiste Wann, Court, Zahlung über volle Breite, längere Linien, gleiche Größen und Achsenschritt_leiste.dart: Linien als Expanded, Punkte 30 px, Einzug auf der Achse der Fragenkarten
- 5liegt in unserem PaketGrüne Haken oben und unten gleich großschritt_leiste.dart und frage_karte.dart: beide 30-px-Kreis, Haken 16, neongrün
- 6liegt in unserem PaketKleines i neben sinnvollen Titeln mit kurzer echter HilfeScreenHelpButton in ps_screen_heading_v2.dart, Texte in core/help/screen_help.dart (u. a. /booking, /dauerbuchung, /freunde-finden)
- 8liegt in unserem Paket„Hat zugesagt“ rechtsbündig direkt vor dem Entfernen-Xsplit_guarantee_widgets.dart _SplitRow: Statuszeile mit FlexFit.tight und textAlign end
- 12liegt in unserem PaketBei Storno ohne Split nicht von „deinem Anteil“ sprechencancel_booking_page.dart: bei prepaid „Erstattung“, „Kosten der Absage“, „Du sagst nur deine Teilnahme ab“
- 7Hinweis, kein AuftragKeine unnötigen Info-Knöpfe auf fremden ProfilenEingehalten: player_profile_page.dart:132 und :145 mit showHelp: false
- 13Hinweis, kein AuftragBei echter geteilter Zahlung finanziell zutreffende Hinweise behaltenEingehalten: Split-Zweig in cancel_booking_page.dart unverändert, cancelPreviewOwnFeeLabel bleibt
- 15Hinweis, kein AuftragErstattung nicht erfinden, laufende Buchung bei Teilrückzahlung nicht als storniert führenEingehalten: 78 „Erstatten ist nicht Absagen“ (booking_refund_text.dart); Paket setzt „erstattet“ nur im Storno-Zweig (booking_list_filter.dart:106)
- 17Hinweis, kein AuftragReservierungsdauer nicht pauschal 15 Minuten, Serverfrist ist maßgeblichEingehalten: 78 rechnet mit hold.expiresAt (home_halt_kachel.dart); Paket setzt in lib keine feste Frist
- 10erledigt in Build 78Zahlungsbeleg als Kassenzettel mit eigenem Icon, Beleg öffnen zum Stripe-Beleg, nur echte BeträgeGegenprüfung: c6a9b0a7 receipts_sheet.dart (ReceiptPaper Kassenzettel, ReceiptIcon, Betrag aus amountCents, Beleg öffnen nur bei hasProviderReceipt = receiptUrl https, sonst receiptNoProvider); receipt_icon.dart; aufgerufen in booking_detail_page.dart:848 und match_progress_page.dart:936; Commits 6b37795c, c0d165e4 sind Vorfahren von c6a9b0a7
6 · Startseite und Dauerbuchung 8 von 13 erledigt
- 26teilweiseRookie grün, Advanced lila, PRO mit stärkerem GelbkontrastFehlt: Nur die Grundfarben Rookie grün, Advanced lila, PRO gold stehen zentral. Der stärkere Gelbkontrast für PRO fehlt: Build 78 lässt das Gold ausdrücklich wie es war, ebenso die Arbeitskopie und unser Zweig. Die Level-Kachel der Startseite (Kontext der Anforderung, PRO-Variante mit schwarzem Kreis) hat in 78 keine stufenabhängige Fassung, sie ist für alle gleich dunkel mit Lime-Pfeil.Gegenprüfung: c6a9b0a7 stufen_farben.dart:42-45 („GOLD BLEIBT, WIE ES WAR“), :53/:58/:64 (rookieGruen, advancedLila, proGold F5D34C unverändert); home_v2_page.dart:2558ff _Levelk mit fester Fläche 0xFF120527 (:2593) für jede Stufe
- 18nur am Gerät oder Server prüfbarBeide Eröffnungen in einer Kachel mit bewegtem Court, nur bestätigte Daten, keine erfundene UhrzeitFehlt: Design-Code ist vollständig in 78. Nicht im Code prüfbar: ob die Serverdaten für Trier und Bruchsal bestätigt sind. Außerdem zählt der Countdown Std/Min genau bis opensAt und blendet die Kachel dort aus; liegt die erste buchbare Zeile bei 0 Uhr (Beispiel im Code: 'Fr, 16. Oktober · 0 Uhr'), wirkt das wieder wie eine 0-Uhr-Eröffnung. Sportkorrektheit des Videos nur im Video prüfbar.Gegenprüfung: c6a9b0a7 home_grand_openings_card.dart (eine Kachel, Schleife über alle aktiven grandOpening, Datum ohne Uhrzeit, Video kGrandOpeningClip grand-opening-v3.mp4, Poster zeigt Court von oben), identisch mit Paket 30.09.; location.dart:133-175 opensAt = Beginn der ersten buchbaren Zeile vom Server; eingebunden home_v2_page.dart:849
- 19nur am Gerät oder Server prüfbarHintergrundvideo spielt klar in Echtzeit, Ballwege padelrichtigInhalt der Videodateien, nur beim Ansehen am Gerät prüfbar
- 28Hinweis, kein AuftragFeedback gezielt auf V74 legen, nichts zurücksetzenEingehalten: home_v2_page.dart nur gezielt geändert (147 hinzu, 67 weg), keine Rücknahme von V74-Logik gefunden
- 30Hinweis, kein AuftragGroße 3D-Court-Animation erst nach dem BasisumfangEingehalten: keine 3D-Animation in lib; dauerbuchung_motion.dart im Paket ist 2D und nicht eingebunden
- 20erledigt in Build 78Court-buchen-Kachel links nicht transparentGegenprüfung: c6a9b0a7 court_buchen_video.dart:303-345 _Schleier: Verlauf Stops 0 bis .38 volle Markenfarbe, erst rechts durchsichtig; home_v2_page.dart:2390-2410 _CourtBuchenTile Fläche brand + CourtBuchenVideo mit Schleier (Vorgabe true); identisch mit Paket 30.09.
- 21erledigt in Build 78PRO-Pokal darf dezent schwebenGegenprüfung: c6a9b0a7 home_visible_motion.dart:59-140 HomeFloatingTrophy (4 px auf und ab, 3 s, steht bei reduzierter Bewegung und im Hintergrund); verwendet home_v2_page.dart:3329 im _ProUpgradeCard, sichtbar für no_membership/rookie/advanced (home_v2_page.dart:937)
- 22erledigt in Build 78Dauerbuchungs-Kachel ohne störende KonturGegenprüfung: c6a9b0a7 home_v2_page.dart:2924-3160 _DauerbuchungKachel: Container nur color brand, kein Border, CourtBuchenVideo schleier:false, kein Verlauf (Timur 03.10./05.10.)
- 23erledigt in Build 78Nächstes Match ohne unerwünschten VerlaufGegenprüfung: c6a9b0a7 upcoming_booking_card.dart:181 ticketFill + _ticket :240-250 feste Fläche, kein Gradient; Startseite nutzt Variante home (home_v2_page.dart:807)
- 24erledigt in Build 78Level-Kachel besser füllen, Pfeil richtig einreihenGegenprüfung: c6a9b0a7 home_v2_page.dart:2558-2640 _Levelk: Ring 76/62, Pfeilscheibe right 24 bottom 22 auf der Achse der anderen Kacheln, bei Einstufung nackter Pfeil auf derselben Achse (Timur 03.10.); _Levelk identisch mit Paket 30.09. (bis auf Timurs Pfeilkorrektur), mit ChatGPT-Stand b6cf9933 und mit unserem Designpaket
- 25erledigt in Build 78PRO-Variante mit schwarzem Kreis rechts und mehr Illustration linksGegenprüfung: c6a9b0a7 home_v2_page.dart:3276-3380 _ProUpgradeCard: schwarzer Kreis 48 rechts (right 24, bottom 22) mit Goldpfeil, Pokal 128/116 und Schläger 90/74 links; deckungsgleich mit Variante B FINAL (pro-vergleich.html) und Paket 30.09.
- 27erledigt in Build 78Einstufungsring mit sechs Segmenten und Abständen, Start „1 von 6“Gegenprüfung: c6a9b0a7 home_placement_ring.dart:14-15 (total = required+1, Start bei 1), :71 (Bogen 0,75 je Segment = 25 % Lücke), home_anpassen_copy.dart:84 „von $total“; apps/api/src/ranking/engine/constants.ts:483 placementMatches: 5 ergibt 6 Segmente; eingebunden in home_v2_page.dart _LvlHomeCard (HomePlacementRing). Datei identisch mit der ChatGPT-Arbeitskopie app74
- 29erledigt in Build 78Jeden Dauerbuchungsschritt bestätigen, kein Auto-Weiter, zurück genau einen SchrittGegenprüfung: c6a9b0a7 dauerbuchung_flow_page.dart:85-99 (_bestaetigt, Kachelwahl schließt die Frage nicht), :405-441 (_erledigt nur wenn bestätigt, _bestaetigen); serie_termin_herkunft.dart (TerminHerkunft, Termin/Serie gehen per pop genau eine Seite zurück), Commit d1897cf8 Punkte 1 und 3
6 · Profil, Standorte, Member Pass 0 von 14 erledigt
- 41offenMember Pass: Illustration ohne Schläger und ohne Rookie-Schriftzug, mehr FarbnuancenFehlt: Ein Rookie-Schriftzug steckt nicht im Kartenbild selbst, offen sind Schläger und Farbnuancen.Zweitprüfung: pass_karte.dart:57-60 in beiden Ständen; Kommentar :52 „Rookie Lime mit Schläger“; karte-rookie.png angesehen: Schläger rechts; der Zweig ändert nur die Schüttel-SVGs
- 31liegt in unserem PaketEinmaliger Bio-Hinweis mit vier Teilen, Bearbeiten, Schließen-X, Newsletter-Stil, Schläger statt Herzprofile_bio_hint.dart (NewsletterSzene, schlaeger-3d.webp), profile_bio_hint_store.dart, Aufruf profile_page.dart:151
- 32liegt in unserem PaketZum Match einladen öffnet Buchung mit Hinweis „vorgemerkt“, keine falsche Versandzusage78: vorbelegteCrew (app_router.dart:725); Paket: player_added_notice.dart „… ist vorgemerkt“, Aufruf in buchen_flow_page.dart
- 33liegt in unserem PaketProfil-Spielstats mit Level, Win-Rate, Siegesserie; keine doppelte Levelanzeige, kein Division-Chipplayer_progress_view.dart PlayingStatsPanel, profile_page.dart ohne Level-Plakette und ratedLine. Achtung: lädt Ranking ohne rankingAvailability (player_progress_view.dart:183)
- 34liegt in unserem PaketKein Sammellevel-Container im Profil, Levelansicht im AI-Trainer, keine erfundene DivisionProfil ohne Levelkarte (showLevelCard false); Levelkarte nur in ki/video_trainer_page.dart:78
- 35liegt in unserem PaketGleiche Levelringfarbe in Profil und AI-Trainer über einen gemeinsamen Bausteinshared/level_color.dart skillLevelColor in Profil, Paket-AI-Trainer und Ergebnis; Hedis AI-Trainer je Match nutzt ihn nicht
- 36liegt in unserem PaketVier eigene Heimclub-Bilder Trier, Bruchsal, Walldorf, Kaiserslautern im filmischen Stillocations/location_images.dart; Walldorf nutzt das bisherige Hallenbild, das auch Rückfall ist; walldorf.jpg liegt ungenutzt
- 37liegt in unserem PaketStandortseiten wie Heimclub-Karten mit denselben Fotoslocations_page.dart und HeimclubCard (profile_parts.dart) nutzen beide LocationImages
- 38liegt in unserem PaketFunktionslosen Courts-Knopf entfernenlocations_page.dart: onCourts entfernt
- 39liegt in unserem PaketRoute unten rechts, Heimclub danebenlocations_page.dart: Route-Knopf und „Als Heimclub“ nebeneinander
- 40liegt in unserem PaketTrier und Bruchsal buchbar, Walldorf und Kaiserslautern nur Coming soonBuchbarkeit vom Server in 78 (35e20162); Paket zeigt Coming-soon-Karten, fest im Code (locations_page.dart:35)
- 42liegt in unserem PaketKleines Schüttel-Icon im Pass in sauberem Containerpass_abschnitte.dart: Karte pass-shake-card mit 48-px-Symbol
- 43liegt in unserem PaketSchüttel-Pop-up ruhig mit kleinem Kopf, Schließen, QR-Ruhezone; Logik unverändertpass_quick_overlay.dart: Kopfzeile mit Symbol und Schließen; QR-, Zutritts- und Offline-Logik nicht geändert
- 44nur am Gerät oder Server prüfbarReale Schüttelempfindlichkeit korrektSensorverhalten nur am Gerät; 78 nutzt 1,9 g und zwei Umkehrpunkte (shake_detector.dart)
6 · Mitteilungen 1 von 4 erledigt
- 45liegt in unserem PaketKopf mit Zahnrad und Titel in einer Zeilenotifications_page.dart:904 inlineTrailing: true
- 46liegt in unserem PaketVerständliche Titel ohne Buchungsreferenz, Zeit an der Zeile, klare GruppierungPaket trennt PS-Referenz vom Titel und setzt die Zeit darunter; Zeitgruppen schon in 78 (notifications_page.dart:116)
- 48nur am Gerät oder Server prüfbarPrivates Zurückfolgen, Knopf nach Neuladen, falsche Ziele bei Storno echt testenNur mit zwei echten Konten am Gerät prüfbar; kein gezielter Fix-Commit gefunden
- 47erledigt in Build 78Nur eine Einladung statt Duplikat, Aktionen bis zur Reaktion sichtbarGegenprüfung: c6a9b0a7 notifications_page.dart:917-927 (recurring.invitation-Zeile wird nicht gezeichnet, solange die Karte steht), :593-615 (_aufstellungsStand aus meta.lineupState/lineupActions, Lesen ändert nichts); Server in-app-notifications.service.ts:137-166; Commits 30f8bbd6, 35e20162
7 · Ablauf und Design 1 von 10 erledigt
- 52teilweiseIm Spiel Übersicht mit Timer und Match beenden, Punktezählen nur optionalFehlt: Timer und Match beenden gibt es nur auf dem Zählschirm selbst. Eine Übersicht während des Spiels, in der das Punktezählen nur Zusatzoption ist, fehlt: der einzige Weg im Spiel ist „Weiter zum Match“ → „Match starten“ → Zähler. Ohne Zählen geht es nur nach Slotende über die schnelle Satzeingabe. Früher beenden ohne Zähler geht nicht. Unser Zweig ändert daran nichts Entscheidendes.Gegenprüfung: c6a9b0a7 live_match_page.dart:42-58 (im Spiel gibt es nur den Zählschirm: Restzeit, +/− je Seite, Match beenden, erreichbar erst über „Match starten“); match_spiel_knoepfe.dart:139-166 (spielKnopfFuer: „Ergebnis eintragen“ ohne Zähler erst nach Slotende und nur mit Ranked Matches)
- 53teilweiseVor dem Ende Rückfrage „Match wirklich beenden?“Fehlt: Build 78 fragt „Match beenden?“, nicht „Match wirklich beenden?“ (der Wortlaut steht erst in unserem Zweig). Außerdem entfällt die Rückfrage ganz, wenn das Match entschieden ist und kein weiteres Match mehr starten kann (live_match_page.dart:672), auch in unserem Zweig.Gegenprüfung: c6a9b0a7 strings.dart:7192 liveEndTitle = 'Match beenden?'; live_match_page.dart:667-705 (_beenden, Rückfrage nur bei `if (!s.score.isOver || weiteres)`, :672); unser Zweig 9a879999 strings.dart:7188 'Match wirklich beenden?'
- 54teilweiseOrganisator beendet, schnelles Ergebnis, kein Knopf „Zweites Match starten“Fehlt: Fundstellenliste unvollständig: außerdem live_match_page.dart:945 (Startknopf ab Match 2 heißt „Zweites Match starten“) und :687 (Beenden-Dialog nennt den Knopf). In 78 erscheint er laut V75 nie nach „Match beenden“ (live_result_page.dart:991), nur nach Spielende über die Punkte.Zweitprüfung: 78 und 9a879999 gleich: live_match_page.dart:1052, live_result_page.dart:997 (weiteresMatchCta = „Zweites Match starten“, strings.dart:7756); der Zweig ändert die Live-Seiten nicht
- 55teilweiseErgebnisbestätigung der Gegenseite als Pop-up, im Doppel reicht eine PersonFehlt: Pop-up result_confirmation_dialog.dart nur über Vorschau-Route erreichbar, nicht im echten AblaufServer: eine Person der Gegenseite reicht (e8a965ea); App zeigt eigene Seite match_result_pending_page.dart
- 57teilweiseNach Wertung Reiter Ergebnis, Weiter zu Dein Level mit Animation, dann Home oder VideoFehlt: Zweistufige Folge mit Animation: match_level_stage.dart im Paket, aber nirgends eingebunden78: Ergebnis und Leveländerung auf einer Seite (match_result_page.dart), Weiter zum Video am Ende (962c3e9a)
- 58teilweiseFünf Einstufungsspiele mit Moment „Du bist eingestuft“, Aufstieg als zweite VarianteFehlt: „Du bist eingestuft“ nur in unverbundenem match_level_stage.dart und ungenutzter PlacementCompletedCard78: fünf Einstufungsspiele, Ring 1 von 6, Einstufungs-Push (f44a3bd1)
- 50liegt in unserem PaketRanked oder Freundschaft bei Buchung vorbelegen, speichern, später im gleichen Design ändern78 speichert die Wahl (5ef2650b); Paket nutzt denselben Schalter PsToggleRow in Buchung und Matchseite
- 51liegt in unserem PaketMatchstatus und Dein Match auf einer Seitematch_progress_page.dart: bestätigte, bezahlte Buchung zeigt direkt LiveMatchPage
- 56Hinweis, kein AuftragTestdemo simuliert Bestätigung sichtbar, nie Serverregel umgehenFehlt: Es wird keine Serverregel umgangen, im Store-Build simuliert nichts. Die Route ist aber nicht release-gesperrt, siehe 56.1.Zweitprüfung: OpponentConfirmationPreviewSource nur in tool/phone_level_review.dart:19 umgesetzt; lib hat nur die Schnittstelle (match_result.dart:831) und die Vorschauseite (result_confirmation_dialog.dart:108)
- 49erledigt in Build 78Partner und Teams vor dem Match wählenGegenprüfung: c6a9b0a7 match_spiel_knoepfe.dart:20-27 und :182-187 (teamsKnopfFuer: Teams jederzeit nach Zahlung bis Slotende, auch vor Beginn), split_organizer_view.dart:1393-1396 (onTeams), booking_detail_page.dart:470 (derselbe Block auch bei FIX); vor dem Live-Zähler bei vier Spielern erst Teams (weiter=live), Commits 49e9d00e, 1f78bda5. Rückfall „Wer war dein Partner?“ nach Spielende nur, wenn keine Teams gesetzt wurden (match_result_entry_page.dart:1214)
7 · V74-Spezifikation 10 von 14 erledigt
- 66teilweiseLevel, Rangliste und Saison zunächst nur für TestkontenFehlt: Eigenes Profil zeigt jedem Konto SPIEL-STATS mit LEVEL-Kachel, Plakette 0 und 'Deine Stats starten mit dem ersten Ranked Match' ohne Freigabeprüfung. Fremde Profile zeigen Level oder 'Einstufung läuft' der Testkonten auch Nicht-Testkonten, weil der Server das Level ohne Freigabe des Betrachters mitschickt.Gegenprüfung: Sperre greift: ranking_availability.dart, ranking-gate.ts (test_users). Ohne Sperre: profile_page.dart:612 SpielStatsPreview und Plakette '0' (strings.dart:4151); fremde Profile: follow.service.ts:586 → player_profile_page.dart:891
- 72nur am Gerät oder Server prüfbarÄltere Wertungsregeln (nur Ranked, echte Konten, Einstufung, Saisons) gegen Server prüfenFormel liegt auf dem Server, nur mit Hedi klärbar; placementMatches 5 in engine/constants.ts:483
- 65Hinweis, kein AuftragRanked ohne Tageslimit, altes Drei-Matches-Limit nicht wieder einbauenEingehalten: engine/constants.ts:718 dailyRatedMax 1 000 000 in WL-PL-3.2 (f44a3bd1); Paket ändert nichts
- 71Hinweis, kein AuftragHedis Vorarbeit (Kontolöschung, Benutzername, Codekanal, Fehlerberichte, Tür, Zahlung) nicht neu erfindenEingehalten: Paket berührt diese Logik nicht, nur Gestaltung und im Store-Build inaktive Prototyp-Weichen
- 59erledigt in Build 78Server hält Spielstand, Mitspieler sehen live, Beenden gilt für alleGegenprüfung: c6a9b0a7 Commits f1b7ac18 (MatchLive am Server, PUT/POST /matches/:id/live), 565f78a7 (Mitspieler immer Zuschaueransicht, Kachel endet bei allen), 49e9d00e (Live-Karte endet bei allen); live_match_page.dart:42-62; docs/00_project_control/CURRENT_DELIVERY_CHECKPOINT.md:14 MATCH_LIVE_ENABLED=true seit 14.10. in Produktion
- 60erledigt in Build 78Startregeln Golden Point und Match-Tiebreak bis 10Gegenprüfung: c6a9b0a7 core/models/match_format.dart MatchFormat.standard (goldenPoint: true, thirdSet: matchTiebreak); live_match_page.dart:99 _format = MatchFormat.standard; padel_score.dart:51 Match-Tiebreak bis 10; Server apps/api/src/match-flow/padel-score.ts:53-56 DEFAULT_MATCH_FORMAT
- 61erledigt in Build 78Plus und Minus beidseitig farbig, Satztabelle je Satz, eigenes Team linksGegenprüfung: c6a9b0a7 live_match_page.dart:1254ff _PunktKnopf (beide Seiten p.brand gefüllt), :1319ff _MinusKnopf (beide Seiten brand getönt), :421-430 _teamName (A = eigenes Team, links), :1027 LiveSatzTabelle je Satz eine Zeile; Commits 86a38fca, f1598bd3, 6ed53e75 (Ergebnistabellen eigenes Team links)
- 62erledigt in Build 78Schnelle Satzeingabe ohne Live-Zählung, 7:6 korrektGegenprüfung: c6a9b0a7 match_result_entry_page.dart:940 und :955ff _SchnellFormular (Satzeingabe ohne Zähler, 7:6 als ganzer Satz erkannt); set_score_validation.dart:64 (6:0 bis 6:4, 7:5, 7:6); live_result_page.dart:54-55 und :575 („Ergebnis anpassen“ setzt Sätze, 7:6 bleibt 7:6); Commits d20b17bf, 7085ab06. Erreichbar wie in Hedis V74-Vorgabe nur mit Ranked Matches (zunächst Testkonten)
- 63erledigt in Build 78Neutral: Spielergebnis hochgeladen, Passt, Stimmt nicht, dann nur Wer hat gewonnenGegenprüfung: match_result_pending_page.dart: hochgeladenTitel, Passt/Stimmt nicht, _WerHatGewonnenSheet; ranking_v74_copy.dart:197-208; Push neutral in apps/api templates.ts:5158. Dazu ein freiwilliger Spielstand, so steht es in Hedis Folgerunde
- 64erledigt in Build 78Gegenseite bestätigt, nach 24 Stunden automatisch, nur Sieger strittigGegenprüfung: apps/api dto.ts:52 CONFIRM_WINDOW_HOURS=24, match-result-rules.ts:727, match-result.service.ts autoConfirmDue (ein Spieler der Gegenseite reicht, gleicher Sieger = CONFIRMED). e8a965ea steckt im Live-Server ae0b50ff7
- 67erledigt in Build 78Teams nach Zahlung, Weiter zum Match ab Spielbeginn, Ergebnis später eintragenGegenprüfung: match_spiel_knoepfe.dart:145 spielKnopfFuer (gesperrt vor Beginn, nach Slotende Ergebnis eintragen), teamsKnopfFuer bis Slotende; match_ablauf_abschnitt.dart:36 nur bestätigte Buchung; Live-Start erst ab Beginn (3396796e). Ergebnis eintragen nur mit Ranking-Freigabe
- 68erledigt in Build 78Buchungswahl bleibt erhalten, belegte Uhrzeit erzeugt HinweisGegenprüfung: buchen_flow_page.dart:442 _zeitPruefen, :1315 Hinweis zeitNichtMehrFrei (buchen_copy.dart:211), Dauer wird nicht mehr überschrieben; dauerbuchung_flow_view_model.dart:386 uhrzeitWeg mit Hinweis
- 69erledigt in Build 78Nur Trier und Bruchsal in der Buchung auswählbarGegenprüfung: apps/api locations.service.ts:86 standortJetztBuchbar + Filter nurBuchbar (35e20162), Buchung und Dauerbuchung lesen die gefilterte Liste (8116dabc). Hängt an Daten: Walldorf/KL erscheinen automatisch ab ihrem Verkaufsstart (laut Doku 15.12.2026)
- 70erledigt in Build 78Zwei untere Knöpfe mit Abstand, Serien mit Bestätigen und genau einem Schritt zurückGegenprüfung: ps_state_scene_v2.dart: 10 Abstand vor dem zweiten Knopf (bfcd8bbc); dauerbuchung_flow_page.dart:85-99 _bestaetigt mit Knopf 'bestätigen'; serie_termin_herkunft.dart: genau eine Seite zurück (d1897cf8); Prüfen-Seite geht per pop zurück
7 · Sammellevel vs. Skill-Level 0 von 4 erledigt
- 74teilweiseRing zeigt Fortschritt innerhalb der Levelstufe, nicht über 1 bis 100Fehlt: Zusätzlich offen: die Seite „Dein Level“ (level_detail_page.dart:325 anteil: me.levelFraction = Server-ringFraction). Auf Home zählt collecting nur mit CollectingLevelSource, und das gibt es nur in tool/. Ob der Server ringFraction als Level durch 100 schickt, steht nicht im Code, nur der Rückfall lZweitprüfung: 9a879999 level_color.dart:14 skillLevelProgress in player_progress_view, level_delta_card:339, match_level_stage:108, profile_parts:950; home_v2_page.dart:2799 ringFraction
- 76liegt in unserem PaketTexte GitHub-Stand, Worauf dein Level basiert, Warum dauert das, Welche Matches zählen entfernenUnser Zweig 9a879999: Kästen „Woraus dein Level entsteht“ und „Warum das so lange dauert“ raus, Hedis Test 5/5 grün.
- 73Hinweis, kein AuftragSammellevel und Skill-Level nicht mischen, kein XP-Zähler als ServerwahrheitEingehalten in Produktion: CollectingLevelSource nur in tool/phone_level_review.dart; Haken in home_v2_page.dart:2760 bleibt ohne Wirkung
- 75Hinweis, kein AuftragKeine Übungen als Levelaufgabe in V1Eingehalten: /uebungen leitet im Paket immer auf /ki um (app_router.dart), in 78 im Store-Build ebenso
8 · Gewünschte Oberfläche 3 von 16 erledigt
- 77teilweiseTitel AI-Trainer ganz links, kleines blaues Beta direkt danebenFehlt: Bestätigt: Der Titel ist Expanded, trailing landet am Zeilenende. ViewHeaderV2 hat schon titleBadge (direkt hinter dem Titel), das wäre der richtige Platz. Im Store-Build ist die Seite aus. Hedis ai_trainer_page _MatchKopf heißt „Match“, Beta rechts.Zweitprüfung: 9a879999 video_trainer_page.dart:56-63 (Beta als trailing), ps_view_header_v2.dart:108-126; app_router.dart:1117 und feature_flags.dart:94-95 (coachEnabled nur ohne Release)
- 81teilweiseDeine Match-Aufnahmen je Match gruppiert mit Datum, Club, Court, MitspielernFehlt: Paket-Datenquelle ist Platzhalter (UnavailableTrainerVideoRepository), zeigt in Produktion keine Aufnahmen78: meine_videos_page.dart je Buchung mit Ort, Court, Datum, ohne Mitspieler; Paket _MatchVideoRow mit Mitspielern
- 82teilweiseIm Match Rückblick mit padelsmart Highlights, ganzem Video und Ordner Deine ClipsFehlt: Ordner „Deine Clips“ nur im Paket ohne echte Daten; dort zudem „Padelsmart“ großgeschrieben78: Highlights und ganzes Video je Buchung (match_videos_page.dart)
- 83teilweiseWingfield kundenseitig nirgends namentlichFehlt: Liste unvollständig: strings.dart:6463-6469 (privacyNoticeBody, Datenschutzhinweis) und 6522-6526 (wingfieldConsentText „Ich möchte Wingfield nutzen…“) nennen Wingfield auch. In Einwilligung und Datenschutz muss der Empfänger rechtlich wohl genannt bleiben, das klären Anwalt und Hedi, nicht einfachZweitprüfung: 9a879999 legal_copy.dart:224 und wingfield_copy.dart umbenannt; weiter sichtbar: wingfield_video_copy.dart:52-348, ai_trainer_copy.dart:324
- 85teilweiseGroßer mobiler Player mit Vollbild und klaren TouchflächenFehlt: Den Player mit Vollbild gibt es. Die Spulleiste hat aber kein Overlay und trackHeight 3, die Trefferfläche ist also klein. Es fehlt ein großer Play-Knopf auf dem Bild, ein Tipp aufs Bild blendet nur die Steuerung ein. Die 48-px-Knöpfe im ersten Beleg stammen aus dem Paket, nicht aus Build 78.Gegenprüfung: video_player_page.dart:134 als Vollbildseite (fullscreenDialog), :361 Vollbild per RotatedBox/immersive, Standard-IconButtons :617-651, Spulleiste :573-590
- 86teilweiseTeilen bei jedem Video und Herunterladen aufs HandyFehlt: Teilen gibt es nicht bei jedem Video. Es steht nur auf der Seite 'Alle Videos' und nur, wenn Wingfield eine Datei statt HLS liefert, sonst kommt 'nur in der App abspielen'. Im AI-Trainer und im Player fehlt Teilen ganz. Sichern (gal) und Teilen (share_plus) selbst sind nativ angeschlossen.Gegenprüfung: match_videos_page.dart:590-620 Sichern/Teilen nur bei canDownload; wingfield_video_models.dart:252 und apps/api wingfield-video-state.ts:259 (HLS nicht ladbar); ai_trainer_page.dart:1503 und video_player_page.dart ohne Teilen
- 87teilweiseSchneiden wie am iPhone: Griffe bis ans Ende, Feinzoom beim Halten, Video folgtFehlt: Keine echte Datenquelle; native Methoden saveVideo und shareFile fehlen in iOS und Androidvideo_trim_timeline.dart (450 ms Halten gleich Zoom, onSeek)
- 88teilweiseQuerformat und Story oder Reel verständlich wählbarFehlt: Export läuft nur über Platzhalter und fehlende native Methoden, am Gerät ungeprüftvideo_trainer_page.dart: Auswahl Querformat oder Story / Reel
- 89teilweiseNach Speichern oder Teilen klare Rückmeldung, weitere Clips, eigene Clips getrennt von HighlightsFehlt: Clip-Ablage und Export ohne echte Quelle, native Methoden fehlenvideo_trainer_page.dart Meldungen wie „Video gespeichert.“, clip_library_page.dart
- 92teilweiseLeere, ladende, fehlerhafte, abgelaufene, gesperrte Zustände mit nächstem SchrittFehlt: Vieles ist da (Laden, Netzfehler mit Erneut, Sperre mit Mitgliedschaften auf der Videoseite, abgelaufene Adresse im Player neu laden). Aber: Meine Videos leer hat keinen nächsten Schritt (die ChatGPT-Vorlage hatte 'Court buchen'), der Video-Reiter im AI-Trainer zeigt Sperre und Leerstand ohne Weg, die Videoseite hat für READY ohne Videos keinen gestalteten Leerzustand, und der Videobereich in der Buchung bleibt beim Laden und bei Fehlern stumm. Clip-Ordner/Deine Clips mit eigenen Zuständen gibt es in 78 gar nicht.Gegenprüfung: c6a9b0a7: meine_videos_page.dart:306 Leerzustand 'meine-videos-leer' ohne Knopf; ai_trainer_page.dart:1597 Video-Reiter gesperrt nur Satz, ohne Weg zur Mitgliedschaft, :1607 leere Liste nur Satz; match_videos_page.dart:529-535 READY ohne Videos nur deaktivierter Reel-Knopf; match_video_section.dart:454 Laden/Fehler in der Buchung = SizedBox.shrink
- 80liegt in unserem PaketOben großes Level mit Ring, drei kompakte Statistikkarten, klare Unterüberschriftenvideo_trainer_page.dart: „Dein Level“, PlayingStatsPanel mit Win-Rate, Siegesserie, Matches; nur hinter Coach-Schalter
- 90liegt in unserem PaketWasserzeichen-P unten in einer Eckevideo_trainer_page.dart:982 p-weiss.svg rechts unten; nur im Paket-Player hinter Coach-Schalter, Hedis Player ohne
- 84Hinweis, kein AuftragKeine redundanten Knöpfe wie Ansehen und bearbeiten, Aufnahme melden, WiederholenEingehalten: weder 78 noch Paket zeigen sie; showRecordingReport im Paket definiert, aber ungenutzt
- 78erledigt in Build 78Home ohne eigenen AI-Trainer-EinstiegGegenprüfung: home_v2_page.dart:970 _SmartCourtRow nur bei homeExtras && coachEnabled; feature_flags.dart:94/132 beide in Release aus. AiTrainerWeiter nur im Ergebnisablauf und im Buchungsdetail, nicht auf Home
- 79erledigt in Build 78Klick auf Einstufung oder Level führt in Levelbereich, kein KreislinkGegenprüfung: home_v2_page.dart:2704 (Einstufung) und :2739 (Level) → AppRoutes.levelDetail; profile_page.dart:447 ebenso; level_detail_page.dart verlinkt nicht auf sich selbst
- 91erledigt in Build 78Lade- und Kameraillustrationen mittigGegenprüfung: c6a9b0a7: ps_state_scene_v2.dart:122 Center(child: illustration) (kamera-3d u. a. in ai_trainer_page.dart:408, match_videos_page.dart:422/444/473, meine_videos_page.dart:266/282/307), PsLoadingSceneV2 ps_state_scene_v2.dart:381 Center, video_player_page.dart:419 Center(child: _buehne), ai_trainer_page.dart _Verarbeitung Ring in zentrierter Column. Ursprung laut output/PADELSMART-AI-REVIEW-2026-09-30/ABGLEICH.txt: 'Kamera mittig, Ladeindikator mittig' = horizontal zentriert, das erfüllt 78 überall im Video-/AI-Bereich.
8 · Technische Grenzen 2 von 6 erledigt
- 98nur am Gerät oder Server prüfbarNative Speicherung, Teilen, Export, Kontingent, Clip-Ordner und echte Daten nachweisenNur am Gerät mit echten Daten; Paket-Quelle ist Platzhalter, native Methoden shareFile und saveVideo fehlen
- 93Hinweis, kein AuftragProvider-Highlights nur zeigen, wenn wirklich geliefertEingehalten: 78 zeigt nur Highlights aus der Serverliste (match_videos_page.dart)
- 96Hinweis, kein AuftragVideos aus bis Datenschutzvertrag, Einzelkauf und Apple Pay nach PayPal ausSchalter aus: VIDEO_SINGLE_PURCHASE_MODE nur off (configuration.ts:1088), APPLE_PAY_ENABLED Vorgabe aus, Videos nur Testkonten (0af8f9bb); Serverstand nicht prüfbar
- 97Hinweis, kein AuftragHightech-V2 nur mit belegten Parametern, zuerst Video-V1Eingehalten: Paket „Video-only MVP, keine erfundene Schlaganalyse“ (video_trainer_page.dart:30); 78 nutzt Wingfield-Werte nach Doku (933ae402)
- 94erledigt in Build 78V74: Video in Buchung, Videos im Profil, Vollbild, Download, Teilen, Playlist, Weiter zum Video, Kontingent, SperreGegenprüfung: c6a9b0a7: booking_detail_page.dart:815 MatchVideoSection; profile_page.dart:639 MatchVideosProfileRow -> meine_videos_page; video_player_page.dart:398 Vollbild per RotatedBox; match_videos_page.dart Sichern/Teilen je Video (bei canDownload) und Reel :519-536; live_result_page.dart:760, match_result_page.dart:290 MatchVideoEinstieg (Weiter zum Video); wingfield_video_copy.dart:161-163 'Noch X von Y Videos diesen Monat'; match_videos_page.dart _gesperrt mit Mitgliedschaften ansehen. Alles im echten Ablauf verdrahtet, serverseitig hinter video.enabled (bleibt bis DPA aus, das ist Freischaltung, kein Codefehlen).
- 95erledigt in Build 78Monatskontingent Rookie 2, Advanced 5, PRO unbegrenzt, nicht mit Clips verwechselnGegenprüfung: c6a9b0a7: apps/api/prisma/seed.ts:307 rookie videoClipsPerMonth 2, :311 advanced 5, :317 pro videoClipsUnlimited true; wingfield-video-kontingent.ts:12-27 Einheit = alle Videos einer Buchung, zählt beim ersten Öffnen, PRO zählt nie; wingfield-video-kontingent.service.ts:236-253 WingfieldVideoUnlock je (Buchung, Spieler). App sagt 'Videos', nicht 'Clips' (alte Zeile 'Video-Clips pro Monat' strings.dart:636 nur noch in ungenutzter membershipBenefitLines). Live-DB-Werte selbst nicht prüfbar, nur Seed.
9 · P0 2 von 7 erledigt
- 104offenF3: erlaubte Zustände für nachträgliche Spieler je Zahlart, Gast, Ersatz, Frist klärenFehlt: Klärung mit Hedi und Zustandsmatrix je ZahlartKeine Zustandsliste gefunden; steht nicht in FRAGEN-AN-HEDI.md
- 100teilweiseF1: nach Ablauf Hinweis oder Neu buchenZweitprüfung: 08157bef ist Vorfahre von c6a9b0a7 (pending_match_card.dart); strings.dart:1781-1786 haltBandAbgelaufen/haltVerfallen; kein „Neu buchen“ in 78 oder 9a879999
- 105teilweiseF4: Heimclub und Buchungsstandort trennen, Walldorf nicht als buchbar zeigenFehlt: Kaans Befund war genau die Kachel 'Court buchen' mit 'Heute ausgebucht · Walldorf'. Die Kachel nimmt in 78 weiter den Heimclub als Buchungsort; wer Walldorf schon als Heimclub hat (8116dabc lässt ihn bewusst stehen), sieht weiter Walldorf auf der Startseite. Heimclub und Buchungsort sind dort nicht getrennt; Hedis Bestätigung der Regel steht laut Commit ebenfalls aus.Gegenprüfung: c6a9b0a7: 35e20162/8116dabc filtern Standorte- und Heimclub-Wahl, behalten aber einen schon gewählten Heimclub Walldorf; home_view_model.dart:1207 Verfügbarkeit der Startkachel aus profile.homeLocationId, home_v2_page.dart:845 clubName = homeLocationName, :2533 'Heute ausgebucht · <Heimclub>' ohne bookableNow-Prüfung
- 101liegt in unserem PaketB1/S7: erst Einzel oder Doppel, dann freie Zeiten je Court-Typ vom ServerUnser Zweig 9a12e3d6: Frage „Einzel oder Doppel?“ vor dem Tag, nur an Standorten mit beiden Typen; Server liefert Typen schon (Trier 01–04 Doppel, 09–10 Einzel, live geprüft).
- 103nur am Gerät oder Server prüfbarF2: Einladungen wirklich zugestellt, in Mitteilungen und Buchungen sichtbar, Antwort bleibtNur mit zwei echten Konten prüfbar; 78 schreibt Mitteilungen mit Person (8ec32b92)
- 99erledigt in Build 78F1: Reservierungskarte zählt die Reservierungsfrist des ServersGegenprüfung: 54c55881 ist Vorfahre von c6a9b0a7; pending_match_card.dart:241 split.closesAt-Zweig nur ohne _awaitingGuarantee, :248-257 activeDeadlineAt mit splitHoldExpiredBand nach Ablauf, :352-358 Startseiten-Karte nimmt bei AWAITING_GUARANTEE activeDeadlineAt; match_progress.dart:804 activeDeadlineAt = guarantee.splitDeadlineAt ?? deadlineAt (Serverwerte, keine eigene TTL). Ein Knopf 'Neu buchen' nach Ablauf fehlt, ist laut Übergabe aber eigene Hedi-Frage.
- 102erledigt in Build 78B2: Bruchsal nur fünf Doppel-Courts, Stammdaten prüfen, kein Client-SonderfallAm 15.10. live am Server geprüft: GET /locations nennt Bruchsal 5 Courts, 5 Doppel, 0 Einzel; GET /availability für Bruchsal liefert Court 01 bis 05, alle DOUBLE.
9 · Weitere Fragen 0 von 7 erledigt
- 111offenOffene Plätze per Link (R1 bis R8, S1 bis S6, P1) erst vertraglich klärenFehlt: Hedis Zusage zu Vertrag, Frist, Garantie und ServerumsetzungNur Anzeige-Zustände in open_places_presentation.dart, genutzt nur in tool/
- 106teilweiseKalender für Einzel- und Dauerbuchung mit Duplikaten, Änderung, Storno, ganzer SerieFehlt: Serienexport ruft nativen shareFile auf, den iOS und Android nicht kennen; Änderung und Storno offen78: Einzeltermin in den Kalender; Paket: UID und Serien-ICS (booking_calendar.dart, booking_handoff.dart)
- 109teilweiseDauerbuchungsmail: Vorlage, Empfänger, Auslöser, Links, keine DoppeltenFehlt: Neues Design nur als EINBAU.md im Paketordner, nicht im Zweig; Empfänger und Dedup ungeklärt78 hat Mail recurring_contract_confirmed (notifications.service.ts:627)
- 110teilweiseClip-Bearbeitung, Hochformat, Download, Teilen, eigene Match-OrdnerFehlt: Echte Datenquelle, native Methoden und Kontingent mit Hedi klären und anschließenOberfläche im Paket unter features/ki
- 107liegt in unserem PaketBio-Hinweis: Speicherung, Schließen, direkte Bearbeitungprofile_bio_hint_store.dart lokal; Schließen und „Profil ergänzen“ öffnet Bearbeiten. Ob der Server speichern soll, ist Frage an Hedi
- 108liegt in unserem PaketSpieler aus Profil vormerken ohne vorzeitige echte Einladungplayer_added_notice.dart; Einladung erst mit der Buchung über vorbelegteCrew aus 78
- 112Hinweis, kein AuftragReine Dart-Anzeigen nicht als fertigen Ablauf ausgebenEingehalten: open_places_presentation.dart nur in tool/phone_open_places_review.dart eingebunden
13 · Ältere Befunde 0 von 18 erledigt
- 130offenEinzelauswahl im Onboarding ohne unnötigen Weiter-KnopfFehlt: Bewusste ältere Abnahmeregel AC-2026-07-31: Antippen wählt nur, „Weiter“ schaltet. Das widerspricht dem Wunsch und braucht eine Entscheidung, bevor gebaut wird.Zweitprüfung: 78 onboarding_flow.dart:1305-1322 (_saveFrequency/_savePlaytime), 1926/1943 onNext, 2569-2571 und 2611-2617; im Zweig unverändert
- 117teilweiseRückmeldung nach Match-EinladungFehlt: Der gemeldete Fall war 'Zum Match einladen' vom Profil (REVIEW-FEEDBACK-20261013.json: 'Profile-to-booking selected-player notice'). Dort gibt 78 keine Rückmeldung, dass der Spieler vorgemerkt ist; das liefert erst unser Paket (player_added_notice.dart, 'ist vorgemerkt'). Bei 'Ich zahle komplett' mit Eingeladenen sagt die Erfolgsseite nur 'Deinen Zugang findest du im Ticket.'Gegenprüfung: c6a9b0a7: strings.dart:7723 splitV54InviteSent nur beim Nachbesetzen eines freien Platzes (match_progress_page.dart:628); booking_success_page.dart successBodySplit 'Deine Crew bekommt die Anfrage jetzt.' nur bei geteilter Zahlung; player_profile_page.dart:475 _zumMatchEinladen schiebt nur die Buchungsstrecke ohne jede Rückmeldung
- 120teilweiseFehlende AvatareFehlt: 1f78bda5 und 459c1c6e bringen Gesichter in Live-Match und Mitteilungen, aber die Anteilsliste im Zahlungs-/Matchschirm zeigt in 78 weiter nur Anfangsbuchstaben. Genau diese Stelle ersetzt erst unser Paket (9a879999, PsAvatar mit avatarKey/photoUrl, dafür auch avatarKey im Modell ergänzt).Gegenprüfung: c6a9b0a7: match_progress_page.dart:2424-2446 _ShareRow zeichnet Buchstabenkreis (name.characters.first) statt PsAvatar, obwohl MatchPlayer.avatarPhotoUrl (match_progress.dart:242) vorhanden ist; player_selection_page.dart:705-720 ebenfalls Buchstaben-Rückfall
- 124teilweiseTür- und Supportweg vollständig definierenFehlt: Weg, wenn der Code nicht öffnet: Kontakt, Notfall, ZuständigkeitSupport „Ich stehe vor der Tür“ zeigt den Code (support_copy.dart:11), Türstatus je Halle (94fb6a77)
- 129teilweiseTelefonnummer-Schirm kurz: „Gib deine Handynummer zur Verifizierung ein“, keine AbsätzeFehlt: Der Absatz steht mit Absicht für App Review 5.1.1(v), Entscheidung 28.09. (Kommentar strings.dart:1420 ff.). Ersatzlos streichen ist ein Store-Risiko, also kürzen statt entfernen und mit Hedi klären. Der gewünschte Satz „Gib deine Handynummer zur Verifizierung ein“ fehlt auch.Zweitprüfung: 78 v3_copy.dart:2160 „Deine Handynummer“, strings.dart:1404 phoneIntro, 1431-1437 Absatz, phone_entry_page.dart:396/407; im Zweig unverändert
- 113nur am Gerät oder Server prüfbarDirekt nach Buchung fälschlich „Anteil unbezahlt“ auf HomeDen Text gibt es in 78 nicht mehr; ob der Zustand kurz falsch steht, nur am Gerät prüfbar
- 114nur am Gerät oder Server prüfbarMail-Links öffnen die App direkt statt Web-Zwischenseite, iOS und Androidapplinks:www.padelsmart.de (Runner.entitlements), autoVerify (AndroidManifest.xml); Verhalten nur am Gerät
- 115nur am Gerät oder Server prüfbarSplit-Einladungsseite stilistisch angleichenPaket ändert invitations_page.dart und split_guarantee_widgets.dart; Gleichheit nur am Bild prüfbar
- 116nur am Gerät oder Server prüfbarKnöpfe auf eigenem und fremdem Profil einheitlich78 hat profilKnopf-Variante (follow_button.dart); Paket ändert nur den Folgen-Knopf in Listen; nur am Bild prüfbar
- 118nur am Gerät oder Server prüfbarLange Ladezeiten ohne passende LadeanimationLadezeiten nur am Gerät messbar
- 119nur am Gerät oder Server prüfbarSchwarze Kanten am Timer- und ZusammenfassungsfensterNur am Bildschirm sichtbar
- 121nur am Gerät oder Server prüfbarVerwirrende Doppelung Gast hinzufügen und Spieler hinzufügen78 zeigt je freiem Platz zwei Chips „Spieler“ und „Gast“ (split_v54_widgets.dart); ob das noch verwirrt, nur im Test
- 122nur am Gerät oder Server prüfbarSchütteln zu unempfindlichshake_detector.dart 1,9 g und zwei Umkehrpunkte; Wirkung nur am Gerät
- 123nur am Gerät oder Server prüfbarKalender im zweiten Monat: Auswahl nicht in Tagesansicht übernommenV52: Monat folgt gewähltem Tag (wann_fragen.dart:177); kein gezielter Fix gefunden, nur am Gerät prüfbar
- 125nur am Gerät oder Server prüfbarNicht funktionierendes „Zahlungsmittel speichern“ in der Buchung entfernenFehlt: Nichts ist halb umgesetzt: Der Haken wurde auf Betreiberwunsch (V52) gebaut und laut Code repariert, er speichert über updateProfile(savePaymentMethod). Ob er wirkt, zeigt nur ein Stripe-Testkauf am Gerät. Ihn zu entfernen widerspräche dem V52-Wunsch, das entscheidet Timur.Zweitprüfung: 78 buchen_pruefen_page.dart:1134-1195 (_merkenUmschalten, V52-Betreiberwunsch, V69-Deklaration im Zahlblatt), buchen_copy.dart:347 „Für nächste Buchungen vormerken?“; Zweig :4011
- 126nur am Gerät oder Server prüfbarFollow-Anfragen privater Profile nach Neuladen zurückgesetztZustand „Angefragt“ existiert (follow_button.dart:91); Speicherung nur mit echten Konten prüfbar
- 127nur am Gerät oder Server prüfbarMitteilungsziele bei Storno und Buchung falschZiele kommen vom Server (deep-links.ts); Paket ändert nur das Symbol für booking.cancelled
- 128Hinweis, kein AuftragGebündelte, nachvollziehbare Änderungen statt ein bis zwei Details je BuildArbeitsweise, kein Code