Agent (index) — Telegram AI-ассистент (smixs/agent-second-brain)
Обзор
Голосовой AI-ассистент с Obsidian vault. Telegram-бот + постоянная Claude Code сессия.
Важно: это НЕ личный AI-секретарь Сергея — отдельный проект от smixs (agent-second-brain), поднят на forge. Работает на той же подписке Claude Code, что и основная сессия main — лимиты общие (5-часовое окно и weekly делятся между всеми сессиями аккаунта).
Состав
- @agentsb_bot — Telegram бот (aiogram 3.x)
- dbrain — постоянная Claude Code сессия в tmux
- vault — Obsidian vault (markdown файлы)
- autograph — graph-based memory engine (decay, MOC, cards)
- RAG — Qdrant + sentence-transformers поиск по vault
Расположение
- Код:
/home/claude/projects/agent-second-brain/ - Vault:
/home/claude/projects/agent-second-brain/vault/ - Symlink:
/home/claude/vault→ vault
Конфигурация (.env)
TELEGRAM_BOT_TOKEN=8679322352:AAF5lRRHx052NWQI9g1rwTJsi7nMLe6czH4
VAULT_PATH=/home/claude/projects/agent-second-brain/vault
ALLOWED_USER_IDS=[30777924]
TZ=Europe/Moscow
CLAUDE_MODEL=sonnet
QDRANT_URL=http://localhost:6333
RAG_HOST=127.0.0.1
RAG_PORT=8765Systemd units
dbrain-bot.service — Telegram бот
dbrain-watchdog.service — watchdog bot-сессии
dbrain-process.timer — ночная обработка vault (21:00)
dbrain-doctor.timer — health checks
dbrain-rag-indexer.service — индексер vault → Qdrant
dbrain-rag-api.service — FastAPI поиск localhost:8765
CLI (dbrain)
/home/claude/.local/bin/dbrain <status|restart|logs|doctor|clear|attach|repair|login>
status— быстрая сводка:stateиз~/.dbrain/STATUS.md(healthy/rate_limited/…) + жив ли bot-процесс + жив ли watchdog + жива ли tmux-сессия мозга (dbrain_34962659)attach— зайти в tmux-пейн мозга живым TTY (полезно при пустомcapture-pane, будит отрисовку)doctor/repair— диагностика и попытка автофиксаrestart— пересоздать сессию мозгаlogs— логи бота
Ручная проверка в обход CLI: tmux capture-pane -t dbrain_34962659 -p (что реально на экране) и cat ~/.dbrain/STATUS.md (что видит watchdog — может быть устаревшим кэшем, см. Инциденты).
RAG поиск
API endpoint: http://127.0.0.1:8765/search?q=...&limit=5
Модель: paraphrase-multilingual-MiniLM-L12-v2 (384 dims, multilingual)
Qdrant: shared контейнер [[projects/coreclaw]]-qdrant, коллекция vault
Memory Engine (autograph)
- Карточки с decay (Ebbinghaus)
- MOC индексы (проекты, идеи, задачи, рефлексии)
- Graph health + dedup
- Ночной pipeline: daily notes → cards
Инциденты
2026-08-15: бот «второй памяти» слал «⏳ Лимит подписки исчерпан» — ЛОЖНАЯ тревога, реального лимита не было. ЗАКРЫТО.
Причина: regex-классификатор tmux_parse.classify_state выдаёт RATE_LIMITED, если на экране сессии есть текст usage limit|rate limit|weekly limit|resets at|…. Экран застрявшей/зомби tmux-сессии показывал старый баннер «weekly limit» (кадр от 12–13.08) → бот классифицировал как лимит. Реального лимита не было: подписка Pro (~/.claude/.credentials.json: subscriptionType=pro), сессия main на том же аккаунте работала.
Решение (утро 15.08, закрыл Hermes): поправлен regex-парсер rate_limited в tmux_parse.py; tmux-сессия dbrain_34962659 пересоздана (09:23) → пустой экран ушёл, STATUS.md=healthy; бот в 12:17 ответил «Да» — работает.
Побочный реальный баг (найден+устранён): зомби-сессия dbrain_34962659_cron давала ПРЕФИКС-МАТЧ tmux — has-session -t dbrain_34962659 цеплял _cron, из-за чего liveness-проверка ложно считала «мозг жив», а capture-pane читал зомби. Чинить точным именем (=dbrain_34962659). Зомби убит.
Урок: сообщение о лимите ≠ реальный лимит — проверять subscriptionType в credentials и КОД классификатора, а не строить теории. По ходу выдал 5 неверных версий подряд; Hermes закрыл инцидент коротко и верно. См. MEMORY · auto-memory feedback-no-fabricated-facts.
2026-08-14: ideas/inbox копился днями — обработка стояла после early-exit.
Посты от savereelsbot (ideas/inbox/) разбираются в scripts/process.sh
(таймер dbrain-process в 21:00) командой d_brain.pipeline inbox. Но секция
inbox стояла после проверки пустого daily: при DAILY_SIZE < 50 скрипт
делал exit 0 (graph-only) и до inbox не доходил. В дни без записей в daily
inbox не разбирался вовсе → 7 постов (7–10.08) провисели до 14.08. Второй фактор:
13.08 daily был непустой, до inbox дошло, но упало rate_limited (выжженный
лимит подписки), ретрая нет. ИСПРАВЛЕНО: inbox-секцию перенёс до проверки
пустого daily (commit 7a12233) — теперь разбирается всегда, а early-exit ветка
всё равно коммитит+пушит изменения. Пустой inbox = быстрый no-op. Остаточный
риск: если 21:00-запуск попадёт на rate_limit, посты ждут следующего дня (не
критично — подхватятся). 7 постов за 14.08 разобраны вручную при старте сессии.
2026-07-15: brain-rebuild.service падает на permission error.
Юнит (Quartz build vault → сайт, таймер каждые 30 мин) валится на
vault/inbox/[[inbox/2026-07-03-inbox]].md — файл и сама папка inbox/ принадлежат
root:root (drwxr-xr-x), а сервис бежит от claude без прав на запись.
Содержимое файла — старый чат-лог, не ценно. Фикс: sudo chown -R claude:claude vault/inbox/. У d-brain сессии нет passwordless sudo — чинить
руками. ИСПРАВЛЕНО (16.07): владелец сменён на claude:claude, юнит с 12:46:57
16.07 завершается успешно (0/SUCCESS).
2026-08-15: ЛОЖНЫЙ rate_limited — парсер цеплял слова из ответа Claude.
tmux_parse.py _RATE_RE матчил usage limit|rate limit|limit reached|resets at|5-hour limit|weekly limit по последним 18 строкам пейна (chrome). Когда Claude РАБОТАЛ и писал ответ про лимиты (например, разбирал почему бот возвращает лимит) — его же текст попадал в chrome → классификатор решал RATE_LIMITED → бот отвечал “Лимит подписки исчерпан”, хотя Claude работал. Второй источник: строка You've hit your session limit остаётся в ИСТОРИИ пейна после закрытия меню — тоже цеплялась.
ИСПРАВЛЕНО: _RATE_RE теперь матчит только СТРУКТУРУ активного меню /rate-limit-options (нумерованные пункты 1. Stop and wait for limit to reset / 2. Upgrade your plan) — по аналогии с _TRUST_MENU_RE. История и текст ответов не ловятся. Проверено 3 кейсами: нормальная сессия с историей лимита → ready, активное меню → rate_limited, Claude пишет про лимиты → ready. Бот перезапущен.
2026-08-15: @agentsb_bot — НЕ личный AI-секретарь Сергея.
Записи в MEMORY/services/project называли его “AI секретарь” — неверно. Это отдельный бот из репо smixs/agent-second-brain, поднятый на forge; Сергей его не считает своим секретарём. Работает на подписке Claude Code Сергея — 5-часовое окно и weekly лимит ОБЩИЕ между сессией main и dbrain_34962659. Когда одна сессия выжигает лимит — встаёт и вторая (и наоборот). Факт важен для планирования: параллельная работа двух сессий ускоряет выжигание 5-часового окна.
2026-07-16: false-positive ”❌ Ошибка сессии” при длинных tool-heavy ходах.
claude_session.py:470-473 (DEFAULT_STALL_TIMEOUT = 180с) считает сессию
“wedged”, если в tmux-пейне нет новых байт дольше 180с, и возвращает
AskResult("error", "session stalled (no active turn)") — бот показывает
пользователю ошибку, хотя Claude всё ещё реально работает (просто тихий
участок вывода при цепочке Bash-вызовов). Ловится в chat_session.py:58
как session ask for user N returned error. Не баг сессии — эвристика
детекции зависания слишком чувствительна для ходов с долгими
диагностическими sweep’ами (systemctl/journalctl/docker). Повторилось дважды
16.07 (13:00, 13:16) во время ручного расследования инцидентов.
Интеграции
- Metricool MCP: управление постами @technologiprivat
- Brand: “Technologi Privat”, brandId: 6384443
- Token в
~/.claude/.credentials.json
- Deepgram: транскрипция голосовых сообщений
Iva — тестовый переход (в процессе, 18.07)
Готовим параллельный тест smixs/iva на этом же сервере (полный план в
iva-agent). Токен нового тестового Telegram-бота получен
18.07 и лежит в ~/.config/iva-pending.env (вне git, chmod 600) —
не в vault, секреты сюда не пишем. Deepgram- и OpenRouter-ключи для
установки переиспользуем существующие (agent-second-brain/.env,
~/.hermes/.env). install.sh ещё не запускали — ждём, пока
пользователь будет за терминалом (не с телефона, sudo требует пароль,
которого у сессии нет). После установки iva-pending.env удалить.
Как работают правки и обновления (важно для риска): ~/iva — это
живой git-checkout апстрима smixs/iva, не форк и не отдельная копия.
Своя логика добавляется только новыми файлами (agent/skills/*,
agent/connections/*, agent/subagents/*) — это безопасно, iva update их не тронет. А вот правка существующих файлов (например
agent/instructions.md) рискованна: iva update делает git fetch +
fast-forward, а если апстрим force-push’нул — hard-reset, который
затирает несохранённые правки в отслеживаемых файлах. Наш vault
(отдельный приватный репо) обновлениями кода не затрагивается никогда.