本書は CodeCart の「ラウンドトリップ・プロトコル」を定義し、あらゆる AI 製品・エージェントフレームワーク・ブラウザー拡張・スクリプトがユーザーのメモリーウォレットを読み書きし、互換性を保てるようにするものです。プロトコルは意図的に極小です:普通のチャット返信の中で、どの LLM でも確実に出力できなければなりません。
- キャリーブロック——ユーザーが AI に貼り付ける内容:有効なカード+モデルに更新の出力を求める指示。
codecartブロック——モデルが返信の最後に付けるメモリー更新(フェンス付きコードブロック)。- ウォレットファイル——全カードを保持するエクスポート JSON。ユーザーが持ち運べる正準ストア。
[これは私の個人メモリーです(CodeCart ウォレット、<日付>)。すべての回答をこれに基づいてパーソナライズしてください。]
- (preference) 短く、結論から答える
- (fact) ネットショップを運営している
- (boundary) 月1万円の予算を超える提案はしない
---
<codecart ブロックの追加をモデルに求める指示——正準の文言はアプリ内を参照>
カードタイプ:preference(答え方の好み)、fact(安定した情報)、status(現在の関心事、変化する)、boundary(絶対ルール)。
モデルは返信の最後にこう付けます:
```codecart
+ <type> | <内容>
~ <古いメモリー行からそのまま引用した断片> => <修正後の内容>
- <退役させるメモリー行の断片>
```
+はカード追加。<type>は4タイプのいずれか。省略時(+ <内容>)はfactとして扱う——ただし誤検出を避けるためフェンス内のみ。~は置き換え:テキストに<断片>を含む有効カードを(大文字小文字を無視して)探し、アーカイブして修正カードを追加。これがウォレットを肥大化させず最新に保つ仕組みです。-は置き換えなしの退役(フェンス内のみ)。- 推奨モデルルール(キャリー指示に含まれます):最大5行;持続的な個人情報のみ;ユーザーの言語で書く;該当なしならブロック自体を省略。
パーサーはフェンス外の行も受け付けてよいが、明示的な <type> | 接頭辞がある場合に限ります。
{
"version": 2,
"cards": [
{
"id": "m3k9x1ab2",
"type": "preference",
"text": "短く、結論から答える",
"status": "active",
"created": 1720300000000,
"updated": 1720300000000
}
]
}status は active か archived。コンシューマーは active カードのみを持ち込み、インポート時は text の重複(大文字小文字・前後空白を無視)をスキップしてマージしなければなりません。
import json
with open("codecart-wallet.json", encoding="utf-8") as f:
wallet = json.load(f)
carry = "\n".join(
f"- ({c['type']}) {c['text']}"
for c in wallet["cards"] if c["status"] == "active"
)
# carry を system prompt の先頭に付け、モデル出力中の
# ```codecart``` ブロックを上記文法でパースしてマージする。- ブロックタグは常にリテラル文字列
codecart。 - 未知のカードタイプは
factとして扱い、未知の JSON フィールドはラウンドトリップで保持すること。 - v1.3 レガシーエクスポート(
nodes++CLAIM/+ANCHORセマンティクス)の対応:anchor → boundary、claim → fact、isSuperseded → archived。