Мнемозина — агентный конвейер знаний
Превращает сырье из инбокса в проверенное, разложенное по разделам знание с пометкой
«как это поможет мне» и короткой справкой к действию.
Порядок истины при расхождении: $MNEMAZINE_VAULT/99 Система/00 СИСТЕМА — Агентный конвейер знаний.md
(принципы/таксономия/формат справки) и $MNEMAZINE_VAULT/99 Система/Протокол_Мнемозина.md (ворота полноты)
бьют этот файл, потому что SSOT на диске обновляется чаще скилла. Прочитай «00 СИСТЕМА…» перед
исполнением. У нового пользователя этого файла может не быть — это не ошибка: первый запуск
работает без него.
Три слоя Карпаты — у каждого свой владелец правки: сырье (инбокс + _archive) неизменяемо,
конвейер его не редактирует никогда · ноты принадлежат конвейеру — в разделы vault они попадают и
меняются только через него · схема («00 СИСТЕМА…» + Протокол_Мнемозина.md) со-эволюционирует с
владельцем: ее меняет решение владельца, не прогон. Слой, правленный не своим владельцем,
перестает быть доказуемым.
Рой (основной режим)
Запускай через mnemazina-coordinator — единую точку входа для всего, потому что он один
держит гейты полноты; ручной обход координатора теряет ворота и делает тихий дроп возможным.
Координатор сам делает guard, triage, fan-out процессоров, storage, retrieval.
Agent(
subagent_type: "mnemazina-coordinator",
prompt: "{команда пользователя или контент}"
)
Четыре агента роя ($HOME/.claude/agents/mnemazina-pipeline/):
| Агент |
Модель |
Роль |
mnemazina-coordinator |
sonnet |
Оркестратор-контролер: census→triage→ГЕЙТ-1→fan-out→store→ГЕЙТ-2→ГЕЙТ-3→леджер |
mnemazina-processor |
haiku/sonnet/opus (по тиру) |
Стадии 2–5 для одного материала (параллельно). Пишет source: во frontmatter |
mnemazina-librarian |
haiku→sonnet |
Стадии 6–7 (хранение, без архива) + retrieval + архивация только за ГЕЙТ-3 |
mnemazina-reconciler |
sonnet |
«Менделеев» — сверщик полноты: каждый файл инбокса → нота/причина. Блокирует архив и «done» |
Выбор модели по тиру (решает координатор):
| Тир |
Условие |
Модель |
| 0 |
Код/tech-структура |
Ollama qwen2.5-coder:7b pre-pass → haiku |
| 1 |
Простой текст/скриншот |
haiku extract + sonnet verify+refine |
| 2 |
Стандарт (статья/промт/методика) |
sonnet на всех стадиях |
| 3 |
Мед/юр/фин факт · спорное · сложный синтез |
sonnet + opus verify+refine |
Fable 5 — именованный опциональный тир, не дефолт. Для стадий Extract/Verify/Classify/Refine
(mnemazina-extract/-verify/-classify/-refine или комбинированный mnemazina-processor)
координатор спавнит агентов с model: "fable" (Claude Fable 5) вместо haiku/sonnet/opus только
когда пользователь явно просит Fable 5 на прогон («прогони через Fable 5», «модель — Fable 5»),
потому что это самый дорогой тир и без явной просьбы его цена не оправдана.
Guard/Triage/Distribute/Store/Index/Reconciler остаются на дефолтном тире (haiku/sonnet) — оверрайд
касается только синтез-стадий одного материала, не механических и не gate-стадий. Без явной
просьбы — таблица тиров 0–3 как обычно.
MCP и инструменты в конвейере:
| Инструмент |
Где использует |
Зачем |
mcp__markitdown__convert_to_markdown |
mnemazina-processor стадия 2 |
PDF/DOCX → markdown до чтения Claude (−60% токенов) |
kb-fetch <url> CLI |
mnemazina-processor стадия 3 |
Чтение первоисточника локально за $0 (markitdown для бинарников, trafilatura для HTML; честные exit-коды вместо выдумки) |
kb-search "<запрос>" [--ru] CLI |
mnemazina-processor стадия 3 |
Метапоиск без ключей (ddgs: brave/ddg/mojeek/startpage, --ru добавляет yandex) — фолбэк, когда встроенный WebSearch пуст |
YouTube-сабы через yt-dlp --write-subs --write-auto-subs |
стадия 0 |
Готовые субтитры за секунды и $0 вместо ~30 мин whisper-транскрипции часового ролика; сабов нет → whisper как раньше |
agent-reach CLI (doctor) |
стадия 3, платформы |
Роутер платформ: RSS/Bilibili/V2EX работают; его web-канал (Jina, квота) не использовать — kb-fetch локальнее; Reddit/Twitter выключены — аккаунтов у владельца нет, живые треды соцсетей без логина не отдает никто |
Ollama localhost:11434 |
mnemazina-processor pre-pass |
Бесплатная очистка кода/техконтента |
| Memory MCP (если доступен) |
mnemazina-librarian FIND |
Быстрый cross-session поиск |
Retrieval:
/kb find <запрос> → mnemazina-coordinator → mnemazina-librarian (FIND mode)
- Быстрый grep по vault, ранжирование, проектный контекст из
_ПРОЕКТЫ.md
- Ответ: топ-7 заметок с relevance score + связь с проектами + действие
- Нетривиальный синтез ответа (сравнение, найденная связь между нотами) → предложи сохранить его
заявкой в инбокс тем же путем (
agent-research--…), потому что синтез, умерший в чате,
не накапливается.
Inline-контент от пользователя: пользователь вставил текст/ссылку прямо в чат → координатор
сохраняет в инбокс и обрабатывает, потому что нота без файла-источника не пройдет сверку покрытия.
Боковая дверь агента: файл-заявка agent-research--<project>--<slug>.md в
$HOME/Desktop/Mnemazine Inbox/ — законный вход наравне с inline владельца, потому что файл, положенный
в раздел vault напрямую, минует census и гейты (канон — docs/AGENT-MEMORY.md проекта mnemazine).
Конвейер обрабатывает заявку как обычное сырье; нота получает type: agent-research,
claim_status: provisional — в проверенный корпус агентское знание переходит только операцией
graduate после ревью, потому что агентская верификация слабее владельческого конвейера.
Резервный режим: mnemazina-coordinator недоступен — это не ошибка, выполняй стадии ниже
вручную сам; недоступный отдельный агент mnemazina-* — тоже: бери его инструкцию из
$HOME/.claude/agents/mnemazina-pipeline/ и исполняй сам.
Режимы
| Команда |
Что делает |
/kb или /mnemazina |
Обработать новое сырье из $HOME/Desktop/Mnemazine Inbox/ (см. Пути) |
/kb backlog |
Легаси-бэклог удален 2026-05-31; режим — для будущих массовых дампов, если появятся |
/kb migrate |
Перенести AI Knowledge Base/ → 08 AI и Инструменты/, починить связи |
/kb fix <файл> [<раздел>] |
Ре-классификация заметки без Finder → агент mnemazina-fix |
/kb watch |
Авто-обработка, по умолчанию выключена (включение — см. Авто-режим ниже) |
OPS вызова (важно)
- Движок Workflow запрещает
Date.now()/new Date() в скриптах, потому что это ломает
resume. RUN_ID/created_at берутся из args.now (ISO), иначе fallback unstamped000000.
Не возвращай Date в скрипты — движок отвергнет прогон на resume.
- Named-вызов
Workflow({name:"mnemazina-pipeline"}) кэширует скрипт на старте сессии, поэтому
правка $HOME/.claude/workflows/mnemazina-pipeline.js мид-сессии не подхватится — гони через
Workflow({scriptPath:"$HOME/.claude/workflows/mnemazina-pipeline.js"}) или новую сессию.
- Уникальный RUN_ID: mode-detect читает
args.message отдельно от args.now, так что объект
слать безопасно. Всегда: Workflow({name:"mnemazina-pipeline", args:{now:"<ISO>", message:"<команда|пусто>"}}).
ISO брать из Bash date -u +%FT%TZ (Date в скрипте запрещен). Без now все прогоны получают
id kb-unstamped000000 и сталкиваются в _run-observability.jsonl — леджер наблюдаемости
становится нечитаем.
- Форматы
args: строка-команда ("найди кофе"), строка-JSON ('{"now":"…","message":"…"}') или
объект ({now,message}) — все три дают одинаковый mode-detect. INLINE-режим срабатывает по длине
message>80, не по сериализации объекта.
- Census детерминирован: состав инбокса =
find -maxdepth 1 -type f (агент census-list),
не haiku-census-агент, потому что LLM-перепись врет в обе стороны — дропает реальные файлы и
считает мусор подпапок типа .claude/scheduled_tasks.lock. Empty-check по trueCount с диска.
Top-level счетчики итоговой сводки тоже могут врать — сверяй диск (ls инбокса, ctime архива),
не поля сводки.
- Codex fallback: если Claude Code недоступен, запускай
$HOME/.codex/bin/mnemazine-kb [команда].
Это адаптер того же mnemazina-pipeline.js: agent(...) исполняется через codex exec, агенты
берутся из $HOME/.codex/agents/mnemazina-pipeline/, OCR из $HOME/.codex/skills/mnemazina/vision-ocr.
Проверка паритета зеркал — одной командой (отдельного скрипта нет):
diff -rq $HOME/.claude/agents/mnemazina-pipeline $HOME/.codex/agents/mnemazina-pipeline && diff -q $HOME/.claude/workflows/mnemazina-pipeline.js $HOME/.codex/workflows/mnemazina-pipeline.js.
Дифф не пустой — это не ошибка, а сигнал пересинхронизировать codex-зеркало из канона $HOME/.claude.
- Токены в финале обязательны: итоговый результат всегда содержит
token_usage, потому что
без него token-аудит сессии слеп. Claude runtime берет оценку из abtop/_run-observability.jsonl;
Codex fallback суммирует tokens used каждого codex exec agent-вызова.
Пути
- База знаний (стабильна):
$MNEMAZINE_VAULT/ · Стейджинг: $MNEMAZINE_VAULT/00 Входящие/
- Инбокс (ЗАКРЕПЛЕН на Рабочем столе):
$HOME/Desktop/Mnemazine Inbox/. Сюда юзер кидает сырье —
иди сюда сразу, не спрашивай и не ищи, потому что поиск инбокса по диску жжет токены на
решенный вопрос. (Старый симлинк-алиас на эту же папку может существовать для совместимости.)
- Проект «Полезные промты» (бэклог + tools/docs + архив) — может переезжать, поэтому ищи по
маркер-файлу, а не по запомненному пути:
INBOX="$HOME/Desktop/Mnemazine Inbox" # закреплен; создай, если нет
PROJ=$(dirname "$(find $HOME/Desktop ~ -maxdepth 5 -name 'AI_KNOWLEDGE_BASE_SYSTEM.md' 2>/dev/null | head -1)")
ARCHIVE="$INBOX/_archive" # durable: mv обработанных исходников в подпапки ГГГГ-ММ/ (вне git-vault, БЕЗ авто-удаления)
Маркер не нашелся → PROJ пуст — это не ошибка: обычный /kb работает без проекта, PROJ
нужен только режимам backlog/migrate; сообщи об этом в справке и продолжай.
- Легаси-бэклог: удален 2026-05-31 (пусто). Новый массовый дамп → клади папкой в
$PROJ и зови /kb backlog.
- Транскрипция (Стадия ⓪): движок
~/.npm-global/bin/whisper (openai-whisper, модель small);
рабочая папка $INBOX/_work/.
Подготовка (один проход в начале) — агент mnemazina-guard (haiku)
- Проверь, что база доступна на запись и пути существуют (создай отсутствующее), потому что
отказ записи в середине прогона оставляет пол-обработанный инбокс.
1б) Git-снапшот vault — до первого
mv и до merge дублей в Стадии ⑥, потому что merge без
снапшота необратим:VAULT="${MNEMAZINE_VAULT:?укажите путь к vault}"
git -C "$VAULT" rev-parse --git-dir >/dev/null 2>&1 || git -C "$VAULT" init .
git -C "$VAULT" add -A && git -C "$VAULT" commit -m "pre-/kb $(date +%Y-%m-%dT%H:%M)" --allow-empty
При сбое: git -C "$VAULT" log --oneline -5 → точка восстановления.
1в) Lockfile прогона — защита read-modify-write индексов от параллельного /kb:LOCKFILE=/tmp/kb-run.lock
[ -f "$LOCKFILE" ] && { echo "Уже идет прогон (PID $(cat $LOCKFILE)). Удалите $LOCKFILE."; exit 1; }
echo $$ > "$LOCKFILE"; trap "rm -f $LOCKFILE" EXIT
Lockfile занят — это не сбой твоего кода, а параллельный прогон: сообщи пользователю и
остановись; чужой lock не удаляй сам, потому что удаление на живом прогоне дает гонку
в _МАСТЕР-ИНДЕКС.
- Прочитай
_ROUTING.md (корень vault) и 99 Система/_ШАБЛОНЫ.md — дешевый первый проход,
который избавляет от переспрашивания таксономии на каждом материале.
- Собери список только нового сырья: пропусти
README.md и уже обработанное (сверь с
99 Система/Лог обработки.md). Для каждого материала пиши в лог при старте каждой стадии,
не только в финале, потому что лог только-по-финалу теряет след упавшей стадии.
Инбокс пуст — это не ошибка: скажи об этом и предложи /kb backlog.
- Durable-архив: обработанные исходники
mv в $ARCHIVE/ГГГГ-ММ/ (подпапка по дате прогона),
БЕЗ авто-удаления, потому что оригиналы нужны для claim↔источник ре-верификации нот.
Конвейер (⓪ транскрипция + 7 стадий)
Вход — медиа (ссылка/файл видео/аудио/подкаст) → сначала Стадия ⓪ (mnemazina-transcribe), затем 1–7.
Один материал = одно самостоятельное знание = один .md. Обрабатывай ВСЕ материалы инбокса,
не один: они независимы и могут быть на разные темы → разные разделы и заметки; батч — не одна
тема. Группируй только настоящие дубли/связанное (стадия 1). Много материалов → распараллель
субагентами (рой по умолчанию). Каждый материал проходит все стадии независимо; индексацию делай
батчем в конце, потому что per-материальная индексация дает N перезаписей одного индекса.
Тяжелое чтение (картинки, PDF, веб) делегируй субагентам — в основном контексте оно вытесняет
план прогона.
Субагенты ($HOME/.claude/agents/mnemazina-pipeline/), модели по сложности:
| Стадия |
Агент |
Модель |
Выход |
| pre-run |
mnemazina-guard |
haiku |
git-снапшот + lockfile + retention. Блокирует конвейер при гонке |
| ⓪ Транскрипция |
mnemazina-transcribe |
haiku |
transcript.md + сырой segments.json (если вход — медиа) |
| 1 Триаж |
mnemazina-triage |
haiku |
список материалов + тип + группы, дубли отсеяны |
| 2 Извлечение |
mnemazina-extract |
sonnet |
чистое ядро (OCR/чтение, шум убран) |
| 3 Верификация |
mnemazina-verify |
sonnet (спорное→opus) |
первоисточник + VERIFIED-ENUM + факт/реконструкция/добавлено |
| 4 Классификация |
mnemazina-classify |
sonnet |
раздел (или предложение нового по правилам) |
| 5 Огранка |
mnemazina-refine |
sonnet (сложное→opus) |
готовая заметка + блок «как поможет мне» + справка |
| 6 Распределение |
mnemazina-distribute |
sonnet |
.md записан в раздел, вики-связи, дубли слиты (с git-снапшотом ДО merge) |
| 7 Индексация |
mnemazina-index |
haiku |
обновлены _Содержание.md, _МАСТЕР-ИНДЕКС.md, _ROUTING.md, лог |
| 7.5 Сверка (ГЕЙТ) |
mnemazina-reconciler |
sonnet |
«Менделеев»: каждый файл инбокса → нота (по source:)/причина. Маркер ПОКРЫТИЕ ПОЛНОЕ ✓ или список дыр. Блокирует архивацию |
| fix |
mnemazina-fix |
sonnet |
ре-классификация: mv + frontmatter + индексы + лог |
Ворота полноты (принудительное исполнение)
Главное правило системы: ни один файл инбокса не архивируется и прогон не закрывается «done»,
пока на диске не доказано, что файл учтен — потому что единственный смертный грех конвейера
это тихий дроп материала. SSOT: 99 Система/Протокол_Мнемозина.md.
Мнемозина здесь — надзиратель, а не участник: маркер отсутствует → СТОП, следующая стадия не
стартует; каждая стадия отчитывается «✓ Стадия N» / «❌ Стадия N — причина»; 2 провала подряд →
СТОП + уведомить пользователя; архив открывается только за ГЕЙТ-3 (а он требует пройденного ГЕЙТ-2); done — лишь при
unaccounted==0 и сходящемся леджере.
Три ворот-маркера. Условие проверяет код workflow (детерминированная сверка списков файлов),
не суждение агента, потому что агент-автор не судит полноту своей же работы:
| Гейт |
Маркер |
Когда |
Условие (не выполнено → СТОП/ремонт) |
| ГЕЙТ-1 |
## МАНИФЕСТ ПОЛНЫЙ ✓ |
после триажа |
union(units.files) ∪ classified == census(инбокс). Файлы, что триаж пропустил, форсируются в юниты — триажу на полноту не доверяем |
| ГЕЙТ-2 |
## ПОКРЫТИЕ ПОЛНОЕ ✓ |
после Store |
каждый census-файл → нота с source: на диске ИЛИ причина (dup/noise/unreadable/deferred). Дыры → авто-ретрай-раунд (Sonnet) |
| ГЕЙТ-3 |
## АРХИВ РАЗРЕШЕН ✓ |
после сверки |
mv в архив только учтенных файлов. Непокрытые остаются в инбоксе + флаг — не теряются |
Гейт качества ноты (NOTE-SPEC): после Store, до Reconcile —
node "$MNEMAZINE_ROOT/scripts/mnemazine-vault-quality-gate.mjs" --spec --changed-since <старт прогона>.
Провал ноты = она уходит в ретрай, не в раздел, потому что пожелание шаблона исполняется
вероятностно, а код-гейт всегда (канон — docs/NOTE-SPEC.md проекта mnemazine).
Контракт ноты (обязателен): каждый процессор пишет source: <точное_имя_исходного_файла>
во frontmatter, потому что это единственный ключ наземной сверки — нота без source: покрытием
не засчитывается, и файл будет числиться дырой.
Леджер в финале (всегда в сводке): noted + dup + noise + unreadable + deferred + unaccounted == census.
Расхождение → статус done_with_gaps (не done), дыры названы поименно.
Census ≠ триаж. Census (Кирилов, haiku) механически перечисляет ВСЕ файлы инбокса — наземная
правда. Триаж (Сопиков) классифицирует. Сверщик (Менделеев) сверяет триаж с census и с диском.
Три независимых взгляда, потому что пропуск одного ловится другим.
Токеносбережение (встроено в workflow)
База — 95% скриншоты; токены утекают на спавне агента-на-материал и повторной обработке. Меры:
| Мера |
Стадия |
Эффект |
hash-cache (99 Система/_processed-hashes.json) |
Census |
SHA-256 каждого файла; уже обработанный → скип за 0 токенов (ни агента, ни vision). Все cached → ранний выход + архив. Закрывает корень инцидента «дроп-124» — повторную обработку, на которой терялись файлы |
| markitdown CLI |
Извлечение |
PDF/DOCX/PPTX/XLSX/EPUB → markdown локально до Claude (не vision/сырье). Уже установлен |
| локальный OCR (Apple Vision) |
OCR-проход (до триажа) |
Скрин/картинка → vision-ocr "<файл>" локально → текст-сайдкар .ocr/*.txt, 0 токенов, русский точно. Облачный vision — только фолбэк (пусто+TIER3). Не ollama/llava — галлюцинирует на русском |
| локальная транскрипция (openai-whisper) |
TRANSCRIBE-проход |
Видео/аудио → whisper --model small локально → .transcript/*.txt, $0. Видео больше не deferred |
| cost-aware тиры |
Process |
text/pdf/docx/xlsx/url/video → Haiku (тир 1); код → тир 0; мед/юр/фин → Sonnet/Opus |
| семантический дедуп (fastembed) |
Process 4.5 |
пере-скриншот/пере-сейв того же знания (другой хэш, та же суть) → cosine ≥0.72 к ноте vault → дубль, новую не плодим. Локально (~/.venvs/kb-embed, multilingual-MiniLM), без Ollama. Индекс 99 Система/_embeddings.json, дозапись после Store. Скрипт kb-embed.py (build/add/query) |
После Store librarian дописывает хэши обработанного в кэш, чтобы следующий прогон их не тронул.
Извлечение — LOCAL-FIRST, $0: OCR = Apple Vision (vision-ocr), транскрипция = openai-whisper,
текст-доки = markitdown, дедуп = fastembed. Облачный vision — только фолбэк. Для извлечения Ollama
не нужен (llava отклонен — галлюцинирует на русском); pre-pass кода на qwen2.5-coder:7b (тир 0) —
отдельная, живая роль.
Стадия ⓪ (транскрипция) — вход видео/аудио/URL
Материал-ссылка (YouTube/1000+ сайтов) или файл (видео/аудио/подкаст) → mnemazina-transcribe:
yt-dlp → ffmpeg (wav 16k mono) → ~/.npm-global/bin/whisper --model small → transcript.md +
сырой segments.json. Транскрипт держи сырым (без summary), потому что ценное из него извлекают
стадии 2–3, а ранний summary срезает то, что они ищут. Модель: дефолт small (кэш, ~0.5x realtime,
авто-язык RU/EN); макс точность → medium/large-v3. Нет инструмента (yt-dlp/ffmpeg/whisper) —
это не тупик: предложи установку с объяснением «зачем», решает юзер (пункт «Проверка инструментов»
в справке). Приватное видео → нужны cookies, спроси.
Контроль стадии 3 (верификация + обогащение)
Обогащение — всегда, это дефолт. Внешний поиск разрешен без спроса, потому что каждая нота
строится из исследованного первоисточника, не из семени-скрина. --private — только опт-ин
(юзер явно пишет), тогда: локальная верификация, verified → непроверяемо-методом (--private).
Token-frugal контракт — тяжелое чтение сети несет локальный kb-fetch за $0, контекст агента ест минимум:
- GitHub-репо/инструмент → сначала GitHub MCP (
mcp__github__*, владелец его выдал —
авторизация внутри); MCP недоступен → REST API, не scrape, потому что scrape на GitHub
блокируется: curl -s https://api.github.com/repos/{owner}/{repo} → точные звезды/pushed_at/license;
релиз .../releases/latest. Парсь jq/python3. Лимита 60/ч хватает; больше → keychain-токен
(printf 'protocol=https\nhost=github.com\n\n' | git credential fill — по host, метка аккаунта
несущественна; токен не печатать и не коммитить — утечка в лог/git необратима).
- Не-GitHub URL →
kb-fetch <url> (симлинк в ~/.local/bin, канон —
$HOME/Проекты/mnemazine/scripts/kb-fetch.py): один вызов → один JSON с markdown, бинарники
(pdf/docx/…) конвертит markitdown, HTML — trafilatura, кодировки легаси-рунета чинит сам.
Exit-коды честные: 2 = needs_js (эскалируй на Playwright MCP или WebFetch), 3 = заблокировано
(пометь «источник недоступен», содержимое не выдумывай), 4 = сеть. ok:false → факт остается
непроверенным, это штатный исход, не сбой.
- Поиск: встроенный WebSearch первым (бесплатен, уже оплачен подпиской); пусто/рунет →
kb-search "<запрос>" [--ru] (ddgs-метапоиск без ключей: brave/ddg/mojeek/startpage, --ru
добавляет yandex последним — он лучше индексирует рунет, но банит агрессивнее всех).
- Firecrawl — только по явной команде владельца («жги кредит»), потому что это платные кредиты
и его Fire-engine нужен лишь классу сайтов за жесткой анти-бот-защитой; sgai из конвейера удален
(бесплатного режима у него нет, кредиты разовые).
- В ноту — дистиллят ≤120 слов (что это · выгода · звезды/версия/цена · 1 подводный камень · URL),
не дамп, потому что дамп в ноте — это те же токены при каждом будущем чтении vault.
- Дедуп: перед вызовом
grep vault (тема покрыта → скип). Кэш 99 Система/_enrich-cache.json
(повтор = 0 вызовов). Батч похожих нот → 1 заход.
Приоритет источников: WebSearch (встроенный) → kb-search (ddgs) — для поиска; kb-fetch →
Playwright MCP/WebFetch (needs_js) — для чтения URL; Firecrawl — только по явной команде владельца.
Промт из материала прогони сам (выполним ли, дает ли заявленное), потому что заявление автора —
не факт. Факт/цифру/мед./юр./фин. сверь с официальным источником.
verified — пять значений (VERIFIED-ENUM):
подтвержден — факт проверен по внешнему источнику
источник-не-найден — искали, не нашли (это не значит «неверно»)
непроверяемо-методом — PDF за paywall, личный черновик
проверено-практикой — выставляет только пользователь после применения, потому что практику агент за него не проживет
облако-недоступно — сеть/поиск деградировали: kb-search исчерпал бэкенды, kb-fetch вернул blocked, WebSearch пуст
Не подтвердилось — это не повод дропать: ставь одно из четырех non-подтвержден значений,
заметку сохраняй, факт вынеси в справку — решает пользователь.
Стадия 4 — новый раздел
Новый раздел — только при выполнении всех условий контракта (не лег ≥70% никуда · устойчивая
область · ≥2 знания со временем), потому что легкое создание разделов размывает таксономию до
нечитаемости. Иначе — ближайший раздел + уточняющий тег. Создал раздел → обнови мастер-индекс,
роутинг, лог и обязательно вынеси в справку, чтобы пользователь мог отменить.
Стадия 5 — фрейминг «как поможет мне»
Каждая заметка обязана иметь блок (без него знание лежит мертвым — нет входа в действие):
- Текущие проекты — к чему применимо. Список берется только из
$MNEMAZINE_VAULT/99 Система/_ПРОЕКТЫ.md (единый источник; не хардкодить здесь, потому что хардкод
протухает молча). Файл пуст или отсутствует — это не ошибка, ставь общий шаблон: «Применить
к задаче, над которой работаете сейчас. Чтобы получать персональные шаги — добавьте проекты
в _ПРОЕКТЫ.md».
- Саморазвитие — какой навык/привычку качает.
- Следующее действие — одно конкретное действие на сегодня.
Стадия 5.6 — самообучающиеся референсы доменов
Знание несет actionable-способность по домену (новый скилл, MCP, CLI, инструмент, правило,
техника) → конвейер дозаписывает ее в $HOME/.claude/references/<домен>.md, потому что так карты
инструментов умнеют вместе с vault, а не отстают от него.
Маппинг знание → домен → файл:
| Сигнал ноты (теги/раздел/суть) |
Домен |
Файл |
| security / уязвимость / auth / секреты / OWASP / pentest |
безопасность |
references/security.md |
| дизайн / UI / UX / Figma / анимация / типографика / бренд |
дизайн |
references/design.md |
| агентные системы / рой / оркестрация / GSD / loop / harness / суб-агенты |
агенты |
references/agents.md |
| веб-поиск / скрейп |
бесплатный стек kb-fetch/kb-search |
$HOME/Проекты/mnemazine/scripts/kb-fetch.py (Firecrawl — легаси, только по команде владельца: references/firecrawl.md) |
| деплой / сервер / VPS / CI |
деплой |
references/deploy.md |
| новый устойчивый capability-домен |
— |
создать references/<домен>.md по образцу security.md |
Правила дозаписи:
- Только actionable (имя скилла · команда установки · когда применять) — пересказ ноты в референсе
дублирует vault и протухает вторым экземпляром.
- Дедуп: уже в референсе → не дублировать (можно уточнить).
- Внешний код (установка) — правило зависит от типа находки, см. Стадию 5.65: Claude Code/агентный
скилл → автоустановка; MCP-сервер/open-source система/tool → «добрать (явное добро)».
- Что дозаписано — строкой в сводную справку: «Референсы обновлены: …».
Стадия 5.65 — автоустановка скилла vs подтверждение для MCP/tool
Развилка на находках, которые документируют внешнюю способность для агента — применяется ДО
Стадии 5.7 (регистрация в routing-реестре) и решает, ставить ли находку молча или ждать владельца:
- Материал документирует Claude Code / агентный скилл (переиспользуемая процедура/промт-паттерн
для AI-агента) → устанавливать автоматически: добавить в
$HOME/.claude/skills/, зарегистрировать в
~/.agents/SHARED-SKILLS-WORKFLOWS.md и ~/.agents/GITHUB-STARS-LEDGER.md (если применимо),
без дополнительного подтверждения владельца — скилл это текст, риск низкий, откат = удаление папки.
- Материал документирует MCP-сервер или open-source систему/инструмент, требующий установки
(npm/pip/docker/clone) → НЕ устанавливать автоматически, потому что это внешний код с большей
поверхностью риска (сеть, credentials, системные изменения). Вынеси находку в отчет прогона и
дождись явного «да» от владельца перед установкой. (Правило 2026-07-12, kb-20260712T131126.)
Стадия 5.7 — регистрация способности в routing-реестре
Знание несет скилл/MCP/CLI/инструмент с именем-id (не просто технику) → зарегистрируй его в
реестре способностей, чтобы автоподбор route-skills увидел его немедленно, а не после
weekly-пересбора.
Как: дописать JSONL-строку в ~/.agents/registry/overrides.jsonl:
{"id":"<имя-скилла-как-в-skills>","rating":4,"model":"S","domains":["<домен>"],"purpose":"<одной строкой>","use_when":"<триггер-слова задачи>"}
id = точное имя скилла (папка в skills/), потому что только так build_registry свяжет
запись с установленным скиллом. Знание-only (еще не установлен) → запись = «кандидат», станет
полной после установки.
domains/use_when — чтобы routing ловил по задаче (включая RU-слова).
- Запись в
overrides.jsonl под WatchPaths → launchd com.athena.registry-watch сам гонит
registry-rebuild.sh (index+registry+views+graphify+validate) → routable «сразу же».
Гарантированно-сразу (без ожидания watch): bash ~/.agents/registry/scripts/registry-rebuild.sh --now.
- Дедуп: id уже в
overrides.jsonl/registry.jsonl → уточни строку, не плоди дубль — дубль id
делает выбор реестра недетерминированным.
- В сводку: «Реестр способностей: + (routable)».
- Зеркалировать обновленный референс по правилу зеркалирования (после справки/решения).
Финал
- Источник опустел: обработанный исходник перемещен (
mv) в $ARCHIVE, в инбоксе только
README.md. (Политика: durable-архив БЕЗ авто-удаления — см. Подготовку, шаг 4.)
- Обязательные код-шаги (детерминированный код с exit-кодом, не суждение агента):
node "$MNEMAZINE_ROOT/scripts/mnemazine-refresh-core-indexes.mjs", затем его
--check гейт — exit ≠ 0 значит индексы не сошлись, чинить до справки.
graphify --update по vault (граф — память Мнемозины).
- Catch-up линта:
$MNEMAZINE_VAULT/99 Система/_lint/.last-lint отсутствует или старше 36 часов →
прогнать node "$MNEMAZINE_ROOT/scripts/mnemazine-kb-lint.mjs", потому что ночное
расписание могло не сработать — догоняем при ближайшем запуске.
- Верни пользователю сводную справку (таблица: знание · раздел · verified (причина) ·
как поможет · следующее действие; + новые разделы; + требуют решения; + 🔧 Проверка инструментов;
- Референсы обновлены (какие
references/<домен>.md дозаписаны — Стадия 5.6)).
- Дозапиши
99 Система/Лог обработки.md.
Условие останова. Прогон закончен, когда леджер сходится и справка выдана. Проверь свой
последний абзац: сводная таблица с леджером и token_usage — закончено; обещание («сейчас
обработаю…»), план или вопрос без справки — не закончено, продолжай, потому что обещание в
финале = прогон, который никто не завершил.
Авто-режим (/kb watch, по умолчанию выключен)
Задел под автозапуск без команды. Включать только по явному запросу пользователя, потому что
watch + ручной /kb без lockfile прогона (Подготовка, шаг 1в) дают гонку read-modify-write
в _МАСТЕР-ИНДЕКС. Два способа:
- launchd/cron на Mac: watcher следит за инбоксом, при новых файлах дергает
claude -p "/kb".
- Scheduled task / hook: периодический прогон
/kb, если инбокс непуст.
Скрипт-watcher и пример конфига: $HOME/.claude/skills/mnemazina/watch/ (README там же). Секреты
в скрипт/конфиг не зашивать — plist и cron-строки читаемы всем локальным процессам.
Зеркалирование (всегда, но строго ПОСЛЕ решения пользователя)
Зеркалить нужно всегда (скилл — общая способность → Codex $HOME/.codex/skills/mnemazina/ + VPS
root@ATHENAOS_HOST:/srv/agent-os, без секретов). Порядок жесткий, потому что зеркало до решения
пользователя разносит по машинам то, от чего он еще может отказаться:
- Сначала выдай пользователю короткую справку о полученном знании: что это + куда применить
прямо сейчас (проекты из
99 Система/_ПРОЕКТЫ.md).
- Если что-то надо ставить/подключать — предложи явно: «давай установим …».
- Только после решения пользователя (применили/установили или отказались) → зеркаль на
Codex + VPS, затем обнови каталоги.
Не зеркаль молча и не раньше справки.
Когда НЕ применять (и чем заменить)
- «Прочитай/перескажи этот файл» без просьбы сохранить — просто прочитай и ответь: конвейер
добавит стадии, гейты и токены к задаче, у которой нет выхода в vault.
- Вопрос по коду/проекту (любой репозиторий) — это
graphify-запрос или обычная работа с
кодом: Мнемозина хранит жизненные знания в $MNEMAZINE_VAULT, а не код-контекст проектов.
- Факт о владельце/сессии на будущее («запомни, что я предпочитаю X») — это auto-memory
(
MEMORY.md проекта), не нота vault: авто-память per-project и дешевая, vault — для durable-знания
с источником.
- Рабочее дело со своим конвейером (например ведение клиентских дел) — отдельная сессия в
своем репозитории: у таких дел собственная раскладка, ноты vault им не замена.
- Правка содержимого существующей ноты — правь файл в vault напрямую;
/kb fix — только
ре-классификация (перенос раздела + frontmatter + индексы), не редактор текста.
- Включение
/kb watch «заодно» — только по явной просьбе: см. Авто-режим, причина — гонка
индексов.
1---2name: mnemazina3description: Мнемозина — агентный конвейер знаний. Превращает все, что попало в $HOME/Desktop/Mnemazine Inbox/ (скриншоты, PDF, ссылки, видео, аудио, заметки), в проверенные классифицированные Obsidian-ноты с блоком «как это поможет мне», обновляет оглавления разделов и мастер-индекс, возвращает справку к действию. Use whenever the user runs /kb, /mnemazina, /kb find, /kb fix, /kb backlog, /kb migrate, or says anything about processing collected material — «обработай входящие», «разбери инбокс», «разложи по базе знаний», «process my inbox», «ingest this». Also use when the user pastes a link, text, or screenshot asking to save/remember it («сохрани это в базу», «добавь в vault», «запомни на будущее»), and when the user asks what their knowledge base holds on a topic («/kb find <query>», «найди в базе знаний», «что у меня есть про…»). Trigger even if the user never names Мнемозина or /kb — any request to file material INTO the personal vault ($MNEMAZINE_VAULT) or retrieve knowledge FROM it belongs here.4---56# Мнемозина — агентный конвейер знаний78Превращает сырье из инбокса в проверенное, разложенное по разделам знание с пометкой9«как это поможет мне» и короткой справкой к действию.1011**Порядок истины при расхождении:** `$MNEMAZINE_VAULT/99 Система/00 СИСТЕМА — Агентный конвейер знаний.md`12(принципы/таксономия/формат справки) и `$MNEMAZINE_VAULT/99 Система/Протокол_Мнемозина.md` (ворота полноты)13бьют этот файл, потому что SSOT на диске обновляется чаще скилла. Прочитай «00 СИСТЕМА…» перед14исполнением. У нового пользователя этого файла может не быть — это не ошибка: первый запуск15работает без него.1617**Три слоя Карпаты — у каждого свой владелец правки:** сырье (инбокс + `_archive`) неизменяемо,18конвейер его не редактирует никогда · ноты принадлежат конвейеру — в разделы vault они попадают и19меняются только через него · схема («00 СИСТЕМА…» + `Протокол_Мнемозина.md`) со-эволюционирует с20владельцем: ее меняет решение владельца, не прогон. Слой, правленный не своим владельцем,21перестает быть доказуемым.2223## Рой (основной режим)2425Запускай через **mnemazina-coordinator** — единую точку входа для всего, потому что он один26держит гейты полноты; ручной обход координатора теряет ворота и делает тихий дроп возможным.27Координатор сам делает guard, triage, fan-out процессоров, storage, retrieval.2829```30Agent(31 subagent_type: "mnemazina-coordinator",32 prompt: "{команда пользователя или контент}"33)34```3536**Четыре агента роя** (`$HOME/.claude/agents/mnemazina-pipeline/`):3738| Агент | Модель | Роль |39|---|---|---|40| `mnemazina-coordinator` | sonnet | Оркестратор-контролер: census→triage→ГЕЙТ-1→fan-out→store→ГЕЙТ-2→ГЕЙТ-3→леджер |41| `mnemazina-processor` | haiku/sonnet/opus (по тиру) | Стадии 2–5 для одного материала (параллельно). Пишет `source:` во frontmatter |42| `mnemazina-librarian` | haiku→sonnet | Стадии 6–7 (хранение, без архива) + retrieval + архивация только за ГЕЙТ-3 |43| `mnemazina-reconciler` | sonnet | «Менделеев» — сверщик полноты: каждый файл инбокса → нота/причина. Блокирует архив и «done» |4445**Выбор модели по тиру (решает координатор):**4647| Тир | Условие | Модель |48|---|---|---|49| 0 | Код/tech-структура | Ollama `qwen2.5-coder:7b` pre-pass → haiku |50| 1 | Простой текст/скриншот | haiku extract + sonnet verify+refine |51| 2 | Стандарт (статья/промт/методика) | sonnet на всех стадиях |52| 3 | Мед/юр/фин факт · спорное · сложный синтез | sonnet + opus verify+refine |5354**Fable 5 — именованный опциональный тир, не дефолт.** Для стадий Extract/Verify/Classify/Refine55(`mnemazina-extract`/`-verify`/`-classify`/`-refine` или комбинированный `mnemazina-processor`)56координатор спавнит агентов с `model: "fable"` (Claude Fable 5) вместо haiku/sonnet/opus только57когда пользователь явно просит Fable 5 на прогон («прогони через Fable 5», «модель — Fable 5»),58потому что это самый дорогой тир и без явной просьбы его цена не оправдана.59Guard/Triage/Distribute/Store/Index/Reconciler остаются на дефолтном тире (haiku/sonnet) — оверрайд60касается только синтез-стадий одного материала, не механических и не gate-стадий. Без явной61просьбы — таблица тиров 0–3 как обычно.6263**MCP и инструменты в конвейере:**6465| Инструмент | Где использует | Зачем |66|---|---|---|67| `mcp__markitdown__convert_to_markdown` | mnemazina-processor стадия 2 | PDF/DOCX → markdown до чтения Claude (−60% токенов) |68| `kb-fetch <url>` CLI | mnemazina-processor стадия 3 | Чтение первоисточника локально за $0 (markitdown для бинарников, trafilatura для HTML; честные exit-коды вместо выдумки) |69| `kb-search "<запрос>" [--ru]` CLI | mnemazina-processor стадия 3 | Метапоиск без ключей (ddgs: brave/ddg/mojeek/startpage, --ru добавляет yandex) — фолбэк, когда встроенный WebSearch пуст |70| YouTube-сабы через `yt-dlp --write-subs --write-auto-subs` | стадия 0 | Готовые субтитры за секунды и $0 вместо ~30 мин whisper-транскрипции часового ролика; сабов нет → whisper как раньше |71| `agent-reach` CLI (`doctor`) | стадия 3, платформы | Роутер платформ: RSS/Bilibili/V2EX работают; его web-канал (Jina, квота) не использовать — kb-fetch локальнее; Reddit/Twitter выключены — аккаунтов у владельца нет, живые треды соцсетей без логина не отдает никто |72| Ollama `localhost:11434` | mnemazina-processor pre-pass | Бесплатная очистка кода/техконтента |73| Memory MCP (если доступен) | mnemazina-librarian FIND | Быстрый cross-session поиск |7475**Retrieval:**76- `/kb find <запрос>` → mnemazina-coordinator → mnemazina-librarian (FIND mode)77- Быстрый grep по vault, ранжирование, проектный контекст из `_ПРОЕКТЫ.md`78- Ответ: топ-7 заметок с relevance score + связь с проектами + действие79- Нетривиальный синтез ответа (сравнение, найденная связь между нотами) → предложи сохранить его80 заявкой в инбокс тем же путем (`agent-research--…`), потому что синтез, умерший в чате,81 не накапливается.8283**Inline-контент от пользователя:** пользователь вставил текст/ссылку прямо в чат → координатор84сохраняет в инбокс и обрабатывает, потому что нота без файла-источника не пройдет сверку покрытия.8586**Боковая дверь агента:** файл-заявка `agent-research--<project>--<slug>.md` в87`$HOME/Desktop/Mnemazine Inbox/` — законный вход наравне с inline владельца, потому что файл, положенный88в раздел vault напрямую, минует census и гейты (канон — `docs/AGENT-MEMORY.md` проекта mnemazine).89Конвейер обрабатывает заявку как обычное сырье; нота получает `type: agent-research`,90`claim_status: provisional` — в проверенный корпус агентское знание переходит только операцией91graduate после ревью, потому что агентская верификация слабее владельческого конвейера.9293**Резервный режим:** mnemazina-coordinator недоступен — это не ошибка, выполняй стадии ниже94вручную сам; недоступный отдельный агент `mnemazina-*` — тоже: бери его инструкцию из95`$HOME/.claude/agents/mnemazina-pipeline/` и исполняй сам.9697## Режимы9899| Команда | Что делает |100|---|---|101| `/kb` или `/mnemazina` | Обработать новое сырье из `$HOME/Desktop/Mnemazine Inbox/` (см. Пути) |102| `/kb backlog` | Легаси-бэклог удален 2026-05-31; режим — для будущих массовых дампов, если появятся |103| `/kb migrate` | Перенести `AI Knowledge Base/` → `08 AI и Инструменты/`, починить связи |104| `/kb fix <файл> [<раздел>]` | Ре-классификация заметки без Finder → агент `mnemazina-fix` |105| `/kb watch` | Авто-обработка, по умолчанию выключена (включение — см. Авто-режим ниже) |106107### OPS вызова (важно)108109- Движок Workflow **запрещает** `Date.now()`/`new Date()` в скриптах, потому что это ломает110 resume. RUN_ID/created_at берутся из `args.now` (ISO), иначе fallback `unstamped000000`.111 Не возвращай Date в скрипты — движок отвергнет прогон на resume.112- Named-вызов `Workflow({name:"mnemazina-pipeline"})` **кэширует скрипт на старте сессии**, поэтому113 правка `$HOME/.claude/workflows/mnemazina-pipeline.js` мид-сессии не подхватится — гони через114 `Workflow({scriptPath:"$HOME/.claude/workflows/mnemazina-pipeline.js"})` или новую сессию.115- **Уникальный RUN_ID:** mode-detect читает `args.message` отдельно от `args.now`, так что объект116 слать безопасно. Всегда: `Workflow({name:"mnemazina-pipeline", args:{now:"<ISO>", message:"<команда|пусто>"}})`.117 ISO брать из Bash `date -u +%FT%TZ` (Date в скрипте запрещен). Без `now` все прогоны получают118 id `kb-unstamped000000` и сталкиваются в `_run-observability.jsonl` — леджер наблюдаемости119 становится нечитаем.120- Форматы `args`: строка-команда (`"найди кофе"`), строка-JSON (`'{"now":"…","message":"…"}'`) или121 объект (`{now,message}`) — все три дают одинаковый mode-detect. INLINE-режим срабатывает по длине122 `message`>80, не по сериализации объекта.123- **Census детерминирован:** состав инбокса = `find -maxdepth 1 -type f` (агент `census-list`),124 не haiku-census-агент, потому что LLM-перепись врет в обе стороны — дропает реальные файлы и125 считает мусор подпапок типа `.claude/scheduled_tasks.lock`. Empty-check по `trueCount` с диска.126 Top-level счетчики итоговой сводки тоже могут врать — сверяй диск (`ls` инбокса, ctime архива),127 не поля сводки.128- **Codex fallback:** если Claude Code недоступен, запускай `$HOME/.codex/bin/mnemazine-kb [команда]`.129 Это адаптер того же `mnemazina-pipeline.js`: `agent(...)` исполняется через `codex exec`, агенты130 берутся из `$HOME/.codex/agents/mnemazina-pipeline/`, OCR из `$HOME/.codex/skills/mnemazina/vision-ocr`.131 Проверка паритета зеркал — одной командой (отдельного скрипта нет):132 `diff -rq $HOME/.claude/agents/mnemazina-pipeline $HOME/.codex/agents/mnemazina-pipeline && diff -q $HOME/.claude/workflows/mnemazina-pipeline.js $HOME/.codex/workflows/mnemazina-pipeline.js`.133 Дифф не пустой — это не ошибка, а сигнал пересинхронизировать codex-зеркало из канона `$HOME/.claude`.134- **Токены в финале обязательны:** итоговый результат всегда содержит `token_usage`, потому что135 без него token-аудит сессии слеп. Claude runtime берет оценку из `abtop`/`_run-observability.jsonl`;136 Codex fallback суммирует `tokens used` каждого `codex exec` agent-вызова.137138## Пути139140- **База знаний** (стабильна): `$MNEMAZINE_VAULT/` · Стейджинг: `$MNEMAZINE_VAULT/00 Входящие/`141- **Инбокс** (ЗАКРЕПЛЕН на Рабочем столе): `$HOME/Desktop/Mnemazine Inbox/`. Сюда юзер кидает сырье —142 иди сюда сразу, не спрашивай и не ищи, потому что поиск инбокса по диску жжет токены на143 решенный вопрос. (Старый симлинк-алиас на эту же папку может существовать для совместимости.)144- **Проект** «Полезные промты» (бэклог + tools/docs + архив) — может переезжать, поэтому ищи по145 маркер-файлу, а не по запомненному пути:146 ```bash147 INBOX="$HOME/Desktop/Mnemazine Inbox" # закреплен; создай, если нет148 PROJ=$(dirname "$(find $HOME/Desktop ~ -maxdepth 5 -name 'AI_KNOWLEDGE_BASE_SYSTEM.md' 2>/dev/null | head -1)")149 ARCHIVE="$INBOX/_archive" # durable: mv обработанных исходников в подпапки ГГГГ-ММ/ (вне git-vault, БЕЗ авто-удаления)150 ```151 Маркер не нашелся → `PROJ` пуст — это не ошибка: обычный `/kb` работает без проекта, `PROJ`152 нужен только режимам backlog/migrate; сообщи об этом в справке и продолжай.153- Легаси-бэклог: удален 2026-05-31 (пусто). Новый массовый дамп → клади папкой в `$PROJ` и зови `/kb backlog`.154- Транскрипция (Стадия ⓪): движок `~/.npm-global/bin/whisper` (openai-whisper, модель small);155 рабочая папка `$INBOX/_work/`.156157## Подготовка (один проход в начале) — агент `mnemazina-guard` (haiku)1581591. Проверь, что база доступна на запись и пути существуют (создай отсутствующее), потому что160 отказ записи в середине прогона оставляет пол-обработанный инбокс.1611б) **Git-снапшот vault** — до первого `mv` и до merge дублей в Стадии ⑥, потому что merge без162 снапшота необратим:163 ```bash164 VAULT="${MNEMAZINE_VAULT:?укажите путь к vault}"165 git -C "$VAULT" rev-parse --git-dir >/dev/null 2>&1 || git -C "$VAULT" init .166 git -C "$VAULT" add -A && git -C "$VAULT" commit -m "pre-/kb $(date +%Y-%m-%dT%H:%M)" --allow-empty167 ```168 При сбое: `git -C "$VAULT" log --oneline -5` → точка восстановления.1691в) **Lockfile прогона** — защита read-modify-write индексов от параллельного `/kb`:170 ```bash171 LOCKFILE=/tmp/kb-run.lock172 [ -f "$LOCKFILE" ] && { echo "Уже идет прогон (PID $(cat $LOCKFILE)). Удалите $LOCKFILE."; exit 1; }173 echo $$ > "$LOCKFILE"; trap "rm -f $LOCKFILE" EXIT174 ```175 Lockfile занят — это не сбой твоего кода, а параллельный прогон: сообщи пользователю и176 остановись; чужой lock не удаляй сам, потому что удаление на живом прогоне дает гонку177 в `_МАСТЕР-ИНДЕКС`.1782. Прочитай `_ROUTING.md` (корень vault) и `99 Система/_ШАБЛОНЫ.md` — дешевый первый проход,179 который избавляет от переспрашивания таксономии на каждом материале.1803. Собери список только нового сырья: пропусти `README.md` и уже обработанное (сверь с181 `99 Система/Лог обработки.md`). Для каждого материала пиши в лог при старте каждой стадии,182 не только в финале, потому что лог только-по-финалу теряет след упавшей стадии.183 Инбокс пуст — это не ошибка: скажи об этом и предложи `/kb backlog`.1844. **Durable-архив:** обработанные исходники `mv` в `$ARCHIVE/ГГГГ-ММ/` (подпапка по дате прогона),185 БЕЗ авто-удаления, потому что оригиналы нужны для claim↔источник ре-верификации нот.186187## Конвейер (⓪ транскрипция + 7 стадий)188189Вход — медиа (ссылка/файл видео/аудио/подкаст) → сначала Стадия ⓪ (`mnemazina-transcribe`), затем 1–7.190Один материал = одно самостоятельное знание = один `.md`. Обрабатывай ВСЕ материалы инбокса,191не один: они независимы и могут быть на разные темы → разные разделы и заметки; батч — не одна192тема. Группируй только настоящие дубли/связанное (стадия 1). Много материалов → распараллель193субагентами (рой по умолчанию). Каждый материал проходит все стадии независимо; индексацию делай194батчем в конце, потому что per-материальная индексация дает N перезаписей одного индекса.195Тяжелое чтение (картинки, PDF, веб) делегируй субагентам — в основном контексте оно вытесняет196план прогона.197198Субагенты (`$HOME/.claude/agents/mnemazina-pipeline/`), модели по сложности:199200| Стадия | Агент | Модель | Выход |201|---|---|---|---|202| pre-run | `mnemazina-guard` | **haiku** | git-снапшот + lockfile + retention. Блокирует конвейер при гонке |203| ⓪ Транскрипция | `mnemazina-transcribe` | haiku | `transcript.md` + сырой `segments.json` (если вход — медиа) |204| 1 Триаж | `mnemazina-triage` | haiku | список материалов + тип + группы, дубли отсеяны |205| 2 Извлечение | `mnemazina-extract` | sonnet | чистое ядро (OCR/чтение, шум убран) |206| 3 Верификация | `mnemazina-verify` | sonnet (спорное→**opus**) | первоисточник + VERIFIED-ENUM + факт/реконструкция/добавлено |207| 4 Классификация | `mnemazina-classify` | sonnet | раздел (или предложение нового по правилам) |208| 5 Огранка | `mnemazina-refine` | sonnet (сложное→**opus**) | готовая заметка + блок «как поможет мне» + справка |209| 6 Распределение | `mnemazina-distribute` | sonnet | `.md` записан в раздел, вики-связи, дубли слиты (с git-снапшотом ДО merge) |210| 7 Индексация | `mnemazina-index` | haiku | обновлены `_Содержание.md`, `_МАСТЕР-ИНДЕКС.md`, `_ROUTING.md`, лог |211| 7.5 Сверка (ГЕЙТ) | `mnemazina-reconciler` | sonnet | «Менделеев»: каждый файл инбокса → нота (по `source:`)/причина. Маркер `ПОКРЫТИЕ ПОЛНОЕ ✓` или список дыр. Блокирует архивацию |212| fix | `mnemazina-fix` | sonnet | ре-классификация: `mv` + frontmatter + индексы + лог |213214## Ворота полноты (принудительное исполнение)215216Главное правило системы: **ни один файл инбокса не архивируется и прогон не закрывается «done»,217пока на диске не доказано, что файл учтен** — потому что единственный смертный грех конвейера218это тихий дроп материала. SSOT: `99 Система/Протокол_Мнемозина.md`.219220Мнемозина здесь — надзиратель, а не участник: маркер отсутствует → СТОП, следующая стадия не221стартует; каждая стадия отчитывается «✓ Стадия N» / «❌ Стадия N — причина»; 2 провала подряд →222СТОП + уведомить пользователя; архив открывается только за ГЕЙТ-3 (а он требует пройденного ГЕЙТ-2); `done` — лишь при223`unaccounted==0` и сходящемся леджере.224225Три ворот-маркера. Условие проверяет **код** workflow (детерминированная сверка списков файлов),226не суждение агента, потому что агент-автор не судит полноту своей же работы:227228| Гейт | Маркер | Когда | Условие (не выполнено → СТОП/ремонт) |229|---|---|---|---|230| ГЕЙТ-1 | `## МАНИФЕСТ ПОЛНЫЙ ✓` | после триажа | `union(units.files) ∪ classified == census(инбокс)`. Файлы, что триаж пропустил, **форсируются** в юниты — триажу на полноту не доверяем |231| ГЕЙТ-2 | `## ПОКРЫТИЕ ПОЛНОЕ ✓` | после Store | каждый census-файл → нота с `source:` на диске ИЛИ причина (`dup`/`noise`/`unreadable`/`deferred`). Дыры → авто-ретрай-раунд (Sonnet) |232| ГЕЙТ-3 | `## АРХИВ РАЗРЕШЕН ✓` | после сверки | `mv` в архив **только** учтенных файлов. Непокрытые **остаются в инбоксе** + флаг — не теряются |233234**Гейт качества ноты (NOTE-SPEC):** после Store, до Reconcile —235`node "$MNEMAZINE_ROOT/scripts/mnemazine-vault-quality-gate.mjs" --spec --changed-since <старт прогона>`.236Провал ноты = она уходит в ретрай, не в раздел, потому что пожелание шаблона исполняется237вероятностно, а код-гейт всегда (канон — `docs/NOTE-SPEC.md` проекта mnemazine).238239**Контракт ноты (обязателен):** каждый процессор пишет `source: <точное_имя_исходного_файла>`240во frontmatter, потому что это единственный ключ наземной сверки — нота без `source:` покрытием241не засчитывается, и файл будет числиться дырой.242243**Леджер в финале** (всегда в сводке): `noted + dup + noise + unreadable + deferred + unaccounted == census`.244Расхождение → статус `done_with_gaps` (не `done`), дыры названы поименно.245246**Census ≠ триаж.** Census (Кирилов, haiku) механически перечисляет ВСЕ файлы инбокса — наземная247правда. Триаж (Сопиков) классифицирует. Сверщик (Менделеев) сверяет триаж с census и с диском.248Три независимых взгляда, потому что пропуск одного ловится другим.249250## Токеносбережение (встроено в workflow)251252База — 95% скриншоты; токены утекают на спавне агента-на-материал и повторной обработке. Меры:253254| Мера | Стадия | Эффект |255|---|---|---|256| **hash-cache** (`99 Система/_processed-hashes.json`) | Census | SHA-256 каждого файла; уже обработанный → скип за **0 токенов** (ни агента, ни vision). Все cached → ранний выход + архив. Закрывает корень инцидента «дроп-124» — повторную обработку, на которой терялись файлы |257| **markitdown** CLI | Извлечение | PDF/DOCX/PPTX/XLSX/EPUB → markdown локально до Claude (не vision/сырье). Уже установлен |258| **локальный OCR** (Apple Vision) | OCR-проход (до триажа) | Скрин/картинка → `vision-ocr "<файл>"` локально → текст-сайдкар `.ocr/*.txt`, **0 токенов**, русский точно. Облачный vision — только фолбэк (пусто+TIER3). Не ollama/llava — галлюцинирует на русском |259| **локальная транскрипция** (openai-whisper) | TRANSCRIBE-проход | Видео/аудио → `whisper --model small` локально → `.transcript/*.txt`, $0. Видео больше не deferred |260| **cost-aware тиры** | Process | text/pdf/docx/xlsx/url/video → Haiku (тир 1); код → тир 0; мед/юр/фин → Sonnet/Opus |261| **семантический дедуп** (fastembed) | Process 4.5 | пере-скриншот/пере-сейв того же знания (другой хэш, та же суть) → cosine ≥0.72 к ноте vault → дубль, новую не плодим. Локально (`~/.venvs/kb-embed`, multilingual-MiniLM), без Ollama. Индекс `99 Система/_embeddings.json`, дозапись после Store. Скрипт `kb-embed.py` (build/add/query) |262263После Store librarian дописывает хэши обработанного в кэш, чтобы следующий прогон их не тронул.264**Извлечение — LOCAL-FIRST, $0:** OCR = Apple Vision (`vision-ocr`), транскрипция = openai-whisper,265текст-доки = markitdown, дедуп = fastembed. Облачный vision — только фолбэк. Для извлечения Ollama266не нужен (llava отклонен — галлюцинирует на русском); pre-pass кода на `qwen2.5-coder:7b` (тир 0) —267отдельная, живая роль.268269### Стадия ⓪ (транскрипция) — вход видео/аудио/URL270271Материал-ссылка (YouTube/1000+ сайтов) или файл (видео/аудио/подкаст) → `mnemazina-transcribe`:272`yt-dlp` → `ffmpeg` (wav 16k mono) → `~/.npm-global/bin/whisper --model small` → `transcript.md` +273сырой `segments.json`. Транскрипт держи сырым (без summary), потому что ценное из него извлекают274стадии 2–3, а ранний summary срезает то, что они ищут. Модель: дефолт `small` (кэш, ~0.5x realtime,275авто-язык RU/EN); макс точность → `medium`/`large-v3`. Нет инструмента (yt-dlp/ffmpeg/whisper) —276это не тупик: предложи установку с объяснением «зачем», решает юзер (пункт «Проверка инструментов»277в справке). Приватное видео → нужны cookies, спроси.278279### Контроль стадии 3 (верификация + обогащение)280281**Обогащение — всегда, это дефолт.** Внешний поиск разрешен без спроса, потому что каждая нота282строится из исследованного первоисточника, не из семени-скрина. `--private` — только опт-ин283(юзер явно пишет), тогда: локальная верификация, `verified` → `непроверяемо-методом (--private)`.284285**Token-frugal контракт** — тяжелое чтение сети несет локальный `kb-fetch` за $0, контекст агента ест минимум:286- **GitHub-репо/инструмент → сначала GitHub MCP** (`mcp__github__*`, владелец его выдал —287 авторизация внутри); MCP недоступен → REST API, не scrape, потому что scrape на GitHub288 блокируется: `curl -s https://api.github.com/repos/{owner}/{repo}` → точные звезды/`pushed_at`/license;289 релиз `.../releases/latest`. Парсь `jq`/`python3`. Лимита 60/ч хватает; больше → keychain-токен290 (`printf 'protocol=https\nhost=github.com\n\n' | git credential fill` — по host, метка аккаунта291 несущественна; токен не печатать и не коммитить — утечка в лог/git необратима).292- **Не-GitHub URL → `kb-fetch <url>`** (симлинк в `~/.local/bin`, канон —293 `$HOME/Проекты/mnemazine/scripts/kb-fetch.py`): один вызов → один JSON с `markdown`, бинарники294 (pdf/docx/…) конвертит markitdown, HTML — trafilatura, кодировки легаси-рунета чинит сам.295 Exit-коды честные: `2` = needs_js (эскалируй на Playwright MCP или WebFetch), `3` = заблокировано296 (пометь «источник недоступен», содержимое не выдумывай), `4` = сеть. `ok:false` → факт остается297 непроверенным, это штатный исход, не сбой.298- **Поиск: встроенный WebSearch первым** (бесплатен, уже оплачен подпиской); пусто/рунет →299 `kb-search "<запрос>" [--ru]` (ddgs-метапоиск без ключей: brave/ddg/mojeek/startpage, `--ru`300 добавляет yandex последним — он лучше индексирует рунет, но банит агрессивнее всех).301- **Firecrawl — только по явной команде владельца** («жги кредит»), потому что это платные кредиты302 и его Fire-engine нужен лишь классу сайтов за жесткой анти-бот-защитой; sgai из конвейера удален303 (бесплатного режима у него нет, кредиты разовые).304- В ноту — дистиллят ≤120 слов (что это · выгода · звезды/версия/цена · 1 подводный камень · URL),305 не дамп, потому что дамп в ноте — это те же токены при каждом будущем чтении vault.306- Дедуп: перед вызовом `grep` vault (тема покрыта → скип). Кэш `99 Система/_enrich-cache.json`307 (повтор = 0 вызовов). Батч похожих нот → 1 заход.308309Приоритет источников: WebSearch (встроенный) → `kb-search` (ddgs) — для поиска; `kb-fetch` →310Playwright MCP/WebFetch (needs_js) — для чтения URL; Firecrawl — только по явной команде владельца.311Промт из материала прогони сам (выполним ли, дает ли заявленное), потому что заявление автора —312не факт. Факт/цифру/мед./юр./фин. сверь с официальным источником.313314`verified` — пять значений (VERIFIED-ENUM):315- `подтвержден` — факт проверен по внешнему источнику316- `источник-не-найден` — искали, не нашли (это не значит «неверно»)317- `непроверяемо-методом` — PDF за paywall, личный черновик318- `проверено-практикой` — выставляет только пользователь после применения, потому что практику агент за него не проживет319- `облако-недоступно` — сеть/поиск деградировали: kb-search исчерпал бэкенды, kb-fetch вернул blocked, WebSearch пуст320321Не подтвердилось — это не повод дропать: ставь одно из четырех non-`подтвержден` значений,322заметку сохраняй, факт вынеси в справку — решает пользователь.323324### Стадия 4 — новый раздел325326Новый раздел — только при выполнении всех условий контракта (не лег ≥70% никуда · устойчивая327область · ≥2 знания со временем), потому что легкое создание разделов размывает таксономию до328нечитаемости. Иначе — ближайший раздел + уточняющий тег. Создал раздел → обнови мастер-индекс,329роутинг, лог и обязательно вынеси в справку, чтобы пользователь мог отменить.330331### Стадия 5 — фрейминг «как поможет мне»332333Каждая заметка обязана иметь блок (без него знание лежит мертвым — нет входа в действие):334- Текущие проекты — к чему применимо. Список берется только из335 `$MNEMAZINE_VAULT/99 Система/_ПРОЕКТЫ.md` (единый источник; не хардкодить здесь, потому что хардкод336 протухает молча). Файл пуст или отсутствует — это не ошибка, ставь общий шаблон: «Применить337 к задаче, над которой работаете сейчас. Чтобы получать персональные шаги — добавьте проекты338 в `_ПРОЕКТЫ.md`».339- Саморазвитие — какой навык/привычку качает.340- Следующее действие — одно конкретное действие на сегодня.341342### Стадия 5.6 — самообучающиеся референсы доменов343344Знание несет **actionable-способность по домену** (новый скилл, MCP, CLI, инструмент, правило,345техника) → конвейер дозаписывает ее в `$HOME/.claude/references/<домен>.md`, потому что так карты346инструментов умнеют вместе с vault, а не отстают от него.347348**Маппинг знание → домен → файл:**349350| Сигнал ноты (теги/раздел/суть) | Домен | Файл |351|---|---|---|352| security / уязвимость / auth / секреты / OWASP / pentest | безопасность | `references/security.md` |353| дизайн / UI / UX / Figma / анимация / типографика / бренд | дизайн | `references/design.md` |354| агентные системы / рой / оркестрация / GSD / loop / harness / суб-агенты | агенты | `references/agents.md` |355| веб-поиск / скрейп | бесплатный стек kb-fetch/kb-search | `$HOME/Проекты/mnemazine/scripts/kb-fetch.py` (Firecrawl — легаси, только по команде владельца: `references/firecrawl.md`) |356| деплой / сервер / VPS / CI | деплой | `references/deploy.md` |357| новый устойчивый capability-домен | — | создать `references/<домен>.md` по образцу `security.md` |358359**Правила дозаписи:**360- Только actionable (имя скилла · команда установки · когда применять) — пересказ ноты в референсе361 дублирует vault и протухает вторым экземпляром.362- Дедуп: уже в референсе → не дублировать (можно уточнить).363- Внешний код (установка) — правило зависит от типа находки, см. Стадию 5.65: Claude Code/агентный364 скилл → автоустановка; MCP-сервер/open-source система/tool → «добрать (явное добро)».365- Что дозаписано — строкой в сводную справку: «Референсы обновлены: …».366367### Стадия 5.65 — автоустановка скилла vs подтверждение для MCP/tool368369Развилка на находках, которые документируют внешнюю способность для агента — применяется ДО370Стадии 5.7 (регистрация в routing-реестре) и решает, ставить ли находку молча или ждать владельца:371372- **Материал документирует Claude Code / агентный скилл** (переиспользуемая процедура/промт-паттерн373 для AI-агента) → устанавливать автоматически: добавить в `$HOME/.claude/skills/`, зарегистрировать в374 `~/.agents/SHARED-SKILLS-WORKFLOWS.md` и `~/.agents/GITHUB-STARS-LEDGER.md` (если применимо),375 без дополнительного подтверждения владельца — скилл это текст, риск низкий, откат = удаление папки.376- **Материал документирует MCP-сервер или open-source систему/инструмент, требующий установки**377 (npm/pip/docker/clone) → НЕ устанавливать автоматически, потому что это внешний код с большей378 поверхностью риска (сеть, credentials, системные изменения). Вынеси находку в отчет прогона и379 дождись явного «да» от владельца перед установкой. _(Правило 2026-07-12, kb-20260712T131126.)_380381### Стадия 5.7 — регистрация способности в routing-реестре382383Знание несет **скилл/MCP/CLI/инструмент с именем-id** (не просто технику) → зарегистрируй его в384реестре способностей, чтобы автоподбор route-skills увидел его немедленно, а не после385weekly-пересбора.386387**Как:** дописать JSONL-строку в `~/.agents/registry/overrides.jsonl`:388```json389{"id":"<имя-скилла-как-в-skills>","rating":4,"model":"S","domains":["<домен>"],"purpose":"<одной строкой>","use_when":"<триггер-слова задачи>"}390```391- `id` = точное имя скилла (папка в `skills/`), потому что только так `build_registry` свяжет392 запись с установленным скиллом. Знание-only (еще не установлен) → запись = «кандидат», станет393 полной после установки.394- `domains`/`use_when` — чтобы routing ловил по задаче (включая RU-слова).395- Запись в `overrides.jsonl` под `WatchPaths` → launchd `com.athena.registry-watch` сам гонит396 `registry-rebuild.sh` (index+registry+views+graphify+validate) → routable «сразу же».397 Гарантированно-сразу (без ожидания watch): `bash ~/.agents/registry/scripts/registry-rebuild.sh --now`.398- Дедуп: id уже в `overrides.jsonl`/`registry.jsonl` → уточни строку, не плоди дубль — дубль id399 делает выбор реестра недетерминированным.400- В сводку: «Реестр способностей: +<id> (routable)».401- Зеркалировать обновленный референс по правилу зеркалирования (после справки/решения).402403## Финал4044051. Источник опустел: обработанный исходник перемещен (`mv`) в `$ARCHIVE`, в инбоксе только406 `README.md`. (Политика: durable-архив БЕЗ авто-удаления — см. Подготовку, шаг 4.)4072. Обязательные код-шаги (детерминированный код с exit-кодом, не суждение агента):408 - `node "$MNEMAZINE_ROOT/scripts/mnemazine-refresh-core-indexes.mjs"`, затем его409 `--check` гейт — exit ≠ 0 значит индексы не сошлись, чинить до справки.410 - `graphify --update` по vault (граф — память Мнемозины).411 - Catch-up линта: `$MNEMAZINE_VAULT/99 Система/_lint/.last-lint` отсутствует или старше 36 часов →412 прогнать `node "$MNEMAZINE_ROOT/scripts/mnemazine-kb-lint.mjs"`, потому что ночное413 расписание могло не сработать — догоняем при ближайшем запуске.4143. Верни пользователю **сводную справку** (таблица: знание · раздел · verified (причина) ·415 как поможет · следующее действие; + новые разделы; + требуют решения; + 🔧 Проверка инструментов;416 + **Референсы обновлены** (какие `references/<домен>.md` дозаписаны — Стадия 5.6)).4174. Дозапиши `99 Система/Лог обработки.md`.418419**Условие останова.** Прогон закончен, когда леджер сходится и справка выдана. Проверь свой420последний абзац: сводная таблица с леджером и `token_usage` — закончено; обещание («сейчас421обработаю…»), план или вопрос без справки — не закончено, продолжай, потому что обещание в422финале = прогон, который никто не завершил.423424## Авто-режим (`/kb watch`, по умолчанию выключен)425426Задел под автозапуск без команды. Включать только по явному запросу пользователя, потому что427watch + ручной `/kb` без lockfile прогона (Подготовка, шаг 1в) дают гонку read-modify-write428в `_МАСТЕР-ИНДЕКС`. Два способа:429- **launchd/cron** на Mac: watcher следит за инбоксом, при новых файлах дергает `claude -p "/kb"`.430- **Scheduled task / hook**: периодический прогон `/kb`, если инбокс непуст.431Скрипт-watcher и пример конфига: `$HOME/.claude/skills/mnemazina/watch/` (README там же). Секреты432в скрипт/конфиг не зашивать — plist и cron-строки читаемы всем локальным процессам.433434## Зеркалирование (всегда, но строго ПОСЛЕ решения пользователя)435436Зеркалить нужно всегда (скилл — общая способность → Codex `$HOME/.codex/skills/mnemazina/` + VPS437`root@ATHENAOS_HOST:/srv/agent-os`, без секретов). Порядок жесткий, потому что зеркало до решения438пользователя разносит по машинам то, от чего он еще может отказаться:4394401. Сначала выдай пользователю **короткую справку о полученном знании**: что это + куда применить441 прямо сейчас (проекты из `99 Система/_ПРОЕКТЫ.md`).4422. Если что-то надо ставить/подключать — предложи явно: «**давай установим …**».4433. Только после решения пользователя (применили/установили или отказались) → зеркаль на444 Codex + VPS, затем обнови каталоги.445446Не зеркаль молча и не раньше справки.447448## Когда НЕ применять (и чем заменить)449450- **«Прочитай/перескажи этот файл» без просьбы сохранить** — просто прочитай и ответь: конвейер451 добавит стадии, гейты и токены к задаче, у которой нет выхода в vault.452- **Вопрос по коду/проекту** (любой репозиторий) — это `graphify`-запрос или обычная работа с453 кодом: Мнемозина хранит жизненные знания в `$MNEMAZINE_VAULT`, а не код-контекст проектов.454- **Факт о владельце/сессии на будущее** («запомни, что я предпочитаю X») — это auto-memory455 (`MEMORY.md` проекта), не нота vault: авто-память per-project и дешевая, vault — для durable-знания456 с источником.457- **Рабочее дело со своим конвейером** (например ведение клиентских дел) — отдельная сессия в458 своем репозитории: у таких дел собственная раскладка, ноты vault им не замена.459- **Правка содержимого существующей ноты** — правь файл в vault напрямую; `/kb fix` — только460 ре-классификация (перенос раздела + frontmatter + индексы), не редактор текста.461- **Включение `/kb watch` «заодно»** — только по явной просьбе: см. Авто-режим, причина — гонка462 индексов.