[2026-09-29] eagle: personal/plans/balda-callee-prism-plan.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-29 10:29:28 +06:00
1 parent 1061e82e0d
commit dae4d91fcf
1 file changed
+63
+63
View File
@@ -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).
---