From dae4d91fcf9d793e441453bfa4da09ea102362f8 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 29 Sep 2026 10:29:28 +0600 Subject: [PATCH] [2026-09-29] eagle: personal/plans/balda-callee-prism-plan.md --- personal/plans/balda-callee-prism-plan.md | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/personal/plans/balda-callee-prism-plan.md b/personal/plans/balda-callee-prism-plan.md index 9614a165..9e7367db 100755 --- a/personal/plans/balda-callee-prism-plan.md +++ b/personal/plans/balda-callee-prism-plan.md @@ -412,6 +412,62 @@ spec: --- +### 2.6 Отлов опасных команд: возможные механизмы + +> ⚠️ Исследование 2026-09-29. **Решения нет** — зафиксированы варианты и границы, выбор не сделан. + +**Где физически можно перехватить команду модели:** + +| Место перехвата | Что видит | Кто решает | +|---|---|---| +| Внутри ACP-сессии (адаптер `dsh-acp`) | **каждую** команду модели | адаптер / обёртка вокруг него | +| `Script`-узел в графе | **только** команды сборок/деплоев, вынесенные в граф | граф callee | + +🔴 **Ограничение охвата:** узел `Human` в графе защищает **только** `Script`-шаги. Команды, которые +модель запускает внутри своей ACP-сессии (обычный `bash` харнесса), граф **не видит вообще**. +Значит «отловить все опасные команды» и «отловить только свои сборки» — принципиально разные +объёмы работы: первое требует правки адаптера, второе делается чисто в графе. + +**Механизм 1 — regexp / белый список.** +Детерминированно, ~0 мс, не обходится вероятностной ошибкой. Ловит только известные шаблоны +(`rm -rf`, обращение к `docker.sock`, `~/.ssh`, `curl | sh`); обфускация обходит. + +**Механизм 2 — Jev (`TypeSafeJev` / типизированная оценка).** +Возвращает **числа**, а не решение: `choice` (вероятности по опциям), `score` (0–3 по рубрике), +`noul` (0–1 для утверждения). Не LLM, не вызывает инструменты, текст не генерирует. +Порог и действие пишет **ваш код**: + +``` +risk(0–3) / injection(noul) / exfiltration(noul) + ├─ if risk >= 1.5 || injection >= 0.8 → deny + ├─ if risk >= 0.5 || exfiltration >= 0.5 → ask + └─ иначе → allow +``` + +🔴 **Если `if` не написан — тул выполнится как обычно.** Jev сам не запрещает и не спрашивает; +без обвязки он даёт «команда опасная» и ничего не меняет. Латентность — сотни мс на каждый +тул-колл. Вендор позиционирует его как один слой defense-in-depth, не замену sandboxing. + +**Механизм 3 — Script + Human в графе.** +Апрув только для того, что само вынесено в `Script`. Внутри ACP-сессии не работает. + +**Граница, которая важнее гейта:** любой из трёх механизмов защищает **действие**, но не +**возможность** (§1.1a). Права определяет процесс и монтирование; гейт лишь разрешает +выполнить уже технически возможное. Если ключ есть у процесса — он есть всегда. + +**Сопутствующие факты:** + +- `TypeSafeJev` — один из 10 публичных kinds callee ([personal/tech/callee-prism]] §2.1), то есть + нативный узел графа; схема порогов выше — из вендорской доки tool-approval. +- `permissions.mode` (`allow_all`/`ask`/`deny_all`) — режим разрешений **внутри** ACP-сессии. + В Балде `ask` работает для MM, вопрос уходит реплаем в тред (§4). +- 🔴 **Не подавать вывод модели в `cmd`/`extraArgs` DynamicRole** — исполнение произвольного кода + мимо любого гейта внутри сессии (питфолл 8). +- Разбор слоёв привратника: [[Research/Gatekeeper Architecture for Agent Tool Calls]] — подходы 3 + (OPA), 4 (Cedar), 5 (MCP-прокси), 8 (Jev). + +--- + ## 2.5 Карта стека: кто кого дёргает > ⚠️ Обновлено под топологию §1 (стек на Mac). Прежний вид — «Балда на Kraken + MCP + @@ -651,6 +707,9 @@ scoped-пакеты так не индексируются. ## 6. Решения +> ⚠️ Решения по §2.6 (отлов опасных команд) **не приняты** — это зафиксированное исследование, +> не выбор. Развилки ниже помечены явно. + | # | Вопрос | Решение | Почему | |---|---|---|---| | 1 | Провайдер обеих сторон | DeepSeek | команда Alex | @@ -689,6 +748,10 @@ scoped-пакеты так не индексируются. 11. ⚠️ **Node `>= 22.15`** требуется адаптером (в образе 24.21.0). 12. ⚠️ **Динамических маунтов на macOS Docker нет** — только `up -d` с пересозданием. Доступ к проектам — через рабочую копию в `~/agents` + git, не через маунт под задачу. +13. 🔴 **Граф не видит команды внутри ACP-сессии.** Узел `Human`/`Script` закрывает только то, + что само вынесено в граф; обычный `bash` модели идёт мимо (§2.6). +14. 🔴 **Jev не запрещает и не спрашивает — он возвращает числа.** Без вашего `if` по порогам + тул выполнится как обычно (§2.6). ---