Vlk MemAct について
Vlk MemActは、SQLiteを基盤にPRESENT、PAST、FUTUREの状態で記憶を管理する、エージェント向けの時系列メモリMCPサーバーです。繰り返されるエラーを検出して失敗した方法の再試行を防ぎ、バックグラウンドでの統合とトークン予算管理も行います。
主な機能
- 01時間状態に基づく記憶管理
- 02言語をまたいだエラー指紋の照合
- 03反復エラーの自動アーカイブと制約追加
- 04検索時の矛盾記憶の再調整
- 05古い記憶の統合と整理
- 06トークン予算に応じた低重要度記憶のアーカイブ
活用シーン
- 01繰り返し失敗した修正方法の再試行を防止
- 02後続セッションに文脈と予防制約を提供
- 03アクティブな記憶のトークン量を抑制
MCP 対応
単一バイナリとして、記憶の記録・取得、履歴の確認、検索、統合状態の確認などのツールをMCP経由で公開します。クライアントは標準入出力で接続します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Vlk² — AI エージェント向け時間的状態機械
Vlk² は AI エージェントに時間の感覚を与えます。現在何が起きているか(PRESENT)、すでに何を試したか(PAST)、そして将来の意思決定の指針となるべきものは何か(FUTURE)を把握できます。SQLite をバックエンドに、MCP 上で単一のバイナリとして動作し、こうした時間的な状態遷移を自律的に管理します。
注目のデモ:エージェントが同じ Rust/TS/Python/Go のエラーを3回繰り返すと、Vlk² はそのループを自動的にアーカイブし、予防的な制約を注入することで、エージェントが同じ失敗するアプローチを再試行しないようにします。ただし、このアーキテクチャは汎用的です。時間的状態機械は、あらゆるエージェントフレームワークで、あらゆる種類の過去→現在→未来の遷移を追跡できます。
機能
- 時間的状態機械 — 各メモリは状態を持ちます。PRESENT(有効なコンテキスト)、PAST(アーカイブ済みで、コンテキストには表示されない)、FUTURE(予防的な制約)、PURGED(忘却済み)。バックグラウンドエージェントが、エージェントの介入なしにエントリーを状態間で遷移させます。
- 言語横断のループ検出 — 文字列一致ではなく、言語ごとにエラーのフィンガープリントを作成します。Rust(
error[E0277])、TypeScript/JS(TS2345、TypeError)、Python(ValueError、KeyError)、Go(panic: nil pointer)、HTTP(503 Service Unavailable)、テストフレームワーク(expected: X, got: Y)を認識し、タイムスタンプを除去するフォールバックも備えています。同じフィンガープリントが3回以上現れると、Vlk² はループを自動的に PAST にアーカイブし、FUTURE 制約を注入します。 - 取得時の再固定化 — 呼び出しのたびに現在の信念を確認し、矛盾がある場合はメモリを書き換えます。
- トークン予算の適用 — 30秒ごとに、PRESENT と FUTURE の合計トークン数を推定します。予算(デフォルトは8K)を超えた場合、予算内に収まるまで重要度の低いエントリーからアーカイブします。
- 自律的な統合 — バックグラウンドタスク(30秒周期)が重要度を評価し、古くなったエントリーをアーカイブして、つながりのないエントリーを忘却します。
単なるメモリシステムではない理由
一般的なメモリシステム(agentmemory、Hindsight、Mem0、Supermemory)は、事実、好み、コンテキストを保存します。Vlk² は、それらにはない1つの機能を担います。異なるファイルで同じ Rust のコンパイルエラーが3回繰り返されたことを検出し、エージェントが同じ失敗するアプローチを再試行しないよう制約を注入します。 これは置き換えを目的としたものではなく、それらと並行して動作する、特化型の障害検出レイヤーです。
| 機能 | Vlk² | agentmemory | Hindsight | Supermemory |
|---|---|---|---|---|
| 事実/ペルソナのメモリ | — | ✅ 53 個のツール | ✅ フック | ✅ キーワード |
| 言語横断のエラーフィンガープリント | ✅ 7 つの手法 | — | — | — |
| 自律的なループの解消 | ✅ 3 回以上の繰り返しで自動アーカイブ | — | — | — |
| 取得時の再固定化 | ✅ | — | — | — |
| トークン数に上限を設けたコンテキスト | ✅ デフォルトは8K | — | — | — |
クイックスタート
cd vlk-core
cargo build --release
DATABASE_URL="sqlite:vlk.db?mode=rwc" ./target/release/vlk-core
すべての MCP クライアントは stdin/stdout 経由で接続します。JSON-RPC 2.0 に対応し、メッセージは1行ずつ送信します。
MCP ツール
| ツール | 目的 |
|---|---|
vlk_record_state | ログ/エラーをループ検出用の PRESENT スロットとして追加します |
vlk_fetch_context | 再固定化とループの遮断を行い、コンテキストを整理します |
vlk_time_travel | PRESENT を PAST にアーカイブし、FUTURE 制約を注入します |
vlk_get_history | タイムライン全体を監査します |
vlk_search_memory | ログと制約をキーワード検索します |
vlk_summarize_session | 状態の件数とトークン数の推定値を表示します |
vlk_revoke_future | 誤って学習された制約を削除します |
vlk_get_facts | 抽出されたパターンを取得します |
vlk_consolidation_status | トークンバー付きで統合エージェントの状態を表示します |
vlk_pin_memory | パターンが忘却されないよう保護します |
vlk_unpin_memory | 通常の忘却対象に戻します |
ループ検出の仕組み
- 各エラーは種類ごとにフィンガープリント化されます。Rust の
error[E...]、TS のTS...、Python のTypeError:、Go のpanic:、HTTP の503、テストのアサーション、または先頭 80 文字をフォールバックとして使用します - フィンガープリントによって類似したエラーがグループ化されます。エラーコードが同じでタイムスタンプや行番号が異なる場合も、1 つのパターンとして扱われます
- 3 回以上繰り返されると、ループが自動でアーカイブされ、予防的な制約
[SYSTEM ANCHOR]が注入されます - 今後のコンテキスト取得にこの制約が含まれるため、エージェントは同じことを繰り返さなくなります
アーキテクチャ
memory_contents (immutable, team-agnostic)
└── FK ──► agent_timeline (PRESENT / PAST / FUTURE / PURGED)
├── memory_metadata (temporal vectors, importance, connectivity)
└── semantic_facts (distilled patterns from errors)
└── fact_contradictions (resolution tracking)
Consolidation Agent (background tokio, 30s cycle)
SCAN → EVALUATE importance → BUDGET_CHECK → ARCHIVE low-value → FORGET stale
検証
テスト済み: 中核となるループ検出フローを検証済みです。同一の Rust エラーが 3 回発生すると、PAST への自動アーカイブと FUTURE 制約の注入が行われます。13 個すべての MCP ツールが正しく応答します。
未テスト: 存在しない timeline_ids を指定した場合のピン留め/ピン留め解除、負荷時のトークン予算の適用、競合の解決。
ループ検出のスモークテスト — 同一の Rust error[E0277] を 3 回送信し、自動アーカイブと制約の注入を検証します。
import subprocess, json, tempfile, os, sys
db = tempfile.mktemp(suffix='.db')
proc = subprocess.Popen(['./target/release/vlk-core'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
env={'DATABASE_URL': f'sqlite:{db}?mode=rwc'})
def rpc(msg):
proc.stdin.write((json.dumps(msg) + '\n').encode())
proc.stdin.flush()
return json.loads(proc.stdout.readline())
# Init
rpc({'jsonrpc':'2.0','id':1,'method':'initialize','params':{
'protocolVersion':'2024-11-05','capabilities':{},
'clientInfo':{'name':'test','version':'1.0'}}})
# Send the same Rust error 3 times to trigger loop detection
error = 'error[E0277]: cannot add `str` to `str`'
for i in range(3):
r = rpc({'jsonrpc':'2.0','id':i+2,'method':'tools/call','params':{
'name':'vlk_record_state',
'arguments':{'raw_log': error, 'file_context': f'lib.rs:{i*10}'}}})
assert 'PRESENT state recorded' in r['result']['content'][0]['text']
print(f' Record {i+1}: OK')
# fetch_context triggers loop detection → auto-archive → constraint injection
r = rpc({'jsonrpc':'2.0','id':5,'method':'tools/call','params':{
'name':'vlk_fetch_context','arguments':{}}})
txt = r['result']['content'][0]['text']
assert 'E0277' in txt, 'error missing after fetch'
assert any(kw in txt for kw in ['SYSTEM ANCHOR', 'PREVENTIVE', 'CONSTRAINT']), \
'no constraint injected'
print(f' Fetch: loop archived + constraint injected')
proc.terminate(); proc.wait()
for f in (db, db + '-wal', db + '-shm'):
try:
os.remove(f)
except FileNotFoundError:
pass
print('PASS: loop detection works')
統合
Hermes、OpenCode、Claude Code、Codex、または任意の MCP ホストに追加します。
# ~/.hermes/config.yaml or equivalent
mcp_servers:
vlk2:
command: "vlk2"
env:
DATABASE_URL: "sqlite:~/.hermes/vlk/vlk.db?mode=rwc"
timeout: 30
あらゆる MCP クライアントと互換性があります。agentmemory、Hindsight、Supermemory、または Hermes 組み込みのメモリと併用できます。
要件
- Rust 2021 エディション
- SQLite(sqlx 経由でバンドル)
- 6.4MB のバイナリ
現在の状況
現在も積極的に開発されています。中核となるループ検出と修正メモリのサイクルが実装され、E2E テスト済みです。Vlk² は汎用メモリシステムを補完する特化型のシステムであり、置き換えるものではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。