# Mnemazina

> Мнемозина — агентный конвейер знаний. Превращает все, что попало в $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.

- Skill: `zarubinvibe/mnemazina` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add zarubinvibe/mnemazina`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zarubinvibe/mnemazina/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: zarubinvibe (https://skillmd.com/u/zarubinvibe)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zarubinvibe/mnemazina

---


# Мнемозина — агентный конвейер знаний

Превращает сырье из инбокса в проверенное, разложенное по разделам знание с пометкой
«как это поможет мне» и короткой справкой к действию.

**Порядок истины при расхождении:** `$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 + архив) — может переезжать, поэтому ищи по
  маркер-файлу, а не по запомненному пути:
  ```bash
  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. Проверь, что база доступна на запись и пути существуют (создай отсутствующее), потому что
   отказ записи в середине прогона оставляет пол-обработанный инбокс.
1б) **Git-снапшот vault** — до первого `mv` и до merge дублей в Стадии ⑥, потому что merge без
    снапшота необратим:
    ```bash
    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`:
    ```bash
    LOCKFILE=/tmp/kb-run.lock
    [ -f "$LOCKFILE" ] && { echo "Уже идет прогон (PID $(cat $LOCKFILE)). Удалите $LOCKFILE."; exit 1; }
    echo $$ > "$LOCKFILE"; trap "rm -f $LOCKFILE" EXIT
    ```
    Lockfile занят — это не сбой твоего кода, а параллельный прогон: сообщи пользователю и
    остановись; чужой lock не удаляй сам, потому что удаление на живом прогоне дает гонку
    в `_МАСТЕР-ИНДЕКС`.
2. Прочитай `_ROUTING.md` (корень vault) и `99 Система/_ШАБЛОНЫ.md` — дешевый первый проход,
   который избавляет от переспрашивания таксономии на каждом материале.
3. Собери список только нового сырья: пропусти `README.md` и уже обработанное (сверь с
   `99 Система/Лог обработки.md`). Для каждого материала пиши в лог при старте каждой стадии,
   не только в финале, потому что лог только-по-финалу теряет след упавшей стадии.
   Инбокс пуст — это не ошибка: скажи об этом и предложи `/kb backlog`.
4. **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`:
```json
{"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
  делает выбор реестра недетерминированным.
- В сводку: «Реестр способностей: +<id> (routable)».
- Зеркалировать обновленный референс по правилу зеркалирования (после справки/решения).

## Финал

1. Источник опустел: обработанный исходник перемещен (`mv`) в `$ARCHIVE`, в инбоксе только
   `README.md`. (Политика: durable-архив БЕЗ авто-удаления — см. Подготовку, шаг 4.)
2. Обязательные код-шаги (детерминированный код с 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"`, потому что ночное
     расписание могло не сработать — догоняем при ближайшем запуске.
3. Верни пользователю **сводную справку** (таблица: знание · раздел · verified (причина) ·
   как поможет · следующее действие; + новые разделы; + требуют решения; + 🔧 Проверка инструментов;
   + **Референсы обновлены** (какие `references/<домен>.md` дозаписаны — Стадия 5.6)).
4. Дозапиши `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`, без секретов). Порядок жесткий, потому что зеркало до решения
пользователя разносит по машинам то, от чего он еще может отказаться:

1. Сначала выдай пользователю **короткую справку о полученном знании**: что это + куда применить
   прямо сейчас (проекты из `99 Система/_ПРОЕКТЫ.md`).
2. Если что-то надо ставить/подключать — предложи явно: «**давай установим …**».
3. Только после решения пользователя (применили/установили или отказались) → зеркаль на
   Codex + VPS, затем обнови каталоги.

Не зеркаль молча и не раньше справки.

## Когда НЕ применять (и чем заменить)

- **«Прочитай/перескажи этот файл» без просьбы сохранить** — просто прочитай и ответь: конвейер
  добавит стадии, гейты и токены к задаче, у которой нет выхода в vault.
- **Вопрос по коду/проекту** (любой репозиторий) — это `graphify`-запрос или обычная работа с
  кодом: Мнемозина хранит жизненные знания в `$MNEMAZINE_VAULT`, а не код-контекст проектов.
- **Факт о владельце/сессии на будущее** («запомни, что я предпочитаю X») — это auto-memory
  (`MEMORY.md` проекта), не нота vault: авто-память per-project и дешевая, vault — для durable-знания
  с источником.
- **Рабочее дело со своим конвейером** (например ведение клиентских дел) — отдельная сессия в
  своем репозитории: у таких дел собственная раскладка, ноты vault им не замена.
- **Правка содержимого существующей ноты** — правь файл в vault напрямую; `/kb fix` — только
  ре-классификация (перенос раздела + frontmatter + индексы), не редактор текста.
- **Включение `/kb watch` «заодно»** — только по явной просьбе: см. Авто-режим, причина — гонка
  индексов.

