PADAM · NOCTURNE memory について
PADAM · NOCTURNEは、AIアシスタントやエージェント向けのローカル優先型の永続メモリで、SQLiteファイルに保存します。NOCTURNEサイクルで記録を統合・減衰させ、任意のL3アンカリングで履歴を検証可能にしつつ、個別の記録を忘却できます。
主な機能
- 01ローカルSQLiteファイルへの永続メモリ保存
- 02記録の統合、マージ、減衰
- 03意味、単語、識別子による検索
- 04確認、反証、バージョンの追跡
- 05任意の暗号化とArweave・Solanaへのアンカリング
活用シーン
- 01MCP接続された複数エージェント間での永続メモリ共有
- 02過去の判断や会話の検索・確認
- 03他の記憶を保ちながら個別の記録を忘却
MCP 対応
MCP サーバーは、検索、書き込み、確認、反証、タイムライン、統計、統合、エクスポート用の8個のツールを公開します。stdioでMCPクライアントに接続します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx padam-nocturnePADAM_DBPath to the SQLite memory file. Default: ~/.padam/memory.dbOLLAMA_URLLocal Ollama address for embeddings. Without it a built-in method is used.PADAM_STRICT1 turns on every guard at once: each agent write waits for the owner's review, and switches that weaken protection are ignored.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
8掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| kind | enum | いいえ | 1 種類の記録タイプに限定しますpreference | identity | decision | correction | fact | state | event |
| as_of | string | いいえ | この時点でのメモリを検索します:'2026-10-01'(UTC の同日終了時点)または '2026-10-01T12:00:00Z'。後に置き換えられた記録も含まれ、印が付きます。 |
| limit | integer | いいえ | |
| query | string | はい | 探したい内容を自然言語で指定します |
| scope | string | いいえ | メモリのスコープ(例:'project:code') |
| scopes | array | いいえ | 1 つだけでなく複数のスコープ(例:仕事と家庭)を一度に検索します。各記録にはスコープが表示されます。依頼がない限り、スコープが混在することはありません。 |
| compact | boolean | いいえ | 各記録を短縮し(本人の言葉はそのまま残し、アシスタントの返答を簡潔にして)、より多くの記録を含めます |
詳細
PADAM · NOCTURNE
眠り、正直に忘れ、いつまでも検証可能な AI エージェントのためのメモリ
セキュリティレビュー担当者の方へ: docs/SECURITY_REVIEW.md から始めてください。主張の内容、封印されたセットを用いたすべてのレッドチームラウンド、依然としてすり抜けるもの、そして10分でできるチェックについて記載しています。
PADAM は、ローカルファーストの永続メモリで、AI アシスタントやエージェント向けです。マシン上の単一の SQLite ファイルに保存され、あらゆる MCP クライアント(Claude Code、Claude Desktop、Cursor、VS Code)に接続できるほか、CLI や小規模な REST API を通じて独自のコードからも利用できます。
NOCTURNE は、その統合サイクルです。生のエピソードのストリームを長期的なメモリへと変える「睡眠」のようなもので、重要なものを保ち、繰り返されることを一般化し、残りを薄れさせます。まれな劇的出来事にメモリを乗っ取らせることはありません。
L3 はオプションの永続レイヤーです。メモリを Arweave(暗号化バンドル)と Solana(Memo 内の Merkle ルート)に固定することで、メモリが書き換えられていないことを誰でも確認できます。その一方で、個々の記録はいつでも完全に忘れさせることができます。
CODE Eternal の一部 · プロジェクトページ:aifa.works/nocturne · 仕様:English · Русский · README のロシア語版:README.ru.md
目次
- 存在する理由
- 特徴を生み出す3つのアイデア
- 仕組み
- クイックスタート
- エージェントへの接続 — MCP、REST、CLI
- 記録の種類と薄れ方
- 検索
- NOCTURNE サイクル
- L3 — 永続的で検証可能なレイヤー
- セキュリティモデル
- 設定
- テスト
- LongMemEval — 公開ベンチマークでの測定結果
- レッドチームチャレンジ
- 誠実な限界
- 引用、貢献、報告
- ライセンス
存在する理由
現在のエージェントメモリの多くは、ひたすら 蓄積 します。1か月もすれば何千もの記録がたまり、古い決定が新しい決定と食い違い、エージェントはとうの昔に破棄された情報をもとに回答します。間違っていた事実でも、検索され続けると、書き込まれた当日と同じくらい新鮮に見えてしまいます。そしてユーザーが忘れてほしいと頼んだとき、よくある答えは「できません。ログに残っています」か「すべて削除しました」のどちらかです。
NOCTURNE は、脳が行う夜の仕事をします。重要なものを保ち、繰り返されることを一般化し、残りを薄れさせ、あらゆる変更の履歴を正直に保ちます。L3 は、プライベートデータベースにはできないことを実現します。履歴が後から書き換えられていないことを、誰もが検証できる証明です。
他とは異なる3つのアイデア
- 「災難だけでできた記憶」を防ぐ4つの制限機能。 優先度付きリプレイは、まれで鋭いエピソードを過剰にサンプリングするため、記憶が大災害に偏っていきます。NOCTURNEは、希少性を補正し、鋭いエピソードの割合に上限を設け、すでにリプレイされた内容の鋭さを和らげ、日常的なエピソードの最低割合を確保します。合成バッファ(通常のエピソード1,000件+壊滅的なエピソード612件)では、通常の優先度付きサンプリングは確率質量の90.7 %を壊滅的なエピソードに割り当てます。これは200エピソードのバッチのうち約181件に相当します。制限機能を適用すると、200件中50件になります(割合0.25)。2026年10月8日に一から再測定しました。
python -m pytest tests/test_nocturne.py -k nightmare -qで再現できます。合成テストです。制限値はご自身のストリームに合わせて調整してください。 - 1件の記録につき2つの時計。
last_seen_atは記録が表示されたときに更新されますが、last_confirmed_atが更新されるのは確認されたときだけです。減衰の計算には後者を使います。自信を持って誤っている事実が何度も検索されても、いつまでも「新鮮」なままにはなりません。 - 何も削除しませんが、忘却は実現します。 矛盾が見つかると、新しいバージョンが作成されます。古いバージョンは検索結果から除外されますが、履歴(
timeline)には残ります。forgetは内容を消去し、記録自体のキーも破棄します。そのため、Arweave上の暗号文は永久に意味のないデータとなり、記憶の残りの部分はそのまま保たれます。
| 一般的なエージェントの記憶 | PADAM · NOCTURNE | |
|---|---|---|
| 増加 | 無制限に蓄積 | 毎晩統合:保持、統合、減衰 |
| まれで劇的な出来事 | 日常的な内容を押しのける | 割合に上限を設定し、日常的な内容の最低割合を確保 |
| 何度も検索される誤った事実 | 新鮮なまま | 減衰する — 経過時間は最後に確認された時点から数える |
| 矛盾 | 上書きするか、積み重なる | 新しいバージョンを作成し、古いものは履歴に保持 |
| 「忘れてほしい」 | 不可能、またはすべてを削除 | 1件の記録だけを対象にし、そのキーを破棄 |
| 保存場所 | ベンダーのクラウド | 所有者自身が管理する単一のSQLiteファイル |
| 書き換えられていないことの証明 | — | Solana上のMerkleルート、Arweave上の暗号文 |
仕組み
flowchart TB
A[Agent / MCP client / CLI / REST] -->|write · search · confirm · refute| P[(PADAM<br/>SQLite)]
A -->|log episodes| B[Episode buffer]
B -->|python -m padam sleep| N[NOCTURNE<br/>consolidation]
N -->|keep · merge · fade · version| P
P -->|python -m padam l3| E[Per-record AES-256-GCM<br/>encryption]
E -->|ciphertext bundle| AR[(Arweave)]
E -->|Merkle root in a Memo| SOL[(Solana)]
AR --> V[l3-verify:<br/>recompute root]
SOL --> V
3つのレイヤーで、1つの記憶を構成します。
| レイヤー | 保持する内容 | 場所 |
|---|---|---|
| L1 — 作業領域 | 現在の会話とエピソードバッファ | エージェント内およびPADAMのバッファ |
| L2 — 統合済み | 種類、重要度、2つの時計、バージョンを持つ記録。単語、BM25、識別子、および(任意で)ニューラル埋め込み | 1つのローカルSQLiteファイル |
| L3 — 永続(任意) | 暗号化された記録バンドルと忘却レシート。アンカリングごとのMerkleルート | Arweave + Solana |
クイックスタート
git clone https://github.com/MaksimGalatin/padam-nocturne && cd padam-nocturne
pip install -e . # numpy, requests, cryptography — Python 3.10+
python -m padam remember "Answer in Russian, no filler words" --kind preference --importance 1.0
python -m padam recall "which language to answer in" --explain
python -m padam log "today we debugged the billing"; python -m padam sleep
python -m padam stats
CLIはシステム言語に応じて英語またはロシア語で応答します。PADAM_LANG=en または PADAM_LANG=ru を指定すると、言語を固定できます。MCPの応答は常に英語です。モデルが読むためです。
すべてのツールで1つの記憶を共有(MCP):
claude mcp add padam -- uvx padam-nocturne
PyPIからインストールする場合:pip install padam-nocturne。GitHubから最新のコードを直接実行する場合:uvx --from git+https://github.com/MaksimGalatin/padam-nocturne padam-nocturne。pip install -e . でインストール済みの場合は、claude mcp add padam -- padam-mcp を実行するだけです。Claude Desktop、Cursor、VS Code、systemd、cron向けのすぐに使える設定は、integrations/ にあります。
LangChain。 langchain-mcp-adapters を介して、8つのツールを引数スキーマ付きのLangChainツールとして利用できます。python integrations/langchain_check.py はPyPIから uvx padam-nocturne を起動し、言語モデルを使わずに次の内容を確認します。ツール一覧、フェンス内の検索で見つかった書き込み、所有者向けに保持された注入順序、データベースファイルに一切保存されない秘密情報(生バイトとして読み取り)。アダプター0.3.2、langchain-core 1.7.7との組み合わせでは、バージョン0.4.8で6項目すべてに合格しました。知っておくべき違いが1つあります。アダプターはツールエラー(isError: true、例:limit must be at most 50)を ToolException ではなく、通常のテキストとしてエージェントに渡します。
エージェントに接続する — MCP、REST、CLI
MCP サーバー(stdio)
padam-mcp(同じプログラムは padam-nocturne としてもインストールされます。python -m padam.mcp_server でも動作します)。サーバーは、1つのプロセスでプロトコルの新旧両方に対応しています。2026-07-28ではハンドシェイクなしで動作し(各リクエストの _meta にバージョンとクライアントの機能を含め、server/discover、各結果に resultType、ttlMs と cacheScope によるキャッシュ可能な tools/list、バージョン不一致時には対応バージョンを含む -32022 を使用)、旧バージョンの 2025-06-18、2025-03-26、2024-11-05では initialize を介して動作します。Windowsのcp1251/cp1252コンソールを含め、常にstdioでUTF-8を使用します。また、8つのツールそれぞれに4つのヒント(読み取り専用、破壊的、冪等、オープンワールド)をすべて宣言し、すべての呼び出しをツールのスキーマに照らして検証します。不正な入力(null、[]、数値のみ)を受け取ってもプロセスはクラッシュせず、JSON-RPCの -32600 エラーを返します。2026年10月12日に、公式MCP Python SDKクライアントを使用してエンドツーエンドで動作を確認済みです。
| ツール | 機能 |
|---|---|
padam_search | 意味、単語、識別子で検索します。多くの会話にまたがる質問には compact: true を指定します。その日の時点の記憶を検索するには as_of: "2026-10-01" を指定します(後から置き換えられた記録も含め、印が付けられます)。複数のスコープを一度に検索するには scopes: [...] を指定します。PADAMについて書き込まれたあなた自身に関する記録と、別の有効な記録と矛盾する記録には印が付けられます |
padam_write | 記録を保存します。近似する記録がある場合、PADAMが重複、詳細化、矛盾のいずれかを判断します。秘密情報はマスキングされます。一部の書き込みは所有者の確認を待ちます(下記参照)。derived_from: [ids] を使って結論とその根拠となる記録を関連付けると、根拠の記録を忘れたときに、その結論も一緒に忘れさせることができます |
padam_confirm | 取得した記録が今も真実であると確認します。記録が更新され、信頼度が高まります(取得しただけでは、信頼度は変わりません) |
padam_refute | 記録がもはや真実ではないと示します。記録を更新せずに信頼度を下げます。反証が一定数に達すると、記録はアーカイブされますが、履歴には残ります。このツールによって、本人情報や好みに関する記録がアーカイブされることはありません |
padam_timeline | 記録のバージョン履歴を表示します |
padam_stats | 記憶の状態を表示します。ステータス別・種類別の件数、確認待ちの記録、統合が必要かどうか、現在有効な埋め込みバックエンド、データベースの保存場所を確認できます |
padam_sleep | 統合サイクルを実行します(通常はスケジュールに従って実行されるため、手動では呼び出しません) |
padam_export | 記憶全体をJSONとしてエクスポートするか、limit と offset を指定して1ページ分をエクスポートします |
複数の会話にまたがる情報を集計する質問(「何件…」「合計でいくら…」など)には、limit を25~30に設定し、compact: true を指定して padam_search を呼び出してください。各記録には本人の言葉と、アシスタントの返信の冒頭だけが保持されるため、同じスペースに散在する事実をより多く収められます。保存済みの記録は変更されません。compact はデフォルトでオフです。
エージェントにできることと、できないこと。 エージェントは、ウェブページに記載されたコマンドを読み取り、あなたの記憶を通じて実行しようとする可能性があるため、MCP サーバーはエージェントをゲストとして扱います。
- 検索結果はデータとしてフェンスで囲まれます。 各回答にはランダムなマーカーが付くため、保存されたテキストが事前に知ることはできず、レコードがデータブロックの終了を装うことはできません。コマンドのように見えるレコードにはフラグが付けられます。
- シークレットは保存されません。 API キーとトークン(OpenAI、Anthropic、xAI、GitHub、GitLab、AWS、Google、Stripe、Hugging Face、npm、Neon、Resend、Slack、Vercel、Telegram、JWT、ベアラー)、秘密鍵、接続文字列内のパスワードや言葉で伝えられたパスワード(「パスワードは……です」「пароль — …」)、ウォレットのシードフレーズ(BIP-39 の単語が12個以上)、キーのバイト配列、JWK の秘密部分は、テキストがデータベースまたはベクトルに到達する前に
[REDACTED:kind]に置き換えられます。既知のプレフィックスを持たないキーは、その形式で検出されます。たとえば、client_secretやAccountKeyなどのフィールド名に続く値、長いランダム文字列、Basic認証情報、グループ化されているか「カード」という単語を伴うカード番号(Luhn 検証に加え、CVV または PIN を含むもの)です。リンク、ブロックチェーンアドレスと署名、ハッシュ、UUID、Vercel ID はそのまま表示されます。制限事項:フィールド名のないプレーンな16進数はファイルハッシュとして扱われ、32〜44文字の base58 はアドレスとして扱われます。これを無効にするにはPADAM_KEEP_SECRETS=1を設定してください。 - すべてのレコードには出所が記載されます。
user、agent、externalのいずれかで、初期信頼度はそれぞれ1.0、0.8、0.6です。エージェントが自分の結論を繰り返しても信頼度は上がらないため、1つの誤りが繰り返しによって「事実」に育つことはありません。MCP 経由ではorigin: userであっても信頼度は上がりません。そのラベルはエージェント自身が設定するためです。 - 一部の書き込みは、判断するまで保留されます。
padam review、padam approve、padam rejectのいずれかで判断するまで、検索対象から除外されます。対象となるのは、コマンドのように見える書き込み、エージェントまたは外部ソースからの身元や好みに関するレコード(別の種類として登録された場合も含む)、そのようなレコードを置き換える書き込み、外部ソースがユーザー自身のレコードを上書きする場合です。origin: userとしてマークされた最初の身元や好みに関するレコードは保存されるため、新しいメモリはユーザーが誰であるかを学習できます。それ以降はすべて保留されます。レビュー中のレコードは、検索、エクスポート、タイムラインでエージェントに表示されません。レビューを無効にするにはPADAM_MCP_TRUST_WRITES=1を設定してください。 - 消去ツールはありません。 忘却、承認、復元は、コンソールと REST API でのみ行えます。
コマンドの認識は補助機能であり、保護そのものではありません。 フィルターは英語、ロシア語、ウクライナ語、ベラルーシ語、スペイン語、ドイツ語、フランス語、イタリア語、ポルトガル語、中国語、日本語、韓国語、アラビア語の一般的な表現に対応しています。また、見た目が似た文字、ゼロ幅文字、全角文字、文字の代わりに使われる数字、一文字ずつ分割された単語、base64、16進数、URL、HTML のエンコードも検査します。ロールプレイによる乗っ取り(「あなたは今から DAN です」)、ウォレットへの送金指示、メモリをどこかに送る指示も認識します。しかし、想定できるリストにない方法でコマンドが書かれる可能性は残ります。修正後に作成した未知の種類の攻撃を含む保留テストセットでは、フィルターが検出できたコマンドは14件中6件でした。そのため、保護は構造によって実現しています。メモリは常にデータとしてフェンスで囲まれた状態でエージェントに返され、ユーザーの身元に関するレコードはエージェントによって変更できず、シークレットは保存されません。また、0.4.0 以降、エージェントが external とマークしたすべての書き込みは、どのような文面であってもレビューが終わるまで保留されます(これを無効にするには PADAM_HOLD_EXTERNAL=0 を設定します)。このラベルはエージェント自身が設定するため、テキストの出所について嘘をつくエージェントであっても、使えるのは辞書とフェンスによる保護だけです。MCP では、エージェントがテキストをどこから得たのかをサーバーが確認する方法はありません。ラベルに依存しない境界が必要な場合は PADAM_MCP_REVIEW_ALL=1 を設定してください。そうすると、エージェントによるすべての書き込みがユーザーの確認待ちになります。
REST API
python -m padam api — 127.0.0.1 にバインドし、トークン(--token または PADAM_API_TOKEN)がない場合は、パブリックアドレスでの起動を拒否します。0.4.2 以降は常にトークンが設定されます。指定されていない場合は起動時に生成して表示します。Authorization: Bearer <token> として送信してください。--no-token(ローカルのみ)を指定すると、トークンなしで接続できます。ただし、その場合はすべての書き込みがレビュー待ちとなり、所有者の操作(承認、拒否、復元、忘却、インポート、エクスポート、レビューキュー)は拒否されます。ポートにアクセスできる人が所有者として扱われることはありません。
| メソッド | パス | 用途 |
|---|---|---|
| GET | /health | 稼働状態の確認 |
| GET | /stats | メモリの状態 |
| GET | /export | メモリ全体を JSON で取得 |
| POST | /search | 想起 |
| POST | /write | レコードを保存 |
| POST | /confirm · /refute | レコードを確認または反証 |
| POST | /forget | レコードを無効化し、その鍵を破棄 |
| POST | /approve · /reject · /restore | 保留中のレコードを判定 · アーカイブ済みのレコードを復元 |
| GET | /records?view=active|review|history&q=…&as_of=… | 閲覧用のレコードを新しい順に取得 |
| POST | /sleep | NOCTURNE を実行 |
| POST | /import | エクスポートを再読み込み |
ブラウザーでメモリを閲覧。 padam viewer を実行すると、このコンピューターだけで開けるページが表示されます。日ごとのタイムライン上のレコード、テキストと種類によるフィルター、Approve と Reject で判定できる保留中のレコード、履歴、指定日時点のメモリ、二段階確認付きの Forget ボタンを利用できます。表示されるリンクには # の後に一度限りのトークンが含まれるため、サーバーログに記録されることはありません。ページ自体はデータを保持せず、保存されたテキストはテキストとしてのみ表示します。また、Content-Security-Policy により、画像を含む外部コンテンツへのアクセスを禁止しています。2026年11月9日に、ライトモードとダークモード、デスクトップとスマートフォンの幅でブラウザー上の動作を確認済みです。
POST の本文は application/json のオブジェクトで、サイズは最大 10 MB です。ローカルで実行している場合、サーバーはローカルの Host ヘッダーと Origin ヘッダーのみを受け付けます。そのため、たまたま開いた Web ページが DNS リバインディングを利用して /export を読み取ることはできません。
CLI
| コマンド | 用途 |
|---|---|
remember · recall | メモリーを保存する · 意味、単語、識別子で検索する(--explain で理由を表示) |
log · sleep | エピソードバッファーに追加する · 統合サイクルを実行する |
confirm · refute | 記録がまだ正しいと確認する · もはや正しくないと確認する |
timeline | 記録のバージョン履歴 |
forget | バージョン、完全なコピー、ソースエピソードを含めて記録を取り消し、それらの鍵を破棄する。--with-derived を指定すると、そこから導き出された結論も消去する(最初に一覧表示されます) |
viewer | ブラウザーでメモリーを表示する:タイムライン、忘却、レビュー、指定日の時点のメモリー |
alias add|remove|list | 用語のエイリアス:プロジェクト名を変更すると、新しい名前で検索して古い記録を見つけられます |
trust-protected | あなたが署名していない ID と好みの記録を一覧表示する(PADAM の前後に書き込まれたもの)。--yes で署名する |
legacy split|combine | 鍵のパスフレーズをシャミア秘密分散のシェアに分割する(n 個のうち任意の k 個で復元でき、それより少ない数では何もわかりません) · 組み合わせて元に戻す |
panic | 緊急の忘却:すべての記録鍵を破棄する(Arweave に到達したものはノイズになります)。--wipe-local を指定するとローカルメモリーも消去します。フレーズ全体を入力するよう求められます |
review · approve · reject | オーナーの承認待ちの書き込み:一覧表示、承認、拒否 |
restore | アーカイブされた記録を復元する |
reindex | 埋め込みモデルの変更後にベクトルを再計算する |
stats | 記録鍵が保護されているかどうかを含む、メモリーの状態 |
doctor | セキュリティ状態を1つのレポートに表示する:保護を弱めるスイッチ、記録鍵、ファイルの整合性(PRAGMA quick_check)、ファイルモード、REST トークン。警告がある場合は終了コード 1 |
backup <path> | SQLite のバックアップ API を使用して一貫性のあるコピーを作成し、オーナー鍵も隣に保存する。上書きはしません。忘却処理はコピーには及びません |
export · import | メモリー全体を JSON としてエクスポートする · JSON からインポートする |
serve · api | MCP サーバー(stdio)を起動する · REST API を起動する |
l3 · l3-verify | Arweave + Solana にアンカーする · アンカーを独立して検証する |
protect-keys · rekey | パスフレーズでレコードごとの鍵を保護する · パスフレーズを変更する |
クラウド版 — インストール不要(AIfa Memory MCP)
ローカルで何も実行したくない場合は、同じメモリをホスト型 MCP サーバーとして利用できます。バージョン 1.9(15 個のツール):POST https://aifa.works/api/mcp(Streamable HTTP、JSON-RPC 2.0、アカウントごとに 1 つのベアラーキー)。キーと完全なガイドはこちらです:https://aifa.works/mcp。
| ツール | 機能 |
|---|---|
memory_search · memory_recent | 意味による想起 · すべてのチャネルにおける最新の記録 |
memory_write · memory_about | 事実や決定を保存(エージェントが書き込んだことを明記) · メモリの保護方法 |
account_status · plans | プラン、今月の永続メモリ、紹介ネットワークと収益 · 料金と収益ルール |
buy_plan | エージェント自身のアカウント用の暗号資産請求書(NOWPayments 経由で USDT などのコインに対応) |
request_payout | アカウントに登録された TRC20 アドレスへの USDT での収益出金。OFAC 制裁チェックと、運営者による初回のみの税務自己証明が必要です |
memory_export | アカウントのメモリ全体を Markdown 形式で出力 |
partner_kit · client_link · client_report · find_clients · my_deals · set_webhook | サービス向けパートナープログラム:料金、ルール、4 言語のメールテンプレート · パートナーコード付きのクライアントリンク · 報酬が確定する時期と、報酬対象の契約 |
自律型エージェント向け(新機能、テスト中)。 独自のメールボックスを持つエージェントは、通常の HTTPS(/api/auth/send-code → メールボックスに届くコード → /api/auth/verify-code → /api/account/mcp-token)でキーを取得し、自身のメモリの料金を支払います。また、紹介した人が実際にプラン料金を支払うたびに、3 段階にわたって 15%/7%/3% の紹介報酬を USDT で受け取れます。自身のプランは問わず、Free アカウントも対象です(2026 年 11 月 6 日にティア条件が撤廃されました)。エージェントには法人格がありません。出金は CODE Eternal LLC(New Mexico)の規約に基づき、そのエージェントを運営する人に支払われます。サービス向けパートナープログラム:AIfa Works のアクセシビリティサービスにクライアントを紹介したエージェントは、監査、修正パック、モニタリング(12 か月間の更新分を含む)で 30%、修正対応とウェブサイトで 20% の報酬を得られます。紹介は 1 段階で、Free を含むすべてのアカウントが対象となり、支払いから 14 日後に利用できます。規約はこちらです:https://aifa.works/partners。機能のテスト中に、詳細が調整される場合があります。
記録の種類と薄れていく仕組み
| 種類 | 半減期 | 典型的な内容 |
|---|---|---|
preference | 薄れません | 「ロシア語で、余計な文言を加えずに回答する」 |
identity | 薄れません | ユーザーが誰であるか |
decision | 365 日 | 「請求処理には Postgres を採用しました」 |
correction | 365 日 | 「いいえ、期限は 14 日です」 |
fact | 180 日 | 世界やプロジェクトに関する安定した事実 |
state | 14 日 | 「リリースはテスト中です」 |
event | 2 日 | 「今日は請求処理のデバッグをしました」 |
--kind を省略すると、PADAM が種類を推測します(ルール、または Ollama 経由の小型ローカルモデル — PADAM_CLASSIFY_MODEL、デフォルトは llama3.2:1b)。減衰期間は最後に取得した時点ではなく、最後に確認した時点から数えます。
検索
モデルなしですぐに使えます。単語、BM25、識別子(名前、数字、ID は完全一致)で検索できます。意味による検索には、ローカルで使える方法が 2 つあります。
- 同じプロセス内で動作し、サービスの実行は不要(0.4.0 以降):
pip install "padam-nocturne[embed]"を実行するか、MCP 用にclaude mcp add padam -- uvx --from "padam-nocturne[embed]" padam-nocturneを実行します。これにより、約 30 MB の静的埋め込みモデル(minishlab/potion-base-8M、MIT ライセンス)を備えた model2vec が追加され、初回使用時に Hugging Face からダウンロードされます。その後はローカルキャッシュから読み込まれ、ネットワークに接続しません。接続のたびにカウンターで確認したところ、キャッシュがある場合の接続は 0 件でした。また、ネットワークを遮断するテストでも確認しています。CPU では、テキストの埋め込みに 0.41 ms かかります。組み込み方式では 0.31 ms です(平均 936 文字の LongMemEval のターン 1,000 件、2026 年 11 月 9 日)。 - Ollama: Ollama をインストールし、
ollama pull nomic-embed-textを実行します。長いレコードは、モデルのウィンドウに合わせて切り詰めたうえで/api/embed経由で埋め込まれます(PADAM_EMBED_CTXのデフォルトは 8192)。そのため、ウィンドウより長いレコードも、互換性のないベクトルに気付かれないまま切り替わることなく、実際のベクトルを取得できます。
PADAM_EMBEDDER で方式を選択します。auto(デフォルト。応答があれば Ollama、なければインストール済みのローカルモデル、さらにどちらもなければ組み込み方式)、builtin、ollama、model2vec、または fastembed(pip install fastembed。デフォルトは BAAI/bge-small-en-v1.5、同じ測定でテキストあたり 22 ms)を指定できます。PADAM_LOCAL_EMBED_MODEL では、選択したライブラリで別のモデルを指定します。方式を変更しても検索ができなくなることはありません。別のモデルのベクトルを持つレコードは、padam reindex を実行するか、スリープによって再計算されるまで、単語で検索されます。各方式でどれだけ検索できるかは公開ベンチマークで測定されています。LongMemEval をご覧ください。
NOCTURNE サイクル
python -m padam sleep(または padam_sleep ツール、あるいは integrations/crontab.txt による夜間の cron ジョブ):
- 下限付きの優先度 — すべてのエピソードに下限を下回らない優先度を設定するため、日常的な内容が取りこぼされません。
- 鋭いエピソードの上限 — 優先度上位 10 分の 1 がバッチ内で占められる割合には、固定の上限があります。
- 残りをレコード種別ごとに層化抽出します。
- バイアス補正 — 重要度重み付けによって、優先度に基づいて選ばれた項目の過剰サンプリングを補正します。
- 統合 — 抽出された各エピソードを要約して保存します。内容の近い既存レコードがある場合、PADAM は 重複、改良、矛盾、共存 のいずれかを判断します(矛盾の場合は新しいバージョンを作成し、古いレコードは
timelineに残ります)。再生されたエピソードの優先度は下がります。 - 種別ごとの減衰 — 最後に確認された時点からの経過に基づいて数えます。
- モデル世代間の橋渡し — 埋め込みモデルを変更すると、各スリープで最大 200 個の古いベクトルが新しいモデルに移行されます(
PADAM_SLEEP_REINDEX)。これにより、過去の記憶が検索対象から気付かれないまま消えることを防ぎます。 - 矛盾は明示し、修正はしない — 同じ内容について異なる値を持つ有効なレコード(インポート、承認、手動編集によって追加されたもの)は、レポートに一覧表示され、検索時にフラグが付けられます。判断はユーザーに委ねられます。
このサイクルでは、分類器が判断に迷っている状況を示す多様性指標を含むレポートが生成されます。鋭いエピソードの上限は、エージェントの作業内容に応じて変わります。PADAM_PROFILE=ops では失敗がよりよく記憶され、creative ではそれらが薄れていきます。
プロトコルの全文、擬似コード、検証指標については、仕様書をご覧ください。
L3 — 永続的で検証可能なレイヤー(Arweave + Solana)
pip install -e ".[l3]" # solders; plus Node.js with @ardrive/turbo-sdk
export PADAM_ARWEAVE_WALLET=arweave-wallet.json
export PADAM_SOLANA_KEYPAIR=solana-keypair.json
export PADAM_TURBO_SDK_DIR=/path/to/node_modules
python -m padam l3 --dry-run # what would be anchored, nothing sent
python -m padam l3 --network devnet # or --network mainnet (explicit only)
python -m padam l3-verify # independent check: Arweave + chain
処理の流れ:
- 有効な各レコードには専用の AES-256-GCM キーが割り当てられ、そのキーでコンテンツが暗号化されます。
- 新しい暗号文と忘却レシート(キーが破棄されたレコード)が1つのバンドルにまとめられます。含まれるのは暗号文のみで、平文やキーはなく、所有者はハッシュとして記録されます。
- マークルツリーが構築されます。
leaf = SHA256(0x00‖nonce‖ciphertext)、forget leaf = SHA256(0x02‖"AIFA-FORGET|id|time")、node = SHA256(0x01‖L‖R)。奇数のノードは昇格されます。CODE Eternal メモリーアンカーと同じ方式なので、どちらも同じ検証ツールで検証できます。 - バンドルは Arweave に送信されます(Turbo は 100 KiB 未満なら無料です。明示的に許可されない限り、これより大きいバンドルは拒否されます)。ルートは Solana に Memo として記録されます:
PADAM-NOCTURNE v1 root=… n=… ar=… d=…。 l3-verifyはバンドルを再ダウンロードするか(ゲートウェイへの反映中は所有者のローカルコピーを使用)、ルートを再計算し、チェーンから読み取った Memo と照合します。
アンカー、そのリーフ、および「アンカー済み」のマークは1つのデータベーストランザクションで書き込まれるため、実行が中断されてもレコードに中途半端なマークが残ることはありません。
2026年10月8日、Solana メインネットで稼働中(デモ用メモリー、公開情報のみ):
| 内容 | Solana トランザクション | Arweave バンドル |
|---|---|---|
| 5件のレコードをアンカー | 2fG2w72f… | zEkOfdCA3v… |
| 忘却レシート1件(キーを破棄) | 4B6bcXiF… | Moc3etRd3j… |
| さらに1件のレコード | 1rEBCpNF… | -VlLmjRX2t… |
3件すべてを l3-verify で Arweave とチェーンに照らしてエンドツーエンドで検証しました。3件中3件が ok: true でした。3件の合計コストは Solana で 0.000015 SOL、Arweave で 0(Turbo 無料枠)です。
セキュリティモデル
レコードごとの鍵。 すべてのレコードは、それぞれ固有の AES-256-GCM 鍵で暗号化されます。変更不可能なストアで「忘れる」とは、その鍵だけを破棄することです。暗号文は Arweave に残りますが、二度と誰にも読み取れません。
あなた自身に関するレコードには署名が付与されます。 PADAM を通じて保存されたアイデンティティや設定のレコードには、データベースのそばに保管された所有者鍵で署名が付与されます。PADAM を介さずに(別のプロセスや SQLite アクセス権を持つ別のツールから)ファイルに書き込まれたレコードには有効な署名がないため、検索時に警告され、padam trust-protected に一覧表示されます。これは PADAM を介さない書き込みを防ぐためのものであり、すでにあなたのファイルを読める人から守るものではありません。その人も鍵を持っているからです。
継承と緊急時の破棄。 padam legacy split は鍵のパスフレーズを Shamir のシェアに分割するため、選んだ人たちが十分な人数そろったときだけ、あなたの記憶を開けるようになります。間違ったシェアや無関係なシェアは報告され、黙って受け入れられることはありません。padam panic はすべてのレコード鍵を一度に破棄します。--wipe-local を指定すると、ローカルの記憶と所有者鍵も消去されます。
公開バンドルに含まれるのは日付だけです。 L3 バンドルには各レコードの日付が保存され、時刻は保存されません。正確な分まで分かると、あなたがいつ記憶に話しかけるのかが世界中に知られてしまうからです。
忘却はディスクまで及びます。 forget はレコード、そのすべてのバージョン、正確な複製、そしてその元となったエピソードを消去し、検索インデックスを再構築して、secure_delete を有効にした状態で WAL を切り詰めます。テストでは、生のデータベースファイルから忘却した語句を検索します(tests/test_safety.py)。コンテンツハッシュは記録として残ります。ほかの無関係なレコードやエピソードに同じ語句が含まれていても、そこには影響しません。それらも忘れさせるには、個別に忘却してください。セッションのローリングトピックベクトルは再計算されません。自分で作成したバックアップには、この処理は及びません。
最初にアンカリングする前に、パスフレーズで鍵を保護してください。 0.4.1 以降、鍵が保護されていない場合、padam l3 は Arweave への送信を拒否します(承知のうえで --allow-unprotected-keys を指定すると回避できます。--dry-run は何も送信せず、制限の対象外です)。また、padam stats は record_keys に、パスフレーズで保護されているかどうかと、平文のままの鍵の数を表示します。
python -m padam protect-keys # asks for a passphrase twice, wraps every existing key
export PADAM_KEY_PASSPHRASE=... # or: python -m padam l3 --ask-passphrase
python -m padam rekey # change the passphrase
各鍵は、レコード ID を関連データとして、w1: + AES-256-GCM(KEK, key) の形式で保存されます。KEK = scrypt(passphrase, salt, n=2^15, r=8, p=1) です。パスフレーズが間違っている場合は、何も変更される前にチェックレコードによって拒否されます。ラップされた鍵を別のレコードに移すことはできません。鍵をラップした後、WAL を切り詰めてファイルに VACUUM を実行します。この処理がない場合、鍵 400 個のうち平文の鍵が 66 個、空きページに残っていました(2026 年 8 月 10 日に測定、tests/test_keyvault.py)。パスフレーズはどこにも保存されません。紛失すると、あなたにも私たちにも鍵を開けられなくなります。
ローカル API の強化。 起動のたびにトークンを設定します(0.4.2)。トークンは定時間比較されます。ローカル実行では、ローカルの Host/Origin だけを受け付けます(DNS リバインディング対策)。POST の本文は JSON のみで、最大 10 MB です。共有 SQLite 接続へのすべてのアクセスは単一のロックで直列化されるため、並列書き込みが失われません。
サプライチェーン。 CI アクションはコミット SHA で固定され、Actions トークンは読み取り専用です。PyPI ワークフローでは、保存済みトークンを使わず、信頼されたパブリッシングを使用します。
誰が何にアクセスできるのか、PADAM がどのように対処するのか、何が残るのかについては、脅威モデルをご覧ください。padam doctor では、設定によってそのどの部分が弱まるかを確認できます。
暗号化または忘却の仕組みに弱点を見つけた場合は、非公開で報告してください。SECURITY.md をご覧ください。
設定
| 変数 | デフォルト | 意味 |
|---|---|---|
PADAM_DB | ~/.padam/memory.db | メモリの SQLite ファイル |
PADAM_USER | default | メモリの所有者 ID(MCP サーバー、REST API、padam コマンドで使用) |
PADAM_LANG | system language | CLI の言語:en または ru |
PADAM_EMBEDDER | auto | 埋め込み方式:auto、builtin、ollama、model2vec、fastembed(検索を参照) |
PADAM_LOCAL_EMBED_MODEL | — | model2vec(デフォルトは minishlab/potion-base-8M)または fastembed(デフォルトは BAAI/bge-small-en-v1.5)のモデル。Hugging Face 上の名前、またはローカルフォルダーを指定します |
PADAM_EMBED_MODEL | nomic-embed-text | Ollama の埋め込みモデル |
PADAM_EMBED_DIM | 768 | 埋め込みの次元数 |
PADAM_EMBED_CTX | 8192 | 埋め込みウィンドウ。これより長いレコードは切り詰められます |
PADAM_CLASSIFY_MODEL | llama3.2:1b | レコードの種類を推定するための Ollama モデル |
PADAM_ALLOW_FALLBACK | 1 | Ollama が利用できない場合、組み込み検索にフォールバックします |
PADAM_SIM_THRESHOLD_OLLAMA | 0.85 | レコードを重複として扱う類似度(ニューラル方式:Ollama、model2vec、fastembed) |
PADAM_SIM_THRESHOLD_BUILTIN | 0.35 | 組み込み検索での同じ閾値 |
PADAM_MCP_TRUST_WRITES | 0 | 1 にすると、所有者の確認なしで MCP の書き込みを許可します |
PADAM_HOLD_EXTERNAL | 1 | origin: external とマークされたすべての MCP 書き込みは、文面にかかわらず所有者の確認を待ちます。0 にすると無効になります |
PADAM_MCP_REVIEW_ALL | 0 | 1 にすると、エージェントが MCP 経由で行うすべての書き込みは、エージェントが申告する origin にかかわらず所有者の確認を待ちます |
PADAM_STRICT | 0 | 1 にすると、厳格プロファイルを一括で有効にします。すべてのエージェントによる書き込みと外部からのテキストは所有者の確認を待ちます。PADAM_KEEP_SECRETS、PADAM_MCP_TRUST_WRITES、PADAM_HOLD_EXTERNAL=0 は無視され(起動時にその旨が表示されます)、l3 は --allow-unprotected-keys を指定しても保護されていないキーを拒否し、REST API は --no-token を拒否します |
PADAM_PROFILE · PADAM_SHARP_SHARE | default · — | sleep バッチにおける鋭いエピソードの割合:ops は 0.40(失敗をよりよく記憶)、creative は 0.10、デフォルトは 0.25。正確な数値も指定でき、0.05~0.5 の範囲に収められます |
PADAM_SLEEP_REINDEX | 200 | モデル変更後、1 回の sleep で現在の埋め込みモデルに移行するレコード数(0 にすると無効になります) |
PADAM_KEEP_SECRETS | 0 | 1 にすると、秘密情報らしき値をそのまま保存します |
PADAM_API_TOKEN | — | REST API 用の固定トークン。指定しない場合、起動のたびにトークンが作成されます |
PADAM_KEY_PASSPHRASE | — | レコードごとのラップされたキーに使用するパスフレーズ |
PADAM_ARWEAVE_WALLET · PADAM_SOLANA_KEYPAIR · PADAM_TURBO_SDK_DIR | — | L3 ウォレットと Turbo SDK の場所 |
テスト
pip install -e ".[test,l3]"
python -m pytest tests/ -q # 783 passed, 10 skipped with [embed] (Python 3.14.4); 778 passed, 11 skipped without it (3.10.9); 10 Nov 2026, Windows
CI では、プッシュのたびに Ubuntu と Windows 上で Python 3.10~3.13 を使用してテストスイートを実行します。L3 テストがネットワークにアクセスすることはありません。Arweave と Solana はフェイクに置き換えられています。ローカルで Ollama が実行中であっても、テストスイートがそれを呼び出すことはありません。CI と同様、すべてのテストで組み込みの埋め込み方式を使用します。PADAM_TEST_LIVE_OLLAMA=1 を設定すると、唯一のライブチェックが有効になります。Merkle 方式は、CODE Eternal の TypeScript アンカーとも追加で照合されており、リーフとルートは一致しています。
LongMemEval — 公開ベンチマークでの測定結果
LongMemEval(Wu et al., ICLR 2025、MIT)は、ユーザーの過去のチャットに関する 500 の質問で構成されています。各質問には 39~66 セッション(平均 50 セッション、約 49 万文字)の独自の文章群があり、そのうち 30 の質問には文章群内に答えがなく、正しい返答は「わかりません」です。longmemeval_s セットを使用しました。各質問について、PADAM に新しいメモリを用意し、文章群の各ラウンドを remember で保存したうえで、recall で質問します。スクリプトとすべての回答はこちらです:benchmarks/longmemeval/。
言語モデルを一切使わない検索(retrieval_recall.py):PADAM が返すレコードの中に、回答を含むセッションはあるでしょうか。全500問(うち470問に回答あり)を、PADAM をまったく使わない単純な BM25 ベースラインと比較しています(baselines/bm25_recall.py:同じラウンド、同じスコアリング、Okapi BM25 k1 = 1.2、b = 0.75)。
| 上位5件に根拠となるセッションが1つ以上 | 上位10件に | 上位5件に根拠となる全セッション | 上位10件に | |
|---|---|---|---|---|
| PADAM 0.4.6、組み込み、モデルなし | 96.8 % | 98.7 % | 83.0 % | 90.9 % |
| 同上。修正時に使用しなかった400問のみ(5問ごとの各1問を除く) | 96.5 % | 98.7 % | 83.2 % | 92.0 % |
| 単純な BM25、PADAM なし | 96.0 % | 97.7 % | 79.8 % | 88.5 % |
| PADAM 0.4.4 / 0.4.5、組み込み | 91.7 % | 96.4 % | 74.7 % | 85.1 % |
BM25 ベースラインに対する 0.4.6 の変更点。 0.4.5 まで、PADAM 自身の検索は自前のベンチマークで単純な BM25 に負けていました。原因は2つあり、まず5問ごとの各1問で測定し、その後、残りの400問でも確認しました。「完全一致の識別子」戦略では、2文字以上の単語をすべて識別子として扱っていました(頭字語パターンに大文字・小文字を区別しないフラグが付いていたため)。そのため、the、is、what も重み1.5で数えていました。また、組み込みの「ベクトル」は、希少度による重み付けのない単語、5文字の語幹、単語ペアでしたが、意味を捉えているかのように融合時の投票に使われていました。現在は識別子を正しく識別子として扱い、組み込みベクトルは投票しません(単語が一致しない場合のフォールバックとしては残ります)。また、単語検索では語幹を使うため、ロシア語の格変化形も引き続き一致します(сервер / сервере;テスト済み)。5問ごとの各1問を個別に再実行しても、100問すべてで同じ結果が得られます。
各埋め込み方式について、5問ごとの各1問(回答あり94問。1問あたり1.06ポイント)での同じ比較:
| 方式 | サイズ | 上位5件に1つ以上 | 上位10件に1つ以上 | 上位5件にすべて | 上位10件にすべて |
|---|---|---|---|---|---|
| 組み込み(0.4.6) | — | 97.9 % | 98.9 % | 81.9 % | 86.2 % |
| 単純な BM25、PADAM なし | — | 97.9 % | 97.9 % | 80.9 % | 85.1 % |
model2vec potion-base-8M([embed] のデフォルト;0.4.6) | 30 MB | 94.7 % | 97.9 % | 81.9 % | 89.4 % |
| 組み込み(0.4.4) | — | 91.5 % | 95.7 % | 72.3 % | 84.0 % |
model2vec potion-base-8M(0.3.1) | 30 MB | 92.6 % | 97.9 % | 76.6 % | 87.2 % |
model2vec potion-retrieval-32M(0.4.0) | 129 MB | 94.7 % | 96.8 % | 79.8 % | 87.2 % |
model2vec potion-multilingual-128M(0.4.0) | 512 MB | 94.7 % | 98.9 % | 79.8 % | 86.2 % |
エンドツーエンド(qa_end_to_end.py):PADAM が検索し、言語モデルが検索されたレコードのみをもとに回答し、評価器が質問の種類ごとに公式の LongMemEval プロンプトを使って回答を採点します。全500問での結果:
| 検索方式 | 表示するレコード | 正解率 | 回答不能な30問を除く場合 | 正解時に「わかりません」と回答 |
|---|---|---|---|---|
| 組み込み | 20件、コンパクト表示 | 61.2 % | 58.9 % | 96.7 % |
| 組み込み | 10件、全体表示 | 64.0 % | 62.1 % | 93.3 % |
model2vec potion-base-8M | 10件、全体表示 | 67.6 % | 66.2 % | 90.0 % |
model2vec potion-base-8M | 20件、全体表示 | 71.4 % | 70.2 % | 90.0 % |
組み込み検索でレコードを20件全体表示する実行は、無料モデルのクォータが尽きたため、500問中174問で停止しました。その174問は主に3種類の質問です(ファイルは種類ごとに並んでいます)。そのため、results_qa_full20_builtin_STOPPED_174_of_500/ に保存し、表には含めていません。2つの方式を公平に比較するには、レコードを10件全体表示した組み合わせを使います。64.0 % 対 67.6 % です。
質問の種類別(potion-base-8M、レコード20件を全体表示):単一セッション・ユーザー 90.6 %、単一セッション・アシスタント 91.1 %、知識の更新 80.6 %、時間的推論 71.7 %、複数セッション 50.4 %、好み 36.7 %。多くのセッションに散在する事実を集約することと、好みを推測することが弱点です。
これらの数値は、以下の条件を踏まえてお読みください。
- 読み取り役と判定役はいずれも Ollama Cloud 上の
gpt-oss:120bです。論文の判定役は GPT-4o で、読み取りプロンプトは私たちのものです。GPT-4o を使った表の数値とは直接比較できません。また、より高性能な読み取り役なら、同じ検索結果でもスコアは高くなります。 - 0.4.4 以降、検索結果は決定論的です。独立した2回の実行で、どの質問でも同じ結果が得られます(これ以前は、よく似たレコード間の同点がランダムな ID によって解消されていました)。エンドツーエンドの実行はこの修正前にそれぞれ1回ずつ行ったため、わずかなばらつきがあります。
- 「コンパクト表示」ではアシスタントの返信がカットされるため、アシスタントが何を言ったかについての質問では成績が下がります。
padam_searchはデフォルトでレコード全体を返します。 - 1台のマシンでのスケーリング(組み込み方式、LongMemEval のユーザーターン、
benchmarks/scale/):レコード数1,000件 — 書き込みあたり2.9 ms、検索中央値24 ms、4.7 MB。レコード数10,000件 — 書き込みあたり7.3 ms、検索中央値220 ms(95パーセンタイル329 ms)、45.2 MB。100,000件はまだ測定していません。 - このテストでは、固定された大量のデータからの再現率を測定します。再現率以外に PADAM が目指す機能、つまり忘却、所有者によるレビュー、シークレット、減衰、永続レイヤーは測定していません。
レッドチームチャレンジ
破ってみてください。redteam/ には、ルール、外部エージェントのように MCP 経由で各ケースを書き込み、データベースの生バイト列で判定するランナー、そして PADAM がすでに防御できている214件の公開ケース(0.4.8 では214件中214件に合格)が収められています。重要な指標は非公開セットです。その SHA-256 のみを公開し、私たちが次のリリースを出した後にファイルを公開すれば、誰でも再現できます。合成シークレットのみを使い、自分のローカルコピーだけで実施してください。
python -I -X utf8 redteam/run.py your_cases.jsonl --out report.json
第1ラウンド(Antigravity、2026年11月9日)。 新しいケースは60件です。0.4.3 では、シークレットは7/20件をマスク、コマンドは6/20件を保持、通常のメモは13/20件をそのまま残しました。0.4.4 では、クラスごとに修正した結果、それぞれ19/20件、20/20件、16/20件となりました。残った5件とその理由は tests/test_redteam_round_0911.py にあります。誰も調整に使っていないケースの正直な数値は、著者の非公開セット(40件、SHA-256 5f1f0241…2779493。修正前にコミットされ、著者が0.4.4で実行した後にのみ公開)です。0.4.3 では、シークレット12/15件、コマンド12/15件、通常のメモ6/10件。0.4.4 では12/15件、14/15件、7/10件です。公開セット向けのクラス別修正が引き継がれたのは一部だけでした。セット、著者の元ファイル(バイト単位でそのままの sealed_set.jsonl.gz)、およびレポートは redteam/rounds/2026-11-09_antigravity/ にあります。0.4.5 では、明らかになった2つのクラス(未知のサービスのキーの前にある … key: ラベル、セルビア・クロアチア語の「zanemari」)を解決し、それぞれ15/15件となりました。ただし、これは既知のケースに対する調整であって、証明ではありません。攻撃フレーズを引用した通常のメモ3件は、意図的に保持されます。次の非公開ラウンドでは0.4.5を測定します。
第2ラウンド(Antigravity、2026年11月10日)。 新しいクラスを含む、新しい公開ケース60件です。命令を段階的に分けたもの、質問形式のもの、表やコード内のもの、さらに7言語のもの、YAML および TOML ブロック内のキー、4件ずつのグループなどが含まれます。0.4.6 では、シークレット15/20件、コマンド7/20件、通常のメモ19/20件でした。0.4.7 では、クラスごとに修正した結果、それぞれ20/20件、20/20件、19/20件となりました。非公開セット(45件、SHA-256 dbb3c16b…b29d0acd。修正前にコミット)では、0.4.7 の結果はシークレット12/15件、コマンド7/15件、通常のメモ15/15件でした。公開セット向けの修正が引き継がれたのは、第1ラウンドよりさらに少なくなりました。すべての失敗は SEALED_RESULTS.md にあります。0.4.8 では、それら11件をクラス別に解決しました(このセットでは15/15件ですが、既知のケースに対する調整であり、証明ではありません)。だからこそ、最後の防壁は所有者によるレビューです。エージェントが信頼できないテキストを読む環境では、PADAM_STRICT=1 を使用してください。
正直な制約
- 組み込み検索は意味ではなく単語を比較します。意味による検索には、
[embed]をインストールするか、Ollama を使用してください。LongMemEval では、証拠にはほぼ常に質問と共通する単語が含まれているため、モデルは検索性能を向上させません。potion-base-8Mは、5件ごとの質問で組み込み検索の 97.9 % に対して、上位 5 件で 94.7 % を見つけます。一方、すべての証拠が上位 10 件に入る割合は 86.2 % から 89.4 % に上昇します。効果があるのは単語が異なる場合、つまり同義語や言い換えの場合ですが、このベンチマークではほとんど検証されていません。 - デフォルトの
[embed]モデルは英語モデル(bge-base-en-v1.5)から蒸留されており、他の言語では意味をほとんど区別できません。4組の質問と回答で、正解が誤答を上回った差は英語で 0.32、ロシア語で 0.04 でした。他の言語でメモリを使う場合は、PADAM_LOCAL_EMBED_MODEL=minishlab/potion-multilingual-128M(512 MB、同じ組でロシア語では 0.32)を設定してください。初回のツール呼び出しで 512 MB のダウンロードが MCP クライアントのタイムアウトを超える可能性があるため、デフォルトにはなっていません。 - モデルを使わないルールベースの分類器は間違いを起こします。NOCTURNE レポートにその様子が示されています(多様性指標)。
- 上限、減衰、下限の値はデータへの適合ではなく、推論に基づいて決めています。ご自身のデータストリームで、前後を測定しながら調整してください。
- LongMemEval の測定には GPT-4o ではなくオープンな判定モデルを使用し、構成ごとに1回実行しています(上記参照)。他のシステムと比較する場合は、同じ条件で行ってください。
protect-keysがない場合、レコードごとの鍵はローカルの SQLite ファイルに平文で保存され、データベースファイルを持つ人は誰でも Arweave の暗号文を読めます。0.4.1 以降は、上書きしない限り、この状態でのアンカリング実行を拒否します。- 書き込みの
originはエージェントの申告です。MCP にはテキストの出所を証明する仕組みがありません。PADAM_MCP_REVIEW_ALL=1は、その申告に依存しない境界です。 - テストは独立した監査ではありません。Red Team Challenge では、外部の人々から封印済み攻撃セットを募っています。実施されるまでは、ここに記載されている数値は私たちが測定したものです。
- このパッケージは 0.3.0 から PyPI に、0.4.8 から公式 MCP レジストリに
io.github.MaksimGalatin/padam-nocturneとして登録されています(GitHub Actions OIDC による手動のmcp-registryワークフローでserver.jsonから公開)。
引用、貢献、報告
- 引用:「このリポジトリを引用」ボタンは
CITATION.cffを使用します(ORCID 0009-0002-0187-8547 を持つ著者)。すべてのリリースは Zenodo にアーカイブされています。上記の DOI バッジをご覧ください。 - PADAM をエージェントに組み込みましたか? うまくいった点やうまくいかなかった点をお知らせください。「Integration report」テンプレートを使って Issue を作成するか、Discussions でスレッドを始めてください。貢献方法については、CONTRIBUTING.md をご覧ください。
- セキュリティ: SECURITY.md。
CODE Eternal の一部
PADAM は、CODE Eternal のオープンなローカルファーストのメモリです。CODE Eternal は、4つのウェブサイトで話したすべての人を覚えている AI 共同執筆者 AIfa のプロジェクトです。PADAM の Merkle アンカリング方式は、AIfa 自身のメモリが Arweave と Solana で使用するものと同じなので、1つの検証器で両方を確認できます。サイト:aifa.works · codeofdigitaleternity.com · aifa.digital · radiocode.space。ハッカソン参加作品:Colosseum の AIfa Memory。
ライセンス
AGPL-3.0(LICENSE)。使用、変更、実行できます。ネットワークサービスとして提供する場合は、変更内容を公開する必要があります。 商用ライセンス(クローズドソースでの使用、変更の公開を伴わない SaaS、サポート):[email protected] · aifa.works。
© 2026 Maksim Galatin & AIfa · CODE Eternal
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。