old : examples : tests/_archive_audits/. Un singur document, actualizat la fiecare sesiune majoră.| # | Item | Status | Acțiune |
|---|---|---|---|
| L1 | PAT Airtable în client | ✓ REZOLVAT | PAT rotat (9 iun), client citește data.json, zero token în sursă. Verificat: 0 match-uri |
| L2 | XSS — bpfEscapeHTML coverage | ⚠ PARȚIAL | Helper + CSP există, dar doar 7 utilizări vs ~30 sink-uri identificate. Audit coverage final necesar |
| L3 | DEBUG_TODAY = "11 Oct" · linia 7281 | ● ACTIV | Flip la "" în ziua lansării. PROTEJAT până atunci — nu se atinge în dev |
| L4 | BPF_TEST_DATE ×2 · liniile 33581, 34163 | ● ACTIV | Flip la lansare. Idem — PROTEJAT în dev |
| L5 | Mapbox token — restricție referrer | ? NEVERIFICAT | 2 min în Mapbox dashboard: HTTP referrer restriction pe pk.* |
| L6 | PWA icons (192 + 512) | ● LIPSESC | manifest.json există și e linkat (linia 20), dar fără icoane. Asset grafic de creat |
| L7 | console.log debug dumps | ? DE VERIFICAT | Strip înainte de prod |
| L8 | QA final pe device real (iPhone via Tailscale) | ○ TODO | Safe-area, notch, home indicator, momentum scroll |
| L9 | Re-run build.py cu date finale | ○ TODO | În ziua lansării, după înghețarea programului în Airtable |
| Zonă | Capabilități livrate | Ultima iterație |
|---|---|---|
| Welcome | Overlay cinematic (foto + 5 gradiente radiale), WITNESS editorial, countdown pre/live/ended, Tonight surface, filter strip (Open Now / Nearby), 3 CTA-uri | V446 + S5 |
| Map / Home | fitBounds adaptiv, popup follows pin, popup ascuns la sheet expandat, markeri cu status dot, quick-filter Open Now pe dot | V374, V485 |
| Search | Hybrid typed search (VENUE / EVENT / ARTIST chips colorate), limit 8, silent close | V375 |
| Venue sheet | Minimised (număr, status, event count) + Expanded (hero foto, events glass cards, chips, date/oră pe rânduri separate), frosted glass, twin CTA Directions/Navigation (decizie user — NU se unifică) | V478–V490 |
| Directions / RDP | Card A→B cinematic, ETA + distanță, polyline animat, X close, CTA-uri coral/glass | V355–V462 |
| Walking nav | Turn card, GPS badge glass, progress, arrival celebration, Start Walking popup compact | V450–V487 |
| Programme / Today | Fullscreen panel, calendar grid 2 rânduri, default Today, time-of-day grouping, NOW line, past dimming, day header „Day N" editorial (fix definitiv 12 iun — spans în template), tipografie fără caps/bold excesiv | V488–V495 + fix |
| Saved | Bookmark venue+event, localStorage, panel carduri compacte (50px, delete 32px), empty state elegant, sync hearts programme↔saved | S3 + V489/V495 |
| Festival Info | Fullscreen, hero, key facts, Explore cards, parteneri logo boxes, ordine: KF → Explore → Partners → Get Involved → Stay Connected | V443 + V495 |
| Tab bar | 5 items (Home/Today/Saved/Map/Info), dark glass blur(52px), alb activ, safe-area, sync la mode change | V480–V482 |
| Add to calendar | ICS per event, buton wired | S2 |
| Micro-interactions | Spring tap pe cards / CTAs / tab bar / detail expand | V492 (S9.3) |
| Design tokens | :root complet (brand, white-alpha 29 pași, fs/sp/r/z) + 1343 migrări | Sprint 4 |
| Securitate | CSP meta, bpfEscapeHTML helper, PAT build-time, .env gitignored | S6 + 9 iun |
| PWA | manifest.json linkat, viewport-fit, theme-color, apple-meta complete | V461 |
| Bug | Rezoluție |
|---|---|
| Day header „Day 513 Oct" | _fixDayHeaders (V436/V437) colapsa span-urile via textContent self-assignment. Fix: template emite spans direct + guards (12 iun) |
C1 forensic touch-action:none | Eliminat de pe FI hero / prog-header — 0 match-uri în sursă |
| B2 popup peste sheet expandat | Fix V374 — single CSS rule |
| Tab bar safe-area strip · venue bottom edge · strong inline regression | Toate închise (vezi arhivă) |
| # | Problemă | Origine | Note |
|---|---|---|---|
| P1.1 | XSS coverage — wrap toate sink-urile innerHTML cu date Airtable | SB-2 | Doar 7/~30 wrapped. O sesiune dedicată cu grep sistematic |
| P1.2 | window.bpfVenues stale → Saved/Tonight pot afișa date vechi | forensic C5 | Fix 1 linie. De verificat dacă mai e cazul cu data.json build-time |
| P1.3 | Boot setIntervals fără timeout (20+) — battery drain dacă CDN flake | H-F1 | setTimeout(() => clearInterval(...), 10000) per interval |
| P1.4 | MutationObservers fără disconnect (8+) — CPU cumulativ | H-F2 | Pattern: store + disconnect înainte de re-create |
| P1.5 | Geolocation dublu-prompt + 3 timeout-uri diferite | H-F3 | Un singur watchPosition, 8s/60s |
| P1.6 | data.json fetch fail silențios pe rețele lente | H-U4 | Skeleton shimmer după 600ms + toast pe catch |
| # | Problemă | Note |
|---|---|---|
| P2.1 | Deep link ?venue= + Web Share API | Press/marketing blocat fără; pereche cu In-Light |
| P2.2 | Token migration faza 2 — --fs-*/--sp-*/--r-* în rulesets vechi | Declarate, ~0% aplicate în componente vechi. Cod NOU le folosește obligatoriu |
| P2.3 | Easing/duration tokens — 86 tranziții cu 4+ easings | Standardizare pe cubic-bezier(.22,.8,.24,1) |
| P2.4 | Cod mort: V330 search handler (~6508–6525), .bpf-prog-past duplicat | Cleanup rapid |
| P2.5 | FEST_START/FEST_END redeclarate 5× | O singură sursă |
| P2.6 | Toast triplu → un singur bpfToast() | H-U3 |
| P2.7 | Filter-state polling 250ms + programme-bg 200ms | Event-driven în loc de poll |
| P2.8 | Events nesortate cronologic în listă | Bucket AFTERNOON→EVENING→AFTERNOON observat. Sort pe start_time înainte de render |
| # | Item |
|---|---|
| P3.1 | CSS architecture overhaul — consolidare V-layers, BEM/CSS layers (B4/P25 — „do not lose this item") |
| P3.2 | new Function() → window[name] (17 locuri; blochează strict CSP) |
| P3.3 | Route cache + sessionStorage persist (cost Mapbox −30-60%) |
| P3.4 | Live ETA polling + distance progress indicator |
| P3.5 | P18 Plan my day — rută multi-venue |
| P3.6 | Service Worker offline-first |
| P3.7 | 3D buildings Mapbox (risc baterie — evaluare) |
| P3.8 | Single MutationObserver dispatcher global, debounced |
| Idee | Impact | Efort |
|---|---|---|
| Cascadă intro stagger (kicker→title→edition→CTAs, 100-200ms) — singurul „WOW" rămas nelivrat | ALT | S · CSS only, spec în arhivă |
| „Tonight's pick" editorial pe welcome când festivalul e live (1 event, ora + venue) | ALT | M |
| Parallax discret pe foto la scroll/tilt | MED | M · defer dacă e timp scurt |
| Idee | Impact | Efort |
|---|---|---|
| Marker hover/selected feedback mai vizibil (scale 1.06 + inel cream 1px) | MED | S |
| Dark map tiles după 20:00 — festival = seară; harta light noaptea e rece | ALT | S–M |
| Decongestie markeri la zoom mic dacă venues se suprapun în centru | MED | M |
| Idee | Impact | Efort |
|---|---|---|
| Click pe EVENT/ARTIST → venue expandat + scroll-to-event (azi: doar selectVenue) | ALT | M |
transition pe result hover (lipsește, sec) | LOW | S |
| Idee | Impact | Efort |
|---|---|---|
| „Open until 21:00" / „Opens at 10:00" exact (P5) — azi doar status generic | ALT | S |
| Walking time pe minimised hero când locația e activă (P6) | ALT | S |
| Share venue (Web Share API) — pereche cu deep link P2.1 | ALT | S |
| Photo gallery în expanded (S9.2 rămas) — dacă Airtable are assets | MED | M |
| Idee | Impact | Efort |
|---|---|---|
| Sort cronologic strict în zi (P2.8 — bug real observat) | ALT | S |
| „Now / Starting soon" chip pe event cards când e azi | MED | S |
| Empty state pe zile fără evenimente („No events this day — see Day N") | MED | S |
| Idee | Impact | Efort |
|---|---|---|
| Conflict warning subtil (2 saved events suprapuse orar) | MED | M |
Share-saved-URL (hash #saved=...) — pereche cu deep links | MED | S |
| Idee | Impact | Efort |
|---|---|---|
Linkuri parteneri funcționale + access URL real din Airtable (welcome_access_url — câmp încă neadăugat?) | MED | S · depinde de schema |
| Idee | Impact | Efort |
|---|---|---|
| Robustețe sesiune lungă — P1.3/P1.4/P1.5 ca pachet unic „stability pass" | ALT | M · 1 sesiune |
| Haptic feedback (Vibration API) pe tab bar + save — Android only, progressive | LOW | S |
| Loading skeleton la primul paint (data.json fetch) | MED | S |
| Capcană | Detaliu |
|---|---|
| Arhitectură V-block append-only | <style id="BPFMAP_VXX_CSS"> + <script id="BPFMAP_VXX_JS"> înainte de </body>. Blocurile târzii câștigă la specificitate egală. NU edita V-blocks vechi decât pentru bug-uri la sursă |
| Day header | Template-ul emite .phd-num/.phd-date direct (linia ~7452). Orice cod care face textContent = pe .prog-day-hd-title DISTRUGE span-urile — guards există în V436/V437, nu adăuga alți writers |
.bpf-saved-panel colision | V402 (vechi) vs Sprint 3 — panouri noi în zona Saved au nevoie de !important sau alt nume de clasă |
V369 .empty-hero :not() whitelist | Elemente noi în welcome au nevoie de ID-override + flex order |
| SPRINT6 debounce 180ms | rebuildGroups re-injectează .bpf-prog-group după fiecare mutație pe #programmeList — post-procesoarele rulează la 220ms+ |
| Preview server | Servește COPIE din /tmp (BPFmap.html + data.json). După edit: re-copy sau restart server, altfel verifici cod vechi |
| Tokens | Cod CSS NOU folosește obligatoriu var(--bpf-*), --fs-*, --sp-*, --r-*, --z-* (:root, liniile ~26–135) |
| Variabile cheie | --bpf-sheet-clearance = tabbar + safe-area + 8px — orice sheet flotant o respectă |
| Getters fragile | new Function("return venues") în S3/S5 — nu replica pattern-ul; folosește window.bpfVenues (și ține-l fresh) |
| Easing canonic | cubic-bezier(.22,.8,.24,1) / 0.22s — semnătura motion a brandului |