Кейс 07 · управление знаниями · собственный продукт
Пишу мысли как в блокнот — дважды в день агент превращает их в связанную базу знаний
Мысли пишутся одним потоком в блокнот — без тегов, папок и форматирования, с любого устройства. Дважды в сутки автономный LLM-агент превращает написанное в атомарные заметки, связи и тематические карты. Полная автономия без подтверждений — роль контролёра выполняют технические предохранители. Система живёт в проде на реальных личных данных.
Результаты конкретного проекта, не гарантия аналогичных показателей.
Контекст
Я веду параллельно несколько направлений — дистрибуцию мебельной фурнитуры, производство, собственные продукты — и вся фактура по ним жила в переписках, заметках телефона и голове: юнит-экономика, договорённости, цены, выводы из книг. Найти нужное можно было только пролистыванием чатов, а половина решений просто терялась.
Классический метод атомарных заметок эту боль решает, но у большинства людей умирает: между «мысль пришла» и «заметка со ссылками» стоит скучная ручная работа, которую никто не делает. Противоположный метод — один файл, всё новое сверху — выживает всегда, но на выходе даёт неструктурированную простыню на тысячи строк, в которой невозможно искать.
Цена проблемы не в минутах. Мысль, не превращённая в заметку, не встречается с другими мыслями. Наблюдение о терпении в третьем периоде хоккейного матча и вывод «на штормящем рынке лучшая сделка — её отсутствие» никогда не окажутся рядом, хотя это один и тот же принцип. Такие стыки и есть источник новых идей.
Решение — совместить оба метода и убрать из связки человека: на входе один файл без трения, на выходе структура, а скучную работу между ними делает автономный агент.
Ограничения
- Ноль подтверждений. Осознанное решение: агент работает полностью автономно и ничего не спрашивает. Следствие — роль контролёра целиком берут на себя технические предохранители, а не человек
- Только iPhone на мобильном входе. iOS запрещает приложениям фоновую работу; мобильная git-синхронизация четырежды затирала свежие файлы устаревшими слепками. Ввод через мессенджер отвергнут: заметки должны жить там же, где читаются
- Агенту нельзя давать git и командную строку. Только чтение, запись и поиск. Все операции с историей делает скрипт-обвязка после проверок — агент не может обойти предохранители, даже если ошибётся
- Инкрементальность обязательна. Наивная схема «читать всё хранилище каждый прогон» перестанет работать через полгода: разбор смотрит только новое, а связи ищет поиском
- Кириллица в именах файлов, урезанное окружение и таймзона планировщика — самые частые причины тихого отказа таких систем; каждая закрыта отдельно
- Приватность. Личные заметки: приватный репозиторий, секреты вне репозитория с ограниченными правами, сквозное шифрование синхронизации
Решение
Что это даёт
Человек пишет мысли в один файл — обычным текстом, без тегов, папок и форматирования, с любого устройства. Дважды в сутки система сама превращает написанное в структуру: атомарные заметки-утверждения, задачи, карточки книг и проектов, связи между ними и обновлённые тематические карты. Раз в неделю она перечитывает архив целиком и ищет неочевидные пары — заметки из разных областей, между которыми нет ссылки, но есть общий механизм мышления. Отдельный модуль собирает «План на день»: только сегодня и завтра, по времени, с галочками.
Как устроено
Вход — файл «Поток»: ноль трения, ничего не сортируется в момент записи. Выход — плоская папка атомарных заметок и хабы-карты тем: структура живёт в ссылках, а не в каталогах. Между ними — LLM-слой: автономный агент (Anthropic API) в headless-режиме на VPS, запускаемый по расписанию с промптом, отсылающим к файлу правил внутри самого хранилища.
Правила — не код, а редактируемый документ: как классифицировать запись, как проверять атомарность, как искать кандидатов на связи через поиск по ключевым понятиям, как сохранять голос автора и честно помечать места, где смысл был достроен. Поведение системы правится обычной правкой текста, без деплоя.
Предохранители вместо доверия
Автономность держится на технике, а не на вере в модель. Каждый прогон — отдельный git-коммит. Записи, пришедшие с устройств, коммитятся до запуска агента: откат отменяет работу агента и физически не может стереть написанное человеком. Прогон, удаливший файл или изменивший текст чужой записи, откатывается автоматически, а перед откатом делается спасательный снимок. Сравнение идёт по строкам без служебных меток — заменить пометку «сыро» на «обработано» у дозревшей записи можно, тронуть саму мысль нельзя. Системные файлы — скрипты и правила — живут в эталонной копии вне репозитория и восстанавливаются при каждом прогоне, если их затёрла сбойная синхронизация. При срабатывании любого предохранителя в корне хранилища появляется файл-маячок, а в начало ежедневного отчёта — баннер.
Синхронизация
Git оставлен только на сервере — как история и бэкап. Устройства синхронизируются через шифрованный Obsidian Sync, а сервер участвует в той же синхронизации через постоянно работающий headless-Obsidian в Docker-контейнере. Это компромисс, купленный кровью: первая архитектура с git-синхронизацией на всех устройствах разваливалась на iPhone.
Архитектура
Правила агента — документ внутри хранилища, а не промпт в коде. Поведение системы правится без деплоя; агент перечитывает правила каждый прогон.
Агент лишён git и командной строки; историей управляет обвязка. Агент не может обойти предохранители, даже если ошибётся.
Коммит входящих данных до работы агента. Единственный способ сделать откат безопасным при внешней синхронизации.
Эталонная копия скриптов вне репозитория + самовосстановление. Репозиторий синхронизируется на телефон, и телефон способен затереть в нём скрипты.
Инкрементальный разбор + полный обход только в еженедельном ревью. Линейный рост стоимости прогона убил бы систему на горизонте полугода.
Общая блокировка всех прогонов. Разбор, ревью и сборка плана не должны трогать git одновременно.
Генерируемый «План на день» с обратной записью галочек в источник. Представление можно пересобирать сколько угодно — состояние живёт в источнике. Даты, за которые собран план, хранятся в его шапке: иначе вчерашние галочки припишутся сегодняшнему дню — баг, пойманный тестом.
Стек
Результат
За первую неделю в проде: 63 заметки и 167 связей из ~40 записей потока, 20 автоматических прогонов подряд без вмешательства — всё проверяемо по git-истории, а не по демо-ролику. Максимальное время «мысль → структурированная заметка» — не больше девяти часов при двух прогонах в сутки; раньше этот путь не происходил вовсе. Критичные сценарии закрыты 13 сценарными тестами и 26 проверками готовности, которые прогоняются перед работой.
| Показатель | Было | Стало |
|---|---|---|
| Ручная разборка записей | неизбежный ежедневный этап | 0 минут — 20 прогонов подряд |
| База знаний за первую неделю | 0 | 63 заметки · 167 связей |
| Потеряно записей за всё время | — | 0 из ~40, включая аварию |
Надёжность
Как система ловит собственные ошибки
Лучшая проверка предохранителей — реальная авария, и она случилась.
После перехода с git-синхронизации на Obsidian Sync записи с устройств стали приходить в рабочую папку сервера незакоммиченными. Старый механизм отката этого не учитывал — и первый же ложный откат стёр свежие записи вместе с работой агента.
Дальше система повела себя так, как и была спроектирована. Спасательный снимок, который делается перед каждым откатом, сохранил всё стёртое — записи восстановлены полностью, ноль потерянных за всё время работы. А сам инцидент вскрыл вторую проблему: тревога писалась в файл внутри скрытой служебной папки, и о простое никто не знал 36 часов. Теперь аварийный сигнал обязан быть в поле зрения по умолчанию — файл-маячок в корне хранилища и баннер в начале ежедневного отчёта: отказ виден в тот же прогон, а не через полтора суток.
Главный вывод зашит в порядок операций: сначала фиксируются данные человека, потом система делает что угодно со своими. Коммит входящих записей стоит первым шагом каждого прогона — теперь откат физически не может стереть написанное человеком.
Что бы сделал иначе
- Предохранитель оказался опаснее угрозы, от которой защищал. Жёсткий откат был безопасен, пока устройства синхронизировались через git. После смены синхронизации он стал стирать незакоммиченные записи. Урок: сначала фиксируй данные пользователя, потом откатывай своё
- Ложное срабатывание стоило двух суток работы системы. Проверка «строка потока не изменена» запрещала любое изменение строки — включая легальную замену служебной пометки у дозревшей записи. Каждый прогон честно откатывался. Сравнивать надо было сразу по содержимому, без служебных меток
- Тихий отказ хуже громкой ошибки. Канал аварийного сигнала обязан быть на виду по умолчанию, а не в скрытой папке — 36 часов простоя это доказали
- Мобильный git — тупик, и это стоило четырёх заходов. iPhone четырежды затирал свежие файлы устаревшими слепками, дважды пришлось пересоздавать хранилище с нуля. Признать тупик стоило раньше: на починку ушло больше, чем на нормальное решение
- Чужие тексты — не для атомизации. Первый разбор попытался раздробить конспект книги на полсотни огрызков. Правило уточнено: чужие тексты переносятся целиком в источники, атомизации подлежат только собственные мысли
Хотите систему, которая наводит порядок в ваших данных сама — и при этом физически не может их потерять?
Напишите — разберём, что можно автоматизировать в вашем случае.