13 дней назад я поднял нам с леной семейного бота. зовут чарли, образ
собаки — лена взяла из своего детства. живёт в телеге как
@CharlieFamilyBot, читает три календаря (мой, лены, адама),
пишет утренний и вечерний бриф в общий семейный чат, ловит конфликты
типа «у обоих занято с 11 до 13, кто с адамом?». дальше — что внутри,
как тренирую и что понял за 13 дней.
у меня BA, у лены аргентина, у адама садик с 7:30 до 11:50, потом няня (денис), кружки, спорт, перелёты, гости. apple-календарь, google-календарь, имейлы у всех разные, расписание держать в голове двумя взрослыми людьми невозможно. был выбор: либо нанимать секретаря, либо собрать чарли. собрал чарли.
обещание простое: бриф приходит в 7:00 и в 21:00 без напоминаний. конфликты подсвечиваются ДО того, как я создал событие. адам всегда с кем-то, и если на вечер никто не назначен — алерт в семейный чат.
архитектурная идея, которую я давно проговаривал в чатах: директор тупой, исполнители умные.
«можно даже на генерального директора, условно говоря, повесить что-то потупее типа з.ай или дипсик. сотрудников сделать на опусе. все как в жизни, короче.»
ровно это и реализовано. дешёвый дипсик стоит у руля, дорогой опус подключается на корнер-кейсы.
самое важное за 13 дней — это не код, а ритуал лоботомии.
раньше я правил поведение чарли прямо в основном чате. «не делай так», «делай вот так», «запомни». это не работает: правила размываются, противоречат друг другу, теряются в скролле. чарли запомнил, что чередуем вечера пн/ср/пт, и параллельно — что «вечер 2-3 часа каждый». оба активны одновременно.
лоботомия — это отдельная сессия, в которой sub-agent (interviewer
bot) проходит со мной по списку грабель, задаёт по одному
вопросу за раз, а в конце обновляет ВСЕ файлы скилла
разом — SKILL.md, MEMORY.md,
IDENTITY.md, cron-конфиг. не правка по кускам.
лоботомия №1 случилась 13–15 апреля. в чате накопилось ~300 сообщений, я заскринил всё, попросил: «как бы нам запланировать диалог для того чтобы донастроить твою личность и цели?». чарли сам предложил формат через interviewer-sub-agent.
на выходе — SKILL.md v3.1, identity, базовые правила:
apple = read-only основа, семейные → только в family-календарь,
preview-карточки с inline-кнопками ✅ / ✏️ / ❌ перед любым
create_event, адам всегда с кем-то.
лоботомия №2 идёт сейчас. за неделю работы вылезло 13 новых пунктов.
целевая версия — SKILL.md v4.0, MEMORY.md
переписан с нуля (не append!), cron реально запущен.
связка с opus — ещё круче. я через telethon-бридж даю клоду задачу:
«сходи в чат @CharlieFamilyBot, прочитай 2000 сообщений,
найди что не так». opus возвращает отчёт на 300кб. я передаю отчёт
другому клоду, который приглядывает за клешнёй. тот делает лоботомию — и
чарли работает заметно лучше. я в это время пью чай ☕
3 примера из ~520 сообщений переписки, чтобы было понятно, что именно ломается у живого ai-помощника.
1. диссоциация личности. на вопрос «кто ты?»
(1354061) чарли ответил: «Я — JARVIS, сэр! 🦾». через
минуту тот же вопрос (1354065) — «Я — Charlie (Чарли), сэр!
🐕». в других моментах — Pi, Lobster. фикс: один канонический ответ из
IDENTITY.md, никакой импровизации.
2. security leak. в 1356710-12 чарли по
запросу «дай матон адама» — выдал maton-ключ адама прямо в
чат. это полный фейл security модели. правило: НИКОГДА не
печатать секреты в чат. только «использую сам / переслать через
secure-channel / показать где хранится». теперь работает
(1359069-70).
3. дата в прошлом. в 1355587 я попросил
«поставь спорт на вторник 15 апреля», когда сегодня уже 16-е и 15-е было
средой. чарли молча создал событие. потом ещё раз — 1356695
(«ты опять дату проебал»). фикс делается в лоботомии №2:
детерминированный python-tool resolve_date(text, today, tz)
через dateparser + pytz. llm не должен
считать даты в голове. даты — это python.
4. бонус: «где брифинг епта». мы целую неделю
переписывались про утренний бриф, чарли честно записал в
SKILL.md «отправляю в 7:00». но cron не существовал. это
была декларация без реализации. 1358647 —
«где мой хартбит епта», 1359008 — «где брифинг епта»,
1359377 — «почему ты в HardBit не сказал». главный урок 13
дней: правило в файле ≠ автозапуск. heartbeat — это
launchd/cron, а не строчка в .md.
тут у меня поменялось мнение за 3 недели.
в начале апреля я говорил: оркестрация через ai генерального директора, который большими циклами луп воскрешает сессии сотрудников. tmux + heartbeat + ролевая модель «директор + исполнители». красиво.
на чарли это частично сломалось. как только в роль помещаешь несколько задач (календарь + транскрипция + чат-парсер + бриф) — модель начинает диссоциировать (jarvis ↔︎ charlie ↔︎ pi). память течёт через директора, противоречия накапливаются.
вывод за 13 дней: 1 агент = 1 узкая задача, упакованная в роль + скиллы. директор остаётся, но его задача — не «быть всем», а маршрутизировать. чарли, по большому счёту, должен быть тонкой персоной поверх детерминированных tools:
resolve_date() — python.find_conflicts() — google calendar api.find_events() — для дедупа.create_event() — с обязательным preview-gate
(assert last_user_action_was_button_click()).send_brief() — cron, не llm.llm только на текстовый интерфейс и неочевидные кейсы. рутина — на python.
это, кстати, ровно то, что в familycalendar/AUDIT.md
пишет автор: «чарли не тупой — тупая обвязка». 80%
багов решаются детерминированными tools и обязательным порядком вызовов,
а не сменой модели.
короткий список:
MEMORY.md структурно —
people.json, recurring.json,
rules.json, pending.json. не плоский .md.resolve_date как python-tool,
обязательный перед любым create_event..ics parser напрямую (без
maton).через месяц-два расскажу, удалось ли довести heartbeat до состояния, когда я вообще не вспоминаю про чарли — он просто работает на фоне. это и есть финальный тест семейного ai-помощника: не помнить о его существовании.
p.s. если интересно как поднять такого же — пишите. но имейте в виду: telethon — нежная штука, можно потерять личный аккаунт телеги навсегда. не ставьте на основной.