Musteri sipariste not alanina tum essesini yapistirdi — KDS tableti yavasladi (PR #657 IX F3)
Canakkale Kepez sahil yolu Truva Kahvecisi sahibi Filiz (38), Cuma 19:30 dinner rush pekinde KDS tablet aniden donmaya basladi. Order #3471 yuklemek 12 saniye, kismi render, scroll lag. Sef Yusuf: "bu siparisin note kismi baya uzun." Filiz ekranda ekran dolduran metin blok gordu — siparis ozeti 1 sosis borek + 1 turk kahvesi 95 TL, ama "note" alani akademik makale + e-postalar + HTML kod gibi 50KB metin. thMenu support 2 yanlis teori curuttu (tablet defect: yedek tablet ayni performans; yanlis alana paste teorisi ile musteriyi aradi). Musteri Selcuk (28, akademisyen) konustu: "Cok ozur dilerim, telefonumda yuksek lisans tezimin bir bolumunu Apple Notes ta editliyordum, Command-A Command-C yaptim, sigara molasi verip QR menuye dondum, note alanina ekstra ihtar yok yazacaktim ama reflex Command-V ile clipboard sifirlanmadigi icin tum 50KB tez bolumu yapistirildi." Order POST body 50KB. Forensik: apps/web-menu/src/app/api/orders/route.ts body.note trim ediyor ama LENGTH CAP YOK, charset filter YOK. D1 orders.note TEXT kolonu happily 50KB store etti. Downstream impact: KDS query 50KB row return, React p tag huge paragraph render, DOM reflow GPU strain (12s load + scroll lag). Surprise: sibling endpoints (admin order POST 500-char cap, kiosk order POST PR #585 XX F1 200-char cap) ZATEN cap liydi. Customer-side web-menu order POST cap siz kalmisti — classic sibling-endpoint hardening parity gap. **PR #657 batch IX F3** fix 5-line validation: typeof check + trim + 500-char truncate (vs reject — truncation chose to preserve well-intended customer note, accidental paste truncates first 500 chars). Plus item.note 200-char cap. Server-side validation + client-side UI char counter X/500. Filiz Selcuk a apology + free turk kahvesi. Fix shipped sonraki hafta 3 farkli operator (Mersin, Izmir, Istanbul) benzer accidental paste yasadi ama 500-char cap ile fark etmediler. Pattern: her client-supplied string field (order.note, item.note, table.label, customer.preferences, search query, profile bio) explicit length cap + character validation + server-side validation tasimali. Truncate-vs-reject decision per-context (user content truncate, technical IDs reject). Sibling endpoint parity audit gerekli yeni endpoint shipped olunca.