tracker
All repositories: gitoria
10.5 KB
# Decisions — tracker.worldapi.org<!-- generated by the antcolony librarian (antcolony-scheduler: ./colony librarian) from librarian/decisions.json — do not edit by hand, it is rewritten -->The creator's decisions for **tracker.worldapi.org** — current state only (superseded ones: `DECISIONS-archive.md` beside this file).**A decision here overrides anything else; ask only if it is not decided here.**Each entry: date · the creator's exact words in quotes · where it was said · "means" = a READING (the librarian's or the architect's), not the creator's words — when in doubt, the quote counts.## Contents- [ident registration](#ident-registration) — 1- [look and style](#look-and-style) — 1- [tracker concept](#tracker-concept) — 11## ident registration- 2026-09-27 · **"Before you can test:** register the app in ident (/apps) for the origin https://tracker.worldapi.org and give me the key and secret — until then the sign-in button shows "not registered with ident yet"."** · [tracker.worldapi.org #1 — Step 1: an empty tracker with the ident login](https://tickets.worldapi.org/projects/tracker.worldapi.org/1)- means (the librarian's reading, not the creator's words): Register the tracker app in ident (/apps) for origin https://tracker.worldapi.org and give the creator the key and secret; without this the sign-in button stays broken.## look and style- 2026-09-27 · **"Fixed by the architect after your correction: now NO button has a border — also "Log out", the signed-in ident status and the identities in the ident dropdown. Only an inverted button (class "inverted", accent outline) would have one; tracker has none yet."** · [tracker.worldapi.org #3 — Design notes from the first test: no borders on the header and the bu…](https://tickets.worldapi.org/projects/tracker.worldapi.org/3)- means (the librarian's reading, not the creator's words): No border on any tracker button including "Log out", the signed-in ident status pill, and identities in the ident dropdown; only class "inverted" (accent outline) buttons keep a border — tracker currently has none.## tracker concept- 2026-09-27 · **"Step 5 (/unwatched) is live — step 6 can start."** · [tracker.worldapi.org #6 — Step 6: /schedule — the upcoming episodes of the shows you follow](https://tickets.worldapi.org/projects/tracker.worldapi.org/6)- means (the librarian's reading, not the creator's words): Tracker step 6 (/schedule) is now unblocked and may begin; the hold is lifted.- 2026-09-27 · **"Step 4 (the show page) is live — step 5 can start."** · [tracker.worldapi.org #5 — Step 5: /unwatched — the unwatched episodes of the shows you follow](https://tickets.worldapi.org/projects/tracker.worldapi.org/5)- means (the librarian's reading, not the creator's words): Tracker step 5 (/unwatched) is now unblocked and may begin; the hold is lifted.- 2026-09-27 · **"Posters: the old tracker kept them as files (storage/posters/<id>.jpg); those files are gone — they were never in the backup (see LOG). Keep the placeholder for now; getting posters again from TMDB (the show's tmdbId) is a later step with the TMDB token. The open point that matters in this step is the check click: it must really toggle (and a season's check all its episodes)."** · [tracker.worldapi.org #4 — Step 4: the show page /shows/:slug with seasons, episodes and watch c…](https://tickets.worldapi.org/projects/tracker.worldapi.org/4)- means (the librarian's reading, not the creator's words): Real poster images are out of scope now (files lost, not backed up); keep the placeholder and defer TMDB re-fetching to a later ticket. For this step, prioritize making the watch check actually toggle, including a season check toggling all its episodes.- 2026-09-27 · [tracker.worldapi.org #6 — Step 6: /schedule — the upcoming episodes of the shows you follow](https://tickets.worldapi.org/projects/tracker.worldapi.org/6) · the creator wrote:> Step 6: /schedule — the upcoming episodes of the shows you follow>> A list of the episodes still to come from the shows you follow, soonest first, without checks.> **Test:** open /schedule — only future episodes of followed shows, the next one on top, no check icons.> **Details:**> - Creator: "/schedule has a similar list without check icons for he upcoming episodes of shows followed".> - Upcoming = release date after today; order soonest first (decided by the architect; the creator named the order only for /unwatched).> - Same row layout as /unwatched (step 5) minus the check.- means (the librarian's reading, not the creator's words): Build /schedule: upcoming (release date after today) episodes of followed shows, soonest first, same row layout as /unwatched but without the check icon.- 2026-09-27 · [tracker.worldapi.org #5 — Step 5: /unwatched — the unwatched episodes of the shows you follow](https://tickets.worldapi.org/projects/tracker.worldapi.org/5) · the creator wrote:> - Creator: "/unwatched lists all unwatched episodes of shows followed in release date desc order"; "check icon is a disc with a check in it".> - Only episodes already released (release date today or earlier); each row: check icon, show title, episode number, episode title, release date; the show links to /shows/:slug.> - Same check icon and watch logic as the show page (step 4) — reuse, don't copy.- means (the librarian's reading, not the creator's words): Build /unwatched: list unwatched episodes of followed shows, newest release first, only already-released episodes; each row shows check icon, show title, episode number, episode title, release date, show links to /shows/:slug; reuse the show page's check icon and watch logic, don't duplicate it.- 2026-09-27 · **"/shows/:slug shows the poster on the left, right of it the title of the show, the genre pills, below the plot summary, below that the artists just as normal links, separated with comma color red, genres are blue i think, this is the show header. then all sesions in reverse order, latest on top, below them collapsable their episodes episodes first the round check icon, if the episode was watche by the user looking its solid, if not its regular. then the episode number, then the title. the last season is not collpased. click on the check adds a watch. the season also has a check, if the season is checked or unchecked all its episodes get checked or unchecked. artists link to /person/<artist-slug> the genre to /genre/<genre-slug>"** · [tracker.worldapi.org #4 — Step 4: the show page /shows/:slug with seasons, episodes and watch c…](https://tickets.worldapi.org/projects/tracker.worldapi.org/4)- means (the librarian's reading, not the creator's words): Build /shows/:slug exactly as specified: poster left, title/genre pills/plot right, artists below as red comma-separated links, genre pills blue, artist/genre links use slugs; seasons listed reverse-chronological, all collapsible except the latest; each episode shows a check icon (solid disc if the…- 2026-09-27 · **"The old data itself had 36,194 episodes without a season link (and 3 watches without a target) — kept as they were; they can be re-linked by show + season number later."** · [tracker.worldapi.org #2 — Step 2: move the old tracker data into the new app](https://tickets.worldapi.org/projects/tracker.worldapi.org/2)- means (the librarian's reading, not the creator's words): Episodes without a season link and watches without a target were migrated as-is, not dropped or fixed now; a later step may re-link them by matching show + season number.- 2026-09-27 · **"Copy calendar.worldapi.org's login unchanged: the header in components/main.hl with <ident-selector>, users.hl, login.js, and the login routes in project.hl. Open those files in /media/STORAGE/projects/calendar.worldapi.org — not ident's test app."** · [tracker.worldapi.org #1 — Step 1: an empty tracker with the ident login](https://tickets.worldapi.org/projects/tracker.worldapi.org/1)- means (the librarian's reading, not the creator's words): Tracker's login must copy calendar's unchanged (identity selector in header, homepage stays empty, no centered sign-in); rejected for not matching.- 2026-09-27 · **"Step 1 is live (https://tickets.worldapi.org/projects/tracker.worldapi.org/1) — step 2 can start."** · [tracker.worldapi.org #2 — Step 2: move the old tracker data into the new app](https://tickets.worldapi.org/projects/tracker.worldapi.org/2)- means (the librarian's reading, not the creator's words): Tracker step 2 (moving old data into the new app) is now unblocked and may begin; the earlier hold is lifted.- 2026-09-27 · **"Every record gets a NEW mpackdb id. Build the map old id → new id, then re-point EVERY reference: Show.seasons/genres/cast, Season.show/episodes, Episode.show/season, Person.shows, Follow.oid/userId, Watch.oid (episode or season, sometimes a plain string)/userId."** · [tracker.worldapi.org #2 — Step 2: move the old tracker data into the new app](https://tickets.worldapi.org/projects/tracker.worldapi.org/2)- means (the librarian's reading, not the creator's words): Tracker step 2: migrate old MongoDB export into new app db with fresh mpackdb ids via an old→new id map, re-pointing every reference listed; only user is creator (ident az5b2), old password hash dropped; build an idempotent one-off tool in tools/ that prints counts and proves counts match, zero d…- 2026-09-27 · [tracker.worldapi.org #1 — Step 1: an empty tracker with the ident login](https://tickets.worldapi.org/projects/tracker.worldapi.org/1) · the creator wrote:> Step 1: an empty tracker with the ident login>> The new tracker starts as an empty app: sign in with ident, then an empty homepage.> **Test:** open https://tracker.worldapi.org, sign in with ident, see the empty homepage with your name and a sign-out.> **Details:**> - New Hybriel app in its own folder, set up like calendar/notes (vendored Hybriel, deploy script, container, port 45008).> - Login exactly like calendar: ident only, no own passwords.> - Nothing else: no shows, no data, no design from the old app. The next steps come from the creator (see CONCEPT.md).> - Proof: a gate with a real ident copy and a real browser: signed out → sign in → homepage → sign out.- means (the librarian's reading, not the creator's words): Tracker step 1 is a new Hybriel app (own folder, vendored Hybriel, deploy script, container, port 45008) with ident-only login like calendar (no own passwords); build nothing else — no shows, data, or design from the old app; further steps wait for the creator via CONCEPT.md.
Branches
- mainmain branch
Latest commits
- 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
- 94716fd2tracker mission 028 (code order) 2/5 util + topics: lib/util.hl holds envOr, storageDir, postersDir, profilesDir, newId, hexDigits, todayStr, dateOr, textOr, hasId, listOr, firstOf, sortDesc once (were copied into up to 5 files); tmdbsync.hl split into tmdb.hl (TMDB/TVmaze requests), sync.hl (one title's sync), sync-helpers.hl, backfill.hl; details.hl split into details.hl, credits.hl, credits-helpers.hl (isIncomplete to shows.hl); search-helpers.hl (words, query, ranking, slugs); collections.hl (the TMDB collection seed, out of franchises.hl); deltasync.hl renamed dailysync.hl; no behaviour change: gates 342/0, 32/0, 52/0, real-copy pages identicalmre
- 186079b0tracker mission 028 (code order) 1/5 move: every root .hl except project.hl into lib/ (styles.hl into components/), import paths only; gates 342/0, 32/0, 52/0; real-copy pages identicalmre
- 4f47f181tracker: report 027mre
- dc1d4be4tracker mission 027: Hybriel master 06617221 vendored (plugin allocator fixes 3a781359 + 413f60e4); real copy RSS through first-start jobs + 400 loads flat ~2.55 GB (190aa11d 2.3 -> 5.6 GB), page times <= 1.1x; gates 342/0, 32/0, 52/0mre
- 84e1b3e1tracker: reports 025 + 026mre
- dc40d859tracker#31 (mission 026): duplicate titles merged — the 68 type+tmdbId pairs held by 157 records were the old tracker's (all migrated); merge.hl repair job (own clock, before the TMDB jobs) keeps one keeper per title (follows/watches > old short id > oldest), moves follows, watches, seasons, cast, credits, timelines, tombstones the rest (mergedInto, never deleted), slugs + short ids 301 to the keeper; stray seasons merged into their listed twin (Reacher S3 watches) or linked when watched; search import re-checks before its put; deploy.sh waits up to 90 s for 200; real copy 68 -> 0 dup ids, az5b2 follows/watches equal; gates 342/0, 32/0, 52/0mre
- 2667da05tracker#30 (mission 025): /my/ pages from slim cached title cards, episode rows and watch sets (after the jobs /my/series 1.8 s -> 0.06 s, /my/unwatched 4.1 -> 0.18 s); timeline page shows its name once; franchise widget under the poster/title; movies with TV leftovers (First Contact) go through the details repair; tools/count-tmdb-ids.hl; gates 327/0, 52/0, 32/0mre
- 3909810dantcolony#40: mission references in README/STATUS/docs point to the moved missionsmre
- e63b1d28antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
- 1cda451dtracker: Hybriel master 190aa11d (#127 both shapes, GC correctness fc838894) — conductor adopts despite /my/series 2.4x after jobs (memory 8.0 → 1.7 GB boot); see reports/071mre
- c1fa2f2etracker (mission 071): Hybriel master 190aa11d measured on the real copy vs the live binary 8590df63 — NOT adopted (after the first-start jobs /my/series 2.4x slower, /series 1.6x, RSS swings 7.4-12.2 GB; fresh it is flat at 1.7-2.2 GB and /my/unwatched faster), vendor stays 8efba065, candidate kept in .scratch/w071/vendor-190aa11d; tests/kinds.mjs: collection seed off (its TMDB request broke check 1 in 1 of 4 runs); tests/realdata-071.sh + realdata-071-bench.mjs + tools/realdata-071-table.py; README + STATUS (numbers, how to repeat); gates 325/0, 32/0, 50/0mre
- 8081350atracker docs (mission 070): README (summary, Config HL_GC_BYTES — kept at Hybriel's default, the 256 MiB setting is taken out of docker-compose.yml again: the jobs grew to 12+ GB with it too, see STATUS), Test (three gates), Deploy (first start ~50 min: kinds then seed, restart once after collections done, memory numbers), Vendored Hybriel 8efba065 + #48 audit, Files; STATUS mission 070 entry (merges, migrated counts, lambda audit, gates, RSS old vs new, how to repeat, open points); docs/kinds.md + docs/franchises.md job order; tests/realdata-070-*.sh, tools/count-migrated.hl, tools/ref-params.py, tools/lambda-audit.pymre
- 1ad19c8ctracker: re-vendor Hybriel master 8efba065 (#126 GC by bytes, #48 lambda parameters copy) (mission 070): bin/hybriel sha256 50361e95…, plugins core crypto data fetch fs http http1 mpackdb proc smtp time web; lambda audit: 13 lambdas change a passed record/list (11 through a local alias), no caller relies on it — unchanged; 319 read-only lambda parameters get & (no copy per call: /my/schedule 2.35 → 0.46 s, /my/unwatched 13.7 → 5.7 s on the real copy); /my/unwatched one merge sort instead of n² inserts; docker-compose HL_GC_BYTES=268435456; deploy.sh runs kinds.mjs + franchises.mjs too (default ports 8700–8710); tests/realdata-070.mjs; gates browser 325/0, kinds 32/0, franchises 50/0mre
- 46b21389tracker (mission 070, conductor): the sync never destroys migrated data — the one-time summary step MOVES a copied summary to migratedSummary (marker summaries-moved.txt) instead of clearing it; a migrated record's first title/genres/homepage/tagline TMDB replaces → migratedTitle/migratedGenres/migratedHomepage/migratedTagline, a migrated season's/episode's title/summary → migratedTitle/migratedSummary (set once); tests/peek-shows.hl prints them; gate 325/0mre
- 749019b0Merge t19 (tracker#19 franchises + timelines) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/browser.mjs/faketmdb.mjs, both sides kept; franchise/timeline pages get #20's typed heading (Franchise | …, Timeline | …), their title links via titlePath (/movies|/series|/shows); the collection seed waits for repair, kinds and credits too; franchises.mjs URLs + 2 new checks; gates browser 323/0, kinds 32/0, franchises 50/0mre
- daf49feaMerge t20 (tracker#20 typed headings + #21 series/shows split) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/search.hl/components/search.hl/browser.mjs/faketmdb.mjs, both sides kept; clock order backfill → repair → kinds → credits; withDetailsFields stores tmdbType + kind; gates: browser.mjs URLs → /series|/movies, typed h1 selectors; kinds.mjs repair/credits off, fixture name = seed name; browser 323/0, kinds 32/0mre
- 20e09d89Merge t18 (tracker#18 delta sync) into main (mission 070): conflicts README/STATUS/show.hl/project.hl/browser.mjs, both sides kept; pageShowOf summary = summaryOfmre
- f83571c3tracker#18 (mission 067): daily sync by change lists — TMDB /tv|movie/changes (since the stored day, paged) + TVmaze /updates/shows → only our changed titles (followed: full step, unfollowed: light step — changed seasons, no TVmaze), full walk on first run / gap > 14 days / failed list; show record refreshed (title, tmdbSummary, tagline, status, genres …; renamed titles re-indexed); summary = the creator's own text (page: summary > tmdbSummary > tvmazeSummary), one-time clear of copied summaries (9,647 on the live copy); gate 261, tests/realdata-018*.mjs, README + STATUSmre
- 1ed5457etracker#20 + #21 (mission 068): typed headings "<Type> | <name>" in type colours; TV titles split into Series (/series) and Shows (/shows) by TMDB type + Reality/Talk/News genres — kind stored by sync/import/adult backfill + new kind backfill (resumes), /movies/<slug>, /shows/<slug> of a series/movie → 301, /my/series + /my/shows, home 5 tiles + 3 rows, search/filmography labels; gates kinds 32 + browser 266, tests/realdata-068.mjs, tools/count-kinds.hl, docs/kinds.md, README + STATUSmre