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=8765

Systemd 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 (отдельный приватный репо) обновлениями кода не затрагивается никогда.