Files
vtube/docs/REFACTOR_RULES.md

128 lines
6.4 KiB
Markdown
Raw Permalink Normal View History

# Refactor / Cleanup / Bug-fix / Feature — definitions
**Чотири типи змін.** Кожна задача має ідентифікувати свій тип. Це визначає:
- Тригер (хто запитує: developer / audit / автоматичний)
- Scope (skill rough effort)
- Тестування (regression / smoke / нове)
- Як комітити (commit message prefix)
---
## REFACTOR
**Що це:** зміна **структури** коду без зміни поведінки. Goal — clearer code, less duplication, easier maintenance.
**Не змінює:**
- HTTP responses (statuses, JSON shape, HTML output byte-for-byte для existing inputs)
- DB schema (без migration)
- API contracts
- Visual rendering for users
**Приклади у tubev:**
- Винести `modules/video.etlua` у shared partial з per-site theme overrides → 14 сайтів дають однаковий HTML output, але код DRY (відсутнє ~60% дублювання)
- Розбити `8081/views/layout.etlua` 1223L монолітом на partials аналогічно іншим 13 сайтам → той же rendered HTML, чистіша структура
- Уніфікувати `sync.sh` на rsync-парадигму (7 selective → 7 rsync) → той же файловий результат, єдина mental model
**Тестування:**
- **Regression smoke** — той же rendered HTML before/after на тестовому сайті
- **Diff snapshot** — `curl <before> vs curl <after>` має бути identical
- Якщо diff — це BUG у refactor, треба фіксити
**Комміт:** `refactor: <scope>: <change>`
**Хто запитує:** developer (`go: refactor X`). НІКОЛИ боти/goboss самостійно — тільки коли явна директива.
---
## CLEANUP
**Що це:** видалення **dead code / dead files** які точно не використовуються.
**Не змінює:**
- Нічого, бо видаляється тільки те що було не задіяне.
**Приклади у tubev:**
- Видалити `DEL_*.etlua` (24 файли × 6 сайтів) — префікс DEL_ явно signals tombstone
- Видалити `*copy*.etlua`, `*_bak*.etlua`, `*_old/` папки — backup-via-rename артефакти
- Видалити `_test.etlua`, `.test.js` з prod tree — tests не у prod
- Видалити legacy UA-* GA snippets (Universal Analytics EOL 2023-07)
**Verification перед видаленням:**
- `grep -rn "<filename>" backup_<port>/` — чи десь reference?
- Якщо posicionado — re-classify як refactor (треба міняти reference спершу)
- Якщо unreferenced — safe to delete
**Тестування:**
- Sync.sh re-run → backup ідентичний прод (для rsync mirror sites)
- Smoke render головних сторінок — нічого не зламалось
**Комміт:** `cleanup: <scope>: remove <what>`
**Хто запитує:** developer ("видали DEL_*"). Боти **знаходять** і **рекомендують** у RECOMMENDATIONS.md, але не видаляють самі без явного go.
---
## BUG-FIX
**Що це:** код **неправильно** працює, треба виправити.
**Змінює поведінку — навмисно**, бо поведінка була некоректна.
**Приклади у tubev:**
- 8112 має 2 GA properties у одному gtag — likely баг (gtag config записує на дві property)
- 8085 submodule `views/static/js/lib` drift — modified reference але не committed; treba decide rollback або commit
- Site domain hardcoded у CSP `<meta>` — правильніше через nginx HTTP header
- `header copy bogolink 25_10_22.etlua` (8112) — typo в назві файлу = drift від 4 інших сайтів
**Тестування:**
- Reproducer test (показує проблему)
- Fix test (показує що пофіксено)
- Regression — нічого іншого не зламалось
**Комміт:** `fix: <scope>: <symptom> → <root cause>`
**Хто запитує:** будь-хто (developer, audit, користувач). Bots HIGH severity findings → goboss flagує developer-у.
---
## FEATURE
**Що це:** **нова поведінка** яка раніше не була доступна.
**Приклади у tubev:**
- Винести `views/config/site.lua` (новий конфіг файл) → нова можливість централізованого управління site_domain / GA ID / CDN host
- SRI integrity для third-party scripts → нова security guarantee
- Build-step для 8148 (винести з sync.sh) → нова функція автоматизації
**Тестування:**
- New tests для нової поведінки (smoke + edge + integration)
- Regression — нічого не зламалось
**Комміт:** `feat: <scope>: <new behavior>`
**Хто запитує:** developer / product. Боти не пропонують features самостійно.
---
## Як вибирати
| Зміна | Type |
|-------|------|
| "Винести в shared module / extract / DRY-it" | **REFACTOR** |
| "Видали мертве" / "забрати DEL_*" / "wipe legacy" | **CLEANUP** |
| "Не працює як треба" / "неправильна відповідь" / "конфлікт даних" | **BUG-FIX** |
| "Додай нове" / "тепер можна X" / "нова кнопка/endpoint" | **FEATURE** |
Якщо змішується — розбий на окремі коміти, **по одному типу на commit**. Mixed commits ламають revert / cherry-pick.
---
## Recommendations vs Plans (важливо)
**Recommendation** = "ось що варто зробити, ось чому, ось приблизний effort".
**Plan** = "ми зараз робимо наступне: ...".
Боти створюють recommendations у [RECOMMENDATIONS.md](RECOMMENDATIONS.md). **Plans створюються тільки коли developer каже "зробити"**.
goboss **не виконує** recommendations самостійно. Тільки нагадує developer-у періодично через session-start summary поки developer не скаже "роби X" або "видали X з backlog".