* 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>
5.3 KiB
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:
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 установили глобально (применимы ко всем репо), но хардкод не пересмотрели — стал багом.
Симптомы:
- При работе в репо ≠ opencode-config коммент постится в opencode-config PR (по номеру), а не в целевой репо.
- При коллизии номеров PR (PR#29 существует в
opencode-configиopencode-voice-dictation)ghвозвращает exit 0 даже на MERGED PR — tool рапортует успех без верификации. pipeline-status.py(правильно деривит репо изgit remote) видит 0 комментов на целевом PR → pipeline застревает на DOCS/REVIEW phase.- Подтверждено: 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.
Решение
- Убрать хардкод
--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. - Синхронизировать
run-pipeline/SKILL.mdTemplate B (docs-review) и Template C (code_review): rawgh pr comment M --body "## ... Summary\n..."заменён наpost_docs_review({ pr_number: M, verdict: ..., body: ... })/post_review({...}). Один canonical путь (tool), формат гарантирован zod-enum. - Добавить инструкцию обработки сбоя tool в
reviewer.mdиdocs-reviewer.md: если tool вернул⚠️ ...failed— СООБЩИ оркестратору и STOP, не fallback на rawgh pr comment. Раньше инструкции не было — агент мог игнорировать сбой (вероятная причина PR#29 silent failure). - Тесты обновлены:
test_spawnsync_argsутверждает--repoНЕ в args (былоargs[repo_idx] == "slaid098/opencode-config") и что args заканчиваются на--body <comment>. - 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).