Files
admin/.mappa/share/runbooks/search.md

5.8 KiB
Raw Blame History

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, agent, memory]

runbooks/search — как искать в mappa

Процедура «найти сущность/страницу, не угадывая» + «восстановить контекст/память». Канон-контекст: canon/gates Г3 (поиск до угадывания). Обновляется при изменениях поиска.

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) (не «собрать по кусочкам»).

2. Скоуп-резолюция (project vs shared)

  • wiki_get(slug) без project = shared-скоуп. Для проектной страницы — wiki_get(project, slug).
  • Одна и та же тема может жить в shared (канон/методология/рунбуки) И в проекте (спека/ретро) — сначала search, потом читать правильный скоуп.

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).

4. Граф (когда «кто ссылается / связь»)

  • «Кто ссылается на X» → graph_backlinks(ref); «куда ведёт X» → graph_neighbors(ref); «связь XY» → graph_path(from, to).

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)