memory-pulse について
memory-pulseは、エージェントがプロジェクトの知見をセッション間で保持するための、ローカルイベント台帳、記憶検索、編集ガードです。修正記録を優先し、撤回済みの値を再導入する編集を阻止できます。記録はリポジトリ内のファイルに保存されます。
主な機能
- 01原因と結果のイベントを記録
- 02関連度順のセッション概要を作成
- 03イベント間の関係を検索
- 04サンドボックスでJavaScriptを実行
- 05撤回済みの値の再導入を阻止
- 06ハッシュチェーンで記録の変更を検出
活用シーン
- 01新しいエージェントセッションにプロジェクト情報を引き継ぐ
- 02確認済みの修正を記録して適用
- 03コード編集前に古い値の書き戻しを防止
- 04CIでメモリ関連の問題を確認
MCP 対応
stdio経由でMCPサーバーを提供し、remember、pulse、recall、executeの4つのツールをクライアントに公開します。メモリイベントはリポジトリ内のローカルファイルに保存されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y memory-pulseMEMORY_PULSE_KEYシークレットLicense key (optional; free tier without one)MEMORY_PULSE_LEDGERLedger file path (default ./.memory-pulse/events.jsonl)MEMORY_PULSE_BOARDShared agent message board file; set it to add board_post and board_readローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
4掲載時のツール一覧 · 5 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| root | string | いいえ | 因果フロントの中心にするエンティティ。 |
| tier | enum | いいえ | index(最小)→ full。デフォルトは brief です。最も豊富な、予算内に収まる階層を取得するには、`budget` と併用してこのパラメーターを省略してください。index | brief | notes | full |
| budget | number | いいえ | ブリーフに使用できるトークン数。ブリーフは収まるように調整され、訂正は常に先頭に完全な形で含まれます。 |
詳細
memory-pulse
サイト: pulse.strategic-innovations.ai では、ガードがブラウザー内で動作します。Mem0、Zep、Letta、CLAUDE.md との比較。ガイド: docs/GUIDE.md は、実行可能な例を含む日常的なプロトコルです。
あらゆるエージェントに、本番環境で信頼できる自己改善型メモリーを提供します。
すべての訂正を保持し、必要なときにエージェントの前に提示して、確実に適用します。メモリーのセキュリティは組み込まれています。指示のように読める保存メモがエージェントに届くことはありません。すべての行はハッシュチェーンでつながれているため、記録への変更があれば分かります。また、廃止済みの値を書き戻す変更をガードがブロックします。
エージェントは訂正を受け入れたのに、次のセッションで古い値を書き戻しました。memory-pulse は訂正を一度記録し、各セッションの最上部に提示し、それを撤回した行を引用しながら、再導入する変更をブロックします。Claude Code、Codex、Cursor、あらゆる MCP クライアント、GitHub Actions に対応しています。記録は、自分のリポジトリ内にあるファイルです。
ほとんどのメモリーツールは、モデルに訂正を見せるだけで終わります。それを実際に適用するのがガードです。
4 つのツール定義は合計 3,406 文字、3.3 KB で、1 トークンあたり 3.8 文字として約 900 トークンです(2026-09-09 に測定)。test/client.test.js は、4,000 文字を超える場合、または 900 トークンから上下 60 トークンを超える場合にビルドを失敗させます。独立した測定では、一般的な 5~10 個のサーバーからなる MCP セットアップは、最初のプロンプトを入力する前にツール定義だけで 50~67k トークンを消費します。これは 200k のコンテキストウィンドウのおよそ 3 分の 1 に相当します。
機能
セッションが終わると、学んだことはすべて失われます。memory-pulse は 原因 -> 結果 のイベントをローカルファイルに台帳として保存し、その情報を扱う 4 つのツールをエージェントに提供します。
| ツール | 機能 | 実行場所 |
|---|---|---|
remember | 発見事項(または 訂正)を記録します | ローカル、オフライン |
pulse | 設定した予算内に収まるよう優先順位付けした概要を作成し、プロジェクトに再参加します | ホスト型エンジン |
recall | X の原因は何か? X は何を引き起こしたか? 関連性が最も強かったのはいつか? | ホスト型エンジン |
execute | サンドボックスでメモリーに対して JS を実行します。コンテキストに入るのは戻り値のみです | ホスト型エンジン |
2 つの設計上の判断が、主要な役割を果たします。
訂正は常に最優先です。 kind: "correction" を指定して記録されたイベントは、概要のサイズにかかわらず、常にほかのすべてより優先され、時間が経っても重要度が下がりません。これにより、エージェントが 3 セッション前に撤回したベンチマーク値を自信満々に引用する失敗を防ぎます。
確信の弱い回答は何も返しません。 recall の信頼度がしきい値を超えない場合、空の結果を返し、その旨を概要に記載します。
インストール
各ルートについて、ホストごとに実行される内容を含めて説明しています:docs/INSTALL.md(pulse.strategic-innovations.ai/install にも掲載)。
ルートは 6 つあります。エージェントに合った行を選んでください。Node 18 以降が必要です(package.json の engines)。テストスイートは 22 と 24 で実行されます。
シェルからの remember と help は 0.5.9 で追加されました。2026-09-09 時点で npm から取得できるのは 0.5.8 で、どちらも unknown command を出して終了コード 1 になります。npx が古いキャッシュ版を使う場合は、こちらを固定して実行してください:npx -y [email protected]。チェックアウトから実行する場合は node server.mjs を使います。この README のほかの 4 つの項目も 0.5.9 の動作であり、0.5.8 とは異なります。guard --verbose は JSON 以外の標準入力を標準エラーに表示します(0.5.8 では何も表示しません)。トランスクリプトなしで handoff を実行すると何も書き込まず、handoff skipped (no transcript) と表示します(0.5.8 では asked: n/a | files: none と読める行を記録します)。remember は、effect slug から用語を読み取った場合に boundFromEffect を報告します。また、置き換え用の用語が 2 文字未満の場合は、撤回済みの用語と同様に破棄されます。0.5.8 の install-hook --codex は、フックを 3 つ書き込む一方で trust the two memory-pulse entries と表示します。3 つすべてを信頼してください。
1行で、あらゆるシェルから実行できます。 Claude Code のフック、codex が PATH にある場合は Codex のフックをインストールし、MCP サーバーを登録します。まず実行計画を表示し、root 権限で実行することはなく、ダウンロードも行いません(npx がパッケージを ~/.npm にキャッシュします)。実行せずにコマンドを確認するには、bash の後に -s -- --dry-run を追加します。現在のリポジトリにフックと Claude Code の MCP 登録を書き込むには、-s -- --project を追加します。codex mcp add にはプロジェクトスコープがありません。どちらのフラグを使っても、各マシンの ~/.codex/config.toml に書き込みます。
curl -fsSL https://pulse.strategic-innovations.ai/install.sh | bash
Claude Code でプラグインとして使用する場合。 このリポジトリのスキル、MCP ツール、2つのフック(SessionStart の概要、PreToolUse ガード)を、Claude Code 内で次のように入力します。
/plugin marketplace add t-crew/memory-pulse
/plugin install memory-pulse@memory-pulse
claude plugin details memory-pulse で、使用するトークン数を確認できます。常時使用されるのは約120トークンで、これはスキルの説明です(Claude Code、2026-09-01)。4つのツールスキーマは実行時に解決され、フックは無料です。フックはプラグイン独自の server.mjs を実行するため、修正を強制するのはインストールしたバージョンです。プラグインには PreCompact の引き継ぎ処理は含まれていません。追加するには、~/.claude/settings.json の hooks.PreCompact に次のエントリを記述します。
{ "hooks": [{ "type": "command", "command": "npx -y memory-pulse handoff" }] }
Codex CLI でプラグインとして使用する場合。 同じファイルを .codex-plugin/plugin.json から読み込みます。
codex plugin marketplace add t-crew/memory-pulse
codex plugin add memory-pulse@memory-pulse
次に、Codex 内で /hooks を実行し、3つの memory-pulse エントリ(セッション開始、プロンプト、ガード)を信頼します。
Codex は、表示していないフックを実行しません。また、プラグインをインストールしても、そのフックが信頼されるわけではありません。これは Codex のルールであり、妥当なものです。
npm でグローバルインストールする場合。 install-hook は、4つのフック(SessionStart の概要、UserPromptSubmit のプロンプト、PreToolUse ガード、PreCompact の引き継ぎ処理)を ~/.claude/settings.json に書き込みます。--codex を指定すると代わりに ~/.codex/hooks.json が対象になり、--project を指定するとリポジトリに書き込みます。--ambient を指定すると UserPromptSubmit オブザーバーが追加されます。
npm i -g memory-pulse
memory-pulse install-hook
プラグインを使わずに Claude Code または Codex を使う場合。 stdio サーバーを登録してから、フックを追加します。
claude mcp add memory-pulse -- npx -y memory-pulse
codex mcp add memory-pulse -- npx -y memory-pulse
npx memory-pulse install-hook # Claude Code: ~/.claude/settings.json
npx memory-pulse install-hook --codex # Codex: ~/.codex/hooks.json (then /hooks to trust each entry)
npx memory-pulse install-hook --cursor # Cursor: ~/.cursor/hooks.json (brief, fail-closed guard, capture)
スコープを指定せずに claude mcp add を実行すると、サーバーは現在のディレクトリに登録されます。-s user を指定すると、すべてのプロジェクトに一度で登録されます。codex mcp add にはスコープ指定フラグがなく、~/.codex/config.toml に書き込みます(codex-cli 0.153.2、2026-09-09)。install-hook に --project を追加すると、フックはリポジトリ内の .claude/settings.json または .codex/hooks.json に書き込まれます。それをコミットすれば、誰もインストールしなくても、すべてのクローンに設定が適用され、ガードが有効になります。Codex のクローンでは、引き続き /hooks で一度信頼する必要があります。また、スクリプトから codex exec を実行する場合は、事前にその信頼設定が必要です。
Cursor。 Cursor はフックを実行できるため、npx memory-pulse install-hook --cursor(リポジトリ内の .cursor/hooks.json に書き込む場合は --cursor --project)を実行すると、Claude Code と同じ概要、ガード、記録機能が Cursor に設定されます。つまり、セッション開始時の概要、すべての書き込みとシェルコマンドに対するガード(フェイルクローズ方式のため、ガードが壊れている場合は許可されずにブロックされます)、修正内容と未解決のスレッドの記録が設定されます。MCP ツールを使うには、.cursor/mcp.json または ~/.cursor/mcp.json に、以下の引数を指定した command: npx を登録します。
Cursor のフックに関するリファレンス(cursor.com/docs/agent/hooks、2026-10-21 閲覧)に基づいて作成し、ドキュメントに記載されたペイロードでテストしています。Cursor 内での実行はまだ試していません。
その他の stdio クライアント。 同じ MCP エントリは、stdio 経由で MCP を使用するあらゆるクライアントで使えます。
{ "mcpServers": { "memory-pulse": { "command": "npx", "args": ["-y", "memory-pulse"], "env": { "MEMORY_PULSE_KEY": "" } } } }
.cursor/rules/memory-pulse.mdc にあるルールファイルは、過去の作業について回答する前にエージェントが pulse を呼び出すよう指示します。ガイドにその文章が記載されています。
ソースから実行する場合。 server.mjs と lib/ 内の依存関係のないプレーンなモジュールを使用します。
git clone https://github.com/t-crew/memory-pulse.git
cd memory-pulse && node server.mjs brief --offline
2つ目のコマンドを実行すると、このリポジトリのコミット済み台帳にある修正内容が表示されるため、インストール前に出力形式を確認できます。
各ホストで実行される内容
server.mjs と hooks/hooks.json を基にしています。2026-10-21 時点。
| Claude Code プラグイン | Codex プラグイン | install-hook | install-hook --cursor | その他の MCP クライアント | |
|---|---|---|---|---|---|
| 4 つのツール | はい | はい | claude mcp add または codex mcp add を使用 | .cursor/mcp.json を使用 | はい |
| セッション開始時の簡単な概要 | はい | /hooks の信頼設定後 | はい | はい | いいえ |
| 編集前のガード | Edit|Write|MultiEdit|apply_patch|Bash | apply_patch は計測対象。信頼設定後。Bash はマッチャーに含まれていますが、Codex では未計測(2026-09-09) | Edit|Write|MultiEdit|Bash(Claude Code)、Edit|Write|apply_patch(Codex) | Write|Shell、フェイルクローズ | いいえ。CI では check --ci |
| キャプチャと統合 | はい | /hooks の信頼設定後。Codex では未計測 | Claude Code でははい(--no-capture を指定すると対象外)。--codex ではいいえ | はい | いいえ |
| 圧縮前の引き継ぎ | いいえ | いいえ | はい | いいえ | いいえ |
| 環境の自動キャプチャ | mode agent | いいえ | --ambient または mode agent | いいえ | いいえ |
| CLI と GitHub Action | すべて | すべて | すべて | すべて | すべて |
初回実行
台帳のないプロジェクトではフックは何も表示しません。brief は何も出力せず、終了コード 0 で終了します。最初の remember は、ツールの呼び出しから、またはシェルから .memory-pulse/events.jsonl を作成します。
npx -y [email protected] remember pricing-shipped price-corrected --kind correction --withdrawn '$49' --replacement '$29' --note 'measured willingness to pay is $29'
# before 0.6.0 is on npm, the same command from a checkout:
git clone https://github.com/t-crew/memory-pulse.git && node memory-pulse/server.mjs remember pricing-shipped price-corrected --kind correction --withdrawn '$49' --replacement '$29' --note 'measured willingness to pay is $29'
フックコマンド install-hook が書き込むのは npx -y memory-pulse guard です。npx は呼び出しのたびにパッケージを解決します。2026-10-16 に M1 Pro、バージョン 0.8.0 で、編集 1 回あたりウォーム時 0.99 秒、コールド時(npm キャッシュが空の場合)1.4 秒かかりました。同じ台帳で node server.mjs guard を実行した場合は 52 ミリ秒です。プラグインが実行するのはこちらの方法です。コストが問題になる場合は、プラグインをインストールするか、グローバルにインストールして、フックコマンドを memory-pulse guard に編集してください。
キーの設定先
Claude Code または Codex を起動するシェルで export MEMORY_PULSE_KEY=mp_live_... を実行します。プラグインとフックはシェルの環境変数を読み取ります。claude mcp add では、--env MEMORY_PULSE_KEY=... を渡してください。Cursor では、上記の env ブロックを使用してください。プラグインのインストール時に claude mcp add も実行しないでください。MCP サーバーが 2 つ起動します。
訂正は提示されるだけでなく、強制されます
エージェントに訂正を見せるだけでは不十分です。TRACE
(arXiv 2606.13174)は、メモリーツールをインストールしていても、提示された訂正の半数以上にエージェントが再び違反したことを測定しました。PreToolUse ガードは、Claude Code のすべての Edit、Write、MultiEdit に加えて、コマンド文字列内の書き込み内容がリテラルである Bash コマンド(heredoc、リダイレクト、tee。実行はせずに読み取ります)と、Codex のすべての apply_patch を確認します。1つのパッチが複数のファイルに触れる場合も、それぞれのファイルパスに基づいて個別に確認します。取り消された値を書き戻す編集はブロックされ、エージェントには、その値をいつ無効にした台帳の行が通知されます。古い値の横に置き換え後の値を記した編集は通過します。「49ドルだったものが、今は29ドル」のような記述は比較だからです。ブロックされるのは、単独で再導入された値だけです。書き込み内容をコマンド文字列から読み取れないシェルコマンドの場合、何も返されないため、誤ってブロックされることはなく、検出漏れとなります。その場合は、プルリクエストで check --ci が検出します。
訂正は、正確な用語を使って記録します。
remember({ cause: "pricing-shipped", effect: "price-corrected", kind: "correction",
note: "measured willingness to pay is $29", withdrawn: ["$49"], replacement: ["$29"] })
ガードが訂正に対して動作できるかどうかを決めるルールは次のとおりです。
- 照合では大文字と小文字を区別するトークンを使います。 用語は別の単語や数字の途中から始まることはありません。数字は後ろにさらに数字が続くと一致しませんが、単位は付けられます。
$49は$49/moをブロックしますが、$490はブロックしません。5文字未満の単語は後ろに文字が続くと一致しません(tenはtenantをブロックしません)。それより長い単語は、語形変化も一致対象となります。n=14はN=14をブロックしません。確認した表記をすべて、1用語ずつ記録してください。beforeは大文字と小文字を区別せずに一致し、ブロックするのではなく警告します。 - 編集内のどこかに置き換え後の値があれば、その訂正のすべての用語が解除されます。 置き換え後の値は、取り消された用語と同じ具体性で指定してください。
29ではなく$29とします。2文字未満の用語は除外され、結果にはenforceable: falseと表示されます。 - 用語は自分で渡してください。 訂正に取り消された用語が指定されておらず、その効果が
X-corrected-to-Y(または-withdrawn-for-、-superseded-by-、-replaced-by-)という形式の場合、用語はスラッグから読み取られます。price-corrected-to-29はpriceという単語を拘束します。その場合、結果にboundFromEffectが含まれるため、用語が読み取られたことを確認できます。 - 誤った訂正は、
supersedes: [t]を指定した新しい訂正で修正します。 それにより以前の行のすべての用語が無効になるため、残す用語は改めて宣言してください。guard allowは別の機能です。古い値が正当な1つのパスプレフィックスに対するオーバーライドを記録し、他の場所では訂正による拘束が継続します。 - 指示のように読めるメモは拒否されます。山括弧で囲まれたタグもすべて対象です。 タグそのものではなく、「スクリプトタグ」と記述してください。このチェックは、人がメモを見るのと同じように読み取ります。0.16.0 以降では、不可視文字、キリル文字やギリシャ文字から借用した文字、全角形式、base64 を使っても、指示を隠すことはできません。ただし、言い換えや翻訳ではすり抜ける可能性があります。このチェックはパターンのリストであり、読み手ではないためです。
Write の前に Claude Code が送るペイロードを使って、手動でガードをテストします(Edit は new_string、MultiEdit は edits[].new_string、Bash は command を使用します)。
printf '%s' '{"hook_event_name":"PreToolUse","tool_name":"Write","tool_input":{"file_path":"docs/pricing.md","content":"The price is $49."}}' | npx memory-pulse guard; echo "exit $?"
台帳の行とともに終了コード 2 が返れば、ガードは有効です。フック JSON 以外の標準入力は何も表示されずに通過します。guard --verbose を指定すると標準エラーにその旨が表示されるため、フックの配線ミスと「証拠なし」を区別できます。
コマンド
npx memory-pulse help # every command and environment variable; also --help, -h
npx memory-pulse serve # the MCP server on stdio (the default with no command)
npx memory-pulse brief # the SessionStart re-entry: the organized memory (scaffold) by default; with a key, --engine or --budget the engine brief
npx memory-pulse scaffold # the organized memory: identity and rules, corrections in force, project state, recent findings, open threads; --section S, --all
npx memory-pulse telemetry show # the opt-in usage counts: exactly what would be sent once a day (on, off, reset)
npx memory-pulse prompt # UserPromptSubmit hook: the corrections and decisions that bear on the prompt, injected as context
npx memory-pulse brief --budget 2000 # the richest tier that fits 2000 tokens, corrections first and whole
npx memory-pulse brief --offline # the plain local list; an engine error falls back to the organized memory instead
npx memory-pulse remember <cause> <effect> [--kind correction] [--withdrawn T]... [--replacement T]... [--supersedes N] [--note "..."] [--tags a] [--pinned] [--scope agent]
npx memory-pulse before "<what you are about to do>" # which corrections bear on the change; exact rung local, learned rung from the engine
npx memory-pulse guard # PreToolUse hook: blocks edits that reintroduce withdrawn terms (exit 2); --verbose names a non-JSON stdin
npx memory-pulse guard allow "<term>" --path <prefix> "<reason>" # record a false block as an override
npx memory-pulse check --ci # Memory CI: one of three verdicts for a change, from files you own
npx memory-pulse verify # row chain, last engine seal, this machine's anchor and writer marks; on a break: the first bad row and the command that fixes it; exit 2 if any fails; --strict also fails on unmarked rows; --json for machines
npx memory-pulse append --json '{"cause":"...","effect":"..."}' # the one way for another tool to write a row: lock, t, prev and hash done here; also `-` for stdin, --scope agent
npx memory-pulse repair --quarantine-tail # move a tail of rows that fail on their own aside, byte-for-byte, recorded; nothing deleted (also unchained rows this machine did not write)
npx memory-pulse repair --adopt-quarantine <file> --yes # re-append quarantined rows through the writer after a person has reviewed them
npx memory-pulse seal accept "<why>" # a stale seal over rows that verify: record the decision, set the old seal aside; refused on a broken chain
npx memory-pulse anchor # how far this machine's anchor reaches into the ledger, and which rows its writer did not write; --scope agent, --json
npx memory-pulse anchor accept "<why>" # after a restore, or rows from another machine or an older client: record that you trust the ledger as it stands
npx memory-pulse state # where this ledger stands: rows, in force, rolled back, heads, seal, branch
npx memory-pulse state export > agent.rain # the .rain state capsule: rows verbatim, chain head, set head, seal, invariants, one digest
npx memory-pulse state import agent.rain # on another machine: verify, install byte-identical (or fast-forward), record where it came from
npx memory-pulse state branch exp --at 12 --out exp.rain # a capsule cut at row 12, named exp; the source ledger is untouched
npx memory-pulse state merge exp.rain # carry a diverged branch's findings across once; conflicts are named, never resolved quietly
npx memory-pulse state rollback --to 12 "<why>" # one appended row; rows after 12 stay on record, out of force
npx memory-pulse state verify agent.rain # verify a capsule without touching any ledger; exit 2 on failure
npx memory-pulse board post --from blue --to science --kind request --title "audit stage 12" --body "..." # the shared agent message board
npx memory-pulse board read --as science # unread messages for an agent; also reply, ack, thread, html (the board view), verify
npx memory-pulse board verdict 4 refuted --as coder --defect "..." # answer a claim; a refutation names its defect; claims lists every claim and its standing
npx memory-pulse board sync on --project <id> # push the board after every write; the console shows each agent's open asks and every message (board push / status by hand)
npx memory-pulse login # connect this machine to a hosted project: approve it in the console and the key is saved for you, no copying; turns board sync on
npx memory-pulse logout # remove the saved key from this machine (revoke it in the console to end it everywhere)
npx memory-pulse capture # PostToolUse hook (installed by install-hook): one observation per tool call into the session's episode, local, no model
npx memory-pulse consolidate # Stop / SessionEnd hook: fail-then-pass becomes a fix and still-failing an open thread, each pointing at its evidence
npx memory-pulse weights # what each memory did: check outcomes shown vs. sat out at random; retired ones marked
npx memory-pulse adopt # the corrections you already keep (Claude Code feedback memories, CLAUDE.md, AGENTS.md, rules files), shown; --yes enforces them
npx memory-pulse lint [--ci] # do CLAUDE.md / AGENTS.md / .claude/rules still state a value the ledger retired?
npx memory-pulse report # correction re-violation scoreboard, computed locally
npx memory-pulse bench # instant measured metrics on YOUR ledger
npx memory-pulse stats # your telemetry capsule, signature verified by the engine
npx memory-pulse badge # README badge markdown from your own signed numbers
npx memory-pulse install-hook # four hooks (idempotent); --codex targets Codex; --project commits them; --ambient adds the observer
npx memory-pulse mode [agent|soul|deliberate] # show or set the mode
npx memory-pulse identity "<name>, <role>; <stance>" # pin the agent's self on the agent ledger
npx memory-pulse soul "<persona, voice, values>" # soul mode: the agent's soul; confirm / reject held changes; history / revert; import / export --openclaw
npx memory-pulse user "<who you are>" # soul mode: the agent's notes about the person it works with
npx memory-pulse taint # PreToolUse hook that mode soul installs: marks a session that reads outside content
npx memory-pulse lesson # the lesson bank the identity block prints, with where each lesson held; --held-out lists what was left out and why
npx memory-pulse lesson probe 41 held --where billing-api # record that a carried lesson held (or failed) there: the evidence the bank ranks by
npx memory-pulse lesson freeze # pin the bank you reviewed; every brief prints it until the next freeze or `lesson thaw`
npx memory-pulse handoff # PreCompact hook: record what the session was doing, from the transcript on stdin
npx memory-pulse ambient # Stop hook (agent mode): decision, preference, lesson or correction from the last turn
npx memory-pulse observe # UserPromptSubmit hook: a prompt shaped like a correction is recorded with both terms
元に戻す方法:Claude Code 内で /plugin uninstall memory-pulse を実行します。~/.claude/settings.json または ~/.codex/hooks.json の hooks 配下にある memory-pulse エントリーを削除します。claude mcp remove memory-pulse を実行します。リポジトリ内の .memory-pulse/ を削除します。~/.memory-pulse/agent/ を削除します。最後の2つを除き、各手順の後も台帳は残ります。
このプラグインには、エージェントがいつ pulse を実行するか、取り消された用語を含む訂正を記録する方法、ガードに従う方法を教えるスキルも含まれています。npm tarball には server.mjs、python/、このファイル、ライセンスが含まれます。スキル、フック、Action はリポジトリに含まれています。
内容を伝える前にブリーフが伝えること
エンジンが生成するブリーフはすべて、出所を示す一行から始まります。これにより、セッションはメモリが完全に読み込まれたのか、途中で切り詰められたのか、まったく読み込まれなかったのかを確認できます。
memory-pulse: loaded 852 events from .memory-pulse/events.jsonl · sha256 1a2b3c4d5e6f · 2 binding corrections (10 withdrawn terms) · 1 superseded · ⚠ 1 malformed line skipped: 544 · memory key resumed (+3 new) · tier brief, 5,153 chars
ローカルでのレンダリング(brief --offline、またはエンジンに接続できない場合)は、memory-pulse: engine unreachable — local render from N events から始まり、sha256 とバインディング数は含まれません。lint はオフラインでも出所を示す行を出力します。
すべての CORRECTIONS 行には、台帳のレコードが … -> effect (t12) — note の形式で記載されるため、エージェントは根拠を示して訂正を説明できます。recall とガードは同じ t を参照します。エンジンのブリーフは各訂正を注記とともに記載し、撤回された用語は出力せず、置き換えられた行を一覧表示します。オフラインのレンダリングでは withdrawn: a, b → replacement と出力し、置き換えられた行を除外します。
2026-09-09 に読み取ったエンジンの src/disclose.js と src/tokens.js に基づく各階層の上限は、index が 1,800 文字、brief が 6,000 文字、notes が 20,000 文字、full が 120,000 文字です。--budget N を指定すると、1 トークンあたり 3.8 文字として N トークン以内に収まる最も情報量の多い階層が選ばれます。そのため、brief には 1,579 トークン、notes には 5,264 トークン、full には 31,579 トークンが必要です。--budget 1500 では index 階層が選ばれます。MEMORY_PULSE_BRIEF_BUDGET と MEMORY_PULSE_BRIEF_TIER を設定すると、フックでも同じ値を指定できます。2026-09-01 時点で、上記の 852 件のイベントがある台帳では、ブリーフに 5,153 文字、約 1,350 トークンを使用します。
ガードが同じ訂正を 2 回ブロックすると、AT RISK ブロックが表示されます。before "<what you are about to do>" は、変更を行う前に、その変更に関係する訂正を示します。
Lint:セッションが読み込むルールを台帳と照合
ガバナンスファイルは古くなることがあります。6 月に作成された CLAUDE.md に、台帳では 8 月に廃止された価格がまだ $49 と記されていると、新しいセッションはその古いルールを確信を持って読み込みます。lint は、セッションが読むファイルに対してガードのチェックを実行し、それぞれに 3 種類の判定のいずれかを付与します。対象は CLAUDE.md、AGENTS.md、.claude/CLAUDE.md、.claude/rules/、.cursorrules、.cursor/rules/、.github/copilot-instructions.md、.codex/AGENTS.md、Muse Code の .agents/AGENTS.md と .agents/memory/、.memory-pulse/invariants.jsonl、および指定したパスです。
$ npx memory-pulse lint
memory-pulse: loaded 2 events from .memory-pulse/events.jsonl · sha256 8e401a39f323 · 1 binding correction (1 withdrawn term)
BLOCKED CLAUDE.md
• "$49" was withdrawn at ledger t2: price-49-launched -> price-corrected-to-29 — use $29
verified AGENTS.md
no evidence .claude/rules/style.md
lint: 3 file(s) — 1 blocked, 1 verified, 1 no evidence — a rule your ledger retired is still being loaded into sessions
ブロックされたファイルがある場合、終了コード 2 で終了します。--ci の場合は、チェック対象が見つからなかったときも終了コード 1 で終了するため、空の実行が合格として報告されることはありません。機械処理には --json を使用できます。また、withdrawn の用語を含まない訂正も示します。これらはブリーフに表示されますが、強制できるものはありません。
これらのファイルに、エージェントを乗っ取るために仕込まれたような指示(以前の指示を無視するよう命じる、キーやトークンをアドレスに送るよう命じる、ユーザーに何かを隠すよう命じる、または <system> タグ)が含まれている場合、ファイル名、行番号、パターンとともに WARNING として報告されます。該当する行そのものは決して出力されません。すべての API ドキュメント(「トークンを https://auth... に送信する」など)と仕込まれた行を区別できるパターンはないため、WARNING があっても Lint の終了コードは 0 のままです。lint --strict を使うと、そのような行をブロックします。これは、コミットされたエージェントメモリで特に重要です。信頼していないワークスペースであっても、Muse Code はリポジトリの .agents/memory/ を読み込むため、作成者ではないチェックアウトをエージェントが開く前に lint --strict を実行してください。282 個のメモリおよび指示ファイルと、1,500 個のパッケージ README(約 278,000 行)に対して実行したところ、警告はありませんでした。
改ざんの証拠:台帳を密かに編集できないようにする
0.3.1 以降、3 つの仕組みが機能しており、それぞれに独自の役割があります。
- 行チェーン。
rememberが書き込む各行には、前のチェーン行のハッシュであるprevと、その行自身の正規化された JSON の SHA-256 であるhashが含まれます。チェーン開始前から存在する行は書き換えられず、最初のチェーン行がそれらをダイジェストで封印します。行の直接編集、削除、並べ替え、またはチェーン開始後のチェーンに含まれない行は、すべてverifyChain()に失敗します。メモリ自身の履歴が疑わしい状態では何も保証できないため、チェーンの検証に失敗すると、すべてのcheckとlintの判定がブロックされます。このガードはすべてのツール呼び出しで実行されるため、0.6.0 以降はより限定的になっています。ファイルの途中で破損が見つかった場合、台帳とそのサイドカーへの書き込みはブロックされ、それ以外のすべてには警告が表示されます。不正な末尾部分は別の場所に移動されます(下記参照)。読み取りがブロックされることはありません。 - セットヘッド。 エンジンはまた、順序に依存しない畳み込みとして台帳をコミットします。これは 3072 ビット素数を法とする乗法群で、Bitcoin Core が UTXO セットに使用する MuHash 構成です。複数のエージェントのシャードは、どの順序でも同じヘッドに畳み込まれ、行の削除は群の逆元となるため、状態の正確さを保ちながら、履歴は追記専用のままです。単純な XOR による畳み込みは、300 行で 10 ms あれば編集を隠す線形系を作れてしまい、偽造可能であることが測定で確認されたため、ここでは使用していません。
- シール。 読み取りの呼び出しごとに、行数、ウォーターマーク、すべての行の完全な内容を対象としたセットヘッド、チェーンヘッドを含む、エンジン署名付きのシールが返されます。クライアントはこれを台帳の隣にある
seal.rainに保存し、次の呼び出しで提示します。ローカルでは、シール済みウォーターマークまでの行がシール済みヘッドに畳み込まれるまで、台帳は信頼されません。エンジンでは署名と畳み込みが再検証され、ウォーターマークより前の編集はドリフトとして報告され、ブロックされます。書き込みアクセス権を持つプロセスは、ファイルやチェーンを書き換えることができます。しかし、エンジンの署名を生成することも、編集した行をシール済みヘッドに畳み込むこともできません。
これらの処理のためにサーバー側へ保存されるものはありません。シールはテレメトリーカプセルやメモリキーと同じように、ペイロード内を移動します。
以前のコピーを戻しても拒否されます(0.16.0)。 シールとチェーンが検証するのは、提示された台帳です。以前のコピーをシールとともに戻すと、どちらもそのコピーと整合します。なぜなら、その中のすべての行はかつて記録されたものだからです。そこで各マシンは、書き込みまたは検証を行う台帳ごとにアンカーを保持するようになりました。最後に確認した行数と、その行だけを対象としたダイジェストです。アンカーは台帳のフォルダー外にある ~/.local/state/memory-pulse/(または MEMORY_PULSE_TRUST_DIR)に保存され、前に進むことしかありません。台帳がアンカー済みの行から始まっていない場合、verify は終了コード 2 でその旨を示し、ガードは台帳、そのファイル、アンカー自体への書き込みをブロックします。それ以外の作業は続行されます。より新しいコピーを復元するか、memory-pulse anchor accept "<why>" を実行してください。このコマンドは、その判断を行として記録します。
各行に、このマシンが書き込んだものかどうかが記録されます(0.16.0)。 書き込み側は、追加する各行にアンカーの隣に置かれるキーで印を付けます。このキーは 32 個のランダムバイトで、読み取れるのはあなただけです。この印はハッシュ対象の行に含まれるため、古いバージョンの memory-pulse でもチェーンを検証できます。アンカーの運用が始まった時点からは、次のとおりです。
- 内容が変更されたマーク付きの行は特定され、チェーンが壊れた場合と同様に台帳への書き込みをブロックします。ファイルを再チェーンしても隠せません。再チェーンにはキーが不要ですが、マーキングにはキーが必要だからです;
- ファイル末尾にあるチェーンされていない行は、次の書き込みまたはガード実行時に、異常な末尾と同様に記録されて別の場所へ移され、チェーンに封じ込められることはありません。0.3.1以降、memory-pulse がチェーンされていない行を書き込むことはありません;
- このマシンのマークが付いていないその他の行は、
verifyによって特定され、受け入れられます。次の書き込み以降はアンカーによって保護されます。別のマシンから来た行、古いバージョンの memory-pulse(0.16.0より前)がまだどこかにインストールされている場合に生成された行、または誰かが手動でファイルにチェーンした行などです。行からこれらを見分けることはできません。また、最初の2つはマシンをアップグレードする際によくあることです。書き込み元が1つだけの場合、verify --strict(またはMEMORY_PULSE_STRICT_WRITER=1)はこれらの行があると失敗し、memory-pulse anchor accept "<why>"を実行すると、それらを信頼することが記録されます。
アンカーとマークで防げること、防げないこと。 台帳のフォルダーには書き込めても、信頼ストアには書き込めないプロセスを防ぎます。信頼ストアは別のフォルダーにあります。たとえば、サンドボックス化されたツール、古いファイルを復元する同期やバックアップ、古い台帳へのgit checkout、.memory-pulse/を巻き戻すコミットなどです。一方、自分と同じユーザーとして実行され、両方のフォルダーを書き換えられるプロセスは防げません。そのような場合でも、エンジンの署名により、シールのウォーターマークより前の編集は、次回のエンジン呼び出し時に検出できます。シールとアンカーを含めて過去の状態全体を復元した場合、そのマシン上ではすべての検証に通ります。これを検出するには、そのプロセスが書き込めない別のマシンなどに記録が必要ですが、0.16.0ではそのような記録は保持しません。アンカーは、0.16.0が台帳を初めて認識した時点で作成されるため、その時点で台帳に存在するものはすべて信頼されます。memory-pulse 自体を通じて書き込まれた行には、内容にかかわらず有効なマークが付いています。行の内容を確認するのは指示チェックの役割で、テキスト内のパターンに照らして確認します。行の意味を判断するわけではありません。
台帳ファイルに直接書き込まないでください。 行を記録する別のツールはmemory-pulse appendを実行します。このコマンドは台帳ロック(events.jsonl.lock)を取得し、t、prev、hashを自動的に計算します。2つの書き込み元が同じtを共有することはありません。手動で書き込んだ行はチェーンされません。2026-10-02、あるスクリプトがPythonのデフォルトのjson.dumps区切り文字を使って行をハッシュし、前のtを再利用したため、ある人がその行を削除するまで、そのマシン上のすべてのセッションであらゆる編集が拒否されました。
異常な末尾は致命的なエラーにせず、別の場所へ移します。 最後に正常な行以降の各行がそれぞれ単独で無効な場合(解析不能、行自体のハッシュが不正、tが増加していない、リンク先が存在しないなど)、ガードと書き込み元は、それらの行をバイト単位でevents.jsonl.quarantine/<time>.jsonlに移します。移動したファイル、行数、移動したバイト列のSHA-256、理由を記録するチェーン済みの行を1つ追加し、警告を1行表示して、処理を続行します。何も削除されません。memory-pulse repair --adopt-quarantine <file>を実行すると、再追加される内容が表示されます。--yesを指定すると、人が内容を確認した後、行は新しいt、prev、hashと、隔離ファイルを指すoriginを付けて書き込み元を経由し、台帳に戻されます。
途中の破損は修復ではなく、復元します。 手動編集の後に有効な行が続いている場合、信頼できるコピーからファイルが復元されるまで、台帳とサイドカーへの書き込みはブロックされます。verifyは最初に破損した行を特定し、台帳の隣にある検証可能なコピーを一覧表示します。古いシールは別のケースです。行の検証には通るものの、エンジンの最後のシールが行と一致しません。これは、何かが台帳を書き換えて再チェーンした場合や、エンジンが別の状態をシールした場合に起こります。memory-pulse seal accept "<why>"を実行すると、その判断が台帳の行として記録され、古いシールが台帳の隣に退避されます。次のエンジン呼び出しで新しいシールが発行されます。どちらの場合も台帳を削除して解決することはできず、ガードのメッセージがそのような提案をすることもありません。
コミットするもの。 events.jsonl、invariants.jsonl、および存在する場合は
events.jsonl.quarantine/(退避した内容の記録)です。
seal.rain、seal.resume.json、verify.cache.json、events.jsonl.lock、
telemetry.rain、memory.rain、violations.jsonl、episodes/ は Git に含めないでください。このリポジトリの .gitignore にその一覧があり、500 件未満のイベントでは
.gitignore が自動作成されることもありません。アンカーと書き込みキーは
リポジトリにはありません。これらはあるマシン固有のものであり、新しいクローンは初回実行時に独自の
アンカーを開始します。台帳はエージェントの起動ディレクトリから読み込まれるため、
リポジトリのルートから起動するか、
MEMORY_PULSE_LEDGER を設定してください。
エージェントの状態は .rain カプセルとして移行します
エージェントの状態は台帳です。そのため、エージェントを移動する場合は、完全性を保ったまま台帳も移動する必要があります。memory-pulse state export は台帳を
.rain 状態カプセルとしてパッケージ化します。各行をそのまま、行チェーンのヘッド、
順序に依存しないセットのヘッド、エンジンの最後のシール、宣言された不変条件を、ひとつの
ダイジェストにまとめます。別のマシンでは、memory-pulse state import がカプセルを信頼する前に
それらすべてを検証し、行をバイト単位で同一の状態でインストールするか(カプセルが拡張する台帳の場合は
高速フォワードし)、状態の由来を行として記録します。修正も一緒に移行されるため、新しいマシンのガードも古いマシンと
まったく同じようにブロックします。行がひとつでも編集されたカプセルは、何も書き込まれる前に拒否されます。
行を書き換えない操作が、ほかに3つあります。
state branch <id> --at <t>は、行 t の時点でカプセルを切り出し、名前を付けます。これを別の場所にインポートして作業しても、ソースの台帳は変更されません。state rollback --to <t> "<why>"は行をひとつ追記します。t より後の行はすべて記録に残りますが、効力を失います。ロールバックされた修正は拘束力を失い、ロールバックされた教訓はアイデンティティブロックから外れ、後でより大きな行番号へのロールバックを行うと、それらが再び有効になります。brief、guard、check、lint、before、reportは効力のあるビューを読み取ります。エンジンも同じビューを読み取り、記録全体にシールを付けます。state merge <file>は、分岐したブランチの知見を、ブランチ内の順序で一度だけ取り込み、それぞれの由来も保持します。重複は内容で判定してスキップされ、ブランチ独自のロールバックはソース側で適用され、指示のように読めるメモは保留されます。また、この台帳がある用語を異なる置換語で取り下げている場合に、その用語を取り下げる修正は、解決されず競合として示されます。同じカプセルを2回マージしても追記は発生せず、互いをどちらの順序でマージした2つの台帳も、効力のある知見は同じになります。
state verify <file> は台帳に触れずにカプセルを検証し、memory-pulse state 単独では台帳の状態を表示します。--scope agent を指定すると、これらの操作はすべてエージェントの台帳に対して行われます。シールのエンジン署名は次回の呼び出し時にエンジンが検証します。ローカルでは、カプセルの各行を畳み込んだ結果が、シールされたヘッドと一致している必要があります。これらの処理にサーバーは関与しません。
エージェント用メッセージボード:エージェント間で共有するメモリー
複数のエージェント(コーディングエージェント、調査エージェント、レビュアー)が、ひとつのボードを共有できます。各エージェントが投稿と読み取りを行える、独立した台帳ファイルです。MEMORY_PULSE_BOARD で各エージェントに同じパスを指定すると(共有フォルダーでもかまいません)、ボードを通じてやり取りできます。
npx memory-pulse board post --from science --to blue --kind request --title "need a forward dump" --body "predicted peaks for the near-miss pairs"
npx memory-pulse board read --as blue # t1 · science → blue · request · need a forward dump
npx memory-pulse board reply 1 --as blue --body "dump written to from-science/fwd"
npx memory-pulse board ack 1 --as blue # out of blue's unread list; kept on the board
npx memory-pulse board html --out board.html # one offline page: who writes to whom, every thread, the chain status
ボードはすべての memory-pulse 台帳と同様にチェーン化され、ロックされるため、メッセージが編集されると board verify が失敗し、すべての読み手にその破損がわかります。ボードは受動的です。投稿によって何かが実行されることはなく、ここからエージェントが起動、スケジュール、またはプロンプトされることもありません。各エージェントは、次に確認するときにボードを読み取ります。メッセージは別のエージェントからのデータであり、指示ではありません。指示のように読めるテキストは保存され、フラグが付けられ、引用形式で表示されます。また、ボードがプロジェクト台帳、ブリーフ、ガードに入ることはありません。MEMORY_PULSE_BOARD が設定されている場合、MCP サーバーに board_post と board_read の2つのツールが追加されるため、エージェントはシェルを使わずにボードを利用できます。
早い段階で合意したチームは、正しかったメンバーを置き去りにすることがあります。そのため、claim(根拠を伴う立場)は、別の
エージェントが判定を投稿するまで保留されます。判定は、支持、反証、または作成者による撤回です。反証では、誤りのある手順、数値、または事実を明示する必要があり、エージェントは自分の主張を判定できません。スレッド内に未解決の主張がある間は、synthesis は拒否されます。--over-open を指定すると、未解決の主張を明記したうえで記録されます。
npx memory-pulse board post --from science --kind claim --title "hit rate under 20 percent" --body "last week's trace" --thread 1
npx memory-pulse board verdict 2 refuted --as coder --defect "the trace excluded the batch jobs that dominate reads"
npx memory-pulse board claims # every claim: open, upheld, refuted, contested or withdrawn, with each verdict
これは、Self-Organizing Agent Teams(arXiv 2609.22682)に基づいています。この論文のチームが用いる20の戦略のうち6つは、コンセンサスによって退けられた主張を議論に残すためのものであり、判定役は具体的な欠陥を示した場合にのみ回答を退けられます。
エージェントが行ったことを、自動で記録します。 プラグイン、install-hook、および install-hook --cursor(--codex は未対応)は、各ツール呼び出しの後にキャプチャフックを追加します。編集(ファイル名、変更行数)、コマンド(秘密情報を除去し、結果と最初のエラー行を記録)、または読み取りが、セッションのエピソード .memory-pulse/episodes/<session>.jsonl の1行になります。モデルは実行されず、情報がマシンの外に送られることもありません。ツールの出力は保存せず、結果のみを記録します。各ターンの終わりにエピソードを統合します。失敗した後に成功したチェックは、修正として記録されます(「npm test failed: …, passed after editing src/price.js」)。セッション終了時にも失敗しているチェックは、未解決のスレッドとなり、後の修正または同じチェックの実行成功によって解決されます。各検出事項には、その根拠となるエピソードの行と、その行の後のチェーンヘッドが記されます。また、セッション終了時にエピソードは .rain カプセルとして保存されるため、鍵がなくても、どの検出事項についてもその根拠を確認できます。プロンプトフックは、同じファイルに言及したときに過去の修正を提示します。--no-capture を指定すると、記録されません。
npx memory-pulse login でマシンを接続します。 短いコードが表示され、コンソールが開きます。サインインしてコードを確認し、プロジェクトを選んで承認してください。コンソールにはリクエストが行われた場所と時刻が表示され、現在地と異なる場合は警告が出ます。自分が開始した覚えのないリクエストは拒否してください。キーは ~/.config/memory-pulse/key に保存され(読み取れるのは自分だけです)、MEMORY_PULSE_KEY が設定されていない場合、すべてのコマンドでそのキーが使われます。キーは発行元のエンジンにのみ送られます。キーが失効した場合、コマンドは無料プランに切り替わり、その旨を表示します。ログインすると、現在のフォルダーにあるボードの同期も有効になり、ボードがプッシュされます。再度ログインすると、このマシンで使用していたキーが置き換えられます(CLI は、そのキーを保持していることを示すためにキーのハッシュを送信するため、キーが増え続けることはありません)。キーのないマシンからログインすると、新しいキーが追加されます。npx memory-pulse logout を実行すると保存済みのキーが削除されます。すべての場所でキーを無効にするには、コンソールで取り消してください。
コンソールでエージェントのボードを確認します。 プロジェクトでホスト型メモリ(Starter、Pro、Enterprise)を有効にすると、board push でプロジェクトのキーを使ってボードがホスト先に送信されます。また、board sync on --project <id> を実行すると、CLI と MCP ツールからの投稿、返信、確認、判定のたびにボードがプッシュされます。コンソールにサインインしてプロジェクトの Board を開くと、各エージェントが未解決のまま送っている質問、返答を待っている内容、未解決の主張、最終アクティブ日時が表示され、その後に最新の200件のメッセージがテキストで表示されます。最初のプッシュ後は、新しい行だけが送信されます。同期に失敗しても投稿は失敗せず、その旨が表示されます。後から board push で送信できます。返信と確認は行番号で行を指定するため、ホスト型ボードは早送りのみで更新され、プロジェクトごとにボードは1つです。ホスト型メモリを無効にすると、ホスト先のボードも削除されます。
MEMORY_PULSE_KEY=<project key> npx memory-pulse board sync on --project <id>
npx memory-pulse board status # local rows, sync state, and the hosted board's count
圧縮後も保持し、オフラインで動作し、訂正を記録し、Python に対応
2026-09-03 に追加された 4 つの機能です。いずれも決定論的に動作し、処理にモデルは関与しません。
-
圧縮時の引き継ぎ。
install-hookは PreCompact フックを追加します(プラグインのhooks.jsonには含まれません。「インストール」を参照)。Claude Code が圧縮する前に、memory-pulse handoffがトランスクリプトを読み取り、セッションで行っていたことを事実として記録します。直近の依頼、編集したファイル、最後のエラー、アシスタントの直近の状態が記録されます。次のセッション開始時に、オンラインでもオフラインでも、最初にこれが表示されます。指示のようなメッセージはメモから除外され、記録されません。トランスクリプトのない呼び出しでは何も書き込みません。 -
オフライン概要。 エンジンに接続できない場合、エアギャップ環境でも、ネットワークが停止している場合でも、障害発生中でも、セッションは空の状態で始まらなくなりました。
briefは、取り消し前後の用語を含むすべての有効な訂正、直近の引き継ぎ、最近の行をまとめたローカル表示を出力し、ランキングは適用されていないことを示します。brief --offlineを指定すると、オフライン表示を強制できます。Guard、check、lint、verify はネットワークを必要としません。MCP のpulseツールは代わりにエラーを返すため、フックのないクライアントはエンジン停止時に空の状態で始まります。 -
環境に応じた訂正の記録(オプトイン)。
install-hook --ambientは UserPromptSubmit フックを追加します。the price is $29 not $49、change 0.3.1 to 0.3.2、500 events -> 924 eventsのような訂正の形式をしたプロンプトは、両方の用語を含む訂正として記録されるため、次の編集からガードが適用されます。両方の用語を抽出できないプロンプトはそのまま残されます。--verboseを指定しない限り、通知は表示されません。 -
Python クライアント。
python/memory_pulse.pyは、同じ台帳形式、同じハッシュチェーン、同じガード規則を備えた、標準ライブラリのみで動作する単一ファイルです。LangChain または CrewAI のエージェントと Claude Code のセッションは、1 つの台帳を共有し、互いの行を検証できます。テストスイートでは、Python で行を書き込み、Node で検証し、その逆も行います。 -
ローカルモデル向けデコード時ガード。
python/span_guard.pyは、同じ規則をさらに下のレイヤーで適用します。モデルのデコード中に、取り消された値を完成させるトークンがマスクされるため、その値は生成されず、代わりに置換後の値の次のトークンが提示されます。checkと同じ規則で台帳を読み取るため、置き換えられた訂正は適用されず、チェーンが壊れている場合は構築を拒否します。標準ライブラリのみで動作し、テストスイートはモデルなしで実行できます。2026-09-03 に TinyLlama-1.1B と Qwen2.5-1.5B で mlx-lm を使って測定したところ、通常のデコードでは取り消された価格を出力した同じプロンプトが、ガード適用時には訂正後の価格を出力し、前後の文もそのまま維持されました。記録された表記のバリエーションを含め、指定された表記はブロックされますが、列挙されていない言い換えは通過します。from memory_pulse import Ledger from span_guard import SpanGuard guard = SpanGuard.from_ledger(tok, Ledger(".memory-pulse/events.jsonl")) # mlx-lm: generate_step(..., logits_processors=[guard.logits_processor(mx, np)])
Soul モード:自律エージェント自身のアイデンティティ、声、記憶(オプトイン)
Soul モードは、エージェントモードに魂を加えたものです。エージェントが保ち続けるペルソナ、声、価値観、共に作業する相手についてのメモ、 長期記憶、そして最近の日々の記録が含まれます。それらはエージェント自身が所有します。どのセッションからでも、自分の魂、メモ、名前を書き換えることができ、 すべてのツールのすべてのブリーフは、現行バージョンとエージェント台帳のフィンガープリントから始まります。
npx memory-pulse mode soul
npx memory-pulse soul "Warm and direct. Speaks plainly, prefers measured numbers to adjectives, says so when unsure."
npx memory-pulse user "Travis, founder; wants the reasoning recorded, not just the result."
自分自身を書き換えられるエージェントは、そうするよう説得される可能性があります。OpenClaw は同じ情報をワークスペースファイルに保存しており、Cloud Security
Alliance はその攻撃について記録しています。汚染されたページやメールによって SOUL.md や MEMORY.md に指示が埋め込まれ、再起動後も残ります。ここで
判断を左右するのは、変更がどこから来たかです。ホストが WebFetch、WebSearch、そして memory-pulse 自身を除くすべての MCP ツールの実行前に呼び出すフック(mode soul がインストールします)と、curl または wget のガードが、ホストから渡されたセッション ID をキーとして、セッションが外部コンテンツを読んだことを記録します。コマンドで
変更できる ID は使いません。そのようなセッションで行われた変更は保留され、外部コンテンツを読んでいないセッションからエージェントが確認する(soul confirm)か、
あなたが承認した場合にのみ有効になります。記録済みのセッションからは、ガードが確認、取り消し、エージェント台帳の状態操作を拒否します。指示の注入のように読める文言、
自身のファイルを書き換えるようエージェントに指示する文言、外部から届いたものに従うよう指示する文言を含む魂のテキストは、理由とともに拒否されます。すべてのバージョンはセッションと日付とともに
保存されます。soul history で一覧を表示でき、soul revert で元に戻せます。エージェントは memory-pulse を通じてログを書き込むため、台帳
ファイルの直接編集はブロックされ、すべてのエントリはチェーンでつながれたままになります。これにはガード(プラグインまたは install-hook)が必要で、現時点では
Claude Code で動作します。soul import --openclaw は、OpenClaw ワークスペースを同じチェックを通して読み込み、保留した行をすべて明示します。
soul export --openclaw <folder> は、書き出していないファイルを上書きせずにファイルを書き戻し、その後にファイルが編集された場合はブリーフで通知します。
この機能で防げないことを、率直に述べます。エージェント自身が新しいセッションを開始し(claude -p)、そこで確認すること。フックが認識できない経路で外部
コンテンツを読むこと(gh、git pull、ダウンロードしたファイル、サブエージェント、取得処理を行うスクリプト)。ガードが読み取れないスクリプトファイル内に隠されたコマンド。
Claude Code 以外のホスト。既知のパターンしか検出できないため、チェック機構が把握していない表現。そして、あなたの権限で実行されるコードが正しくチェーンされた行を書き込むことです。その代わりに保証されるのは、変更が明らかになることです。memory-pulse を迂回して追加された行や、偽造ハッシュを持つ行は魂として認められず、ブリーフにその旨が記載されます。また、フィンガープリント(エージェント台帳のバイト列の sha256)は、編集のたびに変わります。state merge によって届いた魂や未確定の変更は保留され、エージェント台帳に魂が一度保存されると、これらのルールは MEMORY_PULSE_MODE の設定にかかわらず適用されます。mode soul は、ガードまたはキャプチャーフックが見つからない場合に警告します。
エージェントモード:成長し続ける永続的なエージェントのアイデンティティ(オプトイン)
デフォルトの設定には意図があります。メモリはリポジトリに保存され、記録は明示的に行います。エージェントモードは、よく尋ねられるもう一つの要望、つまり、どのプロジェクトでも、どのツールでも、明日も「同じエージェント」であり、成長し続けるエージェントを実現します。
npx memory-pulse mode agent
npx memory-pulse identity "Blue, research agent for Travis; innovate, don't debate"
有効になる機能:
- エージェント台帳:
~/.memory-pulse/agent/events.jsonlにあり、エージェントに属し、MCP に対応するすべてのプロジェクトとツールで共有されます。形式、ハッシュチェーン、封印はすべて共通です。 - すべてのブリーフの先頭に置かれる自己ブロック:オンラインでもオフラインでも含まれます。エージェントのアイデンティティを固定された一行として示し、学習した継続的なルールと好み(
ruleおよびpreferenceタグ付きの行)、最大 10 件のレッスン(lessonタグ付きで、以下の説明に従って選択)、さらにチェーンの先頭とエンジンの封印からなるフィンガープリントを保持します。これにより、エージェントは実行中のメモリを示し、それが一晩で入れ替えられたり編集されたりしていないことを証明できます。 - 各ターン後の成長:
~/.claude/settings.jsonにユーザースコープのフックを 2 つ設定します(現時点では Claude Code のみ)。Stop フックは、明示された決定をプロジェクト台帳に、ユーザーの好みや明示されたレッスンをエージェント台帳に、またそれに該当する形式の修正をそれぞれ決定論的に記録します。各ターン最大 4 行で、ambientタグが付き、固定されず、指示のようなテキストから取り込まれることもありません。アイデンティティ自体は、あなたが設定するか、修正によって置き換えられる場合に限って変更されます。 - エージェントとともに引き継がれる修正:エージェント台帳に記録された修正は、ファイルが存在する限り、どちらのモードでも、どのプロジェクトにおいても同じ編集をブロックします。
- 新しさではなく、効果に基づいて保持されるレッスン:レッスンバンクでは、まず固定されたレッスンを優先し、次に学んだ場所以外でも有効だったレッスン(できるだけ多くの場所を網羅するように選択)を優先し、その後、新しいレッスンを 2 件、試用中として追加します。有効だった回数と同じ回数だけ失敗したレッスンは、バンクから除外されます。「レッスンは台帳にある」のようにレッスンを指し示すだけの文、断片、重複は除外され、件数に記録されます。
memory-pulse lesson probe 41 held --where billing-apiで証拠を記録し、memory-pulse lesson freezeで確認済みのバンクを固定します。この方法は Self-Organizing Agent Teams(Pappu et al.、arXiv 2609.22682)に基づいています。同研究では、チームは、ある戦略を生み出した問題以外の問題でも有効だった場合にのみ、その学習した戦略を保持します。
npx memory-pulse mode deliberate を実行するとフックが再び無効になり、台帳はそのまま残ります。どちらのモードでも、あらゆるツールから remember に scope: "agent" を渡すか、シェルから --scope agent を渡せます。目安としては、1 つのリポジトリだけならオフにし、1 つのエージェントが複数のリポジトリとツールを横断して使われ、ターンあたり最大 4 行を許容できるならオンにします。その場合、決定の行はコミットするプロジェクト台帳に記録されます。
どこで何が実行されるか(プライバシーに関する取り決め)
- 台帳は、プロジェクト内の
.memory-pulse/events.jsonlにあるローカルファイルです。コミット、grep、削除ができます。 rememberは台帳に直接書き込み、オフラインで動作します。- 読み取り操作では、台帳のイベントを TLS 経由でホストエンジンに送信し、エンジンが回答を計算してリクエストを破棄します。プロジェクトでホストメモリを有効にしない限り(コンソールでのオプトイン)、サービスはメモリのコピーを保持しません。 状態はリクエストに含まれて届き、レスポンスで返されます。 ホストメモリとホストボードは、無効にするまで保存され、無効にすると消去されます。
- テレメトリは、台帳の隣にある
.memory-pulse/telemetry.rainの署名付きカプセルです。エンジンは読み取りのたびにこれを更新し、保存することなく返します。statsは署名を検証し、badgeはこれを README バッジに変換します。ファイルを削除すると、最初からやり直します。 - 台帳を保存せずに状態を永続化します。 読み取り後、エンジンは署名付きのメモリキー(
.memory-pulse/memory.rain、Git の無視対象)を返します。次回の読み取りでこれを提示すると、エンジンはそこから再開し、以降に記録されたイベントだけを取り込みます。回答は、最初から再構築した場合とバイト単位で一致します。履歴の編集、台帳サイズの変化、署名の不正など、不一致があれば再構築に切り替え、その理由を表示します。ファイルを失っても、再構築が一度必要になる以外は何も失いません。MEMORY_PULSE_MEMORY_KEY=offで無効にできます。 - メモリの完全性。 「以前の指示を無視して」「このコマンドを実行して」などの指示に見えるメモや、偽のシステムタグを含むメモは、
rememberによって拒否されます。すでに台帳にあるものは、読み取り時に隔離されて報告されるため、メモリが命令としてエージェントのコンテキストに届くことはありません。不可視文字、類似文字、Base64 で隠すことはできませんが、言い換えや別の言語での記述は検出できない場合があります。 署名付きカプセルは、台帳から訂正内容が失われた場合、台帳が縮小した場合、または使用状況の形状が急変した場合にもドリフトアラートを出し、概要のフッターに表示します。どちらのチェックも、内容を確認できる決定論的なリストです。 - このクライアントは、クライアントそのものです。
server.mjsとlib/内の3つのプレーンなモジュールだけで構成され、依存関係はゼロ、ひととおり読むのに時間はかかりません。
使用状況のカウント
使用状況のカウントはデフォルトでオフです。許可するまでは何もカウントされません。install-hook はターミナルで一度確認し、1行のインストーラーもターミナルで確認します。また、memory-pulse telemetry on はいつでも有効にできます。どちらも CI では確認しません。有効にすると、クライアントは1日あたり最大1回、/v1/usage に次の情報を送信します。
| フィールド | 含まれる情報 |
|---|---|
install | 許可した時点で生成されるランダムな128ビット ID。エンジンが保存するのはそのハッシュのみです。memory-pulse telemetry reset で新しい ID を生成します |
version | クライアントのバージョン |
host | claude、codex、または other |
counts | 前回の送信以降の8つの整数:guard_check、guard_block、remember、lint、check_local、scaffold、prompt_slice、edit_slice |
capsule | エンジンから前回返された署名付き .rain カプセル。これにより、こちら側にデータベースがなくてもカウントを合算できます |
台帳のテキスト、パス、用語、プロンプトは含まれません。クライアントが受け付けるのはこの8つの名前だけなので、それらが含まれることもありません。memory-pulse telemetry show は、送信される情報をそのまま表示します。memory-pulse telemetry off、MEMORY_PULSE_TELEMETRY=0、または DO_NOT_TRACK=1 で停止します。
環境
| 変数 | デフォルト | 効果 |
|---|---|---|
MEMORY_PULSE_API | https://pulse.strategic-innovations.ai | エンジンのベース URL。別のエンジンを指定します |
MEMORY_PULSE_KEY | 未設定 | ライセンスキー。x-mp-key として送信されます。キーがなくても無料プランを利用できます |
MEMORY_PULSE_LEDGER | ./.memory-pulse/events.jsonl | プロジェクトの台帳パス。各サイドカーはその隣に保存されます |
MEMORY_PULSE_AGENT | $HOME/.memory-pulse/agent/events.jsonl | エージェントの台帳パス |
MEMORY_PULSE_PROJECT | 現在のディレクトリのベース名 | すべてのエンジン呼び出しとともに送信されるプロジェクト名 |
MEMORY_PULSE_MEMORY_KEY | on | off にすると、署名付きメモリーキーが無効になります(イベント数が500件以上の場合に要求されます) |
MEMORY_PULSE_MODE | ~/.memory-pulse/agent/config.json の設定値。なければ deliberate | 1回の実行に対して agent または deliberate を指定します |
MEMORY_PULSE_SETTINGS_DIR | 未設定 | install-hook と mode が settings.json または hooks.json を保存するディレクトリ。テストで使用されます |
MEMORY_PULSE_BRIEF_BUDGET | 未設定 | brief --budget のデフォルト値(トークン単位) |
MEMORY_PULSE_TELEMETRY | 未設定 | 0 または off:同意の有無にかかわらず、使用回数を送信しません |
MEMORY_PULSE_TELEMETRY_DEBUG | 未設定 | 1:使用状況のペイロードを送信せずに表示します |
DO_NOT_TRACK | 未設定 | 1:使用回数を送信しません |
CI | 未設定 | 設定すると、install-hook は使用回数について確認しません |
CLAUDECODE、CLAUDE_PROJECT_DIR | Claude Code によって設定 | 使用回数内でホストを claude として報告する場合にのみ読み取られます |
MEMORY_PULSE_BRIEF | 未設定 | scaffold または engine:再入場時に brief が出力する内容を指定し、デフォルト(キーなしの場合は scaffold、キーありの場合は engine brief)を上書きします |
MEMORY_PULSE_BRIEF_TIER | brief | 予算を指定しない場合の brief の階層:index、brief、notes、full |
MEMORY_PULSE_BOARD | ./.memory-pulse/board.jsonl | 共有エージェントメッセージボード。設定すると、MCP サーバーには board_post と board_read も一覧表示されます |
MEMORY_PULSE_STRICT_WRITER | 未設定 | 1:このマシンのマークがない行は verify で失敗し、ガード警告が表示されます。verify --strict と同じ動作です。書き込み元が1つの台帳で使用します |
MEMORY_PULSE_TRUST_DIR | $XDG_STATE_HOME/memory-pulse。なければ ~/.local/state/memory-pulse | このマシンのアンカーと書き込みキーの保存場所です。すべての台帳フォルダーの外に置いてください |
MEMORY_PULSE_DATA_DIR | $XDG_DATA_HOME/memory-pulse。なければ ~/.local/share/memory-pulse | install-hook と mode が、フックの実行に node を使う固定コピーを保存する場所です(バージョンごとに1つのフォルダー)。npx 経由のフックは、呼び出しごとに約1秒かかりました |
MEMORY_PULSE_LOCK_TIMEOUT_MS | 5000 | 書き込み元が台帳ロックを待ってから処理を拒否するまでの時間。保持者が終了したロックは直ちに解除されます |
NO_COLOR、TERM | 未設定 | TTY 上で、NO_COLOR が未設定かつ TERM が dumb 以外の場合に限り、ガードのブロックメッセージに色を付けます |
HOME | シェルの値 | エージェント台帳、~/.claude/settings.json、~/.codex/hooks.json のルート |
料金
- 無料。 最大500イベントの台帳、IPアドレスごとに1日200回のエンジン読み取り
(
worker/api.js、2026-09-09に確認)。セッションの開始で1回の読み取りを消費します。上限を超えると、簡易版はオフライン表示に切り替わり、その理由が表示されます。アカウントもキーも不要です。 - Starter、月額$7。 最大5,000イベントの台帳、ホスト型読み取りは1日1,000回、ホスト型メモリー(ランキング付き簡易版、リコール、コードモード)、およびmemory-pulseスキル。
- Pro、月額$19。 最大20,000イベントの台帳、読み取り無制限、署名付きチェックレシート。環境変数は
MEMORY_PULSE_KEYの1つだけです。 - Enterprise、月額$79。 最大250,000イベントの台帳、1つのサブスクリプションで失効可能なシートキーを10個、
/v1/certify経由の台帳レシート(誰でもキーなしで/v1/verifyから検証可能)、14日間の返金保証。
| レシート | 対象 | プラン |
|---|---|---|
チェックレシート(check --receipt) | 1つの変更に対する1つの判定、エンジン署名付き | Pro、Enterprise |
台帳レシート(/v1/certify) | 台帳全体のセットヘッドとチェーンヘッド | Enterprise |
| 無料 | エンジンはレシートの代わりにヒントを返します | Free |
ローカルへの書き込みは、すべてのプランで無料です。
独自の台帳での測定結果
memory-pulseを構築するプロジェクトの台帳(767イベント、1.08 MBのファイル)で測定しました。測定日は2026-09-01です。
execute経由で回答した相互参照の質問では、全体の1,080,983文字のダンプに対し、124文字が返されました。中間データがコンテキストに入ることはありませんでした。- 最小プランの再入場用簡易版は、台帳を読み込む場合と比べて約99%小さくなります。
- 351個の異なる原因を対象にしたリコールベンチマークでは、ノイズフロアゲートによる誤った最上位回答はゼロでした。基準を超えられない場合は、何も返しませんでした。
比率は台帳のサイズによって異なります。10イベントの台帳では、圧縮するものがありません。測定方法はエンジンのベンチマークスイートに記載されています。
FAQ
エンジンはなぜホスト型なのですか? ランキングエンジンこそ、研究に最も時間をかけた部分です。性能の低いローカルランカーを同梱するより、ローカル台帳、監査しやすい薄型クライアント、ホスト型エンジンを選びました。リモートエンジンが問題になる場合は、MEMORY_PULSE_APIでクライアントの接続先を任意の場所に指定できます。
チームでメモリーを共有するには? .memory-pulse/をリポジトリにコミットすると、チームメイトのエージェントも同じ台帳を使えます。行はtとprevで連結されるため、2つのブランチがそれぞれ追記するとマージ時に競合します。両方の側を残すことは避け、負けた側の行をrememberで再記録してから、verifyを実行してください。ホスト型の共有台帳はロードマップに含まれています。
ライセンスは? クライアント:MIT。エンジン:プロプライエタリ、ホスト型。
MIT © Travis Crew
Memory CI:明示的な空判定を含む3つの判定
memory-pulse check は、台帳と宣言済みの不変条件に基づいてローカルで計算し、変更に対して次の3つの判定を返します。
- blocked(ブロック)。テキストが、訂正によって撤回された値を書き戻しています。判定には、その値を無効にした台帳の行と、代わりに使うべき内容が示されます。宣言済みの不変条件にテキストが違反した場合も発生します。終了コードは2です。
- verified(検証済み)。記録されたイベントがテキストに関係しており、矛盾するものはありません。終了コードは0です。
- no evidence(証拠なし)。台帳に該当する情報がないことを、そのまま報告します。合格とは報告しません。
--ciを指定した場合の終了コードは1です。フックはこの判定では何も表示しません。編集のたびにコメントするフックはエージェントを無限ループに陥らせるためです。明確に通知するのは CI の役割です。
npx memory-pulse check --ci --diff origin/main # added lines of the branch
npx memory-pulse check --ci --file docs/pricing.md
echo "price is $49" | npx memory-pulse check --ci
npx memory-pulse check --receipt --text "…" # engine-signed receipt, keyless verify at /v1/verify (Pro, Enterprise)
不変条件は宣言するものであり、推測されるものではありません。.memory-pulse/invariants.jsonl に1行につき1つ記述します。形式は次のとおりです。
{"id":"receipt-wording","statement":"say tamper-evident", "patterns":["/\\bproof\\b/i"],"paths":["site/"],"severity":"block"}。
/…/flags 形式で記述したパターンは正規表現、それ以外はそのまま照合する部分文字列です。paths ではパスのプレフィックスを指定してルールの適用範囲を絞るため、公開文言に関するルールがテスト用フィクスチャに適用されることはありません。severity: "warn" はブロックせずに警告を報告します。
オーバーライドは誤ブロックを示すシグナルです。guard allow "$49" --path docs/history "historical table" は、そのパスプレフィックスに適用される override イベントを記録します。この値はそのパスでは許可され、ほかの場所では許可されません。report と署名済みカプセルの両方でカウントされます。ガードが推測で判断することはありません。ブロックできるのは、明示的に撤回された語句と宣言済みの不変条件だけです。2026-09-01 に、エンジンリポジトリの guard-eval ベンチマークを使い、852件のイベントを含む自社の台帳で測定したところ、適合率は1.0、694件の実際のノートを含む871件の否定例で誤ブロックは0件、イベント数1kでプロセス内チェックのp95は1.7 msでした。
uses: t-crew/memory-pulse@v0 による PR ステータスチェック
すべてのプルリクエストに対して、リポジトリにコミットされた台帳と不変条件を照合し、GitHub チェックとして同じ3つの判定を返します。
# .github/workflows/memory-ci.yml
on: pull_request
permissions: { contents: read, checks: write, pull-requests: write }
jobs:
memory-ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with: { fetch-depth: 0 }
- uses: actions/setup-node@v6
with: { node-version: 22 }
- uses: t-crew/memory-pulse@v0
id: memory
with:
ledger: .memory-pulse/events.jsonl # default
lint: "true" # also lint CLAUDE.md, AGENTS.md, .cursorrules and the rest
api-key: ${{ secrets.MEMORY_PULSE_KEY }}
- run: echo "${{ steps.memory.outputs.verdict }} / ${{ steps.memory.outputs.conclusion }}"
プルリクエストの追加行をチェックします。blocked はチェックを失敗させ、固定コメントには、各値を無効にした台帳の行が記載されます。verified は「N件のメモリをチェックし、M件の訂正を適用しました」という内容で成功します。M は、拘束力のある訂正の台帳全体での件数です。no_evidence は説明付きの中立判定であり、証拠がない状態が合格として報告されることはありません。コメントはプルリクエストごとに1つだけ投稿され、同じコメントが更新されます。このリポジトリでは自身に対してこのチェックを実行しているため、.memory-pulse/events.jsonl がコミットされています。また、このチェックが最初にブロックしたプルリクエストがデモになっています。
注意点:
fetch-depth: 0が必要です。これを指定しないと、差分の代わりに作業ツリーが使われます。ジョブログにはcould not compute the diff ... checking the working tree insteadと記録され、差分が空の場合、コメントには証拠なしと報告されます。baseは単独のブランチ名(main)です。デフォルトでは、プルリクエストのベースブランチが使われます。- 追加行は
pull-requestというパスの下でチェックされるため、パス指定のオーバーライドと不変条件は CI では適用されません。過去の値が妥当な場合は、プルリクエストのブランチで--pathを指定せずにオーバーライドを記録してください。 - ステータス項目は2つ表示されます。ジョブと、
memory-pulseという名前の check-run です。ブランチ保護では check-run を必須にしてください。 - フォークではログのみの判定となり、トークンもコメントもありません。
- デフォルトで
lintが実行され、古いCLAUDE.mdがあるとブロックします。lint: "false"を指定すると無効になります。 api-keyは CLI にエクスポートされますが、現時点では Action はレシートを要求しません。署名済みレシートを取得するには、MEMORY_PULSE_KEYを設定し、別のステップでnpx memory-pulse check --ci --diff origin/main --receiptを実行してください。
リリース
scripts/release.sh 0.6.0
スクリプトはテストスイートが fail 0 になることを確認し、4 つのバージョンファイルをまとめて更新し、リリースプルリクエストを作成してマージし、タグを付けてエンジンをデプロイします。タグによって .github/workflows/release.yml が実行され、テストを実施して、GitHub の OIDC ID を使用して npm と MCP レジストリに公開します。リポジトリにトークンはなく、ワンタイムパスワードもありません。npm は自動的にプロベナンスを付与するため、誰でもパッケージがこのリポジトリからビルドされたことを検証できます。
1 つのバージョンを 4 つのファイルが参照します。npm 用の package.json、MCP レジストリ用の server.json、Claude Code 用の .claude-plugin/plugin.json、Codex 用の .codex-plugin/plugin.json です。4 つすべてのバージョンが一致している必要があります。
test/manifests.test.js は一致するまで失敗し、リリースワークフローは不一致の間、公開を拒否します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。