**⚠️ Це РЕКОМЕНДАЦІЇ, не 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)*
**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)*
**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:
**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` зачистить решту
**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) (якщо не потрібно)
**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.
**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)*
**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.
**What:** Знайти де живуть 5 source JS-файлів (`ad-config.js`, `ad-core.js`, `ad-mute.js`, `vast-preroll.js`, `ad-bootstrap.js`) — `frontend_<port>/views/static/js/` чи shared. Записати у ADS.md.
## D-canonical-archive — Canonical points to `/v/` instead of archive URL pattern (13 sites)
**Зона:** Backend (admin/dev) — потребує kor reboot.
**Symptom:** На archive routes (`/v/arch/`, `/v-cache/`, `/v/stored/`, etc. per CSV new-url-pattern) canonical link генерується як `/v/<id>/...` (standard) замість archive URL. Robots `noindex,follow` правильно set, але canonical не reflects archive.
**Root cause:** `views/id_index.etlua` line ~90 hardcodes `/v/`у canonical generation. Frontend не має access до runtime URL (`ngx.var.uri` not accessible у etlua context, `mysettings.cur_uri` not set).
**Reference (8161 has partial setup):**
-`var.archive_video_dir = "/v-arch/"`
-`var.canonical_without_archive = 1` — explicit strip → canonical = standard `/v/` (BY DESIGN для 8161)
-`app.lua` line 2408-2409 використовує `archive_video_dir` для URL formation
**Fix per site (13 sites — крім 8161 яке by design strip):**
```lua
-- lib/<port>/var.lua
var.archive_video_dir = "<new-pattern-per-CSV>" -- e.g. "/v/arch/" для 8159
**Frontend template** (`id_index.etlua`) можливо потребує adjustment коли backend exposes `mysettings.cur_archive_path` чи similar — depending on app.lua implementation.
Reported 2026-05-05 by user audit на 8159 → bug confirmed на ВСІХ 13 sites with archive routing setup.