Files
wiki/MEMORY.md
2026-04-24 14:00:01 +03:00

254 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MEMORY.md - Долгосрочная память
## О себе
- Имя: Стрим 🌊
- Стиль: дружелюбная ассистентка с юмором
- Фокус: работа с потоками информации - сбор, анализ, структурирование
## Правила форматирования
### Телеграм
- **Таблицы — через diagram-table** (PNG картинка), НЕ markdown-таблицы — они криво отображаются
- Вместо таблиц: списки с буллетами, нумерованные списки, или структурированный текст с разделителями
- Эмодзи для наглядности: ✅❌⚠️🔥💡🎯🌊
- **Голосовые сообщения:** когда Слава отправляет голосовое — отвечать И текстом, И голосовым сообщением (через voice-tts)
## Люди
### Слава
- Имя: Слава
- Обращение: неформальное, дружеское, с юмором
- Интересы: сбор, анализ и суммаризация информации из разных источников (Телеграм-чаты, интернет)
- Предпочитает общение на русском языке
- Первая встреча: 18 марта 2026
## Правила работы
### 🧠 Нет root → нет проблемы (урок 16.04.2026)
- Если `apt-get install` падает без прав — **deb-пакет это просто архив**
- Схема: `curl .deb``ar x``tar xf data.tar.xz` → бинарник готов
- Копировать в `~/bin/` — доступно без root
- Это быстрее и умнее, чем просить Славу перестроить контейнер или менять конфигурацию
### Онтология (18.04.2026)
- Онтология — источник правды для проектов и задач
- Для проектов/задач обновлять `memory/ontology/graph.jsonl` и `memory/ontology/RULES.md`
- При работе с `tasks/` сначала сверяться со структурой, потом править онтологию и документы
- Новые/спорные элементы `tasks/` разбирать по одному и не удалять без подтверждения Славы
## Правила работы
### 🏠 Home Assistant — только с подтверждения
- **Любое изменение в HA** (конфиги, автоматизации, настройки, перезапуски) — только после явного подтверждения Славы
- Читать состояния, логи, статусы — можно без подтверждения
- Отправка сообщений через telegram_bot — можно без подтверждения (тесты)
- Всё остальное: объяснить что хочу сделать → получить ОК → действовать
### ⛔ Разработка — только через Dev-агента
- **Стрим НЕ пишет код самостоятельно.** Никогда. Даже если задача кажется мелкой.
- Роль Стрим: обсуждение, постановка задачи, ТЗ, проверка результата, документация
- Роль Dev: вся реализация (новые файлы, правки кода, скрипты)
- Когда задача дошла до «приступай» → передать ТЗ Dev-агенту через `sessions_spawn`
- Нарушение зафиксировано: 27.03.2026 — слой плотности noisemap реализован Стримом напрямую
### Документация
- **Обязательно**: при любом изменении функционала немедленно обновлять документацию
- Документация всегда должна быть в актуальном состоянии - не "потом", а сразу после изменения
- Порядок работы: изменение → тест → документация → упаковка/коммит
### Структура задач и проектов (18.04.2026)
- Стандарт `tasks/<project-slug>/` закреплён как основа для проектов OpenClaw
- `Task` без `Project` не существует
- У `Project` должны быть `folder` и `doc_path`
- У `Task` должны быть `project`, `folder` и `doc_path`
- Машинные id живут только в онтологии, в папках и человекочитаемых названиях используются slug-и
- `snowbike-kb` оформлен как задача внутри `snowbike-rag`, а не как отдельный проект
- В спорных папках `tasks/` сначала анализ, потом предложение Славе, и только после ОК — удаление или реформа
### 🔍 OpenClaw документация — порядок поиска (14.04.2026)
При **любых** вопросах про настройку/работу OpenClaw — строго соблюдать последовательность:
1. **Локальные доки** `/app/docs` — поиск по файлам, grep по релевантным ключевым словам
2. **docs.openclaw.ai** — если локально не найдено → `web_search site:docs.openclaw.ai <тема>`
3. **web_fetch** конкретной страницы с docs.openclaw.ai для деталей
4. **GitHub** `https://github.com/openclaw/openclaw` — если доки не покрывают вопрос
НЕ прыгать сразу в веб — локальные доки первыми. Это быстрее и всегда доступны.
### Управление ключами и секретами
- Ключи в `openclaw.json` (botToken, gateway.auth.token, tools.web.search.apiKey) — НЕ ТРОГАТЬ
- **Все остальные секреты** — только в `~/.openclaw/.env`
- Никогда не дублировать ключи в SKILL.md, скриптах или других файлах
### Структура workspace
- `tasks/{project}/` — каждый проект в своей папке, там же `PROJECT.md` с деталями
- `skills/` — готовые AgentSkills с полной документацией
- `data/` — выходные данные (`data/{skill-name}/`)
- `memory/` — дневные записи (`YYYY-MM-DD.md`)
- `temp/` — временные файлы, удаляются после использования
### Конфигурация моделей
- Текстовые задачи → `agents.defaults.model.primary`
- Анализ изображений → `agents.defaults.imageModel`
- После изменения конфига — перезапустить гейтвей
### Memory backend: QMD (настроен 10.04.2026)
- Конфиг: корневой ключ `memory` в openclaw.json (НЕ под `agents.defaults`!)
- QMD бинарник: `/home/node/.local/bin/qmd` — явно прописан в `memory.qmd.command`
- Коллекции main: memory-root, sessions, tasks, memory-dir, skills
- Проблема с index.yml: QMD создаёт `memory-root-main` с `**/*.md`, OpenClaw ищет `memory-alt-main`
- Фикс: вручную добавить в `~/.openclaw/agents/main/qmd/xdg-config/qmd/index.yml` запись `memory-alt-main`
- После фикса: `rm ~/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite* && openclaw memory index --force`
- Embed на CPU медленный (~30 мин на ~400 чанков) — Vector: unavailable пока идёт, потом auto-ready
- Sessions индексируются: транскрипты разговоров searchable!
### Memory Wiki (настроен 10.04.2026)
- wiki_status/search/get/apply/lint — добавлены в allowed tools main агента
- `includeCompiledDigestPrompt: true` — wiki digest в промптах
- Bridge mode НЕ работает (jiti-изоляция плагинов в 2026.4.9) — known limitation
- `openclaw wiki bridge import` всегда 0 артефактов — не баг конфига
- Workaround: ручной ingest (`openclaw wiki ingest <file>`) или unsafe-local режим
- Wiki пуста (0 entities/concepts) — нужно наполнять через `wiki_apply`
- Дневник по настройке: `memory/2026-04-10.md`
#### СКИЛЛЫ — читать ПЕРЕД любым действием (12.04.2026)
- **ВСЕГДА** открывать соответствующий скилл перед работой с новой задачей
- Не изобретать велосипед — инструкции в скилле уже есть
- Скилл открывается ДО начала действий, а не после того как застряла
- Исключение: диагностика когда непонятно куда смотреть — но потом сверяться со скиллом
- Факт нарушения: 12.04.2026 — HA audit делала вручную, скилл не открыла → потеряла время на костыли
## Проекты
## Proxy VM — vpn-srv (прокси-сервер)
- **Документация:** `tasks/proxy-vm/PROJECT.md`
- **vpn-srv:** 192.168.2.200, FRP туннель через 185.130.212.192:7000, SSH port 3322
- **Доступ:** `ssh -i ha_ssh_key -o Port=3322 vpn@185.130.212.192`, sudo: `echo meNt85doC | sudo -S`
- **VLESS:** 43.245.226.231:53903, yahoo.com SNI, **flow: xtls-rprx-vision** (обязателен!)
- **Xray порты:** 12345 (tproxy), 1080 (SOCKS5), 8888 (HTTP proxy)
### Задача #1: Homenet-VPN Wi-Fi (ГОТОВО ✅ 12.04.2026)
- **Старт:** 05.04.2026
- **Цель:** 192.168.4.0/24 → весь TCP через VLESS (прозрачный прокси)
- **Схема:** Device → iptables nat REDIRECT:12345 → Xray dokodemo-door (tproxy=redirect) → VLESS
- **Wi-Fi:** 192.168.4.0/24, шлюз 192.168.4.1 (ens19, netplan)
- **DNS:** UDP/53 → DNAT → 1.1.1.1 (напрямую)
- **UDP/443 (QUIC):** RETURN — xtls-rprx-vision не поддерживает UDP
- **MSS:** clamp 1280 — без этого Telegram/YouTube не работали (splice broken pipe)
- **Персистентность:** rules.v4 ✅, sysctl 99-tproxy.conf ✅, netfilter-persistent ✅
### Задача #2: HA Telegram через VLESS (готово ✅)
- **Дата:** 10.04.2026
- **Схема:** HA telegram_bot → SOCKS5 (192.168.2.200:1080) → VLESS → api.telegram.org
- **Только Telegram** через прокси, остальной трафик HA — напрямую
- **HA:** `ha.homenet542.keenetic.pro` (HAOS 17.1, IP 192.168.2.139)
- **Бот:** `@ha542_bot` (8251509944), chat_id Славы: 126472752
- **Entity:** `notify.telegram_bot_8251509944_126472752`
- **Сервис:** `notify.send_message``entity_id: notify.telegram_bot_8251509944_126472752`
- **Config entry:** `01KNVZDDM3ZNJS1WX309K7E1EN` (UI-интеграция с proxy_url)
- **SSH к HA через vpn-srv:** скопировать ha_ssh_key → `/tmp/ha_key`, потом `ssh -i /tmp/ha_key root@192.168.2.139`
### Интернет-заказы (vprok.ru)
- **Старт:** 31 марта 2026
- **Детали:** `tasks/internet-orders/PROJECT.md`
- **Статус:** relay-сервер запущен (185.130.212.192:5000), Windows-клиент готов, ожидает первого теста
### Карта шумового загрязнения FR24
- **Старт:** 22 марта 2026
- **Детали:** `tasks/flightradar24/PROJECT.md`
- **Статус:** прототип v0.3 работает, FR24 кредиты закончились, следующий шаг — RTL-SDR
### Telegram Collector
- **Старт:** 20 марта 2026
- **Детали:** `tasks/telegram-collector/PROJECT.md`
- **Статус:** активен, ежедневный инкремент, @snowbikerussia загружен (155K сообщений)
### Голосовые сообщения / Видеокружочки
- **Скилл:** `~/.openclaw/skills/voice-tts/SKILL.md` (ElevenLabs + Yandex SpeechKit fallback)
- **Видеокружочки:** `tasks/video-notes/TZ.md`, pipeline ElevenLabs → fal.ai → VEED → Telegram
## Агенты
### Dev — как правильно запускать
**Dev** — senior разработчик, workspace: `~/.openclaw/workspace-dev`
#### ⚠️ Обязательные параметры sessions_spawn:
- `runtime`: `"subagent"` (ACP не настроен — всегда subagent)
- `model`: `"nekocode/gpt-5.4"` (если Слава не указал другую)
- `cwd`: `"/home/node/.openclaw/workspace-dev"`**критично!** Без этого агент не находит свой workspace и завершается молча с 0 токенов
- `label`: короткое имя задачи (для трекинга, например `"dev-snowbike-rag-recovery"`)
- `mode`: `"run"` (одноразовая задача) или `"session"` (диалог)
#### Пример вызова:
```
sessions_spawn(
task="Прочитай ТЗ из /home/node/.openclaw/workspace/tasks/...\n\nСделай X, Y, Z.\n\nВерни отчёт.",
runtime="subagent",
model="nekocode/gpt-5.4",
cwd="/home/node/.openclaw/workspace-dev",
label="dev-taskname"
)
```
#### Что включать в task:
1. Ссылка на ТЗ-файл (абсолютный путь) или полный текст задачи
2. Путь к проекту (где лежат исходники)
3. Ограничения (например: "полную переиндексацию не запускать")
4. Формат ожидаемого отчёта
#### Модели:
- **Основная:** `nekocode/gpt-5.4` — если Слава не указал другую
- **Модель по умолчанию:** `anthropic/claude-sonnet-4-6` (Anthropic) — с 2026-04-11
- **Fallback при rate limit:** `openrouter/minimax/minimax-m2.7` — проверено, работает для dev-задач (2026-04-07)
- Rate limit gpt-5.4 проявляется как: агент стартует нормально, но отвечает `{"code":"rate_limited",...}`
- Если rate limit — не ждать, сразу переключаться на MiniMax или Sonnet 4.6
#### Частые ошибки:
- **Не указывать `cwd`** → агент завершается за 5 сек с 0 токенов (молчаливый фейл)
- **`streamTo: "parent"`** → работает только с `runtime=acp`, не с subagent
- **runtime=acp** → не настроен, всегда падает с ошибкой
#### Dev vs Legal:
- **Dev** (id: `dev`) — разработка, дебаг, скрипты
- **Юрист** (id: `legal`) — юридические вопросы по РФ, workspace: `~/.openclaw/workspace-legal`
- **Федя (Fedia)** — агент, workspace: `~/.openclaw/workspace-fedia`
## Скиллы
### Общие (`~/.openclaw/skills/`) — доступны всем агентам
- **voice-tts** — голосовые сообщения (ElevenLabs + Yandex SpeechKit)
- **diagram-png** — генерация PNG-диаграмм из JSON
- **diagram-table** — таблицы в PNG из JSON (Pillow, dark/light). Скрипты: `generate_table.py` (stdin→PNG), `send_table.py` (PNG→Telegram). Требует `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID` в `.env`
### Мои личные (`workspace/skills/`) — только для Стрим
- **ontology** — граф знаний (сущности, связи, запросы)
- **telegram-collector** — сбор данных из Telegram-каналов
- **youtube-search** — YouTube Data API v3. Ключ: `YOUTUBE_API_KEY`
- **yandex-search** — Yandex Search API v2. Ключ: `YANDEX_API_KEY`
- **ontology** — граф знаний (сущности, связи, запросы)
- **Онтология — общая база знаний**: `memory/ontology/`
- `graph.jsonl` — сущности и связи
- `schema.yaml` — схема типов
- `RULES.md` — правила ведения (обязательны)
- **Стрим — единственный writer**: все изменения — только через Стрим
- ⚠️ **Правило (10.04.2026):** При работе с проектами всегда автоматически обновлять онтологию (create/update) и запускать `openclaw wiki ingest` для документации — без напоминания Славы
- **Другие агенты (Dev, Legal, Feda) — читатели**: запрашивают через `sessions_send`
- **Изменения — только с подтверждения Славы**
- **При работе с проектами/задачами — всегда использовать онтологию** (правила: `memory/ontology/RULES.md`)
- Запуск из workspace: `python3 skills/ontology/scripts/ontology.py <command>`
- Storage: `memory/ontology/graph.jsonl` + `memory/ontology/schema.yaml`
- PyYAML не установлен — validate暂时 не работает
## Интеграции
- **Flightradar24 API** — тариф Explorer, 60K кредитов/мес (до 31.05.2026 промо 120K)
- FR24 API key (обновлён 24.04.2026): `019dbf18-3575-71d0-84eb-eb44606fbb63|QU3h8jqLPFyuo9qbQbPu9uoXVK42bTeclMuyRJ5Qb86ba0ea`
- **GigaChat API** — через gpt2giga прокси
- gpt2giga: `185.130.212.192:8443` (baseUrl в openclaw.json)
- Xray VLESS outbound: `43.245.226.231:15281` (Франкфурт), UUID b8d92081-..., Reality+chrome, SNI google.com
- Xray конфиг: `/home/slin/openclaw/xray-config.json`
- OpenClaw получает `HTTPS_PROXY=socks5://xray:10808` через docker-compose environment
- Цепочка: OpenClaw (mva154) → Xray VLESS → ??? → gpt2giga → GigaChat API
- Примечание: прямое подключение из контейнера к 185.130.212.192:8443 недоступно (timeout), трафик идёт через host-сеть
- ⚠️ **TODO:** Слава проверит схему — точно ли Xray участвует в цепочке к gpt2giga или это отдельный маршрут
- Локальный gpt2giga НЕ используется, удалён (08.04.2026)