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

This commit is contained in:
Alexey Martemyanov committed 2026-09-29 01:48:30 +06:00
1 parent 0f67b3791b
commit a553538217
2 files changed
+158 -27

No files matched your search

+126 -12
View File
@@ -228,7 +228,115 @@ bd where
---
## 4. DeepSeek как ACP-провайдер
## 3.5 Роли: что это и как ими управляют
**Роль — YAML/MD-файл в каталоге**, не право и не токен. Описание листа графа: провайдер,
промпт, параметры, таймаут.
```yaml
apiVersion: callee.metalagman.dev/v1alpha1
kind: Role
spec:
description: Собирает Xcode-проект
provider:
type: generic_acp
cmd: dsh-acp
model: deepseek-chat
timeout: 20m
---
Собери проект {{ .Params.project }} и верни отчёт об ошибках.
```
| Источник ролей | Что даёт |
|---|---|
| Каталог по умолчанию | 6 стартовых ресурсов (`callee setup`) |
| Импорт из git | `callee agent import baldaworks/prism-callee --prefix prism` |
| Собственные | файлы в каталоге проекта или `~/.callee/` |
🔴 **Ролей в рантайме не выдают.** Роль = наличие файла в каталоге. Рантайм-механизма
«выдать роль на задачу» **не существует**.
### Что динамическое, а что нет
| Сущность | Динамически? | Чем регулируется |
|---|---|---|
| Роль (файл графа) | ❌ статично | наличие файла в каталоге |
| Провайдер (`type`, `cmd`) | ❌ или из `State` через `DynamicRole` | автор графа |
| Файлы | ❌ | монтирование + рабочая копия |
| SSH-ключ | ❌ | наличие файла у процесса |
| **Разрешение модели внутри ACP-сессии** | ⚠️ **да** | `allow_all` / `ask` / `deny_all` |
🔴 **Единственное, что реально запрашивается в рантайме — разрешение модели внутри
ACP-сессии** (`ask` → вопрос в чат).
---
## 4. Права: формула и границы
**`права = права процесса × смонтированное × разрешённое в графе`**
| Уровень | Кто задаёт |
|---|---|
| Чем запущен процесс | вы, при старте (контейнер / хост-юзер / отдельный юзер) |
| Что смонтировано | compose |
| Что разрешено в графе | автор воркфлоу |
🔴 **`permissions.mode: allow_all` — это про права модели ВНУТРИ ACP-сессии** (править
файлы, запускать команды). Оно **не** расширяет, что процесс видит в файловой системе.
Два разных ограничения.
### Где callee — там и движки, и Script'ы
🔴 **ACP-провайдер — дочерний процесс callee.** Движок на хосте + callee в контейнере
технически невозможны. Следствие: «callee на хосте» = **всё исполнение на хосте целиком**.
### Гейт `Human` защищает действие, но не возможность
Доступ у роли есть **всегда** — он определён тем, чем запущен callee и что смонтировано.
Апрув **не выдаёт доступ**, он разрешает выполнить операцию, которая уже технически
возможна.
```
Роль лежит в каталоге → доступ ЕСТЬ
▼
Узел Human («собрать Xcode в VM macos-27?») → пауза
├─ апрув → Script исполняется (права у процесса УЖЕ были)
└─ отказ → граф останавливается
```
🔴 **Изоляцию даёт только то, чем процесс запущен и что смонтировано — не граф.**
### Динамических маунтов не существует
На macOS Docker маунты задаются **при создании контейнера**; live `mount --bind`
контейнер не видит; симлинк на внешний путь битый. **«Как модель запросит доступ к папке»
не решается через маунты.**
| Подход | Оценка |
|---|---|
| A. Смонтировать всё заранее (`~/Developer:ro`) | запись нельзя |
| B. Пересоздание контейнера (`up -d`, ~3 с) | нужен механизм вне контейнера |
| C. Хост-агент ставит права сам | полный доступ, ноль изоляции |
| **D. Проект = рабочая копия** ✅ | модель работает в `~/agents/<проект>`, результат в проект через git |
**Решение: D** — доступ задаётся наличием репозитория, а не маунтом.
### Доступ выбирается маршрутом, а не запросом
Модель **не просит** прав и **не может эскалировать**: нет доступа — задача падает.
```
Роутер в графе
├─ задача требует ~/agents → роль в контейнере
├─ задача требует Xcode/lume → роль на хост-исполнителе
└─ задача требует хоста по ssh → роль со ssh-ключом (command=)
```
**Разграничение = статический роутинг по типам задач**, не динамические права.
---
## 5. DeepSeek как ACP-провайдер
Провайдер callee — `generic_acp`, `cmd: dsh-acp`, пакет
**`@openma/deepseek-harness-acp@0.4.33`** (Apache-2.0, Node `>= 22.15`,
@@ -250,25 +358,31 @@ bd where
---
## 5. Питфоллы
## 6. Питфоллы
1. 🔴 **`Human` требует TTY** — non-interactive режим отвергает граф целиком, включая
невыбранные ветки Router. Запуск через `docker exec` без `-t` = non-interactive.
2. 🔴 **`cmd` — одно имя файла.** Аргументы только в `extraArgs`, иначе провайдер не стартует.
3. 🔴 **Не подавать вывод модели в `cmd`/`extraArgs`** — исполнение произвольного кода.
4. ⚠️ **`prism/lifecycle` обязан быть `Router`** — иначе устаревший импорт.
5. ⚠️ **Непустой stderr ≠ провал** — судить по exit status.
6. ⚠️ **Таймаут Script валит весь воркфлоу** — не «продолжает с ошибкой».
7. ⚠️ **Concurrency группы `Parallel`** используют один живой shared state.
8. ⚠️ **Поиск npm по `scope:normahq` / `scope:baldaworks` даёт пусто** — эти scoped-пакеты
через search-API не индексируются. Искать прямыми URL
`registry.npmjs.org/<scope>%2f<name>`.
4. 🔴 **ACP-провайдер — дочерний процесс callee** — движок и callee не могут быть на
разных хостах.
5. 🔴 **Гейт `Human` не выдаёт доступ** — только разрешает уже возможное действие.
6. ⚠️ **`prism/lifecycle` обязан быть `Router`** — иначе устаревший импорт.
7. ⚠️ **Непустой stderr ≠ провал** — судить по exit status.
8. ⚠️ **Таймаут Script валит весь воркфлоу** — не «продолжает с ошибкой».
9. ⚠️ **Concurrency группы `Parallel`** используют один живой shared state.
10. ⚠️ **Поиск npm по `scope:normahq` / `scope:baldaworks` даёт пусто** — эти scoped-пакеты
через search-API не индексируются. Искать прямыми URL
`registry.npmjs.org/<scope>%2f<name>`.
11. ⚠️ **Динамических маунтов на macOS Docker нет** — только пересоздание контейнера.
---
## Связанные заметки
- [[personal/plans/balda-callee-prism-plan]] — план внедрения
- [[personal/plans/balda-callee-prism-plan]] — план внедрения (топология: стек на Mac)
- [[personal/projects/balda/balda-mm-delegation-plan]] — общий план Фаз 1-5
- [[personal/plans/balda-mm-phase4-agents]] — Фаза 4 (мост, приёмка)
- [[personal/tech/agents-bridge]] — мост :8790
- [[personal/tech/balda-executor-mcp]] — MCP-сервер делегирования
- [[personal/tech/agents-bridge]] — мост :8790 (демонтируется в новой топологии)
- [[personal/tech/balda-executor-mcp]] — MCP-сервер делегирования (демонтируется)
- [[personal/tech/macos-docker-virtiofs-mount-limits]] — почему нет динамических маунтов