Kaynağa Gözat

[Scope] Phase 5 landing-page status update post batch

- Mark 5.1 [x], 5.2 [~] (cron stub gap flagged), 5.3 [~] (U9 bug noted)
- Add 5.3a [x] for Roll the Dice random-page pool
- Section 5 Feature Flow: codify the two-pool distinction (carousel
  uses landing_reel_posters + PINNED_REEL_POSTERS; Roll the Dice uses
  /api/tmdb/popular?page=N) so future implementers don't conflate
- Note canonical landing lives at (public)/page.tsx with TMDBFooter
  mounted in (public)/layout.tsx

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
User 2 ay önce
ebeveyn
işleme
6fe049e421
1 değiştirilmiş dosya ile 21 ekleme ve 10 silme
  1. 21 10
      PROJECT_SCOPE.md

+ 21 - 10
PROJECT_SCOPE.md

@@ -71,14 +71,23 @@ MovieDice solves group decision paralysis by combining collaborative curation (e
 
 ```
 1. Visitor lands on the root URL — no login required
+   NOTE: src/app/page.tsx was a duplicate stub that shadowed (public)/page.tsx; removed (2026-05-02).
+   The canonical landing is src/app/(public)/page.tsx; TMDBFooter is mounted in (public)/layout.tsx.
 2. Centered "Movie Dice" header/logo displayed
 3. Splash text describes the site briefly (1-2 sentences)
 4. "Roll the Dice" button is visible — tapping it triggers the slot-machine reel animation:
-   a. Three side-by-side reels spin through ~20 movie poster images pulled automatically
-      from TMDB popular/top-rated endpoints (no manual curation; replaced on each periodic refresh)
-      Reel posters use aria-hidden (decorative during animation)
-   b. Reels decelerate and land on a single movie result
-      (the final result can be any TMDB movie, not constrained to the reel poster set)
+   a. Three side-by-side reels spin through poster images sourced from the landing_reel_posters table
+      (populated by seed.sql; cron refresh is a pending TODO — see 5.2).
+      The /api/tmdb/reel-posters route currently fetches TMDB live on each request and ignores the
+      table; PINNED_REEL_POSTERS constant always prepends hard-coded entries (e.g., tmdb_id 615).
+      Reel posters use aria-hidden (decorative during animation).
+      TWO DISTINCT POOLS — do not conflate:
+        - Carousel/reel posters: landing_reel_posters table + PINNED_REEL_POSTERS fallback (curated)
+        - Roll the Dice result: live /api/tmdb/popular?page=N, random page 1–50 (~1000-movie pool)
+   b. Reels decelerate and land on a single movie result drawn from /api/tmdb/popular?page=N
+      (random page 1–50; pool of ~1000 movies). The result is NOT constrained to the reel poster set.
+      KNOWN BUG (U9): modulo wrap missing in spinning branch causes scroll offset to drift on
+      repeated rolls; fix tracked in research/PHASE5_UI_FIXES_PLAN.md U9.
    c. Result is displayed as a static teaser card showing the movie poster (with alt text),
       title, and genres. No link, no tap action.
    d. Animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2)
@@ -92,7 +101,8 @@ MovieDice solves group decision paralysis by combining collaborative curation (e
       - Step 1: left-aligned
       - Step 2: right-aligned
       - Step 3: left-aligned (zigzag visual rhythm)
-8. Footer on all pages: TMDB attribution (logo + link + disclaimer), privacy policy link
+8. Footer on all pages (mounted in (public)/layout.tsx): TMDB attribution (logo + link + disclaimer),
+   privacy policy link
 ```
 
 ### Onboarding (New User)
@@ -497,10 +507,11 @@ Configure HTTP security headers at the Caddy reverse proxy level (not in next.co
 
 ### Phase 5: Landing Page and MVP Polish (April 23-26, 2026) — MVP CUTOFF
 
-- [ ] 5.1 — Build landing page structure: centered logo, splash text, Roll + Genre Roll buttons, Login button, scrolling About section, 3-step how-it-works demo (Step 1 left, Step 2 right, Step 3 left); add site-wide footer with TMDB attribution (logo + link + disclaimer) and privacy policy link; build privacy policy page with required sections (controller identity, lawful basis, data inventory, third-party recipients including Sentry, international transfers, user rights, children's disclaimer, cookie/localStorage disclosure, change notification procedure)
-- [ ] 5.2 — Build and seed landing_reel_posters table: implement periodic refresh job in the Node.js cron container on bi-weekly cadence that automatically fetches ~20 posters from TMDB popular or top-rated endpoints (with `include_adult=false`) and replaces the full set in the DB on each run
-- [ ] 5.3 — Build slot-machine reel animation for the landing page Roll the Dice button: 3 side-by-side reels that spin through the automatically fetched poster set (using w185 size, `aria-hidden` on spinning posters), decelerate, and land on a single TMDB movie result with alt text (the final result is fetched live from TMDB via server proxy — not constrained to the reel poster set); animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2); respect `prefers-reduced-motion` (instant reveal or simple fade-in when enabled)
-- [ ] 5.4 — Wire landing page Roll the Dice and Genre Roll to TMDB via server proxy (no login required); display result as a static teaser card showing poster (with alt text), title, and genres — no link, no tap action
+- [x] 5.1 — Build landing page structure: centered logo, splash text, Roll + Genre Roll buttons, Login button, scrolling About section, 3-step how-it-works demo (Step 1 left, Step 2 right, Step 3 left); add site-wide footer with TMDB attribution (logo + link + disclaimer) and privacy policy link; build privacy policy page with required sections (controller identity, lawful basis, data inventory, third-party recipients including Sentry, international transfers, user rights, children's disclaimer, cookie/localStorage disclosure, change notification procedure). NOTE (2026-05-02): Hero, Carousel, About, HowItWorks, Login link, and TMDBFooter all present in `src/app/(public)/page.tsx` + `(public)/layout.tsx`. Duplicate stub `src/app/page.tsx` removed so (public)/page.tsx is no longer shadowed.
+- [~] 5.2 — Build and seed landing_reel_posters table; implement periodic refresh job in the Node.js cron container on bi-weekly cadence that automatically fetches ~20 posters from TMDB popular or top-rated endpoints (with `include_adult=false`) and replaces the full set in the DB on each run. NOTE (2026-05-02): Table exists and is populated by seed.sql. `PINNED_REEL_POSTERS` constant in the API route always prepends hard-coded entries (e.g., tmdb_id 615 "The Passion of the Christ"). OUTSTANDING: `cron/index.ts` reel-refresh handler is still a TODO — the `/api/tmdb/reel-posters` route currently fetches TMDB live on each request and ignores the DB table. Cron wiring is the remaining gap for this task.
+- [~] 5.3 — Build slot-machine reel animation for the landing page Roll the Dice button: 3 side-by-side reels that spin through the automatically fetched poster set (using w185 size, `aria-hidden` on spinning posters), decelerate, and land on a single TMDB movie result with alt text (the final result is fetched live from TMDB via server proxy — not constrained to the reel poster set); animation is user-triggered only and completes within 5 seconds (WCAG 2.2.2); respect `prefers-reduced-motion` (instant reveal or simple fade-in when enabled). NOTE (2026-05-02): Continuous carousel and slot-machine spin on roll are implemented. KNOWN BUG (U9): modulo wrap missing in spinning branch causes scroll offset to drift on repeated rolls; fix tracked in `research/PHASE5_UI_FIXES_PLAN.md`.
+- [x] 5.3a — Wire landing page Roll the Dice to TMDB via `/api/tmdb/popular?page=N` (random page 1–50, pool ~1000 movies). Result displayed as a static teaser card (poster with alt text, title, genres) — no link, no tap action. NOTE: this is a distinct pool from the carousel reel — see Feature Flow section 5 for the two-pool distinction.
+- [x] 5.4 — Wire landing page Genre Roll to TMDB via server proxy (no login required); display result as a static teaser card showing poster (with alt text), title, and genres — no link, no tap action.
 - [ ] 5.5 — Loading and empty states for all major views (empty list, no search results, no genre matches, empty home page for new users)
 - [ ] 5.6 — Error handling: invalid invite code, TMDB API failure, network errors
 - [ ] 5.7 — Configure HTTP security headers in Caddyfile: CSP (with self-hosted URLs, not \*.supabase.co), X-Frame-Options, X-Content-Type-Options, Referrer-Policy, HSTS (start with max-age=86400, increase before launch), Permissions-Policy; use Report-Only mode during testing