# 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` с деталями
- `tasks/scripts/` и `tasks/reports/` — общие скрипты и отчёты
- `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)
- **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)
