opencode-config/docs/decisions/025-pr-61-drop-hardcoded-repo-in-review-tools.md
Sergey f96acaaa75
fix(tools): drop hardcoded --repo in post-review/post-docs-review (#61)
* fix(tools): drop hardcoded --repo in post-review/post-docs-review

* fix(skills): sync run-pipeline templates to use review tools

* fix(agents): add tool failure handling to reviewer/docs-reviewer

* docs(adr): supersede ADR-019 with hardcoded repo removal note

* docs(handoff): scaffold handoff and ADR for PR

* docs(handoff): set PR number

* fix(ci): reformat post-review/post-docs-review test asserts for ruff format

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-25 03:55:50 +03:00

36 lines
No EOL
5.3 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.

# ADR-025: Drop hardcoded --repo in post-review/post-docs-review tools
## Статус
Accepted (2026-07-25)
## Контекст
`post-review.ts` и `post-docs-review.ts` (созданы в ADR-019, PR#46) хардкодили `--repo slaid098/opencode-config` в вызове `gh pr comment`:
```ts
const r = spawnSync("gh", ["pr","comment", String(args.pr_number), "--body", comment, "--repo", "slaid098/opencode-config"], { encoding:"utf-8", cwd: context.worktree })
```
Флаг `--repo` перегружает auto-detect — `gh` игнорирует `cwd` (context.worktree) и всегда постит в `slaid098/opencode-config`, независимо от репо в котором идёт работа. ADR-019 сознательно отклонил параметризацию `--repo` как "out of scope. Сейчас tools специфичны для slaid098/opencode-config". Затем tools установили глобально (применимы ко всем репо), но хардкод не пересмотрели — стал багом.
**Симптомы:**
1. При работе в репо ≠ opencode-config коммент постится в opencode-config PR (по номеру), а не в целевой репо.
2. При коллизии номеров PR (PR#29 существует в `opencode-config` и `opencode-voice-dictation`) `gh` возвращает exit 0 даже на MERGED PR — tool рапортует успех без верификации.
3. `pipeline-status.py` (правильно деривит репо из `git remote`) видит 0 комментов на целевом PR → pipeline застревает на DOCS/REVIEW phase.
4. Подтверждено: 5 misrouted "Docs Review" комментов на opencode-config PR#29, предназначавшихся voice-dictation PR#29.
**Асимметрия:** `create-issue.ts`, `create-pr.ts`, `merge-pr.ts` НЕ передают `--repo` — полагаются на auto-detect из `context.worktree`. Только post-review/post-docs-review хардкодили.
**Дополнительно:** расхождение между промптами агентов (`reviewer.md:218`, `docs-reviewer.md:198` — предписывают tool) и skill-шаблонами (`run-pipeline/SKILL.md` Template B/C — предписывали raw `gh pr comment`). Оба пути разрешены, но code smell.
## Решение
1. **Убрать хардкод `--repo slaid098/opencode-config`** из `post-review.ts:16` и `post-docs-review.ts:16`. Теперь `gh pr comment N --body <comment>` без `--repo` → gh auto-detect'ит репо из `context.worktree` (cwd), симметрично с `create-pr.ts`/`merge-pr.ts`/`commit.ts`.
2. **Синхронизировать `run-pipeline/SKILL.md`** Template B (docs-review) и Template C (code_review): raw `gh pr comment M --body "## ... Summary\n..."` заменён на `post_docs_review({ pr_number: M, verdict: ..., body: ... })` / `post_review({...})`. Один canonical путь (tool), формат гарантирован zod-enum.
3. **Добавить инструкцию обработки сбоя tool** в `reviewer.md` и `docs-reviewer.md`: если tool вернул `⚠️ ...failed` — СООБЩИ оркестратору и STOP, не fallback на raw `gh pr comment`. Раньше инструкции не было — агент мог игнорировать сбой (вероятная причина PR#29 silent failure).
4. **Тесты обновлены:** `test_spawnsync_args` утверждает `--repo` НЕ в args (было `args[repo_idx] == "slaid098/opencode-config"`) и что args заканчиваются на `--body <comment>`.
5. **ADR-019 дополнен** секцией "Superseding note (PR#60)" — зафиксирован пересмотр решений.
## Альтернативы
- **Параметризовать `--repo` через `git remote get-url origin`** (как ADR-007 для pipeline-status.py) — отклонено: достаточно убрать хардкод, gh auto-detect из cwd справляется. Параметризация добавила бы код без выгоды (create-pr/merge-pr уже работают без неё). ADR-019 rejected alt пересмотрена.
- **Оставить хардкод + параметризовать через env var `GH_REPO`** — отклонено: env var неявная зависимость, auto-detect из cwd надёжнее и симметрична с остальными tools.
- **Запретить raw `gh pr comment*` в allow-list (принудить к tool)** — отклонено для этого PR: оставлено для обратной совместимости. SKILL.md теперь однозначно предписывает tool, расхождение устранено. Strict deny — отдельный PR (см. ADR-019 rejected alt).
- **Валидировать что comment реально запощен (post-hoc check через `gh pr view N --json comments`)** — отклонено: добавляет network round-trip и сложность. Tool уже возвращает `⚠️ ...failed` при non-zero exit — достаточно инструкции "STOP при ⚠️" в промптах (шаг 3).