* fix(agents): add safe read-only commands to reviewer bash allow-list * docs(adr): add ADR-085 reviewer allow-list expansion rationale * docs(handoff): add handoff for reviewer allow-list expansion * docs(handoff): set PR number --------- Co-authored-by: opencode-agent <agent@opencode.local>
4.5 KiB
4.5 KiB
pr: 193 title: fix(agents): add safe read-only commands to reviewer bash allow-list
Что сделано
- Расширён bash allow-list в
.opencode/agents/reviewer.mdбезопасными read-only командами:dateиdate *— временные метки (лог показал 313 срабатываний catch-all, среди нихdate +%Y-%m-%d)sed -n *— печать диапазона строк без авто-вывода (-nподавляет,pпечатает)sortиsort *— сортировка в stdoutsort * -o *: deny— defense-in-depth:sort -o out.txtпишет файл через процесс, обходedit: deny(аналог ADR-005 про echo). Поставлен ПОСЛЕsort *: allow(findLast → deny побеждает для-oварианта, allow для остальных).
- Паттерн
git ls-files*оставлен без изменений (уже присутствует в allow-list, строка 66). Проверка glob-matching в opencode:git ls-files*без пробела матчитgit ls-files(без аргументов) иgit ls-files<anything>включаяgit ls-files .opencode/skills/— паттерн корректен. Срабатывание catch-all в логе — вероятно артефакт устаревшей версии или другой причины; паттерн формально верен и не требует правки. - Создан ADR-085 (
docs/decisions/085-pr-193-reviewer-bash-allowlist.md) с обоснованием и risk-assessment дляsed -n ... wиdate --set. - Guard-скрипт
check-permissions.pyзапущен — новые правила не флагуются как опасные (exit 0). - Global mirror
~/.config/opencode/agents/reviewer.mdсинхронизирован через skillconfigure-opencode(edit in workspace → commit → push → pull на хосте; НЕ прямой правкой, согласно ADR-078).
Почему
Анализ opencode.log (202 740 строк) выявил 313 срабатываний catch-all "*": deny в reviewer.md. Среди заблокированных — безопасные read-only inspection-команды, которые не создают write-bypass, но мешают ревьюеру продуктивно работать (печать диапазона строк, сортировка, временные метки). Catch-all by design (ADR-005 убрал echo * чтобы закрыть bypass), но он блокирует и безопасные команды. Расширение allow-list восстанавливает продуктивность ревьюера без ослабления read-only контракта.
Pending
- После merge:
git pullна хосте + рестарт opencode (MCP/agents грузятся при старте) — правки вreviewer.mdне видны до рестарта. - Для Docker-сетапа:
git pull+docker compose restart opencode.
Watch out
sed -n *с командойw(sed -n '1p; w out.txt') пишет файл внутренними средствами sed — нельзя закрыть через glob. Риск принят как низкий (редкая конструкция, альтернативыcat/head/tailнеудобны для больших файлов). См. ADR-085 Risk Assessment.date --set="..."меняет системное время. В контейнере обычно нет root, на хосте нужен sudo (не в allow-list). Риск принят. См. ADR-085.sort * -o *: denyдолжен стоять ПОСЛЕsort *: allow(findLast). При перестановке правил deny перестанет работать.- НЕ добавлены write-bypass команды:
echo *(ADR-005),cp,awk(может>),xxd(может-r),sedбез-n(можетw/i/c). edit: denyи catch-all"*": denyсохранены — read-only контракт ревьюера не нарушен.- Спека issue #191 содержала опечатку: номер ADR указан как
084(max+1), но084уже занят (084-pr-192-add-boosty-chat-id-env.md). Использован085(фактический max+1 согласно ADR-079). Зафиксировано, продолжено без отклонений.