# tubev — Recommendations Backlog
**⚠️ Це РЕКОМЕНДАЦІЇ, не PLANS.** Кожен пункт виявлено через audit (gocc1+2+3+4 на 2026-04-30) і чекає developer-go перед виконанням. goboss періодично нагадує про unprocessed items на session start.
Типи: **REFACTOR** (структурна зміна без зміни поведінки) / **CLEANUP** (видалення dead code) / **BUG** (неправильна поведінка) / **FEATURE** (нове). Деталі: [REFACTOR_RULES.md](REFACTOR_RULES.md).
---
## 🚨 HIGH severity — Security
### S1. SRI / integrity для third-party JS *(BUG/FEATURE)*
**Where:** layout*.etlua усіх 14 сайтів
**Files:** `ajax.googleapis.com/.../jquery.min.js`, `cdn.jsdelivr.net/...flatpickr/pikaday`, `verifycdn.agego.com/v1/verify.js`, `https://a5.g--o.info`, `https://t1.tubev.sex/static/js/{interdata.min,sync}.js`
**Why:** Compromise CDN → arbitrary JS у браузері користувача. Особливо `agego.com`, `g--o.info` — third-party без вашого контролю.
**What:** pin-version + `integrity="sha384-..."` для кожного CDN script ABO self-host.
**Effort:** M (2-4h per site, batch'ами)
**Status:** OPEN. Чекає developer-go.
### S2. Origin audit obfuscated JS *(BUG)*
**Where:** 10+ файлів random-name JS, не у sync.sh
**Files:** `c24c4cd9.js`, `N7Ym4F.js`, `popa.js`, `f4T4s.js`, `gD0A3.js`, `qDap9.js`, `mo.js`, `aOKM9.js`, `9qFdXQ7.js`, `gk5LT.js`, `PxqbeCb.js`, `k3KL5.js`
**Sites:** 8084, 8085, 8102, 8107, 8112, 8126, 8131
**Why:** Підозріло на adblock-bypass payloads ABO malicious drop. Нема git track, нема sync.sh entry, обфусковані імена.
**What:** Audit походження. Якщо ваші → перейменувати + покласти у sync.sh + git track. Якщо невідомі → видалити після перевірки що active loading не залежить.
**Effort:** S (1-2h)
**Status:** OPEN. Питання до developer: ваші чи невідомі?
---
## 🟡 MEDIUM severity
### M1. 8112 — два GA properties в одному gtag *(BUG)*
**Where:** `backup_8112/views/modules/ga/ga.etlua`
**Why:** gtag config містить одночасно `G-CQN2KFSXSG` і `G-WW50B2EGSJ` → дані пишуться на 2 property. Imовірний bug — не сумісно з legitimate analytics workflow.
**What:** Підтвердити з developer який ID правильний. Видалити інший.
**Effort:** XS (15 min)
**Status:** OPEN. Питання до developer.
### M2. site_domain / GA ID / CDN host → config *(REFACTOR)*
**Where:** layout/header `.etlua` всіх 14 сайтів
**Why:** Site domain hardcoded у CSP `form-action`, `preconnect`, partner logo links. GA IDs hardcoded. CDN hosts hardcoded. Зараз — по N літералів у кожному layout. Drift-prone.
**What:** Створити `views/config/site.lua` (або еквівалент Lua module) з constants:
```lua
return {
domain = "hdsexvideo.xxx",
ga_id = "G-CQN2KFSXSG",
cdn_pic = "cdn-pic.hdsexvideo.xxx",
cdn_video = "...",
partners = { "fulltube.xxx", "nu-bay.com", ... },
}
```
Layout uses `<%= site.domain %>`, `<%= site.ga_id %>`.
**Effort:** M (4-6h)
**Status:** OPEN.
### M3. CSP — meta → HTTP header *(REFACTOR)*
**Where:** layout*.etlua з ``
**Why:** meta-CSP не може встановити `frame-ancestors` / `report-uri`, повільніший за HTTP header. Зараз 8084 (та інші) використовують meta.
**What:** Перенести у nginx config. Може треба developer-side change бо nginx config не наш scope.
**Effort:** S frontend-side / depends backend
**Status:** OPEN. Залежить від developer.
### M4. modules/video.etlua → shared partial *(REFACTOR)*
**Where:** `views/modules/video.etlua` × 14/14 сайтів
**Why:** 67-77% common lines, найвища similarity з усіх модулів. 14 окремих копій що data-loop ідентичний, але class names + tweaks per site.
**What:**
- Extract base partial з `<%= include 'modules/video_base' %>`
- Per-site theme = CSS overrides (не template fork)
- Shared params: `<%= video, css_class, lazy_load %>`
**Effort:** M (4-6h)
**Status:** OPEN. **Найбільший SSOT win** з усіх refactor candidates.
### M5. 8081 layout split *(REFACTOR)*
**Where:** `backup_8081/views/layout.etlua` (1223 рядки monolithом)
**Why:** Outlier. Median решти ~200 рядків. Усі profile_*.etlua унікальні тут — 8081 has different architecture (NL agego, premium fork).
**What:** Розбити на partials аналогічно іншим 13 сайтам (header.etlua + footer.etlua + bottom_block.etlua + main.etlua).
**Effort:** L (8-12h, ПІСЛЯ M4 — щоб 8081 теж пристосувався до shared video partial)
**Status:** OPEN. Залежність: M4.
### M6. 8112 static/ duplicate tree *(CLEANUP/REFACTOR)*
**Where:** `backup_8112/static/{js,css,img,jsplayer,player,trade-th,tmp}` ↔ `backup_8112/views/static/...`
**Why:** Дві ідентичні копії (md5-confirmed). Один live, інший stale.
**What:** З'ясувати який referenced (читай OpenResty config якщо доступно, або питай developer). Видалити інший.
**Effort:** M (2-4h, потребує OpenResty config check)
**Status:** OPEN. Питання до developer.
### M7. 8085 submodule drift *(BUG)*
**Where:** `backup_8085/views/static/js/lib`
**Why:** Modified submodule reference (`m` у git status). Submodule гілка drift'нула від трекованого коміту. Або локальний edit, або prod оновив submodule а tracking — ні.
**What:** З'ясувати з developer: rollback або commit поточний state.
**Effort:** XS (15 min)
**Status:** OPEN. Питання до developer.
### M8. 8086 sync drift — 30+ legacy файлів *(CLEANUP)*
**Where:** `backup_8086/views/`
**Why:** Sync.sh селективно копіює ~25 файлів, але диск містить ~30+ legacy не у sync.sh: `asdadsasd.html`, `layout_bak_25-05-18.etlua`, `id_index_copy_with_cjannels.etlua`, `del___search_top.etlua`, `header_with_country_if.etlua`, `layout_copy_withads.etlua`, plus 24+ модулів.
**What:**
1. Audit чи щось з цього reference'ed у живому layout/modules
2. Unreferenced → видалити
3. Sync 8086 на rsync-парадигму (Group A) — `--delete` зачистить решту
**Effort:** S (1-2h)
**Status:** OPEN.
### M9. 8112 untracked drift *(CLEANUP/BUG)*
**Where:** `backup_8112/{rotator/,lib/,nginx.conf,nginx.conf.compiled,redirect_*.nginx}`
**Why:** Untracked у git, але присутні на disk. `rotator/` має 40+ файлів `1_.txt` (i18n) + `cats.txt` symlink → `/home/nosfortube/frontend_8112/rotator/data/cats.txt`. backup mirror'ить prod app structure частково.
**What:** Or:
- Додати у sync.sh + git track (якщо потрібно у backup)
- Виключити (`gitignore` + не sync) (якщо не потрібно)
**Effort:** S (1h)
**Status:** OPEN. Питання до developer.
---
## 🟢 LOW severity / cleanup
### C1. Видалити DEL_* tombstones *(CLEANUP)*
**Where:** 24 файли × 6 сайтів
**Files:** `DEL_channel_id.etlua`, `DEL_friend_list.etlua`, `DEL_lang.etlua`, `DEL_lang_mob.etlua`
**Sites:** 8100, 8102, 8107, 8112, 8131, 8133
**Why:** Префікс DEL_ явно signals tombstone, але файли досі живуть. Шум grep-у, ризик випадкового деплою.
**Effort:** XS (15 min)
**Status:** OPEN.
### C2. Видалити backup-via-rename артефакти *(CLEANUP)*
**Where:** ~30 файлів з пробілами / " copy" / "with ads" / "without ads" / "with titles"
**Files:** Окремі категорії:
- `header copy bongo link 25_10_22.etlua` × 5 сайтів (8084, 8085, 8112, 8126, 8131; з typo `bogolink` на 8112)
- `id_index copy_ads_actual.etlua` × 2 (8084, 8085)
- `cat_list_thumb with ads.etlua` × 10 (8112)
- `* with titles.etlua` × 5 (8100)
- `untitled file` × 2 (8126)
- `my copy.js`, `machine copy.js`, etc. × 8
**Why:** File names з пробілами ламають shell scripts. Версії повинні бути у git.
**Effort:** S (1h)
**Status:** OPEN.
### C3. Видалити legacy `*_old/` dirs *(CLEANUP)*
**Where:** `backup_8085/views/static/{js_old/,img_old/}` (6+25 файлів)
**Why:** "_old" — explicit legacy marker.
**Verification:** `grep -rn "js_old\|img_old" backup_8085/` → 0 матчів = safe to delete.
**Effort:** XS (30 min)
**Status:** OPEN.
### C4. Видалити legacy UA-* GA *(CLEANUP)*
**Where:** `views/modules/ga/ga.etlua`, `static/js/ga.js`, `layout-orig.etlua`
**Sites:** 8081, 8086, 8100, 8112, 8126
**Why:** Universal Analytics EOL 2023-07-01. UA-* IDs не shipping data, але збільшують attack surface (extra script tag) і гасять performance.
**Files з UA-:** `UA-128492434-7`, `UA-109631925-*`, `UA-105546426-7` (7 унікальних)
**Effort:** XS (30 min)
**Status:** OPEN.
### C5. Видалити paginator_old / video_test варіанти *(CLEANUP)*
**Where:** `views/modules/`
**Sites:** 8084 і 8085
**Files:** `paginator_old.etlua`, `cat_list_thumb_test.etlua`, `cat_index_test.etlua`, `main_list_test.etlua`, `video_test.etlua`, `counters.min.test.js` (8133)
**Why:** Tests / older versions у prod tree.
**Effort:** XS (15 min)
**Status:** OPEN.
### C6. Уніфікувати sync.sh на rsync *(REFACTOR)*
**Where:** 7 selective sites: 8081, 8086, 8112, 8120, 8129, 8133, 8148
**Why:** 7 з 14 уже на ідентичному rsync template (74a6acb…). 7 інших роблять те саме через ad-hoc whitelists. Drift-magnet, важко synced модулі для нових сайтів.
**What:** Замінити selective `cp` allowlists на 12-line rsync template. Виняток — 8148 build-step (виносити окремо в `build.sh`).
**Effort:** S (1h)
**Status:** OPEN.
### C7. 8148 — винести build з sync.sh *(REFACTOR)*
**Where:** `backup_8148/sync.sh` (виконує `sed -i` MUTATION на prod source)
**Why:** sync.sh не повинен мутувати джерело. Build step і sync — різні concerns.
**What:**
- `build.sh` робить ad-bundle build + md5 + sed
- `sync.sh` робить тільки rsync mirror
- Pipeline: `build.sh && sync.sh` — explicit ordering
**Effort:** S (1h)
**Status:** OPEN.
### C8. Naming convention enforcement *(FEATURE/REFACTOR)*
**Where:** Pre-commit hook (per-repo) ABO server-side guard
**Why:** Запобігти повторного появи pробілів у file names, " copy", DEL_*, _test*, obfuscated random names. Інакше backlog буде відновлюватися.
**What:**
- Pre-commit script blocks: `[ a-zA-Z0-9_./-]` чорний список (тільки лат+цифри+`_./- `)
- Block `^DEL_`, `*test*` у production paths
- Document у [docs/NAMING.md](NAMING.md) (TODO P4)
**Effort:** S (1h script + 1h documentation)
**Status:** OPEN.
### C9. Min/non-min JS policy *(REFACTOR)*
**Where:** `c2.{js,min.js}`, `main.{js,min.js}`, `my.{js,min.js}`, `jquery-3.2.1.{js,min.js}` etc.
**Why:** Production = тільки `.min.js`. Dev = source. Зараз обидва у репо — шумно.
**What:** Pre-commit minifier ABO build-step pipeline. Source у `src/`, minified у `static/js/`.
**Effort:** M (3-5h, build pipeline)
**Status:** OPEN. Потенційно потребує developer-side build infrastructure.
### C10. CSS file naming standardization *(REFACTOR)*
**Where:** 8084 (no `views/css/` folder), 8086 (`styles.etlua` instead of `css_.etlua`), 8148 (no folder)
**Why:** 11/14 use `css_.etlua` pattern → решта 3 не вписуються.
**What:** Привести 8084/8086/8148 до `css_.etlua` convention. Якщо вони мають окрему причину (8148 — sprite-driven, не split per page) — задокументувати у [SITES.md](SITES.md) виняток.
**Effort:** S (1-2h)
**Status:** OPEN.
### C11. Cross-site partner logos через config *(REFACTOR)*
**Where:** `header*.etlua`, layout footer-блоки 7 сайтів
**Sites:** 8084, 8085, 8086, 8100, 8102, 8126, 8131
**Why:** Hardlinks на партнерські сайти (`fulltube.xxx`, `hdsexvideo.xxx`, `nu-bay.com`, `gaypornhd.xxx`, `xxxtube1.com`, `fullhdxxx.com`, `maturesexmovies.xxx`) — кожен layout має свої literals.
**What:** Винести у `views/config/partners.lua` як array. Layout iterates.
**Effort:** S (1-2h, після M2 site.lua)
**Status:** OPEN. Залежність: M2.
---
## Reminders cadence
goboss перевіряє цей файл **на початку кожної session** і нагадує developer-у:
- Скільки items OPEN (по severity)
- Що було додано з минулої session
- Найдешевші items (XS-S) — пропонувати спершу
- Найпріоритетніші (HIGH) — окремо помічати
Items з статусом `DONE`, `WONTFIX`, `DEFERRED` переходять у footer цього файлу (history), щоб не плутатися з активним backlog.
---
## DONE / WONTFIX / DEFERRED
*(порожньо — поки нічого не виконано)*
---
*Last update: 2026-04-30 (initial backlog from gocc1+2+3+4 audits)*