diff --git a/memory/2026-05-14.md b/memory/2026-05-14.md index 4908fed..c245357 100644 --- a/memory/2026-05-14.md +++ b/memory/2026-05-14.md @@ -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 — настроить diff --git a/tasks/multi-agent/BRD.md b/tasks/multi-agent/BRD.md index d036ce3..06752d2 100644 --- a/tasks/multi-agent/BRD.md +++ b/tasks/multi-agent/BRD.md @@ -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/ +│ └── / +│ ├── 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//02-trz.md и все артефакты предыдущих этапов. Реализуй задачу согласно своей роли. Закоммить результат." \ + --allowedTools read,write,edit,bash \ + --systemPrompt "$(cat .openclaw/agents/developer.md)" +``` + +Параметры: +- `--systemPrompt` — роль агента (из `.openclaw/agents/.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 | Между | Что проверяет | Как |