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

5.3 KiB
Raw Permalink Blame History

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 установили глобально (применимы ко всем репо), но хардкод не пересмотрели — стал багом.

Симптомы:

  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).