context-engine-audit.ru.md
docs/i18n/context-engine-audit.ru.md
Tesserae как контекстный движок — анализ пробелов
<!-- translations:start -->
English · 한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
Миссия (2026-06-02): Tesserae — это контекстный движок: он генерирует готовый для агентов контекст, реконструируя самосовершенствующуюся базу знаний через три столпа: (1) мониторинг сессий, (2) автономное проактивное поглощение, (3) документы по запросу. Знание должно быть реальновременным и эволюционирующим, готовым к передаче агентам.
Этот документ проверяет текущую кодовую базу на соответствие этой миссии. Это результат четырёхстороннего параллельного обзора (поглощение/сессии, самосовершенствование, вывод/интерфейс для агентов, оркестрация/жизненный цикл).
Статус на v0.5.0 (2026-06-06): Это аудит на момент времени (снимок от 2026-06-02), который сохранён как есть для истории. Большинство его сквозных находок теперь устранены: недостающие супервизор-демон и внутрипроцессный оркестратор конвейера поставлены (спина движка,
tesserae/engine/), живое тейлинг-чтение сессий заменяет пост-фактум скан (Столп 1), пассы самосовершенствования активированы и персистентны через сайдкарnode_memory(supersede по умолчанию с подавлением, числовая уверенность повторяемости — Столп 2), хэш-бакетное эмбеддинг по умолчанию заменено настоящим громко-падающим бэкендом (Столп 3), и контекстный компилятор по запросу Столпа 3 теперь существует (compile_context). Спроектированный инкрементный слой через портGraphStoreприземлился как инфраструктура, но остаётся с флагом OFF/экспериментальным, а объединение serve+watch+deploy (шаг 7 порядка сборки) всё ещё открыто. Статус по фазам см. в фазовой дорожной карте, сводку изменений — в примечаниях к выпуску v0.5.0. Находки ниже оставлены без правок как исходный снимок.
Вердикт одной строкой
Сегодня Tesserae — это механически здоровый, хорошо протестированный пакетный CLI-компилятор. По меркам видения контекстного движка он по всем трём столпам с ручным запуском + постфактум + привязан к git-HEAD. Механика для построения движка уже существует в виде примитивов — не хватает непрерывного, самодвижущегося слоя, который их компонует.
Самая большая отсутствующая часть в каждом срезе: долгоживущий супервизор/демон, владеющий одним циклом событий и автономно управляющий отслеживанием сессий, поглощением, инкрементной компиляцией и публикацией. Всё остальное — инкрементальная надстройка над этим.
Столп 1 — Мониторинг сессий → постфактум, не вживую
| Статус | Находка | Что нужно |
|---|---|---|
| пробел | Захват сессий — это постфактумное сканирование: discover_harness_sessions() обходит завершённые транскрипты только когда человек запускает sessions discover --import или compile. compile намеренно отказывается сканировать ~/.claude/projects/ (задержка). | Тейлер, наблюдающий за JSONL-файлами харнеса и поглощающий ходы по мере выполнения сессии. |
| пробел | Единственный настоящий наблюдатель (watch.py WatchLoop) охватывает исходный markdown, опрашивает каждые 2 с и запускает полный compile. Он не следит ни за сессиями, ни за кодом. | Расширить до триггеров по сессиям + исходным инструментам под одним супервизором. |
| пробел | «Живой» цикл vault_watch.py работает с выводом (обратная синхронизация Obsidian), а не с поглощением. | Не замена живой подкачки знаний. |
| грубо | Повторное извлечение сессии кэшируется по session_id, но на уровне всей сессии: один новый ход аннулирует весь кэш и заново прогоняет полный проход LLM. | Инкрементальность на уровне хода для живого тейлинга. |
| грубо | Хранилище harness_sessions — плоский glob с полным пересканированием на каждый list/write. | Индексированное/дописываемое хранилище для непрерывно растущего набора захватов. |
| отсутствует | Нет временных меток свежести/происхождения по узлам; актуальность отслеживается только на уровне артефакта (git HEAD). | Свежесть по факту для «насколько это свежо?». |
Столп 2 — Самосовершенствующаяся база знаний → одноразовое переизвлечение, навесная эволюция
«Эволюционирующие» проходы существуют, но выполняются только внутри единственного compile (переизвлечение с нуля), и большинство — опт-ин через флаг окружения или ручной CLI. Факты пересчитываются на каждой компиляции, а не пересматриваются на месте.
| Статус | Находка | Что нужно |
|---|---|---|
| пробел | Затухание (Decay) (memory/decay.py, период полураспада Эббингауза 14 дней) вычисляется только во время запроса, никогда не сохраняется и не записывается обратно при компиляции. | Запись затухания во время компиляции + сохранённая оценка. |
| пробел | Цикл доступа затухания мёртв: last_accessed_at == first_seen_at, access_count никогда не растёт. Сигнал «я постоянно это смотрю → это важно» не делает ничего. | Поверхность записи доступа (чтение MCP → инкремент). |
| пробел | Замещение (Supersede) (memory/supersede.py) закрыто за TESSERAE_SUPERSEDE_PASS=true (по умолчанию выкл.) и только добавляет рёбра — никогда не понижает/не скрывает устаревший контент. Пересмотр убеждений — косметика. | По умолчанию вкл. + потребители, подавляющие замещённые факты в выводе. |
| пробел | Противоречия (Contradictions) обнаруживаются (lint.py, уровень info, хрупкое строковое сопоставление), но никогда не разрешаются. Нет арбитража уверенности. | Проход разрешения, а не просто зонд. |
| пробел | Дрейф схемы (Schema drift) (schema_drift.py) — ручная подкоманда schema-drift, которая лишь пишет предложения; схема никогда не самоуточняется. | Путь применения + интеграция в конвейер. |
| пробел | Канонизация (Canonicalization) автоматически сливает только высокоуверенные псевдонимы; остальное ставится в очередь на ручное одобрение через CLI. | Автоматическое слияние с арбитражем LLM со временем. |
| пробел | Цикл обратной связи наполовину закрыт: детерминированный базовый экстрактор полностью игнорирует указания (selective_extractor.py:43); только опциональный путь LLM потребляет исправления. При выключенном LLM человеческие исправления никогда не возвращаются в извлечение. | Соблюдение указаний детерминированным путём или LLM по умолчанию. |
| пробел | Нет усиления повторяющихся инсайтов: ничто не усиливает уверенность, когда инсайт повторяется в разных сессиях. temporal.infer_confidence — грубая строковая эвристика. | Частота между сессиями → числовая уверенность. |
| грубо | Подбор кандидатов на замещение — лексический Жаккар (0.55); семантические перефразировки с малым лексическим пересечением никогда не становятся кандидатами. | Генерация кандидатов на основе эмбеддингов. |
| отсутствует | Весь срез самосовершенствования не протестирован (нет тестов decay/supersede/feedback/drift/canonical/temporal). | Тесты рядом с любым изменением здесь. |
Столп 3 — Документы по запросу → пока не существует
Обвязка запросов/поиска зрелая (гибридный RRF, PPR, ~20 инструментов MCP, ask по страницам, AI-экспорты). Но каждый артефакт — это либо статическая проекция всего корпуса, либо поиск одного узла. «Пользователь спрашивает „дай мне контекст по X“ → подогнанный документ» не реализовано. Примитивы для этого все присутствуют, но никогда не скомпонованы.
| Статус | Находка | Что нужно | |
|---|---|---|---|
| отсутствует | Генерация документов по запросу (ключевой пробел Столпа 3). Нет модуля, который порождает подогнанный, ограниченный запросом документ из запроса. report.py — это сводка линта во время компиляции, а не артефакт знаний. | Новый context_compiler: поиск → PPR → обход окрестности → сборка тела → опциональный LLM-синтез. | |
| пробел | wiki_page возвращает одно предкомпилированное тело узла; нет инструмента многоузловой, ограниченной запросом сборки. | Инструмент MCP `compile_context(query | seeds, depth, budget)`. |
| пробел | ask возвращает прозу или список результатов, но никогда — загружаемый/передаваемый контекстный артефакт. | Режим ответа, выдающий структурированный, цитируемый контекстный пакет. | |
| пробел | agent_harness.py — статическая передача (жёстко зашитые топ-12 узлов + фиксированный список), а не ограниченная запросом или по задаче. | Принимать тему/семя → рендерить ограниченную сводку. | |
| пробел | node_context — это 1 переход, без ранжирования. Слаб как примитив контекста для агента. | Маршрутизация через PPR для ранжированного k-переходного контекста. | |
| пробел | Экспорты (llms.txt, graph.jsonld) — дампы всего корпуса; нет среза по теме. | Подграф по теме → срез llms-txt. | |
| грубо | Лейн эмбеддингов по умолчанию — детерминированное псевдо-эмбеддинг хеш-бакетами (blake2b, 128 измерений); настоящий семантический бэкенд только если установлен sentence-transformers, а auto тихо понижается. «Семантический» поиск из коробки — фальшивка. | Настоящие эмбеддинги по умолчанию или громкое предупреждение о хеш-лейне. | |
| грубо | query.answer() отбрасывает валидный ответ LLM, если в нём нет совпадения регулярки цитирования узла. | Сохранять ответ; вместо этого помечать отсутствующие цитаты. | |
| грубо | Виджет ask на статическом хостинге выдаёт консервированный DEMO_QA; настоящий ask работает только под serve. Публичный «ask» на Pages — театр. | Приемлемо для демо; но не потребляемо агентом на опубликованном сайте. | |
| грубо | Бэкенд auto в ask проглатывает исключения и незаметно понижается до BM25. | Показывать, какой бэкенд ответил и почему сработали откаты. |
Сквозное — Оркестрация и жизненный цикл → пакетный CLI, без движка
| Статус | Находка | Что нужно | |
|---|---|---|---|
| пробел | Нет процесса демона/движка. Плоский одноразовый диспетчер argparse; процесс завершается после каждой подкоманды. Ноль обработки signal/SIGTERM/pidfile/launchd; наблюдатели умирают на голом KeyboardInterrupt. | Управляемый долгоживущий демон, владеющий одним циклом событий + изящное завершение. | |
| пробел | «Непрерывность» = markdown-поллер while True: time.sleep(interval). Нет событий файловой системы, обратного давления или стриминга. | Событийно-ориентированное ядро с единым планировщиком. | |
| пробел | «Refresh» живёт в markdown-навыке слэш-команды, а не в коде — он выстраивает sessions discover --import → compile → obsidian-sync. | Первоклассный внутрипроцессный оркестратор конвейера, общий для демона/CLI/MCP. | |
| грубо | Инкрементная компиляция changed_only хрупкая и самоописана как обходной путь: манифест — {path: sha256}; нужно перезагрузить прежний граф, снять узлы проектора/синтеза, выселить переизвлечённые исходные узлы, затем слить — иначе правка 21 файла схлопывает 2400 узлов до 1700. | Спроектированный инкрементный/потоковый слой, текущий через порт GraphStore. | |
| грубо | cli.py — это диспетчер-бог на ~2000 строк (лестница if args.command == ...); у ask/wiki отдельные самодельные парсеры. | Реестр команд / модули подкоманд. | |
| грубо | Флаги с фазовыми воротами отгружают полуготовую поверхность: справка --sessions-llm говорит «будет учитываться, когда приземлится Phase 5». | Доделать или скрыть. | |
| грубо | graph_stores/url_resolver.py оборачивает асинхронное хранилище в asyncio.run на каждый вызов — новый цикл событий на каждый upsert. Патологично для стриминга. | Постоянная асинхронная среда выполнения, если движок выйдет в прод. | |
| грубо | Гексагональные протоколы ports/ определены, но самостоятельный конвейер обходит их, идя прямо к JSON-артефактам. Порт использует только HypePaper. | Прогонять ядро конвейера через GraphStore единообразно. | |
| грубо | Три формата хранения (JSON-артефакт, хранилище SQLite, Kuzu) без единого источника истины; адаптер Kuzu оборачивает каждое поле в base64, чтобы обойти баг повреждения 0.16. | Сойтись к одному источнику истины. | |
| грубо | serve (TCPServer.serve_forever) и watch — отдельные блокирующие процессы — нельзя serve + авто-рекомпиляцию вместе. deploy — ручной git push, отвязан. | Объединить serve + watch + deploy под супервизором для непрерывной публикации. | |
| отсутствует | frontend.py — устаревший мёртвый модуль, всё ещё отгружаемый, дублирующий tesserae/site/. | Удалить или мигрировать вызывающих. | |
| грубо | Цикл человеческого обзора review_workflow.py выдаёт строковый `"action": "TODO: merge | keep_separate"` JSON для ручного редактирования; нет программного пути применения. | Интегрированная очередь обзора, подключённая к компиляции. |
| примечание | Маркеры TODO/FIXME действительно редки — реальный долг это задокументированные в комментариях обходные пути (слияние changed-only, Kuzu base64, asyncio-на-вызов), а не разбросанные TODO. | — |
Рекомендуемый порядок построения (дельта архитектуры → видение)
- Супервизор-демон + внутрипроцессный оркестратор конвейера. Один цикл событий, сигналы/завершение, замена цепочки refresh из markdown-навыка. Разблокирует все остальные столпы.
- Живой монитор сессий. Тейл JSONL харнеса → инкрементное извлечение на уровне хода → подача в цикл. (Заменяет ручной
sessions discover --import.) - Настоящая инкрементная/потоковая компиляция через порт
GraphStore, списывая хрупкий патч выселенияchanged_only. - Активировать проходы самосовершенствования по умолчанию + сохранять их: запись затухания при компиляции, инкремент access-count при чтениях MCP, supersede вкл. (с подавлением), разрешение противоречий, уверенность повторяющихся инсайтов.
- Контекстный компилятор по запросу (инструмент MCP
compile_context+ CLI): запрос → PPR/гибрид → обход окрестности → собранный, цитируемый, готовый для агента документ. - Настоящие эмбеддинги по умолчанию (или громкое предупреждение о деградации), чтобы семантический поиск не был хеш-заглушкой из коробки.
- Объединить serve + watch + deploy для непрерывной публикации; добавить тесты жизненного цикла (слой, от которого видение зависит больше всего, сейчас покрыт меньше всего).
Сильные стороны, которые стоит сохранить
Детерминированная побайтово идентичная компиляция; широкое покрытие тестами пакетной механики; чистый гибридный RRF-поиск + продуманное взвешивание рёбер PPR; широкая, корректно разделённая (публичная/приватная) поверхность инструментов MCP; надёжные статические экспорты (llms.txt, JSON-LD, RSS) и виджет ask с заботой о безопасности. Фундамент прочен; работа — добавить поверх динамический, самодвижущийся слой.