gitoriaLog in with ident

tracker

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit9abda75d9abda75dtracker: report 035mre9abda75d/reports/032-people-search-settings.md

7.7 KB

  1. # Report 032 — tracker#37: /people, people in the search, /settings (w089, 2026-10-04)
  2. Commits on main: 718bfb8 (code + gates + README/STATUS/LOG), 9bce1f6 (STATUS note). NOT deployed, not pushed.
  3. **/people** (+ `/people/page/<n>`): everyone (no adult filter, as before), the one updated last first. "Updated" = the newest of
  4. `updatedAt` (new: the person page's TMDB fill stamps it), `filmographyAt` and `added`; migrated people without any come last.
  5. Photo + name tiles through `components/tilelist.hl` (new prop `tileClass="tile person-tile"`: name in the person colour, no year),
  6. the same pagination as /movies, "105018 people, last updated first · page 1 of 4376". The letters and `/people/<letter>` are gone.
  7. - Cached view (the mission 025 approach): `lib/people.hl warmPeopleView()` runs at boot: one pass over the people, one sort, the cast
  8. photos. Log: `people view: 105018 people, 51922 cast photos in 3753 ms`. A page slices 24 ids. People created (`castPersonId`) or
  9. updated (the fill) move to the front on the next read (`personTouched`), no restart needed.
  10. - `util.hl sortDesc` now starts from the runs that are already sorted. Output is the same and the gates are unchanged. 105k
  11. nearly-sorted people take 0.15 s instead of 1.6 s.
  12. **Photos**: the order is our file, then `tmdbProfile` (TMDB w185), then the `profile` from a title's cast or crew entry (in-memory
  13. map built at boot), then the new "no photo" placeholder (`assets/photo-placeholder.svg`; titles still show "no poster"). New
  14. people now keep TMDB's profile: cast, crew and `created_by` entries carry `profile`, and `castPersonId` stores `tmdbProfile`.
  15. I first tried a one-time write of the cast profiles into the person records. On the live copy it took **511 s at boot** for
  16. 51,907 people, so I dropped it for the in-memory map (~1–3 s at boot).
  17. **Search**: people rows now show the photo before the name, which links to the person page. The database search and "Fetch from
  18. web" are unchanged. "Jared Harris" finds Jared Harris with his photo.
  19. **/settings**: only `<h1>Settings</h1>`, plain. The typed style ("<type> | <name>") does not fit a page without a type.
  20. **Gates**: browser **369/0** (4 new #37 checks, 3 extended: order after the fill and after a new person, pagination page 2,
  21. search photos for cast / created_by / crew / cast-map / placeholder, "no photo", Settings heading only, the boot log line),
  22. kinds 32/0, franchises 52/0, check-theme 0. One browser run that crossed 04:00 UTC failed 9 #18/#35 checks. The gate sets
  23. TRACKER_SYNC_HOUR to the hour it started in, so a run that crosses the hour fails. This is an old flake; the rerun was 369/0.
  24. **Real copy** (live storage 2026-10-04, tree without .env, jobs off; base 96ba683 for A/B):
  25. - /people pages 1/2/3: server 13–17 ms each, page 4376 ~15 ms. Full load to hydrated (1280, signed in, median of 10): 85 / 67 / 77 ms.
  26. The base had 0.54 s on its first /people (lazy letters).
  27. - Search "Jared Harris": found with photo, 16 ms server (base 12 ms). /search/star trek 120 vs 106 ms load (noise ±10 ms; /movies,
  28. whose code did not change, measured +9 ms).
  29. - Boot RSS ≈ base (+~20 MB). Peak varies ±150 MB between runs of the same build.
  30. - Screenshots 390/1280 signed in and out, all looked at (`.scratch/w089/shots-final/`): header 52 px, no sideways scroll, 0 console
  31. problems.
  32. **Open / for the architect and the creator**:
  33. - On live, /people pages 1–3 are **all crew people** (72/72). They are the writers and directors of the credits job's last titles,
  34. and crew entries had no profile before this mission. So the first pages show "no photo" until someone opens the person (the fill
  35. downloads the photo) or that title's credits are stored again. Cast people with a TMDB photo show it (page 20: 24/24).
  36. Filling them all would need a backfill job (TMDB /person per person, ~50k requests), not built.
  37. - Mission 033 (worktree t38) may also touch `components/tilelist.hl`; this mission added `tileClass` there.
  38. - Housekeeping: my first local copy went into the shared scratchpad dir `…/scratchpad/t` and overwrote the copies of
  39. lib/components/project.hl/tests/browser.mjs/README/STATUS/LOG that an earlier session had left there (an old pre-028 tracker
  40. layout). The repo is unaffected.
  41. ---
  42. # Added: The Remaining (urgent) and tracker#39 (w089, 2026-10-04 06:45)
  43. **The Remaining**: live is not an empty stub. Headless Chrome at 390 and 1280, plus client-side navigation from /search, /movies
  44. and /, shows the overview, 4 genres, director/writer and 5 cast members (Loreana `.scratch/w089/remaining/live-before-*.png`). The
  45. stored record has tmdbSummary, tagline, genres, cast, crew, detailsAt and tmdbSync. Asking TMDB with the app's own request
  46. (`/movie/1775752?append_to_response=external_ids,credits`): poster_path null, imdb_id null, runtime 7, backdrop_path set.
  47. Missing on the page: the poster (TMDB has none), the IMDb link (TMDB has none) and runtime/release date (the app never shows
  48. them). I proposed using the backdrop as a poster fallback plus showing release date and runtime. Waiting for the lead's decision.
  49. No code changed for this.
  50. **tracker#39** (commit b10f00c): migrated episodes still carry TMDB ids that TMDB has since replaced. sync.hl matched by number
  51. only when an episode had no tmdbId at all, so the sync and the repair added a second episode with the same number. Live copy:
  52. 850 extra episodes in 112 series.
  53. - Sync: a stale-id episode is now adopted by its number (old id kept as `migratedTmdbId`).
  54. - Merge: merge.hl step 3 (keeper: most watches, else the synced one, else the first; watches moved or parked; tombstones).
  55. - Check: `tools/count-duplicate-episodes.hl`.
  56. - Gates: 373/0, 32/0, 52/0. With the old sync.hl the new sync check fails.
  57. - Real copy: 850 → 0 in 64 s. The creator's 12,525 watch rows are unchanged; /my/unwatched 993 → 905.
  58. - Seasons: Flash S9 22 → 13; Discovery S5 20 → 10; Scrubs S1 48 → 24. Shots: `.scratch/w089/flash-shots/`.
  59. - Open: Specials stay large (TMDB's own: Flash 72, Discovery 70). 68 pairs with the same tmdbId under different episode numbers
  60. (old-tracker rows) are untouched.
  61. ---
  62. # Added: backdrop poster, runtime, art + photo backfills (w089, 2026-10-04 08:20; main after 4ecc67b)
  63. **Poster fallback**: when TMDB has no poster, syncPoster downloads the backdrop (w780) as the title's poster file
  64. (`posterFromBackdrop`). The existing CSS on every poster box shows it centre-cropped to 2:3. A real poster later replaces it.
  65. **Runtime**: movies now store `runtime`, and a movie page shows "17 September 2026 · 7 min" under its title.
  66. **Art backfill**: one TMDB request for each public title without a poster file and each public movie without runtime.
  67. **Photo backfill**: one TMDB request for each person without any photo source, in /people's order (page 1 first).
  68. - Both run last, after every other start job. They are paced at ≤ 40 requests per 10 s, resume after a restart and ask each item
  69. only once.
  70. - Switches: `TRACKER_ART=0` and `TRACKER_PHOTOS=0`. Every gate and realdata script starts with both off.
  71. **Gates**: browser 379/0, kinds 32/0, franchises 53/0, pager 229/0, franchiseseed 26/0, check-theme 0.
  72. **Real copy**, with real TMDB through a link to .env (never read):
  73. - Art: 4,977 titles done in 42 min — 115 posters, 15 backdrops, 4,609 runtimes, 0 failed.
  74. - The Remaining now shows its backdrop as poster plus "17 September 2026 · 7 min". Shots: `.scratch/w089/remaining/after/`; before
  75. = live, `remaining/live-before-*`.
  76. - Photos: the queue has 53,106 people at about 0.5 s each, so roughly 7.5 h.
  77. - After 5 min, /people pages 1–3 had 8, 3 and 4 of 24 with a photo (0 before). TMDB has no photo for most crew people.
  78. Shot: `.scratch/w089/photos-after/`.
  79. - RSS stayed at 1.5–1.7 GB.
  80. **Open**:
  81. - Only 15 titles had a backdrop to use; most poster-less public titles have no art at TMDB at all.
  82. - Runtime is stored for movies only.
  83. - After deploy the photo job runs for about 7.5 h.

Branches

Latest commits

  • 9abda75dtracker: report 035mre
  • 12595e47mission 035: theme re-vendored from layouts.worldapi.org 0222f67 (two corner radii: radiusSmall 5px, radiusLarge 10px); the tracker's 18 own radii -> radiusSmall/radiusLarge (--layout-radius is gone); check-theme 0; gates 379/0, 32/0, 53/0, 229/0, 26/0; real copy: every computed radius in {0, 5px, 10px, 50%}mre
  • e7305014tracker: report 032 (art + photos)mre
  • fbb903cctracker#33/#37 (mission 032): a title without a TMDB poster gets its backdrop (w780, posterFromBackdrop, shown 2:3 centre-cropped); movies store runtime, the page shows release date + runtime; art backfill (public titles without poster file / movies without runtime) and person photo backfill (tmdbProfile / photoCheck) as the last start jobs (TRACKER_ART, TRACKER_PHOTOS; off in every gate start); gates 379/0, 32/0, 53/0, 229/0, 26/0, check-theme 0; live copy: art 4977 titles in 42 min (115 posters, 15 backdrops, 4609 runtimes), The Remaining shows its backdrop + 7 minmre
  • 4ecc67b2tracker: STATUS/LOG for the t38 + t40 merge (gates 374/0, 32/0, 53/0, 229/0, 26/0, check-theme 0; live copy checks)mre
  • e5945d2fMerge t40 (tracker#40 curated franchises, Franchises menu, superseded collections) into main: deploy.sh lists all six gates (browser, kinds, franchises, pager, franchiseseed, check-theme); search.hl keeps #37's personPhotoOf + #40's importWithCredits; pager gate runs with TRACKER_FRANCHISE_SEED=0; gates 374/0, 32/0, 53/0, 229/0, 26/0, check-theme 0mre
  • b638e99dMerge t38 (tracker#38 pagination, #35 Returning/Airing label) into main: LOG/STATUS keep both sides; pager gate follows #37's /people (everyone, last updated first: seed updatedAt); gates pager 229/0, browser 374/0mre
  • f8ffa4dbtracker: report 032 + The Remaining + #39mre
  • 7565a863tracker: LOG timemre
  • b10f00c8tracker#39: double episodes — migrated episodes whose TMDB id TMDB replaced are adopted by their number in the sync (old id -> migratedTmdbId); merge.hl step 3 merges each season's doubles at start (keeper: most watches > synced > first; watches moved/parked; tombstones into mergedEpisodes, nothing deleted); tools/count-duplicate-episodes.hl; gate fixture + paths-m039; live copy 850 -> 0 in 64 s; gates 373/0, 32/0, 52/0mre
  • 8f1d4542tracker#40: superseded collections — a TMDB collection timeline whose titles are all in one curated timeline is hidden (supersededBy; kept: own page + editor finder), set by the collection seed when it makes one and by the curated build (lifted when the cover is gone); partly covered ones join that franchise; no second widget (First Contact: only Star Trek — Prime); gate franchiseseed 26/0, browser 365/0, kinds 32/0, franchises 53/0, check-theme 0; real copy 24 supersededmre
  • 9448d643tracker#35 follow-up (mission 033): TVmaze 'Running' is labelled 'Returning', or 'Airing' while a non-special episode of the two newest seasons is released within today +-7 days (data unchanged); gate fixtures Running/Airing/Aired + a special; browser 366/0, kinds 32/0, franchises 52/0, pager 229/0, check-theme 0mre
  • 7d4b293dtracker#40: "Franchises" in the main menu (desktop header after People, phone sidebar) → /franchises, marked on franchise and timeline pages; gates 365/0, 32/0, 53/0, 24/0, check-theme 0mre
  • 8751adb8tracker: report 032mre
  • 9bce1f65tracker mission 032: STATUS gate files + the hour-boundary flakemre
  • 718bfb89tracker#37 (mission 032): /people = everyone, last updated first (updatedAt stamped by the person fill; view built at boot, touched people first at once), photo + name tiles (person colour) with the /movies pagination, /people/<letter> removed; photo = our file, tmdbProfile, a cast/crew entry's profile (in-memory map at boot), else the new 'no photo' placeholder; new cast/crew/created_by people keep tmdbProfile; search people rows with the photo; /settings = the heading only; util.hl sortDesc starts from sorted runs (same result, 105k: 1.6 s -> 0.15 s); gates 369/0, 32/0, 52/0, check-theme 0; README/STATUS/LOGmre
  • 93dfb0batracker#40 (mission 034): the curated franchises — data/franchises.json (17 franchises, 31 timelines, 285 TMDB titles, movies + series, in-universe/release order, 12 TMDB collections attached); lib/franchiseseed.hl + jobs.hl franchiseSeedTick (last start job, imports missing titles via details.hl importWithCredits = the search's Add, one per step paced, then one build; franchiseseed.db: editor changes win, the creator's same-name franchise adopted / timeline left alone, 404 remembered, resumable, idempotent); timeline heads 'N titles · in-universe order' (orderKind) and wrap on a phone; series pages show the widget; new gate tests/franchiseseed.mjs (5th in deploy.sh), the others run with TRACKER_FRANCHISE_SEED=0; gates 365/0, 32/0, 52/0, 24/0, check-theme 0; real copy 196 imported, 0 failed, 7 min, restart unchanged=31mre
  • 03ec792ftracker#38 (mission 033): pagination goes exactly to the clicked page — tilelist read the clicked button's text after pagination.hl's own handler had rebuilt the buttons (real clicks only); now li.current, else the button's own text; new gate tests/pager.mjs (5 lists x 11 pages, 390/1280, real + script clicks, Back/Forward) 229/0; browser 365/0, kinds 32/0, franchises 52/0, check-theme 0mre
  • 96ba683adeploy.sh: a gate without a 'passed,' line (check-theme) no longer ends the scriptmre
  • eb3b9205tracker: report 031mre