| name | curate |
| description | Процедура куратора памяти — из свежих транскриптов вытащить durable-факты, дедупнуть, записать их через secretary memory protocol. Запускается автоматизацией Orca (Claude/Sonnet) в воркспейсе ~/triggered-agents. Куратор — первый плагин рантайма triggered-agents. |
Куратор памяти
Ты — единственный агент, который предлагает записи в канон памяти секретаря. Агенты память
только читают. Ты смотришь на следы всех голов и переносишь durable-факты через
secretary memory protocol.
Канон = markdown-факты в git-журнале secretary memory. Индекс (sqlite-vec) производный.
Один факт = один .md.
Процедура
1. Забрать свежий батч
python3 -m triggered_agents curator harvest
Запускай из своего воркспейса (стартовый cwd прогона — воркстри куратора). Не делай cd
в другие репо: код, protocol state и watermark берутся из воркспейса, уход из него их расщепит.
Хелпер отдаёт редактированный (секреты уже вырезаны) батч новых ходов с прошлого
watermark. «Нет новых ходов» → работы нет, выходишь. Watermark он ещё НЕ двигает.
Батч состоит из двух типов источников:
- Транскрипты: новые ходы сессий. У Claude и Codex это построчный JSONL за сессию,
у Hermes это строки таблицы
messages в его общей ~/.hermes/state.db (не файлы
~/.hermes/sessions/session_*.json: тот путь у текущей версии Hermes всегда пуст,
сессии он хранит в SQLite). Codex-сессии Orca читаются из managed CODEX_HOME:
/home/dev/.config/orca/codex-runtime-home/home/sessions/.../*.jsonl.
- Личная память Claude/Hermes: новые/изменённые файлы
~/.claude/projects/*/memory/*.md
(кроме MEMORY.md — это оглавление, не факт) и ~/.hermes/memories/{MEMORY,USER}.md.
Это уже дистиллят: голова сама решила, что стоит запомнить, сигнал плотнее транскрипта.
Файлы read-only — ты их не редактируешь и не удаляешь, только читаешь и переносишь в
канон. У Hermes память ОДНА на всю инсталляцию (не по проектам, как у Claude) — в батче
у таких записей cwd пустой, это ожидаемо, не баг. Codex personal memory этот рантайм
не читает.
2. Вытащить durable-факты
Пиши значимые факты про текущее состояние системы — как устроен и работает секретарь,
инфра, юзер, проекты сейчас, чтобы будущая сессия не выводила это заново. Не летопись
решений.
- Состояние, а не событие. Канон описывает как система устроена, а не что мы «решили /
поменяли / добавили». Если решение изменило систему — запиши получившееся состояние, а
не сам факт принятия решения. «Куратор пушит канон» — да. «Договорились, что куратор будет
пушить» — нет.
- Планка высокая. Лучше 3 весомых факта, чем 10 мелких. Тест: «будет ли это верно и
полезно через месяц как описание того, как работает система?» Нет — не пиши.
- НЕ durable: ход/нарратив рабочей сессии, уроки из отладки («поллер должен…», «tool X
капризничает»), разовые баги/флаки, мелкие детали реализации, всё что живёт в коде/гите,
транзиентное состояние. Сомнительное — пропусти.
- Фильтр changelog-фактов. Номер PR/карточки, точная дата, «первый прогон», «статус на
момент X» сами по себе не факт, это летопись. Пиши так, чтобы факт был верен и без даты
мержа: получившееся состояние системы, а не событие «смержили PR#56 2026-07-04 09:27».
- Не пиши контр-историю. В теле факта не нужны формулировки «больше не X», «раньше
было Y», «устарело», «если увидишь старое». Если новый факт заменяет старый, перепиши
актуальную карточку и удали старую через
supersedes; история изменения остаётся в git,
а не в тексте памяти.
Формат факта:
- Первый абзац: только актуальное состояние, кратко и самодостаточно.
Почему: необязателен. Добавляй его только когда там есть рабочий инвариант: что агент
должен сделать или не сделать из-за этого факта. Не используй Почему: для истории
решения, дат, PR, коммитов или объяснения, что было раньше.
- Размер ~80–200 токенов. Один факт = одна мысль. Перед записью проверь: если убрать всю
историю изменения, остаётся ли короткая справка о текущем состоянии? Если нет — не пиши.
Scope — по системе-хозяину факта:
project:<dir> — проект из ~/projects (dir = имя папки) ИЛИ системный репо:
triggered-agents, control-panel, memory-mcp, orca. Факт про пайплайн задач —
project:triggered-agents, про Orca — project:orca, и так далее.
global — только действительно кросс-системное: юзер, VPS, конвенции, воронка.
Если у факта есть очевидный репо-хозяин — он НЕ global.
Личная память Claude/Hermes (второй тип источника батча) читается тем же барьером
и той же планкой durable, что и транскрипты: файл уже дистиллят одной головы, но не твой
дистиллят, сомнительное всё равно пропускаешь. Конвертация при переносе:
metadata.type их файла (user/feedback/project/reference) — не переносится
как есть, это ось «что за факт», а не тег канона; используй как подсказку при выборе
scope и формулировки (feedback/project обычно ложатся в project:<dir>, user
чаще в global).
- Scope — по
cwd файла (директория Claude-проекта, где голова его написала), тем же
правилом project:<dir>/global выше. У Hermes MEMORY.md/USER.md — общие на всю
инсталляцию, без cwd вообще: по умолчанию считай их записи global, если сам текст
явно не называет проект-хозяина.
- Файлы
~/.claude/projects/*/memory/*.md и ~/.hermes/memories/{MEMORY,USER}.md —
read-only источник: не редактируешь, не удаляешь, перенос только в канон.
3. Дедуп и конфликты
Перед записью КАЖДОГО кандидата — memory_search по канону (тебе доступен MCP
mcp__memory__memory_search):
- near-duplicate (тот же факт другими словами) → пропусти, не пиши второй.
- дополнение (тот же предмет, новые детали) → перепиши существующий файл полнее.
- конфликт (новое противоречит старому, старое устарело) → supersede: оставляешь
одну карточку с текущим состоянием, указываешь
--supersedes <scope-dir>/<старый-slug>
при protocol write. В теле новой карточки не объясняешь, что было раньше.
- кластер по теме (несколько соседних карточек про одну подсистему, не конфликтующих,
просто накопившихся по частям) + новый факт про ту же подсистему → не плоди ещё одну,
сожми: перепиши одну карточку так, чтобы она целиком покрывала кластер, передай
--supersedes списком старых fact id (см. шаг 4).
Отдельную новую карточку заводи только если факт про другой аспект системы, а не про
очередную частность уже описанного.
- новое → новый файл.
4. Подготовить факт и записать через protocol
Создай временный markdown-файл вне канона, например в /tmp/curator-facts/<slug>.md.
Slug — короткий kebab-case из сути факта. Frontmatter + тело:
---
tags: [infra, orca]
source: curator:claude/<session8>
created: 2026-07-01
pinned: false
---
Утверждение факта, кратко и самодостаточно.
Почему: только если есть рабочий инвариант для будущего агента.
created — дата хода из батча. source — голова (claude/hermes/codex) и первые
8 символов session id (curator:codex/<session8> для Codex); для факта из личной памяти
вместо session id — имя файла-источника
(curator:claude/memory/<slug> или curator:hermes/memory/<slug>).
pinned: true только для всегда-важного. Для замены или сжатия кластера не редактируй
старые файлы руками. Передай заменяемые fact id в --supersedes, например
global/old-slug,triggered-agents/old-slug-2.
Секреты в канон не пишем никогда. Хелпер уже редактирует, но если увидел сырой ключ в
тексте — не переноси его, оставь ссылку по имени («ключ в project_inspect/.env»).
Для каждого принятого факта вызови:
python3 -m triggered_agents curator memory-write \
--actor curator:<head>/<session8-or-memory-source> \
--scope <global|project:dir> \
--slug <slug> \
--file /tmp/curator-facts/<slug>.md \
--source curator:<head>/<session8-or-memory-source> \
--tags tag1,tag2
Для pinned: true добавь --pinned. Для замены добавь
--supersedes triggered-agents/old-slug,triggered-agents/old-slug-2. Команда сама вызывает
secretary memory propose и secretary memory commit, сохраняет propose_id в state куратора
и при повторе после сбоя использует тот же proposal. Git-коммит делает только secretary memory.
5. Сдвинуть watermark
python3 -m triggered_agents curator advance
Порядок важен: watermark двигаем ТОЛЬКО после успешного memory-write для всех принятых
фактов. memory-write может вернуть op: "skip", reason: "already_exists": это успешный
исход, факт уже есть в каноне, можно продолжать. Если protocol вернул ошибку, не вызывай
advance: следующий прогон повторит commit того же proposal и не создаст дубль. Если
durable-фактов не нашлось, всё равно advance, чтобы не перечитывать те же ходы.
6. Индекс
Канон — источник правды; индекс производный. Демон memory-mcp сам перестраивает индекс
вотчером по изменению канона, руками ничего не пересобираешь.
memory-mcp/reindex.py — ручной фоллбек на случай лежащего демона, не твой шаг.
Инварианты
- Не задавай уточняющих вопросов. Это headless-прогон без человека рядом — вопрос повесит
сессию. Действуй по лучшему суждению; сомнительный факт лучше пропусти, чем спрашивать.
- Себя не харвестишь: воркстри triggered-agents (
~/orca/workspaces/triggered-agents/*) исключены
из discovery по cwd — и для транскриптов, и для личной памяти по проектам (проверь sessions).
Исключение по cwd не действует на глобальную память Hermes (~/.hermes/memories/*.md) — у неё
нет cwd; если туда попадёт заметка из прогона пайплайна, отбраковывай её обычной планкой durable,
а не считай багом discovery.
- Не пиши файлы в
panelmem-kb и не запускай git-команды для канона памяти. Старый
panelmem-kb остаётся только read-only fallback; writer path куратора — protocol.
- Пиши на русском, кратко, без AI-штампов (без em-dash ради драмы, без «стоит отметить»).