Files
vtube/docs/BOT_WORKFLOW.md

235 lines
10 KiB
Markdown
Raw Normal View History

# Bot & goboss workflow — обов'язкові правила
Durable spec для всіх Claude-ботів (gocc1..4) і goboss-планувальника. Project-agnostic.
**Головне правило:** не патчимо "на око". Думай → план → роби. No hardcodes, no patches, SSOT-first, architectural over patches.
## NO MAKE-WORK rule (CRITICAL)
**НЕ давати ботам задачі з пустого в порожнє.** Кожен dispatch має конкретну причину:
- ✅ developer запитав audit / refactor / fix
- ✅ HIGH severity finding з попереднього report потребує follow-up verify
- ✅ нова area не покрита попередніми звітами (concrete gap)
- ✅ regression/test після коміту з реальними змінами
**Не валідні тригери (НЕ робити):**
- ❌ "давай ще раз перевіримо" без нової причини
- ❌ "audit того ж самого через тиждень — раптом щось зміниться"
- ❌ make-work cross-audit / regression / research коли нічого не змінилось
- ❌ дублювання попереднього task'у з той ж scope
Якщо нема валідного тригера — task file = `Чекай.`. Не вигадуй роботу.
## Recommendations cadence (для goboss)
На початку кожної session goboss перевіряє `docs/RECOMMENDATIONS.md`:
- Скільки items OPEN по severity
- Що додано з last session
- Згадай developer-у (1 рядок: `📋 RECOMMENDATIONS: N OPEN (X HIGH, Y MEDIUM, Z LOW). Найпріоритетніше: ...`)
- НЕ виконуй items самостійно — чекай developer-go
---
## Частина A — для goboss (planner)
### A1. Планування перед dispatch
Перед task file для бота goboss МУСИТЬ:
1. **Scope** — one-liner: що зробити, які файли, який контракт.
2. **Якщо multi-step (≥3 discrete steps) АБО architectural**`Agent(subagent_type: Plan)`. Результат — concrete step-by-step з critical files і trade-offs.
3. **Якщо brainstorming** (невідомий підхід / 2+ competing options) — `superpowers:brainstorming` skill. Записати decision + reasoning у task.
4. **SSOT check** — чи є вже helper/module для цього? Використовуй існуюче.
5. **Recent commits**`git log --oneline -20` — щоб не дублювати.
### A2. Architectural fixes, not patches
Якщо помилка зустрічається 2+ рази з того ж root cause → REDESIGN, не FIX по одному разу.
`feedback_architectural_not_patches` memory — якщо існує.
### A3. Перевірка cherry-pick'ів
Після cherry-pick bot-зміни:
1. Smoke (`pytest tests/test_<feature>.py -q`)
2. Full regression (`./run_tests.sh` або `pytest -q`)
3. ≥3 commits разом без verify → `gocc2` на drift-check audit
4. Push + verify health endpoint
5. Update `docs/ROADMAP.md` (якщо проект має) у тій самій сесії
### A4. Code review після great IMPL
Після кожного MAJOR step (refactor, new SSOT module, multi-file migration):
1. `Agent(superpowers:code-reviewer)` на результат
2. Передати: commit hash, changed files, task spec link
3. Issue → fix inline АБО queue follow-up PR
---
## Частина B — для ботів (executor)
### B1. Before coding — planning phase
Перед першим code edit:
1. Прочитай task ПОВНІСТЮ.
2. Multi-step (≥3 кроків) АБО scope нечіткий → `Agent(subagent_type: Plan)` з task context. Plan = checklist.
3. Architectural decision → `superpowers:brainstorming` skill. `## Decision` block у report.
4. Unclear → ЗАПИТАЙ goboss (через partial report з `QUESTION:` block). НЕ ВГАДУЙ.
### B2. No hardcodes — SSOT first
Перед кожним новим літералом (path, model name, URL, retry count, language code):
1. `grep -rn "<literal>" config/ lib/`
2. Існує → IMPORT
3. Немає → додай у `config/<domain>.py` як module-level const, потім import
Never:
- `API_KEYS = ['xxx']` у коді (use env)
- `DATA_DIR = '/var/lib/...'` у коді (use config)
- `MAX_RETRIES = 3` у двох файлах (extract до `config.retry`)
### B3. No patches — architectural fixes
Bug знайдено:
1. Root cause (не симптом)
2. Локальний → fix inline + regression test
3. ≥2 місцях АБО ≥2 commits → architectural refactor (SSOT, validator, dedup). НЕ копіюй fix у N місць.
### B4. Test coverage
Кожна нова public function / class / module:
- 1 smoke (happy path)
- 1 edge (empty/invalid/failure)
- 1 integration якщо side effects (DB, HTTP, FS)
Test name: `tests/test_<module>_<feature>.py`. Новий endpoint = новий test.
### B5. Pre-push code review
Після commit, ДО report:
1. Re-read diff (`git diff HEAD~1`)
2. Constraint check проти task spec
3. Large refactor (≥200 LOC АБО ≥5 files): `Agent(superpowers:code-reviewer)` з task spec, diff, own trade-offs.
4. Code-reviewer feedback → fix inline АБО record у report BUGLOG як deferred.
### B6. Report structure
Кожен report МУСИТЬ мати у цьому порядку:
1. **Status** (READY / BLOCKED / FAILED)
2. **Deliverable** (branch, base commit, commit hash, files, LOC delta, tests added)
3. **Scope summary** (3-5 bullets)
4. **Decision notes** (якщо archi — варіант + чому)
5. **Test coverage** (per-module)
6. **Full regression** (pytest tail)
7. **Hardcode self-check** (grep — 0 hits)
8. **BUGLOG** (touched OR deferred)
9. **Deviation** (де відхилився від spec + чому)
10. **Signal** (filename for auto-hook trigger)
---
## Частина C — task file template
```markdown
# Task: <one-line scope>
**Assignee:** gocc<N> (<READ-ONLY AUDIT | IMPL | DECISION>)
**Origin:** <link to prior report / TODO / audit finding>
**Base:** `origin/main` @ `<commit-sha>`
## Workflow requirements (per docs/BOT_WORKFLOW.md)
- **Before coding:** `Plan` agent якщо multi-step; `brainstorming` skill якщо archi
- **SSOT check:** grep existing constants; import not copy
- **After major step:** `Agent(superpowers:code-reviewer)` на commit+diff
- **No patches:** recurring bug = root cause refactor
- **Report:** 10 sections per §B6
<!-- task spec -->
```
---
## Частина D — enforcement + exceptions
### D1. Enforcement
- Report без required sections (§B6) → goboss повертає `MISSING: <sections>`
- Bot patch замість architectural → goboss queue додатковий PR на refactor
- Bot пропустив SSOT, hardcode landed → goboss inline-fix + memory update
### D2. Exceptions (без планів)
Не потрібно planning overhead для:
- Trivial 1-file fix (typo, rename, const update)
- READ-ONLY audit (план = task spec sections)
- Doc-only update
- Emergency rollback (`git revert` — явно)
Bot вважає task — exception → ЗАПИШИ у report `## Planning skipped` з reasoning. goboss review.
### D3. Rollback on violation
Architectural violation post-merge (hardcode landed, patch замість refactor):
1. `git revert <commit>` (not --force, not amend)
2. Dispatch новий PR з proper fix
3. Update `feedback_<violation>.md` memory
---
## Частина E — operational procedures (goboss → bot dispatch)
### E1. Порядок dispatch
1. Запиши task у `~/comms/gocc{N}-task.md` з **унікальним Task ID**.
2. Тригер: `~/bin/trigger-bots gocc{N}` (або `~/bin/trigger-bots` для всіх).
`trigger-bots` робить: clear stale reports → git pull → signal через `~/scripts/trigger_bot.sh` (flock-serialized, paste-buffer + dual-Enter + verify).
### E2. Якщо бот не реагує
- `` prompt — Claude процес мертвий
- НЕ Ctrl-C (вбиває Claude)
- Use `~/bin/restart-bots gocc{N}` — kill-session → start-devs → wait 20s → trigger одним скриптом
### E3. Тригер ботів (нова задача)
```bash
~/bin/trigger-bots # всі gocc1-4
~/bin/trigger-bots gocc2 # один
~/bin/trigger-bots gocc1 gocc3 # subset
```
### E4. Повний перезапуск
```bash
~/bin/restart-bots # всі: kill+start+wait+trigger
~/bin/restart-bots gocc4 # один
```
**НІКОЛИ ручний `tmux kill-session`** — використовуй `restart-bots`.
### E5. Task ID правила
- Кожна нова task = новий унікальний Task ID
- Формат: `[goboss YYYY-MM-DD] Task ID: НАЗВА-ЗАДАЧІ`
- Бот порівнює task Task ID vs report Task ID — якщо однакові → "Чекаю.", різні → виконує
- При restart — clear report files перед trigger (restart-bots робить автоматично)
### E6. Context clear policy
`~/bin/clear-bots` (per-bot subset) — використовуй коли:
- Новий епох незалежний від попереднього (different feature/area)
- Контекст ≥30% з 1M (бот сам пише `⚠️ CONTEXT HEAVY` у report)
- Послідовний follow-up на ту саму задачу — НЕ кліри
### E7. Communication scripts (КАНОНІЧНІ)
- `~/scripts/send_to_goboss.sh "<msg>"` — bot → goboss (flock, idle-wait, verify)
- `~/scripts/trigger_bot.sh <session> "<msg>"` — goboss → bot (flock, idle-wait, verify)
- НІКОЛИ raw `tmux send-keys` для quoted text — guard блокує
---
**Reference memories:** `feedback_bot_verification`, `feedback_pre_push_subagent`, `feedback_signal_flood_mutex`, `feedback_simple_no_details`, `reference_bot_comms`.