auto-sync: 2026-05-15 01:30:01

This commit is contained in:
Stream
2026-05-15 01:30:01 +03:00
parent bb2f572d1a
commit c8ba577e04
2 changed files with 299 additions and 0 deletions

View File

@@ -204,3 +204,161 @@ Dev-агент работает на `vibecode/claude-sonnet-4.6` — стаби
- Цвет сливается с тёмной темой
- Нужно сделать контрастнее/крупнее
- Не критично — панель закрывается повторным кликом на "Поиск"
# 2026-05-14 — Claude CLI Proxy + TRI max-aggregation
## Claude CLI Proxy — ГОТОВО ✅
### Что сделано
- **Проект:** `tasks/claude-cli-proxy/` (BRD, DEV_TASK, PROJECT.md)
- **Суть:** CLIProxyAPI (Go, open-source) оборачивает Claude Code CLI в OpenAI-compatible API
- **Деплой:** Docker контейнер `claude-cli-proxy` на mva154 (82.22.50.71)
- **OAuth:** авторизован через Max 5x подписку Славы (claude-homenet542@gmail.com)
- **Сеть:** `openclaw_openclaw-network`, доступен из `openclaw-gateway` по имени `claude-cli-proxy:8317`
- **Порт:** 127.0.0.1:8317 (не наружу)
### OpenClaw интеграция
- Provider `claude-cli-proxy` добавлен в `openclaw.json`
- Dev-агент переключен на `claude-cli-proxy/claude-sonnet-4-6`
- Доступные модели: sonnet-4, sonnet-4-6, opus-4, opus-4-7, opus-4-6, haiku-4-5
- Gateway перечитал конфиг (SIGHUP)
### Лимиты
- Max 5x: ~50-200 промптов/5ч окно
- ⚠️ С 15.06.2026 — Agent SDK credit отдельный (детали TBD)
### Переавторизация (если токен протухнет)
1. `docker compose down`
2. `docker run --rm -it -p 54545:54545 -v $(pwd)/auth:/root/.cli-proxy-api eceasy/cli-proxy-api:latest /CLIProxyAPI/CLIProxyAPI --claude-login --no-browser`
3. SSH туннель + открыть URL в браузере
4. `docker compose up -d`
---
## TRI тайлы — max-агрегация для мелких зумов ✅
### Проблема
На мелких зумах (5-8) вся карта TRI жёлтая — bilinear resampling усредняет значения.
### Решение
Python max-pool (factor=10) на raw TRI single-band → colorize → tile. GDAL 3.4 не поддерживает `-r max`, поэтому numpy.
### Результат
- Zoom 5: 6 тайлов, все непустые, 52% visible — преобладает оранжевый/красный
- Zoom 6-8: контраст есть, плоские участки прозрачные
- Zoom 10-12: full-res, без изменений
- Общий размер: 520M
### Ждём фидбек Славы
Нужно подтверждение что на карте теперь видно где холмисто.
## CLIProxyAPI — дебаг и фикс (14.05.2026)
### Проблема
Dev-агент не мог работать через `claude-cli-proxy/claude-sonnet-4-6` — получал "FailoverError: network connection error". При этом curl из того же контейнера работал.
### Корневая причина
`HTTP_PROXY=http://xray:10809` и `HTTPS_PROXY=http://xray:10809` в environment контейнера openclaw-gateway направляли ВСЕ HTTP-запросы через Xray прокси. Xray не мог зарезолвить внутренний docker hostname `claude-cli-proxy` → connection error.
curl работал потому что обрабатывает прокси иначе для внутренних хостов.
### Фикс
1. Добавлен `NO_PROXY=claude-cli-proxy,localhost,127.0.0.1,172.19.0.0/24` в `/home/slin/openclaw/docker-compose.yml`
2. Убран `reasoning: true` из всех моделей cli-proxy в openclaw.json (парсер не извлекал content)
3. Пересоздан контейнер: `docker compose up -d openclaw-gateway`
### Конфиг провайдера (рабочий)
```json
"claude-cli-proxy": {
"baseUrl": "http://claude-cli-proxy:8317/v1",
"apiKey": "dummy",
"api": "openai-completions",
"models": [...] // без reasoning:true
}
```
### Уроки
- SIGHUP НЕ перечитывает конфигурацию провайдеров (models.providers) — нужен полный рестарт
- HTTP_PROXY влияет на Node.js HTTP клиент для ВСЕХ запросов, включая внутренние docker
- NO_PROXY обязателен для внутренних сервисов в docker network
- CLIProxyAPI поддерживает и OpenAI формат, и нативный Anthropic Messages API
---
## CLIProxyAPI — проблема cloaking + rate limit (14.05.2026)
### Проблема 2: System prompt не доходит до модели
После фикса NO_PROXY запросы доходят, но Dev-агент отвечает "I don't see a Your Role section" — CLIProxyAPI инжектит system prompt Claude Code поверх нашего (cloaking).
### Попытка фикса: anthropic-messages API
- Переключил `api: "anthropic-messages"`, `baseUrl: http://claude-cli-proxy:8317` (без /v1)
- Добавил `User-Agent: claude-cli/2.1.44` header для bypass cloaking
- Результат: запрос дошёл до Anthropic, но получил **429 rate limit**
### Открытие: два разных rate limit bucket'а
- `/v1/chat/completions` (OpenAI формат) → идёт через Claude Code CLI → тот же bucket что у Славы в терминале → **работает**
- `/v1/messages` (Anthropic формат) → идёт напрямую в Messages API → **отдельный rate limit** → 429
### Текущий статус
- `api: "openai-completions"` работает без rate limit, но cloaking затирает system prompt
- `api: "anthropic-messages"` обходит cloaking, но попадает в rate limit
- CLIProxyAPI v7.0.6 не имеет опции отключить cloaking (PR #3328, #2709 не смержены)
### Варианты решения
1. Обновить CLIProxyAPI до latest (может PR уже в main)
2. Добавить `"cloak": "passthrough"` в auth JSON (если поддерживается)
3. Использовать openai-completions + жить с cloaking (system prompt частично работает)
4. Fallback на vibecode для Dev-агента (текущий workaround)
### Текущий workaround
Dev-агент работает на `vibecode/claude-sonnet-4.6` — стабильно, без проблем.
---
## Enduro Trails — UI улучшения ✅
### Что сделано (через Dev-агента на vibecode/claude-sonnet-4.6)
1. **Zoom-индикатор** — в правом верхнем углу, `z12`
2. **Масштабная линейка** — перенесена в правый верхний угол
3. **Кнопка Поиск (🔍)** — в тулбаре, Nominatim geocoding, центрирование карты
4. **Объединение zoom + scale**`z7 · 30 км` в одну строку
5. **Возврат ScaleControl** — линейка под текстом
6. **Финальная переделка** — одна строка: линейка с расстоянием внутри + номер зума справа (`[——— 30 km ———] z10`)
### UI тесты
- Написаны тест-кейсы: `tasks/enduro-trails/TEST_CASES_UI_SEARCH.md` (11 тестов)
- Результат: 8 PASS, 2 FAIL (кнопка ✕ не видна), 1 flaky
- Отчёт: `tasks/enduro-trails/reports/ui-search/report.md`
### Баг: кнопка ✕ закрытия поиска не видна
- Цвет сливается с тёмной темой
- Нужно сделать контрастнее/крупнее
- Не критично — панель закрывается повторным кликом на "Поиск"
---
## Мультиагентная разработка — BRD (14-15.05.2026)
### Контекст
Слава дал папку `tasks/multi-agent/proposal_v1/` — 10 файлов с полной спецификацией мультиагентной системы разработки ПО. Задача: подготовить BRD.
### Решения
- **Orchestrator = детерминированный скрипт (FastAPI)**, не LLM. Чистая логика "если X → Y".
- **Стрим = Analyst** (пишет BRD/ТЗ, координирует со Славой). НЕ оркестратор.
- **Claude Code CLI на mva154** = исполнители (Architect, Developer, Reviewer, Tester)
- **Plane** = витрина для Славы (webhooks → Orchestrator)
- **Gitea** = source of truth + CI (Gitea Actions)
- Architect и Tester — обязательны (Слава подтвердил)
- Designer — вне скоупа пилота
### BRD создан
- Файл: `tasks/multi-agent/BRD.md`
- Статус: draft, дополнен по 10 расхождениям с proposal
- Добавлены секции: структура репо, CLAUDE.md, формат запуска агентов, back-to, эскалация, идемпотентность/очередь, service account, webhook-события, tester scope
- Пилотный проект: Enduro Trails
- План: 3 недели (инфра → orchestrator → пилот)
### Открытые вопросы
- Node.js на mva154 — нужно ставить
- Claude Code CLI — нужно ставить и авторизовать
- Gitea Actions runner — проверить
- Plane webhooks — настроить

View File

@@ -154,6 +154,147 @@ related:
Пропущен на пилоте: Дизайн (UI-макеты пока ручные).
## 5.1. Структура репозитория (канон)
```
enduro-trails/
├── CLAUDE.md # Паспорт проекта для агентов
├── README.md
├── CHANGELOG.md
├── Makefile # make dev / test / lint / build
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── .gitea/workflows/ # CI (Gitea Actions)
│ └── ci.yml
├── .openclaw/agents/ # system prompts агентов
│ ├── architect.md
│ ├── developer.md
│ ├── reviewer.md
│ └── tester.md
├── docs/
│ ├── architecture/
│ │ ├── README.md
│ │ ├── c4-context.mmd
│ │ ├── c4-component.mmd
│ │ └── adr/
│ └── work-items/
│ └── <plane-id>/
│ ├── 00-business-request.md
│ ├── 01-brd.md
│ ├── 02-trz.md
│ ├── 03-acceptance-criteria.md
│ ├── 04-test-plan.yaml
│ ├── 06-adr/
│ ├── 12-review.md
│ └── 13-test-report.md
├── src/
├── tests/
│ ├── unit/
│ ├── integration/
│ └── e2e/
├── scripts/
│ ├── lint-spec.sh
│ ├── lint-adr.sh
│ └── req-coverage.py
└── migrations/
```
Все артефакты имеют YAML frontmatter (type, plane_id, status, version). Линтеры проверяют наличие и валидность.
## 5.2. CLAUDE.md (паспорт проекта)
Файл в корне репо — первое что читает каждый агент при запуске. Содержит:
- Стек технологий
- Команды (make dev/test/lint/build)
- Структура проекта
- Конвенции (commits, branches, naming)
- Правила для агентов (что можно, что нельзя)
## 5.3. Формат запуска агентов
Orchestrator запускает Claude Code CLI:
```bash
cd /home/slin/repos/enduro-trails && \
claude -p "Прочитай CLAUDE.md. Прочитай docs/work-items/<plane-id>/02-trz.md и все артефакты предыдущих этапов. Реализуй задачу согласно своей роли. Закоммить результат." \
--allowedTools read,write,edit,bash \
--systemPrompt "$(cat .openclaw/agents/developer.md)"
```
Параметры:
- `--systemPrompt` — роль агента (из `.openclaw/agents/<role>.md`)
- `--allowedTools` — ограниченный набор инструментов
- Рабочая директория — корень репо (агент видит весь проект)
- Бюджет: ограничен через Max подписку (5-часовое окно)
## 5.4. Обратная волна (back-to)
Когда агент возвращает задачу на предыдущий этап:
**Reviewer → Developer:**
1. Reviewer ставит `request-changes` в PR (через Gitea API)
2. Orchestrator получает webhook → лейбл `back-to:dev`
3. Orchestrator запускает Developer повторно (читает комментарии review)
4. Лимит: ≤3 итерации. После 3-й → `escalation:human-needed`, уведомление Славе
**Tester → Developer:**
1. Tester находит баг → создаёт issue в Plane, пишет в test-report
2. Orchestrator: лейбл `back-to:dev`, PR возвращается в stage:dev
3. Developer фиксит → снова QG-4 → QG-5 → QG-6
**Architect → Analyst (Стрим):**
1. Architect находит противоречие в ТЗ → коммитит комментарий, лейбл `back-to:analysis`
2. Orchestrator уведомляет Стрим → Стрим правит ТЗ → новый :approved: от Славы
## 5.5. Эскалация
Оркестратор эскалирует к Славе когда:
- Агент 3 раза вернулся на предыдущий этап
- Claude Code CLI вернул ошибку (rate limit, timeout, crash)
- QG красный после 3 попыток
- Найдена security-уязвимость уровня critical
Формат: уведомление в Plane (комментарий + лейбл `escalation:*`) + сообщение Славе через Стрим.
## 5.6. Идемпотентность и очередь
**Идемпотентность:** webhooks могут дублироваться. Orchestrator проверяет:
- Не запущен ли уже агент на эту задачу (lock по plane_id + stage)
- Не обработано ли уже это событие (event_id в журнале)
**Очередь:** задачи выполняются последовательно (один Claude Code CLI одновременно). Orchestrator ведёт FIFO-очередь. Приоритет: urgent > high > medium > low.
## 5.7. Service account в Git
- User: `claude-bot` в Gitea
- Email: `claude-bot@mva154.local`
- PAT-токен для push в feature-ветки
- Не имеет права push в main (только через PR merge)
- Все коммиты агентов — от этого аккаунта (отличимы от человеческих)
## 5.8. Plane → Orchestrator: события
| Событие Plane | Реакция Orchestrator |
|---------------|---------------------|
| `work_item.created` (Feature) | QG-0 → создать ветку + подзадачи + папку docs/ |
| `:approved:` от Славы на подзадаче «Анализ» | QG-1 → запустить Architect |
| Подзадача «Архитектура» → done | QG-2 → запустить Developer |
| CI green на PR | QG-4 → запустить Reviewer |
| Review approved | QG-5 → запустить Tester |
| Test report: verdict=pass | QG-6 → merge PR, deploy |
| `:approved:` от Славы после деплоя | QG-7 → закрыть Work Item |
## 5.9. Tester — scope на пилоте
На пилоте Tester запускает:
- Unit-тесты (повторно, в чистой среде)
- Integration-тесты
- E2e-тесты (Playwright) по Acceptance Criteria из `04-test-plan.yaml`
- Формирует `13-test-report.md`
Не на пилоте (v2): visual regression, a11y (axe-core), performance, security scan.
## 6. Quality Gates
| QG | Между | Что проверяет | Как |