Skip to main content
Glama
temporal-knowledge

temporal-knowledge

by kenningai

Kenning Continuity

劣化ではなく蓄積するエンタープライズ知識。

LLMエージェントがセッションをまたいで組織知識を蓄積できるようにするMCPサーバー。ドメイン単位でスコープされ、Neo4jをバックエンドとする。すべての構造的不変条件は指示ではなくツールによって強制され、生のCypher書き込みは公開されない。そのため、モデルが何をしようとグラフが自己破壊することはない。

エンタープライズ規模で本番稼働している:37ドメイン、376セッション、3,000以上の知識エンティティが4ヶ月の日常利用で蓄積された。

なぜこれは満たされても劣化しないのか

ほとんどの蓄積型メモリシステムは、2つのいずれかの方法で失敗する。観察された事実と、役に立とうとするモデルが推論した事実を区別するものが何もないため、初日から作話を起こす。あるいは、デモは成功しても、規模が大きくなるにつれて劣化する。すべての書き込みが制約のない追記であり、ストアには類似重複、無言の上書き、誰にも作成者を辿れない主張が徐々に蓄積されていくからだ。

4つのコミットメント。すべて構造的に強制される:

何も上書きされない。 update_knowledge も retype_knowledge も存在しない。エンティティについて既知の内容を変更すると、EVOLVED_FROM によって先行ノードにリンクされた新しいノードが作成される。以前の理解は依然として存在し、読み取り可能であり、帰属も可能である。以前に誤っていたことは記録の事実であり、そこから消去されるべきものではない。

すべての主張は2ホップでその作成者に到達する。 知識エンティティは Session によって発見され、Session は Person によって指揮される。両方のエッジは、実際の指揮者なしでは実行を拒否するツールによって書き込まれる。つまり「誰が、いつ、どのような目的のためにこれを述べたか」は常に答えられる。慣習によるのではなく、それを欠いたまま知識を作成するコードパスが存在しないからだ。

同一性は文字列から推論されることはない。 11のドメインにまたがる「Alice Example」という名前の17のノードは、17の参照行為であり、正しく区別されている。そのうちの2つが同一人物であると主張することは、誰かがセッション内で行う主張であり、distinct という値を保持できる REFERENT_CLAIM として記録される。いいえという答えを記録する場所がないシステムは、同じ質問を永遠に繰り返すことになるからだ。文字列マッチングによる同一性判定は、多くのナレッジグラフが静かに嘘をつき始める場所である。

構造が事実を担い、プロパティはそれを複製しない。 知識エンティティは domain プロパティを保持しない。エンティティは、それを発見したセッションによってドメインに配置され、そこからウォークによって到達される。これに先立つプロパティは乖離していた。非正規化がそうするように:21のエンティティが、実際にはそれらへのパスがまったく存在しない実在のドメインを指す domain 文字列を保持していた。構造の隣にテキストとして保持される事実は、構造によって保持されるのではなく、最終的には構造と矛盾する事実である。

confidence フィールドは意図的に存在しない。ある場面での誰かの確信度はその人の経験に関する事実であり、伝達されない。後の読者は、自分が知っていることと照らし合わせて説明から独自の確信度を導き出す。確信度スコアが目指していたものは、代わりに読者が誰でも判断できるエッジによって担われる:VALIDATION、INVALIDATING、そして対になる Solution のない Challenge である。

蓄積型メモリシステムを大規模に運用し、これらの壁に自ら直面したことがあるなら、ぜひご意見をお聞かせください。

Related MCP server: attestor

アーキテクチャ

プロセス層(不変)— Person → Session、Domain → Session 内。NEXT_SESSION は常に時間的に前方を指し、ツールによって強制される。この層への所属は、可能な未来を保持し、実現に向けて測定する能力である。ここには参照対象は存在しない。

知識層(追記専用)— 11のオントロジータイプと7のサブラベルが、13の接続タイプで接続され、すべてのノードが :Knowledge とマークされる。説明の変更は、EVOLVED_FROM によってリンクされた新しいチェーンノードを作成する。

オペレーター向けの、LLMに不変条件の足場として与える教示については HOWTO.xml を、各コミットメントの背後にある理由については 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 flag

Env var

Default

Description

--db-url

NEO4J_URI or NEO4J_URL

bolt://localhost:7687

Neo4j接続URL

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

(none)

ツール名プレフィックス(例: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

(none)

カンマ区切りのCORSオリジン

--allowed-hosts

NEO4J_MCP_SERVER_ALLOWED_HOSTS

(none)

カンマ区切りのホスト。DNSリバインディング保護

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)

Tool

Description

list_domains

セッション数と最終アクティビティを含む全ドメイン

create_domain

知識ドメインを作成(冪等)

begin_session

セッションを開始し、session_id を返す。domain、purpose、director、director_key はすべて必須 — 指揮者の Person ノードはここでのみ作成され、他の場所では作成されない

end_session

学んだことの要約とともにセッションを閉じる

begin_session はドメインの状態ではなく、タイプ別のカウントを返す。状態をインラインで返すと、ある本番ドメインでは600,820文字になり、セッションが質問をする前に約15万トークンを消費していた。実際に必要な部分については、types と limit を指定して get_domain_state を呼び出すこと。

知識ミューテーション(6)

Tool

Description

create_knowledge

エンティティを作成。衝突時は拒否、プロセスタイプは拒否、未知のフィールドは破棄せず拒否

evolve_knowledge

説明を変更する唯一の方法。EVOLVED_FROM によって先行ノードを保持した新しいチェーンノードを作成。オントロジータイプは維持し、サブラベルのセットは置き換える

confirm_knowledge

エンティティがレビューされ、変更がないことを確認したことを記録

merge_knowledge

EVOLVED_FROM チェーンを1つの正規ノードに圧縮。破壊的 — 元に戻せない

create_connections

エンティティをリンク。session_id を受け取り、すべてのエッジに記録する — エッジは主張であり、その作成者に到達する

claim_referent

2つの参照対象が同じものであると主張。必須の resolution:proposed、confirmed、または distinct

クエリ(5)

Tool

Description

search_knowledge

名前と説明に対する全文検索。チェーンの先頭のみ

get_domain_state

ドメインの現在のエンティティ。オプション:types、limit、descriptions

get_session_history

誰がいつ何に、どのような目的のために取り組んだか

get_chain_history

EVOLVED_FROM を逆向きに辿る — 以前に理解されていたこと

read_cypher

読み取り専用のCypherエスケープハッチ。書き込みは拒否される

タクソノミー(2)

Tool

Description

list_knowledge_types

11のオントロジータイプと7のサブラベル(ラティス付き)

list_connection_types

13の知識エッジタイプと5のプロセスエッジタイプ

グラフ分析(6)

Tool

Description

gds_create_projection

GDSグラフプロジェクションを作成

gds_drop_projection

プロジェクションを削除

gds_pagerank

PageRank中心性

gds_betweenness

媒介中心性 — ブリッジノード

gds_louvain

Louvainコミュニティ検出

gds_wcc

弱連結成分

タイプシステム

すべての知識ノードは :Knowledge、正確に1つのオントロジーラベル、そのラベルを決定的に命名する ont_type プロパティ、そしてNeo4jのマルチラベリングによる0個以上のサブラベルを保持する。

オントロジー型

それが何か

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 修正第10号、2025年10月8日提出。WILSON GOES PUBLIC…」

提出書類は Event である。Wilson は創業者である。提出書類が彼について何かを明らかにすることは、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