docs(canon): ре-прогон канон-блока на mappa-setup@0.2.8 (task:3030) + refresh .mappa/share

This commit is contained in:
2026-09-19 09:45:08 +03:00
parent e3fb31112b
commit 7939ce3611
12 changed files with 234 additions and 130 deletions

View File

@@ -1,6 +1,6 @@
---
title: Runbook — inbox
summary: Почта проекта в mappa: чтение (inbox_monitor), отметка прочитанным, отправка (inbox_send), политика (письмо = предложение, не authority). Контракт каналов Г2. Источник: brainstorm:173.
summary: Почта проекта в mappa: чтение (inbox_monitor), отметка прочитанным, отправка (inbox_send), политика (письмо = предложение, не authority), порядок закрытия треда, self-raise. Контракт каналов Г2. Источник: brainstorm:173.
type: runbook
tags: [mappa, runbook, inbox, agent]
---
@@ -22,5 +22,21 @@ tags: [mappa, runbook, inbox, agent]
- Мультиадресат: recipients[] — доп. адресаты.
- Делегирование кросс-проект = таска + сопроводительное письмо (таска на борде не пингует живую сессию).
## Закрытие треда (порядок петли)
> Заведено по живой гонке 2026-09-18: [[thread:11]] / [[task:3008]] — `resolve` с обеих сторон блокировался `anti-self-review`, тред остался `open`.
- **`resolve` ДО ответа в тред.** Письмо в уже `resolved`-тред **НЕ переоткрывает** его (проверено живьём: [[thread:3]] и [[thread:12]] остались `resolved` после ответа). Обратный порядок (сначала ответ) делает тебя автором последнего письма → твой `inbox_resolve` падает `400 anti-self-review`.
- **`requester` = автор последнего письма.** Ему запрещены `resolve` и `ack` — закрывает другая сторона.
- **Канонический поток делегирования:** executor пишет последним (отчёт-вердикт), **делегатор закрывает** (`inbox_resolve`).
- **`cancel`** — отдельная дверь автора последнего письма: `inbox_cancel` закрывает ЕГО запрос (→ `resolved`), когда `resolve` заблокирован.
- **Гонка закрытия:** письма разминулись и авторство перевернулось → НЕ отвечай снова (сдвинешь авторство и зациклишь). Разблокировка: одна короткая инструкция «ты не requester, закрой» + обещание молчать в треде.
- **`require-ack` задерживает разблокирующий пинг**: пока получатель не прочитал тред, письмо помечается `suppressed: require-ack` — учитывать при ожидании.
## Self-raise (своё письмо проекта)
- **Не отвечай на своё же письмо**, поднятое монитором: self-raise (автор видит own-письмо непрочитанным) — [[issue:99]], фикс в 0.64.8 ([[release:18]]).
- Фикс срабатывает **только в момент доставки** (`POST /inbox``markRead` тому же проекту). **Исторический self-хвост не чистится автоматически**у проекта, который много пишет себе (агент-зона `.admin`: отчёты о деплоях уходят и в `mappa`, и в `.admin`), в инбоксе могут висеть сотни «непрочитанных» self-писем (живой замер: `unread_count 468`). **Это старый хвост, а не непрочитанная работа.**
- Разовый бэкфилл — [[task:3011]] (`POST /inbox/backfill-self-read {project}`, идемпотентный, per-project).
- Правило «свой отправитель»: `from == <имя проекта>` или `agent:<имя проекта>` (`isSelfSenderLetter`, `server/src/inbox-policy.ts`); мультиадресат метится per читателя-проекта (письмо `from: .admin` → для `.admin` self, для `mappa` — чужое).
## Связано
[[runbooks/index]] · [[canon/gates]] (Г2) · [[runbooks/tasks]] · [[runbooks/session]] (raise на старте) · brainstorm:173 · requirements:23
[[runbooks/index]] · [[canon/gates]] (Г2) · [[runbooks/tasks]] · [[runbooks/session]] (raise на старте) · brainstorm:173 · requirements:23 · issue:99 (self-raise) · task:3011 (бэкфилл self-хвоста)

View File

@@ -1,6 +1,6 @@
---
title: Runbooks — каталог сущностей mappa
summary: Каталог сущностей mappa (тип → тулы → runbook). Единая карта «что существует и как с этим работать» для агента. Обновлять при добавлении новых типов. Источник: brainstorm:173.
summary: Каталог сущностей mappa (тип → тулы → runbook). Единая карта «что существует и как с этим работать» для агента. 21 сущность покрыта runbook'ами (2026-09-18: +thread). Обновлять при добавлении новых типов. Источник: brainstorm:173.
type: runbook
tags: [mappa, runbooks, entities, agent]
---
@@ -8,37 +8,35 @@ tags: [mappa, runbooks, entities, agent]
Карта «тип → MCP-тулы → процедура». Runbook — агентский слой «как сделать X» (по запросу). Справочные описания тулов — в MCP-поверхности/docs; здесь маршрутизация.
## Основные (есть runbook)
## Сущности (есть runbook)
| Тип | Что это | Тул-поверхность | Процедура |
|---|---|---|---|
| task | таска на доске | task_list/get/create/update/close, comment_* | [[runbooks/tasks]] |
| wiki | страница вики (project/shared/private) | wiki_get/search/create/update, entity_* | [[runbooks/wiki]] |
| inbox | почта проекта | inbox_monitor/send/mark_read | [[runbooks/inbox]] |
| inbox | почта проекта**канал** | inbox_monitor/send/mark_read | [[runbooks/inbox]] |
| **thread** | тред-разговор — **сущность** (тема); канал — inbox | `/threads?persona=`, `GET /thread/<ref>?actor=`, inbox_ack/resolve/cancel, catch_stuck_threads | **[[runbooks/threads]]** |
| session/handoff | сессии live-ingest, handoff | session_*, handoff_write | [[runbooks/session]] |
| поиск/граф | найти/связать | search/entity_search/wiki_search, graph_* | [[runbooks/search]] |
## Остальные типы (справка: MCP-описания + docs; наполнение runbooks — post-pilot, task:2071)
| Тип | Тул-поверхность | Цикл |
|---|---|---|
| brainstorm | brainstorm_create/update/promote | шторм-буфер → промоут (wiki+archive) |
| issue | issue_create/get/list/update, mark_duplicate, add_addresses | репорт bug/feature/question/incident |
| requirements | requirements_create/get/list/update/add_addresses | спека-контракт «что должно быть» (status: draft→approved→implemented→verified) |
| plan | plan_create/get/list/update/add_addresses | этапы/фазы планирования |
| comment | comment_create/list | короткий след на таске (Г2: не носитель вердиктов) |
| tag | tag_create/list/get/apply | метки, scope=project |
| attachment | attachment_create/get/list/delete | вложения (url/blob) к task/wiki/brainstorm/session |
| release | release_create/list/get/close | версии + fixed_in-рёбра (деплой-гейт через .admin) |
| agent/operator | agent_*, operator_* | реестры субъектов |
| repo/commit | git_index_* | git-индекс (поиск кода через mappa, волна brainstorm:171) |
| project | projects_list/register/resolve/create_repo/owners | реестр проектов (канон = папка) |
| skill | skill_list/get/create/update/delete | каталог скилов сервера |
| entity-слой | entity_get/search/move/versions/diff/restore/transform | общий слой сущностей |
| sched/telemetry | scheduler_*, telemetry_* | расписания, метрики (зона админа) |
| issue | репорт bug/feature/question/incident | issue_create/get/list/update, add_addresses, mark_duplicate | [[runbooks/issue]] |
| **intent** | SDKЛ-намерение («что и зачем», без техники) | **intent_create/get/list/update/add_addresses/promote** | **[[runbooks/intent]]** |
| requirements | спека-контракт «что должно быть» | requirements_create/get/list/update/add_addresses | [[runbooks/requirements]] |
| plan | этапы/фазы планирования | plan_create/get/list/update/add_addresses | [[runbooks/plan]] |
| comment | короткий след на таске (Г2: не носитель вердиктов) | comment_create/list | [[runbooks/comment]] |
| tag | метки, scope=project | tag_create/list/get/apply | [[runbooks/tag]] |
| attachment | вложения (url/blob) к task/wiki/brainstorm/session | attachment_create/get/list/delete | [[runbooks/attachment]] |
| release | версии + fixed_in-рёбра (деплой-гейт через .admin) | release_create/list/get/close | [[runbooks/release]] |
| brainstorm | шторм-буфер → промоут (wiki+archive) | brainstorm_create/update/promote | [[runbooks/brainstorm]] |
| agent/operator | реестры субъектов | agent_*, operator_* | [[runbooks/agent-operator]] |
| repo/commit | git-индекс (поиск кода через mappa) | git_index_*, code_* | [[runbooks/repo-commit]] |
| project | реестр проектов (канон = папка) | projects_list/register/resolve/create_repo/owners | [[runbooks/project]] |
| skill | каталог скилов сервера | skill_list/get/create/update/delete | [[runbooks/skill]] |
| entity-слой | общий слой сущностей | entity_get/search/move/versions/diff/restore/transform | [[runbooks/entity]] |
| sched/telemetry | расписания, метрики (зона админа) | scheduler_*, telemetry_* | [[runbooks/sched-telemetry]] |
## Правила каталога
- Каталог — единая карта. **При добавлении нового типа сущности** (напр. requirements/plan 2026-08-28) — расширение этого каталога обязательным шагом в постановке серверной таски (конвенция).
- Каталог — единая карта. **При добавлении нового типа сущности** — расширение этого каталога обязательным шагом в постановке серверной таски (конвенция).
- Slug'и: `runbooks/<тип>` (kebab, латиница).
- Связь: [[canon/index]] (гейты) · [[canon/gates]] · [[docs/index]] (wiki:3341, ответы человеку) · [[mappa-wiki-topology]] (wiki:3378)
## Связано
[[canon/index]] · [[canon/gates]] · [[runbooks/tasks]] · [[runbooks/wiki]] · [[runbooks/inbox]] · [[runbooks/session]] · [[runbooks/search]] · brainstorm:173 · requirements:23
[[canon/index]] · [[canon/gates]] · [[runbooks/tasks]] · [[runbooks/wiki]] · [[runbooks/inbox]] · [[runbooks/threads]] · [[runbooks/session]] · [[runbooks/search]] · [[runbooks/issue]] · [[runbooks/intent]] · brainstorm:173 · requirements:23

View File

@@ -1,36 +1,47 @@
---
title: Runbook — search и graph
summary: Поиск в mappa: карточный search/entity_search/wiki_search (без тел), правила К1К4 (поиск до угадывания), граф (path/neighbors/backlinks/stats) для реляционных вопросов. Источник: brainstorm:173.
title: Runbook — search/граф и общая память
summary: Поиск в mappa: карточный search/entity_search/wiki_search (без тел), правила К1К4 (поиск до угадывания), скоуп-резолюция project/shared, анти-паттерн wiki_get(slug) на shared-слое, граф (backlinks/neighbors/path) для реляционных вопросов, mode='recall' (общая память: поиск → граф-кластер, depth/related).
type: runbook
tags: [mappa, runbook, search, graph, agent]
tags: [mappa, runbook, search, agent, memory]
---
# Runbook: search / graph
# runbooks/search — как искать в mappa
## Карточный поиск (без полных тел)
- `search(q, types?, scope?, project?, tags?, sort?)` — по всем типам.
- `entity_search(q, type, scope?, project?)` — по типу (напр. type=task/wiki/brainstorm).
- `wiki_search(q, scope, project)` — только вики (карточки с summary).
- Результат — pointer-карточки {ref, type, project, slug, snippet, related}; полное тело — entity_get/wiki_get. Не тащить тела в контекст поиском.
Процедура «найти сущность/страницу, не угадывая» + «восстановить контекст/память». Канон-контекст: [[canon/gates]] Г3 (поиск до угадывания). Обновляется при изменениях поиска.
## К1К4: поиск ДО угадывания (Г3)
1. **Не угадывать slug/роут по названию темы.** Неизвестный slug → search/wiki_search сначала → wiki_get по найденному. Пустой поиск → спросить человека (страницы может не быть).
2. **Скоуп**: project-страница через wiki_get без project = 404; не знаешь проект → search(scope='all') → project из карточки.
3. **Префиксы каталога**: concepts/, canon/, methodology/, runbooks/, docs/ — не перебирать, искать.
4. **Адресация**: num | type:N | uuid; не route-guessing; internal/registry id ≠ public ref.
## 1. Поиск до угадывания (К1К4)
- Не знаешь ref/существование → `entity_search(q)` / `wiki_search(q)` (карточки: ref/type/project/slug/snippet). Никогда не «угадывать» slug/номер.
- Скоупы: `project=X` (жёсткий) | `shared` | `all` (boost текущего). Результат карточки несёт project — переключайся по нему.
- Префиксы каталога: слаги живут под `canon/`, `methodology/`, `runbooks/`, `concepts/`, `docs/` — не перебирать префиксы, искать.
- Тип-фильтры: `types=[task|wiki|inbox|brainstorm|…]` — сузить до нужного.
- Карточка найдена → полное тело: `entity_get(ref, full=true)` (не «собрать по кусочкам»).
## Граф (реляционные вопросы — НЕ чтением)
| Вопрос | Тул |
|---|---|
| «что связывает X и Y» / путь | graph_path(from, to) |
| соседи / исходящие | graph_neighbors(id) |
| кто ссылается / backlinks | graph_backlinks(id) |
| здоровье (сироты/битые) | graph_stats() + graph_backlinks |
| дерево parent_of | graph_tree(root) |
## 2. Скоуп-резолюция (project vs shared)
- `wiki_get(slug)` без project = shared-скоуп. Для проектной страницы — `wiki_get(project, slug)`.
- Одна и та же тема может жить в shared (канон/методология/рунбуки) И в проекте (спека/ретро) — сначала search, потом читать правильный скоуп.
Precondition: граф реально связан (graph_stats: edges≈0 → пусто, отвечай чтением). Пустой path = связи нет — так и сказать, не выдумывать цепочку по текстовой близости.
## 3. Анти-паттерн: wiki_get(slug) для shared-слоя (после task:2073)
> **Анти-паттерн:** `wiki_get(slug)` для shared-канона/рунбуков (`canon/*`, `methodology/*`, `runbooks/*`) мис-резолвится → 404 или чужая страница. Если увидел 404/не-тот контент — это shared-слой → переключись на `entity_search(scope='shared')` → `entity_get(ref, full=true)`. Не повторяй `wiki_get(slug)` (21.7% ошибок на /wiki/:slug по телеметрии, дайджест 2069).
## Рост графа (запись рёбер)
Рёбра создаются при записи refs (`[[...]]`) в теле. Канон рефов: [[wiki:slug]] по слагу, [[task:N]]/[[brainstorm:N]] по рефу; без плейсхолдеров/диапазонов/кириллицы/алиасов. Сироты/битые в своих страницах — чинить (Д2/Д3).
## 4. Граф (когда «кто ссылается / связь»)
- «Кто ссылается на X» → `graph_backlinks(ref)`; «куда ведёт X» → `graph_neighbors(ref)`; «связь XY» → `graph_path(from, to)`.
## Связано
[[runbooks/index]] · [[canon/gates]] (Г3) · [[runbooks/wiki]] · brainstorm:173 · [[concepts/telemetry]] (wiki:3256, 404-класс)
## 5. Общая память — `mode='recall'` (поиск → граф-кластер)
> **Это и есть «общая память» mappa** (intent:4, task:2570). Агент получает память **запросом**, а не подсовыванием.
- **Когда:** хочешь не «найти страницу по названию», а **восстановить контекст** вокруг темы: поиск-кластер сущностей и связей между ними. `search(q, mode='recall', scope=…)`.
- **Что вернёт:** карточки кластера с полем **`depth`** (0 = сид, 1 = сосед, 23 = дальше по рёбрам; relevance затухает `1/(1+depth)`) и **`related[]`** (внутрикластерные связи). Лимит ~50.
- **Пайплайн (память как восстановление):**
1. `search(q, mode='recall')` → кластер (сиды + depth + related);
2. выбрать 13 ядра; `entity_get(ref, full=true)` → полное тело;
3. `graph_neighbors`/`graph_backlinks` → развернуть вглубь по рёбрам;
4. `graph_path(A, B)` → связать два полюса.
- **Без `mode='recall'`** — обычный карточный поиск (регресс-контракт, depth нет). Ищешь `mode='recall'` тогда, когда ответ — это «связка сущностей», а не «одна страница».
- **Опора качества:** recall опирается на FTS-safe (task:2572) + тег-канал (task:2573) для релевантности — если сырой ввод/спецсимволы ломают поиск, используй чистый запрос.
## 6. Handoff как снимок памяти (после task:2571)
- `handoff_write(project, session_id, status, summary, open_treks?, ask_user?, guards?, recent_commits?)` — писать можно **в любой момент сессии** (reactive-чекпоинт), не только в closing ritual.
- Рёбра `handoff → session (in_session) / project (belongs_to) / task` материализуются при write → **handoff не сирота**.
- **Восстановление после разрыва:** `search(type='handoff', project=X, limit=1, sort=recency)` → последний → `entity_get(handoff:N, full=true)` → снимок: что сделано / что открыто. Канон-контекст: [[canon/gates]] Г3/Г9.
**Связи:** [[runbooks/index]] · [[canon/gates]] · [[canon/index]] · [[runbooks/session]] · [[task:2073]] · [[task:2570]] · [[task:2571]] · [[intent:4]] · [[requirements:32]] · [[concepts/memdb-recall-search-patterns]] (wiki:3395)

View File

@@ -1,6 +1,6 @@
---
title: Runbook — session
summary: Сессии и handoff в mappa: live-ingest (session_upsert/heartbeat), ритуал старта (orient: pull → handoff → inbox → liveness), ритуал финиша (closing: handoff-write). Источник: brainstorm:173.
summary: Сессии и handoff в mappa: live-ingest (session_upsert/heartbeat), ритуал старта (orient: pull → handoff → inbox → liveness), ритуал финиша (closing: handoff-write), ветки на диск (git worktree). Источник: brainstorm:173.
type: runbook
tags: [mappa, runbook, session, handoff, agent]
---
@@ -18,9 +18,20 @@ tags: [mappa, runbook, session, handoff, agent]
- Claim-гейт (repo,branch): `session_hold(repo, branch)` — свободно → работай; чужой клейм → НИЧЕГО не делать, сообщить человеку «кто держит», ждать (ревок — только оператор).
- Stale-active (обрыв) → crash-detect: сказать человеку, предложить (игнор/напоминание письмом/продолжить).
## Ветки на диск (git worktree)
- **Ветка = рабочее дерево (папка).** Одна ветка — одно извлечение; одну ветку нельзя выкатить в двух worktree одновременно (`fatal: already checked out`).
- **Параллельные ветки** → отдельные рабочие деревья:
```bash
git worktree add C:/Users/vitya/projects/.worktrees/mappa-<slug> worker/<slug>
git worktree list # карта: folder → branch → commit
git worktree remove C:/Users/vitya/projects/.worktrees/mappa-<slug>
```
- **Что на диске:** у worktree `.git` — это ФАЙЛ (`gitdir: <главный-репо>/.git/worktrees/<имя>`), не папка. Объекты/refs — ОБЩИЕ (главный `.git/objects`, у нас 51M); per-worktree — только HEAD/index/refs/logs в `<главный>/.git/worktrees/<имя>/`; `commondir` → на общий пул.
- **Имя папки ≠ маппинг проекта.** Клиент мапит `project=basename(folder)`: для параллельных кластеров либо слать явный `project="mappa"`, либо класть worktree под именем, не ломающим project-резолв. Каждый worktree = отдельная связка сессии (`sourceRef`/folder) → разные ветки = разные клеймы `(repo,branch)` → 409 нет.
## Ритуал финиша (closing)
- `handoff_write(project, session_id, status, summary, open_treks, ask_user, guards, recent_commits)` — по решению человека (не авто-sweep).
- PROPOSE wiki-ingest (важное знание → вики) + PROPOSE закрытия тасок. Мутации — после подтверждения.
## Связано
[[runbooks/index]] · [[runbooks/inbox]] · [[runbooks/tasks]] · [[canon/gates]] · контракт wiki:2660 · [[concepts/session-live-ingest]] (wiki:2604) · brainstorm:173
[[runbooks/index]] · [[runbooks/inbox]] · [[runbooks/tasks]] · [[canon/gates]] · контракт wiki:2660 · [[concepts/session-live-ingest]] (wiki:2604) · [[methodology/kzntsv/index]] (wiki:3404) · brainstorm:173

View File

@@ -1,34 +1,28 @@
---
title: Runbook — tasks
summary: Как работать с тасками mappa: ориентация, выбор (priority/due), взятие (status+owner), исполнение, закрытие, review-связка, comment. Контракт: wiki:2660 (interactive). Источник: brainstorm:173.
summary: Как работать с тасками mappa: ориентация (task_list/board_digest), взятие (status+owner, version+409), ведение (comment-след, blocked_by), optimistic-конфликт 409→retry, закрытие с Review-методом. Контракт: wiki:2660.
type: runbook
tags: [mappa, runbook, tasks, agent]
tags: [mappa, runbook, task, agent]
---
# Runbook: tasks
# runbooks/tasks — как работать с тасками
Цикл работы с таской: ориентация → выбор → взятие → исполнение → закрытие.
Процедура «взять → вести → закрыть таску». Канон-контекст: [[canon/gates]] Г2 (каналы), Г4 (адресация). Обновляется при изменениях.
## Ориентация / выбор
- Доска проекта: `task_list(project, parent='root')` (корни) или `board_digest(project)` (счётчики+overdue+blocked). Кросс-проектно: `board_digest()` без project.
- Выбор по приоритету/дедлайну. Priority — территория человека: агент ставит P0P2/deadline только при создании, дефолт P1. Overdue → notify (admin_overdue_scan), авто-бамп запрещён.
- Таска без `**Review:**` в описании — не принимается к работе (вернуть постановщику, правило 14).
## 1. Ориентация / выбор
- Доска: `task_list(project, status=…)` (компакт: ref/status/priority/title) или `board_digest(project)` (счётчики + overdue/blocked).
- Взять: `task_get(ref)` → свежая `version``task_update(status='active', owner=<identity>, version)` — CAS; конфликт → 409 (см. п.3).
- Owner — только реально работающий; не брать чужую active-таску.
## Взятие (interactive contract, wiki:2660)
`task_update(project, id, status='active', owner=<себя>, version=<из task_get>)` — одной мутацией (status→active + owner). Версия — optimistic concurrency: конфликт → 409 → re-GET → retry.
## 2. Ведение
- `comment_create` — короткий след «где остановился» (не носитель вердиктов — они письмами, канон Г2).
- blocked_by: `edge_create(from, to, blocked_by)` / снять `edge_delete` (парные review-таски).
- Пауза/переключение: `task_update(status='paused'|'ready', reason)`.
## Исполнение
- Работаешь по критериям приёмки из описания; след «где остановился/что попробовал» — comment_create (короткий), вердикты/отчёты — письмом (Г2).
- Смена фокуса → status=paused/ready с reason (не бросать в active).
## 3. Optimistic-конфликт (version+409 → retry)
> **Optimistic-конфликт:** update/close идут с `version` (из `task.get`) → конфликт → **409** → перечитай `task.get` свежим → retry с новой `version`. НЕ работай со stale-version (виден по POST /session 14.7%, POST /requirements/update 23.1% — телеметрия, дайджест 2069).
## Закрытие (handover)
- Перед close: проверить покрытие критериев + метод ревью из описания выполнен (`subagent` прогнан / `next-session` review-таска существует / `none` обоснован).
- `task_close(project, id, version)` → status=done.
- Review-связка: импл-таска → парная `<slug>-review` (blocked, blocker=impl) ИЛИ зонтик на кластер (не BOTH). Ревьюер — следующая сессия, НЕ имплементер. Вердикт ревью — письмом полностью.
## 4. Закрытие
- `task_close(ref, version)`: критерии приёмки выполнены И review-метод из `**Review:**` поля исполнен (правило 14: subagent прогнан / next-session review-таска существует / none обоснован).
- done → парная review-таска разблокируется (если была).
## Создание таски (для босса/делегирования)
`task_create(project, slug, title, description, status='ready', priority=P1, session_id)`. Номер — только из ответа. Делегирование кросс-проект = пара: таска + сопроводительное письмо (inbox_send) — таска на борде не пингует живую сессию.
- Зависимости: `edge_create(from, to, 'blocked_by')` (task→task, цикл → 422).
- Импл-таска обязана нести `**Review:**` (subagent | next-session | none).
## Связано
[[runbooks/index]] · [[canon/gates]] (Г2 каналы) · [[runbooks/inbox]] · контракт wiki:2660 · brainstorm:173 · requirements:23
**Связи:** [[runbooks/index]] · [[canon/gates]] · [[canon/index]]

View File

@@ -25,4 +25,4 @@ tags: [mappa, runbook, wiki, agent]
Прочитать источник → извлечь сущности/концепты → summaries/<slug> (иммутабельно) → затронутые страницы create/update → отчёт. Один ингест может трогать 1015 страниц — нормально. Сырой контент в summaries не дампить (только summary + raw_path).
## Связано
[[runbooks/index]] · [[canon/gates]] (Г1/Г3/Г8) · [[runbooks/search]] · контракт wiki:2660 · [[concepts/wiki-ingest-convention]] (wiki:3312) · brainstorm:173
[[runbooks/index]] · [[canon/gates]] (Г1/Г3/Г8) · [[runbooks/search]] · контракт wiki:2660 · [[concepts/wiki-ingest-convention]] (wiki:3312) · brainstorm:173