fix(check-permissions): add project-status.py to DANGEROUS_PATTERNS #108

Merged
slaid098 merged 2 commits from fix/check-permissions/project-status-patterns into main 2026-08-19 01:09:14 +03:00
Owner

Что сделано

Добавлены 2 паттерна для project-status.py в DANGEROUS_PATTERNS в .opencode/scripts/check-permissions.py (симметрично с существующими для pipeline-status.py и spec-status.py):

  • r"^python3? .*project-status\.py" — reason use project-status tool, not bash. See ADR-019
  • r"^python .*project-status\.py" — reason use project-status tool, not bash. See ADR-019

Размещены сразу после блока spec-status.py, перед git clone, scope "agent" (те же правила, что у соседей).

В tests/test_check_permissions.py добавлены 3 параметризованных теста, симметрично покрывающих все 3 oracle-скрипта (pipeline-status/spec-status/project-status):

  • test_oracle_script_bash_pattern_violation (6 кейсов) — allow для oracle-скрипта через bash в agent .md → violation с правильным reason.
  • test_oracle_script_pattern_not_flagged_in_global (6 кейсов) — agent-scoped паттерны не срабатывают на opencode.json (scope='agent').
  • test_oracle_script_deny_not_violation — deny для oracle-скриптов не flagged.

Почему

ADR-019 требует, чтобы все 3 oracle-скрипта вызывались ТОЛЬКО через нативные tools (pipeline-status/spec-status/project-status), не через bash. Валидатор check-permissions.py покрывал pipeline-status.py и spec-status.py, но НЕ project-status.py — асимметрия. Если бы агент получил allow-правило вида "python3 .../project-status.py": allow, валидатор бы его пропустил. Теперь все 3 скрипта покрыты единообразно.

Watch out

—

Pending

—

Closes #105

## Что сделано Добавлены 2 паттерна для `project-status.py` в `DANGEROUS_PATTERNS` в `.opencode/scripts/check-permissions.py` (симметрично с существующими для `pipeline-status.py` и `spec-status.py`): - `r"^python3? .*project-status\.py"` — reason `use project-status tool, not bash. See ADR-019` - `r"^python .*project-status\.py"` — reason `use project-status tool, not bash. See ADR-019` Размещены сразу после блока `spec-status.py`, перед `git clone`, scope `"agent"` (те же правила, что у соседей). В `tests/test_check_permissions.py` добавлены 3 параметризованных теста, симметрично покрывающих все 3 oracle-скрипта (`pipeline-status`/`spec-status`/`project-status`): - `test_oracle_script_bash_pattern_violation` (6 кейсов) — allow для oracle-скрипта через bash в agent .md → violation с правильным reason. - `test_oracle_script_pattern_not_flagged_in_global` (6 кейсов) — agent-scoped паттерны не срабатывают на `opencode.json` (scope='agent'). - `test_oracle_script_deny_not_violation` — deny для oracle-скриптов не flagged. ## Почему ADR-019 требует, чтобы все 3 oracle-скрипта вызывались ТОЛЬКО через нативные tools (`pipeline-status`/`spec-status`/`project-status`), не через bash. Валидатор `check-permissions.py` покрывал `pipeline-status.py` и `spec-status.py`, но НЕ `project-status.py` — асимметрия. Если бы агент получил `allow`-правило вида `"python3 .../project-status.py": allow`, валидатор бы его пропустил. Теперь все 3 скрипта покрыты единообразно. ## Watch out — ## Pending — Closes #105
test(check-permissions): cover all 3 oracle scripts symmetrically
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 6s
CI / bootstrap (pull_request) Successful in 10s
Permission Security Check / check (pull_request) Successful in 12s
CI / lint (pull_request) Successful in 31s
CI / typecheck (pull_request) Successful in 32s
CI / complexity (pull_request) Successful in 32s
CI / test (3.13) (pull_request) Successful in 1m44s
c938ab0b04
Author
Owner

Code Review Summary

PR закрывает асимметрию из issue #105: DANGEROUS_PATTERNS теперь единообразно покрывает все 3 oracle-скрипта (pipeline-status/spec-status/project-status), плюс 3 новых теста (2 параметризованных по 6 кейсов + deny-кейс). Изменения минимальны, симметричны существующему стилю и полностью соответствуют контрактам issue.

Positives

  • Симметрия с соседями: 2 новых паттерна (^python3? .*project-status\.py / ^python .*project-status\.py) идентичны по структуре, scope ("agent") и reason-формату существующим блокам pipeline-status/spec-status — контракт issue #105 выполнен дословно.
  • Размещение: вставлены после блока spec-status.py, перед git clone — как указано в issue.
  • Тесты покрывают все 3 скрипта: ORACLE_SCRIPT_CASES параметризует 6 кейсов, что закрепляет инвариант симметрии на будущее (если кто-то добавит 4-й oracle-скрипт, тест-паттерн напомнит о необходимости покрытия).
  • Проверка scope-семантики: test_oracle_script_pattern_not_flagged_in_global явно фиксирует, что agent-scoped паттерны не срабатывают на opencode.json — важный инвариант check_rules.
  • Проверено локально: uv run pytest tests/test_check_permissions.py -q → 39 passed; python3 .opencode/scripts/check-permissions.py → exit 0 (deny-правила из #103 не триггерят валидатор).
  • Cross-file impact: readers валидатора — CI permissions-check.yml (black-box, exit code) и configure-opencode skill (документация). Формат вывода не менялся, breakage-риска нет.

Suggestions (info, not blocking)

  • .opencode/scripts/check-permissions.py:40 [style] Паттерн ^python .*project-status\.py технически избыточен — ^python3? уже покрывает python (python + optional 3 + space). Но дублирование идентично существующим блокам pipeline-status/spec-status, и контракт issue #105 явно требует оба паттерна — симметрия важнее DRY здесь. Не менять.
  • .opencode/scripts/check-permissions.py:26,31 [info] Pre-existing: reason для spec-status.py содержит stale плейсхолдер ADR-NNN (соседи используют ADR-019). Вне scope этого PR — заведён issue #109.

Verdict: APPROVE

## Code Review Summary PR закрывает асимметрию из issue #105: `DANGEROUS_PATTERNS` теперь единообразно покрывает все 3 oracle-скрипта (`pipeline-status`/`spec-status`/`project-status`), плюс 3 новых теста (2 параметризованных по 6 кейсов + deny-кейс). Изменения минимальны, симметричны существующему стилю и полностью соответствуют контрактам issue. ### Positives - **Симметрия с соседями**: 2 новых паттерна (`^python3? .*project-status\.py` / `^python .*project-status\.py`) идентичны по структуре, scope (`"agent"`) и reason-формату существующим блокам `pipeline-status`/`spec-status` — контракт issue #105 выполнен дословно. - **Размещение**: вставлены после блока `spec-status.py`, перед `git clone` — как указано в issue. - **Тесты покрывают все 3 скрипта**: `ORACLE_SCRIPT_CASES` параметризует 6 кейсов, что закрепляет инвариант симметрии на будущее (если кто-то добавит 4-й oracle-скрипт, тест-паттерн напомнит о необходимости покрытия). - **Проверка scope-семантики**: `test_oracle_script_pattern_not_flagged_in_global` явно фиксирует, что agent-scoped паттерны не срабатывают на `opencode.json` — важный инвариант `check_rules`. - **Проверено локально**: `uv run pytest tests/test_check_permissions.py -q` → 39 passed; `python3 .opencode/scripts/check-permissions.py` → exit 0 (deny-правила из #103 не триггерят валидатор). - **Cross-file impact**: readers валидатора — CI `permissions-check.yml` (black-box, exit code) и `configure-opencode` skill (документация). Формат вывода не менялся, breakage-риска нет. ### Suggestions (info, not blocking) - **.opencode/scripts/check-permissions.py:40** [style] Паттерн `^python .*project-status\.py` технически избыточен — `^python3? ` уже покрывает `python ` (python + optional 3 + space). Но дублирование идентично существующим блокам `pipeline-status`/`spec-status`, и контракт issue #105 явно требует оба паттерна — симметрия важнее DRY здесь. Не менять. - **.opencode/scripts/check-permissions.py:26,31** [info] Pre-existing: reason для `spec-status.py` содержит stale плейсхолдер `ADR-NNN` (соседи используют `ADR-019`). Вне scope этого PR — заведён issue #109. ### Verdict: APPROVE
slaid098 deleted branch fix/check-permissions/project-status-patterns 2026-08-19 01:09:14 +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!108
No description provided.