* 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.6 KiB
pr: 61 title: fix(tools): drop hardcoded --repo in post-review/post-docs-review
Что сделано
- Убран хардкод
,"--repo","slaid098/opencode-config"изtools/post-review.ts:16иtools/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/post_reviewtool. Устранено расхождение skill-шаблон ↔ промпт (code smell, модель могла выбрать любой путь).- В
agents/reviewer.mdиagents/docs-reviewer.mdдобавлена секция "Tool failure handling": если tool вернул⚠️ ...failed— СООБЩИ оркестратору и STOP, не fallback на rawgh pr comment. Раньше инструкции не было (см. memorypost-review-post-docs-review-tool-vs-skill-discrepancy.md— "Fallback instructions — НЕТ"). - Тесты обновлены:
test_spawnsync_argsвtests/test_post_review_tool.{py,ts}иtests/test_post_docs_review_tool.{py,ts}теперь утверждают--repoНЕ в args (былоargs[repo_idx] == "slaid098/opencode-config") и что args заканчиваются на--body <comment>. Docstring обновлены. Все 24 Python теста проходят. - ADR-019 (
docs/decisions/019-pr-46-review-posting-tools.md) дополнен секцией "Superseding note (PR#60)": зафиксировано убирание хардкода, пересмотр rejected alternative "Параметризовать --repo", устранение расхождения skill-шаблонов, добавление инструкции обработки сбоя.
Почему
post-review.ts/post-docs-review.ts хардкодили --repo slaid098/opencode-config в spawnSync("gh", [..., "--repo", "slaid098/opencode-config"]). Флаг --repo перегружает auto-detect — gh игноряет cwd (context.worktree) и всегда постит в slaid098/opencode-config, независимо от репо в котором идёт работа.
Симптомы (из issue #60):
- При работе в репо ≠ opencode-config (например voice-dictation) коммент постится в opencode-config PR (по номеру), а не в целевой репо.
- При коллизии номеров PR (PR#29 существует в обоих репо)
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 (cross-post incident).
Асимметрия: create-issue.ts, create-pr.ts, merge-pr.ts НЕ передают --repo — полагаются на auto-detect. Только post-review/post-docs-review хардкодили — legacy/oversight из ADR-019 (rejected alt "out of scope. Сейчас tools специфичны для slaid098/opencode-config").
Расхождение skill ↔ промпт: промпты reviewer.md:218, docs-reviewer.md:198 предписывали tool, а run-pipeline/SKILL.md Template B/C предписывали raw gh pr comment. Оба пути разрешены (gh pr comment* в allow-list), но расхождение — code smell.
Pending
— (после мерджа: обновить memory notes technical/post-docs-review-silent-failure-pr-29.md и technical/post-review-post-docs-review-tool-vs-skill-discrepancy.md — пометить resolved, importance high → medium. Делается в этом же PR, шаг 6 спеки issue #60.)
Watch out
- Tool'зы теперь требуют, чтобы
context.worktreeуказывал на git-репо сoriginremote. Из не-git директории/root/workspacegh упадёт с явной ошибкой (лучше тихого misroute). Это ожидаемое поведение — см. ADR-019 superseding note п.5. gh pr comment*остался в allow-listreviewer.md/docs-reviewer.md— raw bash путь технически разрешён, но промпт + SKILL.md теперь однозначно говорят "используй tool". Если захотеть strict tool-only — отдельный PR с deny правилом (см. ADR-019 rejected alt "Запретить raw gh pr comment в allow-list").- TS-тесты (
test_post_review_tool.ts,test_post_docs_review_tool.ts) — документационные, запускаются подbun test(bun runtime недоступен на CI). Реальные assertions в Python-зеркалах, которые запускаются черезtests/_ts_loader.mjs. - Pipeline-status.py regex'ы НЕ изменены — tools генерируют ровно тот формат (
## Code Review Summary+### Verdict: <V>,## Docs Review Summary), который парсятREVIEW_VERDICT_REиDOCS_REVIEW_RE.