24.1 KB · updated 2026-07-06 · md

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(queryseeds, 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 --importcompileobsidian-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: mergekeep_separate"` JSON для ручного редактирования; нет программного пути применения.Интегрированная очередь обзора, подключённая к компиляции.
примечаниеМаркеры TODO/FIXME действительно редки — реальный долг это задокументированные в комментариях обходные пути (слияние changed-only, Kuzu base64, asyncio-на-вызов), а не разбросанные TODO.

Рекомендуемый порядок построения (дельта архитектуры → видение)

  1. Супервизор-демон + внутрипроцессный оркестратор конвейера. Один цикл событий, сигналы/завершение, замена цепочки refresh из markdown-навыка. Разблокирует все остальные столпы.
  2. Живой монитор сессий. Тейл JSONL харнеса → инкрементное извлечение на уровне хода → подача в цикл. (Заменяет ручной sessions discover --import.)
  3. Настоящая инкрементная/потоковая компиляция через порт GraphStore, списывая хрупкий патч выселения changed_only.
  4. Активировать проходы самосовершенствования по умолчанию + сохранять их: запись затухания при компиляции, инкремент access-count при чтениях MCP, supersede вкл. (с подавлением), разрешение противоречий, уверенность повторяющихся инсайтов.
  5. Контекстный компилятор по запросу (инструмент MCP compile_context + CLI): запрос → PPR/гибрид → обход окрестности → собранный, цитируемый, готовый для агента документ.
  6. Настоящие эмбеддинги по умолчанию (или громкое предупреждение о деградации), чтобы семантический поиск не был хеш-заглушкой из коробки.
  7. Объединить serve + watch + deploy для непрерывной публикации; добавить тесты жизненного цикла (слой, от которого видение зависит больше всего, сейчас покрыт меньше всего).

Сильные стороны, которые стоит сохранить

Детерминированная побайтово идентичная компиляция; широкое покрытие тестами пакетной механики; чистый гибридный RRF-поиск + продуманное взвешивание рёбер PPR; широкая, корректно разделённая (публичная/приватная) поверхность инструментов MCP; надёжные статические экспорты (llms.txt, JSON-LD, RSS) и виджет ask с заботой о безопасности. Фундамент прочен; работа — добавить поверх динамический, самодвижущийся слой.