# RLM — контекст как программируемый объект (огромный артефакт → REPL + partition/map + рекурсия)

## Принцип (2026-06-15, из Recursive Language Models)

Когда нужно ответить/выжать по **артефакту, который НЕ влезает в окно контекста** (гигантский
лог, дамп, jsonl, листинг датасета на сотни тысяч строк, длинная переписка/handoff-история) —
**не набивать его в промпт**. Вместо этого: **контекст лежит переменной/файлом, модель пишет код
(peek/grep/chunk), нарезает на чанки и рекурсивно вызывает себя/саб-агента на каждом чанке**,
потом синтез. Это бьёт «context rot» (деградацию к концу длинного контекста) и обрабатывает
входы на 1-2 порядка больше окна — при сопоставимой цене.

Источник: Recursive Language Models (Alex Zhang/MIT + Omar Khattab), блог
https://alexzhang13.github.io/blog/2025/rlm/ + arXiv [2512.24601]. Полный разбор и цифры —
память [[reference_recursive_language_models]].

## Это НЕ новый механизм — это формализация того, что у нас уже есть

- skill `agent-harness-design` (references/agent-tool-design.md §9, Connector Code-Execution Pattern) = тот же приём для коннекторов:
  обернуть данные в sandbox-REPL, дать модели исследовать кодом, а не набивать промпт.
- Workflow-примитивы: partition+map = `pipeline()`/`parallel()` по чанкам; sub-RLM = `agent()`
  на чанк (skill `workflow-orchestration`, [[reference_claude_workflows]]).
- Готовая команда: **`/rlm-explore`** (`~/.claude/workflows/rlm-explore.js`) — root peek/план →
  map по чанкам → синтез. Применять её, а не изобретать заново.

## Когда применять / когда НЕ надо

| Применять (RLM-style) | НЕ применять (обычный single-pass) |
|---|---|
| Артефакт не влезает в окно, нужен ответ/выжимка по нему | Контекст влезает и кэшируется — single-pass дешевле/быстрее |
| Длинный контекст, качество тонет к концу (context rot) | Нужен детерминизм/гарантия стоимости и скорости |
| RAG строить нерелевантно/дорого ради разового вопроса | Маленький файл — просто прочитать целиком |

## Механический паттерн (то, что делает /rlm-explore)

1. **Peek (root, depth=0)**: агент смотрит только метаданные артефакта (число строк, head,
   структуру) — НЕ весь контент. Возвращает план: число чанков / focus-hint / grep-термы.
2. **Map (depth=1, fan-out)**: `pipeline()` по диапазонам строк; саб-агент на чанк читает свой
   диапазон (Read offset/limit или sed) и извлекает findings по вопросу. Чанки независимы.
3. **Reduce/Synthesize**: финальный агент сводит findings в цитируемый ответ (со ссылками на
   строки/источники).

## Билинг-граница (обязательно)

Рекурсия/fan-out = **кратный расход токенов** (`safety-billing.md §4`: N чанков → N+ агентов).
Поэтому:
- Запускать только при явной нужде (артефакт реально большой) — opt-in, не «инициативно».
- Гард на число чанков: `budget`-проверка в loop, разумный `maxChunks`, и **логировать, что
  отброшено** (no-silent-caps — нельзя молча обрезать покрытие и выдать за «прошли всё»).
- Дорогую модель — на peek/synthesize (рассуждение), дешёвую — на map (механика чанков)
  (`edit-formats-and-tiering.md`: architect/editor-тиринг).

## Anti-patterns
- ❌ Набить артефакт целиком в один промпт «авось влезет» → обрезка/context rot, потеря хвоста.
- ❌ Запустить map на тысячи чанков без `budget`-гарда → выжигание лимита (billing §4).
- ❌ Молча обрезать число чанков (top-N) и заявить «проанализировано всё».
- ❌ Тащить их OpenAI-репу как есть — заточена под GPT-5; берём паттерн на нашем стеке.

## Related
- [[reference_recursive_language_models]] — полный разбор, цифры, первоисточники
- skill `agent-harness-design` (references/agent-tool-design.md §9) — Connector Code-Execution Pattern (тот же приём)
- `safety-billing.md` §4 — fan-out = кратный расход, гард обязателен
- `edit-formats-and-tiering.md` — модель-тиринг peek/synthesize vs map
- `quality-over-tokens-independent-verify.md` — синтез по чанкам можно перепроверить свежим агентом
