[2026-09-28] eagle: personal/projects/balda/balda-mm-delegation-plan.md personal/tech/agents-bridge.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-28 11:49:59 +06:00
1 parent 4a6b5bcb70
commit b219b5c2cb
2 files changed
+81 -12

No files matched your search

+55 -3
View File
@@ -191,6 +191,36 @@ auth-файлов из `~/.claude`/`~/.codex` отклонено, не пред
порт свободен, форвард выключен администратором. Обход — Cloudflare Tunnel
(исходящее соединение, не SSH-форвард).
### 8. 🔴 `GET /task/{id}` и `/tasks` требуют секрет; `/healthz` — нет
Проверено 2026-09-28. Асимметрия: `/healthz` открыт (это осознанно — по нему проверяют
и туннель, и мониторинг), а **чтение задач тоже закрыто**:
```bash
curl -s http://127.0.0.1:8790/tasks # → {"detail":"unauthorized"}
curl -s -H "X-Bridge-Secret: $SECRET" .../tasks # → JSON со списком
```
Симптом ошибки: `jq` падает `Cannot index object with object` — потому что в ответе
объект `{"detail":"unauthorized"}`, а не массив. **Не `jq` сломан** — просто нет
заголовка. Всегда проверять `head -c 200` перед разбором.
📌 Полезно: ответ `GET /task/{id}` достаточно детален, чтобы поставить диагноз без логов
контейнера — `status`, `exit_code`, `duration_s`, `stdout`, `stderr`, `error`.
`duration_s < 1` при `exit_code: 1` = CLI упал мгновенно на своей проверке (напр.
авторизации), а не на реальной работе.
### 9. 🔴 Кратковременные задачи могут стать `failed` без `stdout`/`error`
В списке `/tasks` видны исторические задачи с `exit_code: 1`, `duration_s ~0.7-0.8`,
`stdout: null`, `error: null` — тогда как другая задача того же класса отдала
содержательный `error` (`Claude configuration file not found at: /root/.claude.json`).
Следствие: **пустой `stdout` не значит «задача не запускалась».** Смотреть на связку
`status=failed` + `exit_code=1` + `duration_s`, а причину добирать из логов контейнера
(`docker logs balda-executor`) или повтором задачи. Не делать вывод «мост не вызывает CLI»
по пустому ответу одной задачи.
---
## Порядок ручной приёмки (сработавший)
@@ -200,11 +230,27 @@ curl -s -o /dev/null -w "%{http_code}\n" -X POST http://127.0.0.1:8790/task \
-H 'Content-Type: application/json' -d '{"prompt":"hi"}' # → 401 (нет секрета)
# с секретом и одним Idempotency-Key дважды → один и тот же task_id, 202 затем 200
# GET /task/{id} → status/stdout/exit_code
# GET /task/{id} → status/stdout/exit_code (⚠️ С секретом, иначе unauthorized)
```
Тестовый скрипт: `/tmp/test-bridge.sh` (читает секрет из `.env`, в командной строке
секрет не светится).
📌 **Секрет из `.env` в inline-команде собирать скриптом, а не литералом.** Строка вида
`SECRET=$(grep … .env | cut …)` в инлайн-шелле ломается на кавычках и на редакции секретов
Hermes — рабочий вариант: положить в файл (`write_file`) и запустить `bash /tmp/x.sh`.
Секрет в командной строке не светится.
Тестовый скрипт: `/tmp/test-bridge.sh`, `/tmp/probe-exec.sh` (читают секрет из `.env`).
### Проверка авторизации CLI одной задачей
```bash
# ожидаемо при незалогиненном CLI: status=failed, exit_code=1, duration_s<1,
# stdout="Not logged in · Please run /login"
# при рабочем логине: status=succeeded, реальный текст модели
```
`/tmp/probe-exec.sh <task_id>` — печатает полный JSON задачи **и** состояние ФС
контейнера (`ls -la /root/`), чтобы сразу видеть, есть ли `.claude.json`/креды.
---
@@ -229,3 +275,9 @@ curl -s -o /dev/null -w "%{http_code}\n" -X POST http://127.0.0.1:8790/task \
(`AllowTcpForwarding no`).
- **2026-09-26** (MCP): `executor_health` из контейнера `balda-executor-mcp`
(docker-сеть Kraken) вернул живые данные моста — связка Kraken→Mac работает.
- **2026-09-28**: аудит Фазы 4 живыми вызовами. Мост + туннель + контейнер исправны,
задача доходит до CLI, но падает `Not logged in · Please run /login` — **CLI в контейнере
не авторизован**, это единственный блокер Фазы 4. В хост-монтировании `~/cli-auth/claude/`
**нет** `.claude.json` — только `backups/`, `projects/`, `sessions/`. Добавлены §8
(чтение задач требует секрет) и §9 (failed-задачи без stdout). Разбор:
[[personal/plans/balda-mm-phase4-agents]] §20.