Skip to main content
Glama
temporal-knowledge

temporal-knowledge

by kenningai

Непрерывность знаний (Kenning Continuity)

Корпоративные знания, которые накапливаются, а не деградируют.

MCP-сервер, позволяющий LLM-агентам накапливать организационные знания между сеансами, ограниченные по доменам, на базе Neo4j. Каждый структурный инвариант обеспечивается инструментом, а не запрашивается в инструкции, и никакой необработанный Cypher-запрос на запись не предоставляется — поэтому граф не может повредить себя, что бы модель ни решила сделать.

Он работает в производстве в масштабе предприятия: 37 доменов, 376 сеансов и более 3000 сущностей знаний, накопленных за четыре месяца ежедневного использования.

Почему он не деградирует по мере заполнения

Большинство накопительных систем памяти терпят неудачу одним из двух способов. Они конфабулируют с первого дня, потому что ничто не отличает наблюдаемый факт от факта, выведенного моделью, пытающейся быть полезной. Либо они переживают демо, а затем деградируют под нагрузкой, потому что каждая запись — это неограниченное добавление, и хранилище медленно заполняется почти дубликатами, тихими перезаписями и утверждениями, которые никто не может проследить до автора.

Четыре обязательства, все обеспечиваются структурно:

Ничто не перезаписывается. Нет ни update_knowledge, ни retype_knowledge. Изменение того, что известно о сущности, создаёт новый узел, связанный с предшественником через EVOLVED_FROM. Прежнее понимание по-прежнему существует, по-прежнему читаемо, по-прежнему атрибутировано. Более ранняя ошибка — это факт о записи, а не то, что следует стереть из неё.

Каждое утверждение достигает своего автора за два перехода. Сущность знания обнаруживается Session; Session направляется Person. Оба ребра записываются инструментами, которые отказываются работать без реального руководителя. Поэтому «кто это сказал, когда и с какой целью» всегда можно установить — не по соглашению, а потому что не существует пути кода, который создаёт знание без этого.

Идентичность никогда не выводится из строки. Семнадцать узлов с именем «Alice Example» в одиннадцати доменах — это семнадцать актов ссылки, корректно различных. Утверждение, что два из них — один человек, является утверждением, которое кто-то делает в сеансе, записанным как REFERENT_CLAIM, способным нести значение distinct — потому что система, в которой нет места для записи ответа нет, будет бесконечно задавать один и тот же вопрос. Сопоставление идентичности по строкам — это то, где большинство графов знаний тихо начинают лгать.

Структура несёт факты; свойства не дублируют их. Сущность знания не содержит свойства domain. Она помещается в домен сеансом, который её обнаружил, и достигается оттуда обходом. Свойство, которое предшествовало этому, дрейфовало — именно так денормализации и делают: 21 сущность несла строку domain, указывающую на реальный домен, к которому не было пути. Факт, хранящийся как текст рядом со структурой, а не через неё, — это факт, который в конечном итоге разойдётся со структурой.

Поле confidence отсутствует намеренно. Уверенность кого-то в конкретном случае — это факт об их опыте и не передаётся; более поздний читатель выводит свою собственную уверенность из описания, сопоставляя его с тем, что он знает. То, к чему стремятся оценки уверенности, передаётся рёбрами, которые любой читатель может оценить: VALIDATION, INVALIDATING и Challenge без парного Solution.

Если вы сами сталкивались с этими стенами при эксплуатации накопительной системы памяти в масштабе, мы хотим услышать вас.

Related MCP server: attestor

Архитектура

Процессный слой (неизменяемый) — Person → Session, внутри Domain → Session. NEXT_SESSION всегда указывает вперёд во времени, что обеспечивается инструментом. Членство в этом слое — это способность удерживать возможные будущие и измерять их по отношению к реализации; ничто здесь не является референтом.

Слой знаний (только добавление) — 11 онтологических типов и 7 под-меток, связанных 13 типами связей, каждый узел помечен :Knowledge. Изменения описания создают новый узел цепочки, связанный через EVOLVED_FROM.

См. HOWTO.xml для обучающего материала для оператора, который следует давать LLM в качестве инвариантного каркаса, и docs/design/ для обоснования каждого обязательства.

Предварительные требования

  • Python 3.10+

  • Экземпляр Neo4j 5.x (локальный или удалённый)

  • uv (для разработки; не требуется для установки)

Быстрый старт

pip install kenning-continuity

kenning-continuity --db-url bolt://localhost:7687

Или из исходников:

uv sync
uv run kenning-continuity --db-url bolt://localhost:7687

Конфигурация

Флаги CLI имеют приоритет над переменными окружения, которые имеют приоритет над значениями по умолчанию.

Флаг CLI

Переменная окружения

По умолчанию

Описание

--db-url

NEO4J_URI или NEO4J_URL

bolt://localhost:7687

URL подключения к Neo4j

--username

NEO4J_USERNAME

neo4j

Имя пользователя Neo4j

--password

NEO4J_PASSWORD

password

Пароль Neo4j

--database

NEO4J_DATABASE

neo4j

Имя базы данных Neo4j

--transport

NEO4J_TRANSPORT

stdio

stdio, sse или streamable-http

--namespace

NEO4J_NAMESPACE

(нет)

Префикс имени инструмента (например, myapp → myapp-begin_session)

--read-timeout

NEO4J_READ_TIMEOUT

30

Таймаут чтения запроса, секунды

--server-host

NEO4J_MCP_SERVER_HOST

127.0.0.1

HTTP-хост (транспорты, отличные от stdio)

--server-port

NEO4J_MCP_SERVER_PORT

8000

HTTP-порт (транспорты, отличные от stdio)

--server-path

NEO4J_MCP_SERVER_PATH

/mcp/

HTTP-путь (транспорты, отличные от stdio)

--allow-origins

NEO4J_MCP_SERVER_ALLOW_ORIGINS

(нет)

Разрешённые CORS-источники через запятую

--allowed-hosts

NEO4J_MCP_SERVER_ALLOWED_HOSTS

(нет)

Разрешённые хосты через запятую, защита от DNS-rebinding

Конфигурация MCP-клиента

Claude Desktop / Claude Code

{
  "mcpServers": {
    "temporal-knowledge": {
      "command": "kenning-continuity",
      "args": ["--db-url", "bolt://localhost:7687"]
    }
  }
}

HTTP-транспорт

kenning-continuity \
  --db-url bolt://localhost:7687 \
  --transport streamable-http \
  --server-host 0.0.0.0 \
  --server-port 8000 \
  --allow-origins "http://localhost:3000" \
  --allowed-hosts "localhost,127.0.0.1"

Поверхность инструментов (23 инструмента)

Сеанс выполняется: create_domain (один раз) → begin_session → создание / эволюция / подтверждение / связывание знаний → end_session.

Сервер не хранит состояние. begin_session возвращает session_id, который клиент передаёт каждому последующему инструменту знаний. Сеанс, который никогда не закрывался, остаётся active — это задумано.

Процесс (4)

Инструмент

Описание

list_domains

Все домены с количеством сеансов и последней активностью

create_domain

Создать домен знаний (идемпотентно)

begin_session

Начать сеанс; возвращает session_id. domain, purpose, director и director_key обязательны — узел Person руководителя создаётся здесь и нигде больше

end_session

Закрыть сеанс с резюме того, что было изучено

begin_session возвращает количество по типам, а не состояние домена. Возврат состояния встроенно составлял 600 820 символов в одном производственном домене — примерно 150 тыс. токенов потрачено до того, как сеанс задал вопрос. Вызовите get_domain_state с types и limit для той части, которая вам действительно нужна.

Мутация знаний (6)

Инструмент

Описание

create_knowledge

Создание сущностей. Отказывает при коллизии, отказывает для процессных типов и отклоняет неизвестные поля, а не игнорирует их

evolve_knowledge

Единственный способ изменить описание. Создаёт новый узел цепочки, сохраняя предыдущий через EVOLVED_FROM; сохраняет онтологический тип, заменяет набор под-меток

confirm_knowledge

Записать, что сущности были проверены и найдены неизменными

merge_knowledge

Сжать цепочку EVOLVED_FROM в один канонический узел. Разрушительно — необратимо

create_connections

Связать сущности. Принимает session_id и записывает его на каждом ребре — ребро является утверждением и достигает своего автора

claim_referent

Утверждать, что два референта — одно и то же, с обязательным resolution: proposed, confirmed или distinct

Запросы (5)

Инструмент

Описание

search_knowledge

Полнотекстовый поиск по именам и описаниям, только головы цепочек

get_domain_state

Текущие сущности для домена; опционально types, limit, descriptions

get_session_history

Кто над чем работал, когда и с какой целью

get_chain_history

Обход EVOLVED_FROM назад — что было понято ранее

read_cypher

Cypher-запасной выход только для чтения; записи отклоняются

Таксономия (2)

Инструмент

Описание

list_knowledge_types

11 онтологических типов и 7 под-меток, с решёткой

list_connection_types

13 типов рёбер знаний и 5 типов процессных рёбер

Аналитика графа (6)

Инструмент

Описание

gds_create_projection

Создать проекцию графа GDS

gds_drop_projection

Удалить проекцию

gds_pagerank

Центральность PageRank

gds_betweenness

Центральность по посредничеству — узлы-мосты

gds_louvain

Обнаружение сообществ Лувена

gds_wcc

Слабосвязные компоненты

Система типов

Каждый узел знания несёт :Knowledge, ровно одну онтологическую метку, свойство ont_type, детерминированно называющее эту метку, и ноль или более под-меток через мульти-метки Neo4j.

Онтологический тип

Что это такое

Actor

То, что действует; обладает агентностью

Structure

Устройство без агентности; устойчивая форма

Artifact

Созданный объект, который сохраняется и на который можно ссылаться

Place

Место, кампус, регион или территория — всегда объект ссылки, никогда — источник ссылки

Event

Событие, локализованное во времени

Insight

Осознание, открытие, прорыв

Pattern

Повторяющаяся структура, распознаваемая в разных экземплярах

Challenge

Препятствие в настоящем времени

Solution

Решение, которое сработало; образует пару с Challenge

Lesson

Правило, выведенное из опыта

Rationale

Причина, стоящая за чем-то

Суб-метки образуют решётку, а не плоскую карту

PersonReferent → Actor          System        → Structure
Organization   → Actor          Process       → Structure
Team           → Organization → Actor         Configuration → Structure
                                              Service       → Structure

create_knowledge принимает либо онтологический тип (Actor), либо суб-метку (Team) и применяет всю цепочку: :Knowledge:Actor:Organization:Team. Поэтому запрос по организациям находит команды. Плоская карта выдала бы :Actor:Team, молча отбросив средний уровень, и ничто бы об этом не сообщило.

Типы связей (13)

EVOLVED_FROM, ENABLING, REQUIRING, INFORMING, CAUSING, COMPOSING, EXTENDING, RECOGNITION, VALIDATION, INVALIDATING, ASSOCIATED_WITH, SITUATED_AT, REFERENT_CLAIM.

Процессные рёбра — HAS_SESSION, NEXT_SESSION, DIRECTED, DISCOVERED, CONFIRMED — записываются только процессными инструментами и не могут быть созданы через create_connections.

Что должно содержать описание

Описание говорит о том, чем сущность является, а не о том, что с ней или вокруг неё произошло. Временные наблюдения относятся к узлам Event, достижимым через рёбра.

  • Правильно, для Actor:PersonReferent: «Основатель lululemon. Крупнейший индивидуальный акционер (8,4%). Подан по форме Schedule 13D — не пассивный.»

  • Неправильно: «SCHEDULE 13D/A Amendment No. 10 filed Oct 8, 2025. WILSON GOES PUBLIC…»

Файлинг является Event. Уилсон является основателем. То, что файлинг раскрывает что-то о нём, — это ребро INFORMING. Его описание должно пережить любое количество будущих файлингов без изменений, если только не изменится сама его идентичность.

Разработка

uv sync --group dev

./.venv/bin/pytest tests/unit          # mocked substrate, no database
./.venv/bin/pytest tests/integration   # real Neo4j via testcontainers; needs Docker
./.venv/bin/pyright

Дефект, живущий в Cypher-запросе, невидим для модульных тестов — они имитируют подложку, и однажды баг в создании рёбер прошёл все тесты одинаково и до, и после исправления. Всё, что касается запросов, должно находиться в tests/integration/.

Лицензия и атрибуция

Лицензировано под Apache License, Version 2.0. Используйте, модифицируйте, запускайте в продакшене — коммерчески или иначе.

Работа здесь — это онтология: решётка типов, разрешение обходом, размещение эпистемического статуса в рёбрах, принцип, что каждый инвариант живёт в инструменте. Это отдаётся свободно, и Apache-2.0 просит лишь, чтобы атрибуция путешествовала вместе с ней: сохраняйте LICENSE и NOTICE и отмечайте, что вы изменили.

Название Kenning AI не является частью этого гранта (Apache-2.0 §6). Смотрите TRADEMARKS.md, что можно делать без разрешения, — а это почти всё, включая указание того, на чём построено ваше программное обеспечение.

Контакты

contact@kenningai.com — без форм, без воронок, письмо доходит до нас напрямую.

Нам особенно интересно услышать тех, кто запускал накопительную систему памяти в масштабе и сформировал мнение о том, почему они терпят неудачу. Этот режим отказа — причина почти каждого решения в этом репозитории, и несогласие того, кто столкнулся с этим сам, для нас ценнее, чем согласие того, кто не сталкивался.


Kenning AI · kenningai.com

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Audit-grade memory backbone for agent teams. Bi-temporal facts (event time + transaction time, with recall(as_of=...) replay), 6-step deterministic retrieval (no LLM in the critical path), conversation ingest with speaker-locked dual-pass extraction, per-tenant Postgres row-level security, and Ed25519-signed provenance. Postgres + pgvector + Neo4j defaults.
    37 PyPI
    14
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent knowledge graph memory for AI agents, enabling them to store, recall, and query facts about people, projects, and relationships across sessions.
    MIT