gitoriaLog in with ident

tracker

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commitf8ffa4dbf8ffa4dbtracker: report 032 + The Remaining + #39mref8ffa4db/reports/019-tracker-unwatched-checks.md

3.7 KB

  1. # w063 — tracker#29: /my/unwatched checks look "active" (mission 019 (old 063))
  2. **Commit**: `fa1f9df` on main in loreana:/media/STORAGE/projects/tracker.worldapi.org. It is not pushed and not deployed. I did not touch tracker-wt26.
  3. ## Cause
  4. This is **not a code regression** of #23 / f14db67.
  5. - **Classes are right**: on the real-data copy, signed in as az5b2, all 1,287 checks on /my/unwatched have the class `checkicon regular`. Their computed fill is transparent, both on a fresh load and after a client-side navigation. The live CSS is the same as HEAD.
  6. - **The look was the problem**: the "inverted" unwatched check from #11 (outline circle with an outline check) was drawn in the **accent** colour. A whole page of those reads as ticked.
  7. - **Fix** (`styles.hl`): the unwatched circle and check are now **muted grey** (`colorTextMuted`, rgb(145,150,155)). They turn accent only under the pointer.
  8. - A watched check is unchanged: a solid accent disc with a dark check.
  9. - The #11 shape stays: it is not a bare empty circle, which the creator rejected in #11.
  10. ## Pages checked
  11. - **Same fix applies** (they share the same CSS): /my/unwatched, the show page's seasons and episodes, and the movie page.
  12. - **/my/schedule**: it has no checks.
  13. - **/my/movies**: only watched movies get a mark (#24). An unwatched movie has no mark, so there is no empty check on that page.
  14. ## Gate
  15. `mkdir -p /tmp/w063/shots; TRACKER_GATE_SHOTS=/tmp/w063/shots TRACKER_GATE_PORT=8720 TRACKER_GATE_IDENT_PORT=8721 TRACKER_GATE_CHROME=8722-8726 TRACKER_GATE_TMDB_PORT=8727 node tests/browser.mjs`
  16. → `266 passed, 0 failed` (was 259).
  17. - **How a check is tested**: the new `checkLook(sel)` measures a real check on the page; the hidden-copy check is removed. It moves the pointer off the check, then reads the circle's computed fill and stroke, the check's stroke, and whether the check is the topmost element. It also takes the screenshot pixel inside the disc. Each check must then pass as `lookEmpty` or `lookSolid`.
  18. - **Where**:
  19. - /my/unwatched: both rows.
  20. - Show page: an unwatched episode and season, a watched episode, and the #23 mixed state.
  21. - Movie page: both states.
  22. - /my/movies: the watched mark.
  23. - **Negative test**: run against the old `styles.hl`, the gate fails exactly 4 of the new checks, all on the accent stroke.
  24. - **Pre-existing quirk**: the gate crashes if the `TRACKER_GATE_SHOTS` directory does not exist, so `mkdir` it first.
  25. ## Real data
  26. - **Copy**: I took Byrodin's `storage/` at about 19:30. The ssh from Loreana to Byrodin was refused, so I piped the tar from Byrodin into Loreana instead.
  27. - **Run**: server on :8730, `REAL_OUT=/tmp/w063/real node tests/realdata-063.mjs`.
  28. - **/my/unwatched**: 1,287 checks, all regular, muted and unfilled. Full load took 1,913 ms at 390 px and 1,050 ms at 1280 px.
  29. - **Other pages**: Foundation has 11 muted and 2 solid checks. The Star Trek: First Contact movie check is muted. /my/movies has no marks, because the creator has no watched movie.
  30. - **Click**: one click took the list from 1,287 to 1,286 rows in 1.5 s, and the row stayed gone after a reload. There were 0 console problems.
  31. - **Cleanup**: the copy, the sessions and the server are gone, and ports 8720–8731 are free.
  32. ## Screenshots (looked at)
  33. - **Real data**: Loreana `/tmp/w063/real/my-unwatched-390.png` and `my-unwatched-1280.png`, plus `show-*` and `my-movies-*`. The grey outline checks are clearly different from the solid accent discs on Foundation.
  34. - **Gate**: `/tmp/w063/shots/`.
  35. ## Open points
  36. 1. Deploy.
  37. 2. The ticket asks for "empty" checks. I kept #11's outline-with-check shape and made it grey instead of accent. If the creator wants a bare empty circle, that reverses their #11 note. It would be a one-line CSS change plus the `lookEmpty` gate check.
  38. 3. There were no Hybriel issues.

Branches

Latest commits

  • 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
  • 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
  • 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
  • 7d7d4487tracker#33 (mission 029): reduced titles — every title TMDB's details never went through this app (no detailsAt, no tmdbSync) is incomplete (shows.hl isIncomplete; the old tracker's migrated rows passed #26's test: 5,697 non-adult on the live copy, 691 series without seasons); the repair job does the visibly reduced first (shows.hl missingParts), the page completes one on open; a title TMDB has no poster for (The Remaining) shows the placeholder; tools/count-incomplete.hl; gate fixtures stand for synced titles (tmdbSync), tests/seed-reduced.hl + #33 checks; gates 347/0, 32/0, 52/0mre
  • 661c2592tracker: report 028mre
  • 27c916fatracker mission 028: README ("Code order", the new file map), STATUS (counts before/after, tests, how to repeat, open), LOGmre
  • d924f398tracker mission 028: comments name the new files (sync.hl, dailysync.hl, backfill.hl, credits.hl, jobs.hl, images.hl …); tools/ref-params.py + tools/lambda-audit.py also scan lib/ (they globbed the root only), lambda-audit counts a plain `x = p` alias like `let x = p`mre
  • 2e89b968tracker mission 028 (code order) 5/5 let: `let` only where a variable is reassigned — 667 never-reassigned lets became plain declarations (project.hl, lib/, components/, tools/, tests/); kept: 264 in loop bodies (a plain declaration there is 'Cannot reassign' on the 2nd pass), 234 reassigned, 27 whose name is also a member/outer/free name (a plain write would rebind it); tools/let-audit.py decides and fixes (README 'Code order'); tests/realdata-m028.{sh,mjs} = the page-output diff on a real copy; gates 342/0, 32/0, 52/0, real-copy pages identicalmre
  • 54796ff2tracker mission 028 (code order) 4/5 thin faces + last copies: the show page's check/follow faces call lib/watches.hl toggleWatched / toggleSeasonWatched (seasonAllWatched moved there) and lib/follows.hl toggleFollowed; both logins (header selector face, /login/callback) share lib/users.hl userOfCode; todayStr/listOf copies in components and the export readers copied into tools/migrate.hl + tools/old-short-ids.hl now once (lib/util.hl, lib/export.hl); gates 342/0, 32/0, 52/0; old-short-ids output byte-identical, migrate output identicalmre
  • 06b078e3tracker mission 028 (code order) 3/5 project.hl is the map: config, routes, wiring and a feature → file index (914 → 258 lines); the background jobs (daily sync run, backfills, details repair, credits job, merge, short ids, collection seed) moved unchanged into lib/jobs.hl (a class: their state is reassigned every step, a static cannot be; one instance made after the server), the login callback into lib/users.hl, poster/photo serving into lib/images.hl, the /shows/<slug> rule into lib/shows.hl showsMovedPath; route handlers are thin wrappers; gates 342/0, 32/0, 52/0, real-copy pages identicalmre