fix(reviewer): deny project-status.py oracle script #106

Merged
slaid098 merged 3 commits from fix/reviewer/deny-project-status-oracle into main 2026-08-19 00:27:06 +03:00
Owner

Что сделано

Добавил 5 deny-правил для project-status.py в .opencode/agents/reviewer.md (блок permission.bash), симметрично существующим правилам для pipeline-status.py (строки 63-67) и spec-status.py (строки 68-72):

"python3 *project-status.py*": deny
"python3 .opencode/scripts/project-status.py*": deny
"python3 */project-status.py*": deny
"python *project-status.py*": deny
"python */project-status.py*": deny

Правила размещены сразу после блока spec-status.py, перед "node --version*": allow. Порядок last-match-wins сохранён — deny идут после "python3*": allow / "python *": allow.

Также добавил тест test_reviewer_denies_all_oracle_scripts в tests/test_permissions.py — проверяет, что для каждого из 3 oracle-скриптов есть ровно 5 deny-правил ожидаемого формата. Тест закрепляет контракт ADR-019 и защитит от регрессии (если кто-то удалит/переименует deny-правило, тест упадёт).

Почему

Issue #103: в reviewer.md были deny-правила только для 2 из 3 oracle-скриптов (pipeline-status.py, spec-status.py). Из-за "python3*": allow (строка 61) reviewer мог запустить python3 .opencode/scripts/project-status.py напрямую через bash, обходя нативный tool project-status — нарушение ADR-019 (oracle-скрипты вызываются ТОЛЬКО через нативные tools). vision.md уже содержала все 3 набора правил (после PR #102), reviewer.md отставал — асимметрия.

Watch out

— Отдельно зафиксирован баг #105: check-permissions.py в DANGEROUS_PATTERNS не содержит паттернов для project-status.py (валидируются только pipeline-status.py/spec-status.py). Валидатор проверяет только allow-правила, поэтому deny из этого PR проходят корректно, но если какой-то агент получит allow для project-status.py, валидатор это пропустит. Fix — в issue #105, вне scope этого PR.

Pending

— Fix issue #105 (check-permissions.py симметрия для project-status.py).

Closes #103

## Что сделано Добавил 5 deny-правил для `project-status.py` в `.opencode/agents/reviewer.md` (блок `permission.bash`), симметрично существующим правилам для `pipeline-status.py` (строки 63-67) и `spec-status.py` (строки 68-72): ``` "python3 *project-status.py*": deny "python3 .opencode/scripts/project-status.py*": deny "python3 */project-status.py*": deny "python *project-status.py*": deny "python */project-status.py*": deny ``` Правила размещены сразу после блока `spec-status.py`, перед `"node --version*": allow`. Порядок last-match-wins сохранён — deny идут после `"python3*": allow` / `"python *": allow`. Также добавил тест `test_reviewer_denies_all_oracle_scripts` в `tests/test_permissions.py` — проверяет, что для каждого из 3 oracle-скриптов есть ровно 5 deny-правил ожидаемого формата. Тест закрепляет контракт ADR-019 и защитит от регрессии (если кто-то удалит/переименует deny-правило, тест упадёт). ## Почему Issue #103: в `reviewer.md` были deny-правила только для 2 из 3 oracle-скриптов (`pipeline-status.py`, `spec-status.py`). Из-за `"python3*": allow` (строка 61) reviewer мог запустить `python3 .opencode/scripts/project-status.py` напрямую через bash, обходя нативный tool `project-status` — нарушение ADR-019 (oracle-скрипты вызываются ТОЛЬКО через нативные tools). `vision.md` уже содержала все 3 набора правил (после PR #102), `reviewer.md` отставал — асимметрия. ## Watch out — Отдельно зафиксирован баг #105: `check-permissions.py` в `DANGEROUS_PATTERNS` не содержит паттернов для `project-status.py` (валидируются только `pipeline-status.py`/`spec-status.py`). Валидатор проверяет только `allow`-правила, поэтому deny из этого PR проходят корректно, но если какой-то агент получит `allow` для `project-status.py`, валидатор это пропустит. Fix — в issue #105, вне scope этого PR. ## Pending — Fix issue #105 (check-permissions.py симметрия для project-status.py). Closes #103
style(tests): ruff format oracle deny test
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 6s
CI / bootstrap (pull_request) Successful in 9s
Permission Security Check / check (pull_request) Successful in 17s
CI / lint (pull_request) Successful in 39s
CI / typecheck (pull_request) Successful in 25s
CI / complexity (pull_request) Successful in 20s
CI / test (3.13) (pull_request) Successful in 2m0s
2ed45aff5d
Author
Owner

Code Review Summary

PR добавляет 5 deny-правил для project-status.py в reviewer.md (симметрично существующим блокам pipeline-status.py/spec-status.py) и регрессионный тест, закрепляющий контракт ADR-019 для всех 3 oracle-скриптов. Изменения минимальны, точны и закрывают асимметрию с vision.md (PR #102). CI green, тесты проходят (30 passed).

Positives

  • reviewer.md:73-77 [config] Правила полностью симметричны существующим блокам (5 glob-вариантов: python3 *X*, python3 .opencode/scripts/X*, python3 */X*, python *X*, python */X*), размещены после catch-all "python3*": allow / "python *": allow — last-match-wins сохранён.
  • tests/test_permissions.py:166-190 [tests] Тест проверяет точное множество deny-правил (set equality, не только count) для всех 3 скриптов — защищает от регрессии при удалении/переименовании любого правила. Переиспользует существующий хелпер _parse_agent_bash_rules, не дублирует парсинг.
  • PR body [hygiene] Все 4 heading'а заполнены осмысленно; известный gap валидатора (check-permissions.py не содержит паттернов для project-status.py) честно задокументирован в Watch out и вынесен в issue #105 — вне scope, не блокирует.
  • Cross-file impact [architecture] Paired update выполнен в этом же PR: writer (reviewer.md) + reader (tests/test_permissions.py) обновлены совместно, окно сломанного main закрыто. check-permissions.py не ломается — валидатор проверяет только allow-правила, deny проходят (подтверждено test_check_permissions_passes).

Suggestions (info, not blocking)

  • tests/test_permissions.py:176 [style] Тройка скриптов и 5 glob-вариантов могли бы быть вынесены в константы модуля (например, ORACLE_SCRIPTS), чтобы тест не перечислял их inline — но текущий вариант читается хорошо и соответствует стилю соседних тестов, менять не обязательно.
  • tests/test_permissions.py:166 [info] Тест покрывает только reviewer.md; vision.md (уже содержит все 3 набора после #102) остаётся без аналогичной проверки. Если симметрия агентов важна — можно расширить тест на оба агента в будущем PR (не блокирует).

Verdict: APPROVE

## Code Review Summary PR добавляет 5 deny-правил для `project-status.py` в `reviewer.md` (симметрично существующим блокам `pipeline-status.py`/`spec-status.py`) и регрессионный тест, закрепляющий контракт ADR-019 для всех 3 oracle-скриптов. Изменения минимальны, точны и закрывают асимметрию с `vision.md` (PR #102). CI green, тесты проходят (30 passed). ### Positives - **reviewer.md:73-77** [config] Правила полностью симметричны существующим блокам (5 glob-вариантов: `python3 *X*`, `python3 .opencode/scripts/X*`, `python3 */X*`, `python *X*`, `python */X*`), размещены после catch-all `"python3*": allow` / `"python *": allow` — last-match-wins сохранён. - **tests/test_permissions.py:166-190** [tests] Тест проверяет точное множество deny-правил (set equality, не только count) для всех 3 скриптов — защищает от регрессии при удалении/переименовании любого правила. Переиспользует существующий хелпер `_parse_agent_bash_rules`, не дублирует парсинг. - **PR body** [hygiene] Все 4 heading'а заполнены осмысленно; известный gap валидатора (`check-permissions.py` не содержит паттернов для `project-status.py`) честно задокументирован в Watch out и вынесен в issue #105 — вне scope, не блокирует. - **Cross-file impact** [architecture] Paired update выполнен в этом же PR: writer (`reviewer.md`) + reader (`tests/test_permissions.py`) обновлены совместно, окно сломанного main закрыто. `check-permissions.py` не ломается — валидатор проверяет только `allow`-правила, deny проходят (подтверждено `test_check_permissions_passes`). ### Suggestions (info, not blocking) - **tests/test_permissions.py:176** [style] Тройка скриптов и 5 glob-вариантов могли бы быть вынесены в константы модуля (например, `ORACLE_SCRIPTS`), чтобы тест не перечислял их inline — но текущий вариант читается хорошо и соответствует стилю соседних тестов, менять не обязательно. - **tests/test_permissions.py:166** [info] Тест покрывает только `reviewer.md`; `vision.md` (уже содержит все 3 набора после #102) остаётся без аналогичной проверки. Если симметрия агентов важна — можно расширить тест на оба агента в будущем PR (не блокирует). ### Verdict: APPROVE
slaid098 deleted branch fix/reviewer/deny-project-status-oracle 2026-08-19 00:27:07 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!106
No description provided.