Files
vtube/docs/RECOMMENDATIONS.md
goboss a9db23dfa4 initial: tubev infrastructure docs
- CLAUDE.md lean entry-point + index
- BOT_WORKFLOW.md dispatch rules + no-make-work + recommendations cadence
- SITES.md 14 ports inventory
- SYNC_WORKFLOW.md 2 sync paradigms
- MODULES.md module map + DEL_/test/obfuscated flags
- REFACTOR_RULES.md REFACTOR vs CLEANUP vs BUG vs FEATURE
- RECOMMENDATIONS.md initial backlog from gocc1+2+3+4 audits 2026-04-30
- docs/roles/ 4 bot roles
2026-04-30 14:18:23 +00:00

231 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 з `<meta http-equiv="Content-Security-Policy" ...>`
**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_<lang>.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_<page>.etlua`), 8148 (no folder)
**Why:** 11/14 use `css_<page>.etlua` pattern → решта 3 не вписуються.
**What:** Привести 8084/8086/8148 до `css_<page>.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)*