gitoriaLog in with ident

tracker

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commite5945d2fe5945d2fMerge 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 0mree5945d2f/reports/032-people-search-settings.md

5.9 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.

Branches

Latest commits

  • 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
  • 9b5d2e89tracker mission 031: README (What it does, Test: four gates + the #32 checks, Files: theme/, new pages), STATUS (real copy, A/B load, how to repeat, open points), LOGmre
  • 39950e4ctracker#32 (mission 031): the WorldAPI theme (theme/ vendored verbatim from layouts.worldapi.org 85b5654; styles.hl inherits it: accent green-dark, type colours 1-6; own base/header rules, row lines, genre-pill and inverted-button frames removed, the season foldable keeps its line; check-theme 21 -> 0, 4th deploy gate; main actions class primary) and the #32 header (theme AppHeader/MainMenu/UserMenu/Sidebar/ContentFirst: desktop brand, search, Series|Shows|Movies|Genres|People, user icon with Unwatched..Settings, Logout; signed out the ident selector, phone the iD icon dropdown; phone menu in the sidebar overlay; marked entry by :has); /find -> /search/<q>, /genres, /people(/<letter>), /settings; main { ContentFirst { slot } } works around the hl:web one-line slot bug; gates 365/0, 32/0, 52/0, check-theme 0mre
  • a386dc92tracker: reports 029 + 030mre
  • 71e0fd7dtracker missions 029 + 030: README (What it does, Files, gate count), STATUS (real-copy numbers, how to repeat, open points), LOGmre
  • d36ea6eatracker#34 + #35 (mission 030): Follow directly under the poster, as wide as the poster (show.hl, styles.hl); the status pill next to a series' title — TVmaze's status (new tvmazeStatus, stored by the sync's TVmaze merge) else TMDB's, TVmaze Ended + TMDB Canceled = Canceled, inverted (filled, dark text, no border), green running / yellow pending / red canceled / muted ended (shows.hl statusOf); the daily delta asks TVmaze's status of an unfollowed series TVmaze's change list names (dailysync.hl syncRunStep, sync.hl syncTvmazeStatus); the status backfill after the details repair (backfill.hl, jobs.hl statusTick; resumable, 550 ms per TVmaze request); gates 354/0, 32/0, 52/0mre