Memories / ドキュメント

このページの内容

Memories 技術ガイド

本書は現在の実装におけるストレージ、信頼境界、ローカル認可、ホスト型 Center、封印された秘密、検索データフロー、クラウドオブジェクト同期、デスクトップ状態の境界を説明します。SECURITY.md、docs/architecture.md、docs/authorization.md、docs/center.md と同じ動作を記述します。ストレージ形式のバージョンは1です。開発用ソフトウェアであり、テスト合格は独立したセキュリティ監査を意味しません。

ストレージと信頼境界

ローカルデータベースのテーブルは header、state、checkpoints です。形式メタデータ、ソルト、行番号を除き、値はすべて関連データ付き暗号文です。ログも暗号文です。永続化された平文の全文索引はありません。

形式ヘッダーの version は1でなければ開けません。ユーザーパスワードは Argon2id(バージョン0x13、メモリ64 MiB、反復3回、並列度1)と16バイトのソルトで32バイトの鍵に導出します。この鍵はランダムなマスター鍵をラップし、関連データは memories/master/v1 です。マスター鍵は状態とローカルチェックポイントを暗号化します。対称暗号は XChaCha20-Poly1305 です。

各権限エポックには独自の保管庫鍵があります。各リビジョンはランダムなデータ鍵を持ち、そのエポック鍵でラップします。シリアライズしたコンテンツを個別認証する256 KiB のチャンクに分割し、チャンク位置と総数を関連データに含めます。リビジョン署名はアセット ID、親バージョン、ポリシーヘッド、墓標フラグ、暗号文、デバイス証明書を対象とします。署名アルゴリズムは Ed25519 です。

変更は複製状態で準備し、暗号化状態とチェックポイントを同じ SQLite トランザクションでコミットします。synchronous=FULL を使います。読み取りと実行の意図は交付前にコミットします。そのためディスク障害時は交付を拒否し、意図のコミット後にクラッシュすると結果不明の状態が残る場合があります。同一データディレクトリは OS 排他ロックで1つの協調ライターに制限します。初期化は同じディレクトリにデータベースを書き終え、閉じて同期してから目的の場所に公開し、既存の対象を上書きしません。各デバイスは独自のストアを使います。使用中の SQLite ファイルをクラウドドライブクライアントで同期しても、複数デバイスのトランザクション安全性は得られません。

ユーザーの Ed25519 鍵がデバイスの Ed25519 署名鍵と X25519 交換鍵に証明書を発行します。証明書だけでは不十分で、各保管庫のポリシーがデバイスを明示的に認可する必要があります。同じユーザーでもデバイス鍵は独立しています。初期ユーザーの署名能力は、認証され受信者向けに暗号化された承認パッケージでのみ、承認済みの個人デバイスに渡します。デバイス取り消し後、ユーザー ID 鍵でその保管庫のデバイス許可リストを迂回できません。

転送エンベロープは形式バージョン、送信デバイス鍵、受信者交換鍵、一時 X25519 公開鍵、AEAD ペイロード、Ed25519 署名を含みます。転送鍵は HKDF で導出します。受信者 ID と一時鍵は認証されます。デバイス追加には期限付き署名要求を使い、承認デバイスの公開鍵を明示的に固定します。要求はコミット成功後だけ消費します。承認用フィンガープリントは完全な SHA-256 です。リストの短縮表示だけを承認の根拠にはできません。

ポリシーは署名付きの線形履歴で、メンバー、ロール、デバイス許可リスト、増加のみの取り消し集合、エポックを含みます。ロール確認には直前のポリシーを使います。通常ユーザーはメンバー資格を変えずに自身の ID に別のデバイスを認可できます。メンバー招待、参加承認、メンバーのデバイス認可は Admin または Owner のみです。Admin は Admin、Editor、Reader のメンバーを変更できますが、誰かを Owner にしたり、既存 Owner の変更、デバイス取り消し、所有権移転を行ったりできません。Owner は実行できます。所有権移転は Owner をちょうど1人に保ちます。ポリシー検証は Admin による Owner メンバーや取り消し集合の変更を拒否します。

アセット履歴は内容アドレス方式の有向非巡回グラフです。未消費のリビジョンが複数あるアセットは競合状態です。解決リビジョンは見えているすべての親バージョンを指定する必要があります。墓標はアセットを現在のビューから除外しますが、履歴は削除しません。

バックアップは独立した Argon2id と AEAD エンベロープで、署名済みローカル状態と復旧材料を保存します。復旧は新しいデバイス鍵と保管庫 ID を生成し、現在のコンテンツと競合ヘッドを保持し、元の署名履歴を暗号化した読み取り専用アーカイブに置きます。以前の共有メンバー資格が引き続き有効とは扱いません。デバイス専用保管庫、クラウド認可、クラウド送受信キューはバックアップ対象外です。

設計上の保護対象は以下です。リレーによるアセット内容の読み取り・偽造、明示的なフィンガープリント照合後の相手 ID の置換、認証済み暗号文の変更、ローカルパスワードなしでコピーしたデータベースを読む行為、Reader による書き込み偽造、管理者による所有権変更、取り消し済みデバイスがユーザー ID 鍵で自身を新しい認可デバイスとして発行する行為、CLI や MCP による意図しない認証情報出力、コマンドラインでのパスワード受付、MCP 能力への端末権限昇格の継承、署名リビジョンや監査の検知されない変更、チェーンの欠落、残存データベース状態に対するチェックポイント切り詰めです。

以下は境界外であり、解決済みとは記載しません。

  • 侵害された端末、OS 管理者、認可済み悪意あるプログラム、メモリ検査、キーロギング、ユーザーによる意図的な平文コピー。Rust が所有する鍵バッファはゼロ化します。OS スワップ、クラッシュダンプ、依存ライブラリの割り当て、Dart の GC 対象文字列には消去保証がありません。デスクトップにハードウェア鍵ストレージはありません。
  • リレーは通信メタデータを観察し、接続を遮断し、暗号文を独自に記録し、取り消しを遅延させ、デバイスを分断できます。付属のリレーサーバーはアセットを書き込みませんが、悪意あるサーバーに記録を禁止できません。リレーはオフラインデバイス向けにキューを持ちません。
  • オフライン取り消しは過去の平文、鍵、バックアップを消去できません。取り消しをまだ受け取っていない端末は古いローカルコピーを使用できます。
  • 監査が証明するのは既知の状態に対する署名内容と連続性であり、侵害されたデバイスがすべてのアクセスを記録したことではありません。データベース全体とローカル証拠を古くても内部整合するバックアップで置き換えた場合、新しい相手のチェックポイントや外部アンカーがなければ検知できません。信頼できるタイムスタンプサービスはありません。
  • 同じ OS ユーザーの他プロセスはローカルアカウント境界の内側です。IPC は OS ユーザーを認証します。端末の権限昇格は親プロセス PID も使います。同じユーザーの悪意あるプロセスからの隔離ではなく、PID 再利用に影響されない永続セッション ID でもありません。
  • 実行ファイルのフィンガープリントは起動前に確認します。OS サンドボックス、強制コード署名、アトミックなファイルハンドル実行、子孫プロセスの封じ込めはありません。
  • クリップボードコピー、エクスポートファイル、ユーザーが明示的にコピーを要求した認証情報は、ユーザー操作に従い暗号化ストアを離れます。コピー内容はロック後も残り、OS 履歴や他のアプリが保持する可能性があります。

ローカル IPC と認可

service::Request は共有の型付き操作インターフェースで、スネークケースの op で区別します。未知のトップレベルフィールドは拒否します。ローカル IPC はビッグエンディアン32ビット長プレフィックスの JSON フレームとバージョン1のラッパーを使います。任意の HTTP/WebSocket リスナーとリレー RPC は、トークン認証の WebSocket バイナリ JSON フレームを共用します。デスクトップのリモート接続はロック解除・権限昇格後、ローカル IPC と同じ操作面(ws:remote / relay:remote)を提供します。モバイル FFI/Share には引き続きプラットフォーム拒否リストがあります。詳細は docs/remote-daemon.md と SECURITY.md を参照してください。任意の認可センター([[centers]])はローカルの自己初期化を禁止します。チケットモードは登録、MCP 認可、ロック解除のチケットを発行し、ホストモードはコンテンツを Center のサーバー暗号化ストアに置きます。後述の内容および docs/center.md、docs/authorization.md を参照してください。

デーモンは現在の OS ユーザーだけにサービスを提供します。Windows は名前付きパイプ、Linux と macOS は Unix ソケットを使います。IPC は同時に最大16クライアントを受け付けます。Windows の名前付きパイプのフレーム読み取りは依然ブロッキングで、停止した同一ユーザークライアントが枠を占有しますが、1つの停止クライアントやクラウド転送が他の全接続を妨げることはありません。Unix フレーム I/O には期限があります。書き込みロックを保持するサービス操作は、信頼済み子プロセスの実行も含め直列です。

通常のロック解除はアイドル15分で失効します。sudo は同じローカルパスワードを使い、最長15分、アイドル5分で失効し、コマンドを発行した端末の親プロセスに限定します。ロックや再起動は昇格を消去します。完全ロック中の試行はレート制限しますが、永続署名監査には書きません。解除済みで有効なローカル署名 ID があると、失敗操作を監査します。意図は交付前にコミットし、突然のクラッシュはコミット済み意図を残し、結果を捏造しません。

MCP 認可はローカルの保有者能力で、呼び出し元が指定したファイルに書き、端末には出力しません。mcp grant の --minutes は有効期間を決め、--write がある場合だけ通常の記憶を作成できます。mcp serve --grant-file はファイルから能力を読み、stdio の MCP 2024-11-05 でツールを提供します:memory_search、memory_retrieve、memory_ask、memory_read、memory_read_revision、memory_history、memory_diff、memory_write、memory_delete、card_write、card_graph、card_link。各呼び出しは認可内の保管庫を伴い、ディスパッチ前に能力を個別確認します。

MCP は端末の権限昇格を継承できません。プライベート記憶、ファイル、認証情報の読み取り、プロセス、リモートセッション、ループバックプロキシ、暗号処理ジョブの実行、保管庫メンバー管理、DesktopStatus の要求はできません。ロックはメモリ内の認可を消去し、未失効のものは解除後に復元します。ロック自体は削除しません。認可サービスの発行、一覧、取り消し、申請、受領は MCP ツールから呼び出せますが、MCP 自身の能力を使い、端末昇格や Center 管理者 bearer は使いません。通常読み取りは {{secret:标签}} を解決しません。card_write は秘密マップを持たないため、秘密参照を含むカードの更新は検証で失敗します。参照の短い ID は型付き認証情報 ID のみを短縮し、本文のマーカーはそのままです。

otp_code は RFC 6238 の TOTP と RFC 4226 の HOTP を実装します。HOTP はコードを返す同じコミットで増加後のカウンターを保存します。parse_otp_import は otpauth:// と Google Authenticator の otpauth-migration://offline?data=... を受け付け、アカウントを TOTP または HOTP カードに解析します。URI ホスト、type パラメーター、移行データにタイプがあればその値で識別し、なければカウンター付きは HOTP、それ以外は TOTP です。呼び出し元がタイプを別途選ぶ必要はありません。CLI の --image は先に rqrr で画像から2種類の URI をデコードし、同じインポート経路を使います。URI と --image は同時指定できません。複数カードでは --title はタイトル接頭辞だけになり、--id は1枚だけを置換できます。モバイルカメラはこの2種類の OTP QR コードをインポートしません。ホスト型デバイスのペアリングスキャンは別経路で、後述します。カードのリビジョンは任意の別名、備考、分類も持てます。更新時の省略は元の値を保持し、空文字列は消去します。シードは検索や MCP に入りません。TOTP は正しいローカル時刻に依存します。生成結果は認可された短時間コードで、シードのエクスポートではありません。監査はコードもシードも記録しません。

credential_copy は認証情報出力制限の明示的例外です。ローカル権限昇格を要求し、監査意図を先にコミットしてから UTF-8 平文をクリップボードクライアントに渡します。CLI はシステムクリップボードへの書き込み成功後だけ {"copied":true} を出力します。MCP はコピーを要求できません。監査が記録するのは credential.copy と交付意図で、OS クリップボードの成功応答ではありません。

モバイル ABI は crates/ffi/memories.h に宣言されています。ハンドルは数値の登録 ID で、生の Rust ポインターではありません。返された文字列は memories_free で1回解放します。不正 JSON は入力を再表示せず一般エラーにします。memories_lock_all はアプリのバックグラウンド移行時に全体ロック世代を進め、遅れた処理中応答を抑止し、すべてのホスト型セッションも破棄します。モバイル経路はプロセス実行、ローカル MCP 認可作成、ローカル認可管理、権限申請 RPC を含みません。ホスト型 Center に接続する hosted_* は別経路で、コンテンツは一覧、読み取り、kind = credential の書き込みだけを公開します。

暗号処理ジョブは短い ID を解決する前に承認ダイジェストを確認し、呼び出し元が見た参照にダイジェストを結び付けます。サービスはローカル昇格と保管庫アクセスを確認し、認証情報アセットだけを解決し、実行意図をコミットして共有ランナーを呼びます。ランナーはツールを再確認し、入力をコピー・照合し、所有者のみアクセス可能な作業領域に認証情報を実体化し、シェルなしでコマンドを実行し、ツール出力を抑制し、成功した成果物だけを公開します。プレースホルダーはパスだけを置換します。MCP 許可リストとモバイル FFI はプロセスジョブを拒否します。

認可、権限申請、ホスティング、封印された秘密

ローカル認可とホスト型 Center は同じロール上限を使います。Reader は最大 read、Editor は read_write、Admin は read_write_delete、Owner は allow_all です。省略時は read。Reader と Editor は発行・再委譲できません。発行はロール上限と呼び出し元の認可スコープの両方に制約され、保管庫をまたげず、親認可より長く存続できません。期間は1–60分です。メンバーの直接発行は深さ1、認可による発行は1増え、2を超えると拒否します。Center の永続メンバー認証情報は深さ0で、再委譲とは数えません。受信者は既存メンバーで、ロールは発行者以下、予約名 center-admin 以外である必要があります。コンテンツ認可は受信者のロールを変えません。

同時に有効な認可は最大10000件(service::MAX_ACTIVE_GRANTS)で、ローカルデーモンとホスト型 Center は同じ上限です。トークンは発行または受領の応答で1回だけ現れます。永続状態は SHA-256 とメタデータだけを保存し、定数時間で比較します。ロックはメモリ鍵を破棄して認可を停止し、取り消しません。解除・再起動後も未失効の認可は有効です。失効認可とその子孫はロードと定期確認で消去します。取り消しは子孫に伝播します。メンバー削除や発行者のロールが発行済みスコープを下回る変更では、ポリシーコミット時に関連認可が無効になります。認可は保管庫同期や復旧バックアップに含まれません。

権限申請は承認後に受領します。スコープ申請の承認は境界だけを記録し、トークンを生成しません。申請者が作成時のメンバー認証情報で1回受領します。その応答が失われるとトークンは再取得できません。ロール申請はローカルのみで、承認時に即座にポリシーを変え、受領はありません。Owner は署名付き所有権移転を使い、期限付き認可で恒久ロール変更は承認できません。ホスト型 Center はスコープ申請のみ受け付けます。自分の申請は承認・拒否できません。主体と発行者が異なる認可の呼び出し元は申請できますが、承認、拒否、取消、受領はできません。保留上限は申請者1人につき1保管庫20件、1保管庫200件です。7日超で失効します。決定済み、失効済み、受領済みの申請は最後の遷移から30日後に削除します。

ローカル監査はデバイスごとの署名付きハッシュチェーンです。Center の DIR/audit.jsonl は鍵なしチェーンで、既知のヘッドに対する改ざんを検知できますが、運営者によるログ全体の書き換えは防げません。

Center には2つのモードがあります。mode = ticket(既定)は登録、MCP 認可、ロック解除チケットだけを発行し、コンテンツはデバイスの暗号化ストアに残ります。解除チケットは期限前なら繰り返し使え、特定デバイスに結び付かず、ローカルでデバイスパスワードによる解除だけを許可し、sudo や MCP 昇格は付与しません。mode = saas で Center を --data 付きで実行するとコンテンツはサーバー暗号化ストアに入ります。運営者はストアパスワードを持ち、解除済み平文を読めます。これはサーバー側暗号化で、運営者に対する機密性境界ではありません。設定に mode = "saas" がちょうど1つあるとデーモンはコンテンツ RPC を Center の /v1/rpc に転送します。未対応操作は直接失敗し、ローカルにフォールバックしません。管理者 bearer はロック、解除、メンバーを管理し、コンテンツルートで使うと401になります。allow_all はホスト型コンテンツ面だけを対象とし、サーバー管理、デバイス管理、sudo、登録、復旧、実行、暗号処理ジョブは含みません。

ホスト型ストアの e2e: true カードは平文秘密を拒否します。ペアリング後、秘密をデバイスの X25519 公開鍵宛ての、既知の Ed25519 鍵で署名したエンベロープに入れます。Center は公開鍵と暗号文だけを保存します。誰が、どのカードを、いつ扱ったかは見え、古いエンベロープの留保・再送もできますが、本文は見えません。デバイス認可は発行も承認もできません。取り消しはそのデバイスのエンベロープを削除し、復号済み平文は回収できません。e2e フラグの削除は Owner の認可だけで可能で、その書き込みに秘密は含められません。ローカル保管庫の新デバイス追加は引き続き期限付き署名要求と完全なフィンガープリント照合を使い、カメラは使いません。

検索とモデルデータフロー

検索キャッシュは最大2保管庫の索引を保持します。各保管庫は最大10,000チャンク、出典テキストとメタデータ16 MiB、ベクトル32 MiB です。索引に入る前にプライベートコンテンツ、認証情報、ファイル、削除済み、隔離、競合リビジョンを除外します。SQLite 一時ストレージはメモリに固定します。キャッシュはバックアップやクラウドエクスポートに入りません。ロックは全索引とベクトルを消去し、ポリシー、リビジョン、隔離状態の変化は対応キャッシュを無効化します。

通常本文を Unicode の安全な境界付近で最大768文字のチャンクに分け、通常128文字重複させます。中国語と混在テキストは Jieba で分かち書きします。FTS5 BM25 のタイトル、本文、安全なメタデータの重みは5、1、2です。any はキーワードのいずれか、all は全語、phrase は元のフレーズを要求します。これらの制約はベクトルやハイブリッド候補にも適用します。クエリはエスケープし、任意 FTS 演算子として実行しません。基本の memory search は文書ごとにチャンクを統合し、memory_retrieve と rag search は個々のチャンクを、アセット ID、リビジョン、安定チャンクハッシュ、元の UTF-8 オフセット、スコア、引用ラベル付きで返します。

ベクトルは正規化されたメモリ内キャッシュです。ベクトル検索はコサイン類似度を使います。ハイブリッド検索は逆順位融合で、k は60です。既定の軽量再ランキングは限定候補集合でクエリ網羅と完全なフレーズ一致を高く評価します。設定したモデルエンドポイントは学習型再ランキングも行えます。

既定の埋め込みはプロセス内 EmbeddingGemma 300M Q4 で、ローカル ONNX 推論を通じて768次元のベクトルを作ります。推論セッション作成前に ONNX テレメトリーを明示的に無効化します。推論エンジンはアプリに付属し、約209 MiB のモデルファイルは公開データです。rag model-install が固定リポジトリリビジョンから取得し、公開前に各ファイルの SHA-256 を確認するか、rag.local_model_dir から提供します。確認済みファイルはオフラインで再利用できます。モデルファイルは別の Gemma ライセンスを持ち、秘密でも、独立監査済みのセキュリティ境界でもありません。

リモート埋め込みアドレスの設定後は、認可された RAG 操作がすべての適格文書チャンクをそのエンドポイントに送れます。生成は質問と選択した出典チャンクだけを送り、学習型再ランキングは候補を送ります。リモート URL は HTTPS 必須で、HTTP はループバックだけを許可します。モデル API のリダイレクトは拒否します。ループバック要求はプロキシを使いません。他の要求は HTTP、HTTPS、SOCKS プロキシとプロキシ環境設定を利用できます。再試行は上限付きで、一時的な接続・読み取り障害、HTTP 429、選定した5xx のみが対象です。再試行で重複課金される可能性があります。TLS 検証は無効化しません。API 鍵は設定内の環境変数名でのみ参照し、TOML、URL、コマンド引数に書きません。MCP ツール引数はプロバイダー URL、認証情報、プロキシを選べません。

デバイス専用保管庫は、非ループバックプロバイダーに送るモデルステップを推論前に拒否します。ローカル推論と明示設定したループバックサービスは利用できます。

Retrieve、RagIndex、RagStatus、RagAsk は保管庫認可と MCP スコープを維持します。IPC はサービスミューテックスの外でモデル処理を行い、外部処理の前後と交付前に解除世代、認可、アクセス権、出典リビジョンスタンプを再確認します。署名付き意図は推論やエクスポートに先行します。監査は成否と交付した出典 ID を記録し、プロンプトや鍵は記録しません。生成は出典テキストを信頼できないデータとして扱い、アプリツールを持ちません。モデルは構造化した回答と引用を返す必要があり、存在しない引用 ID は拒否します。証拠がない場合は生成を呼ばず、結果を insufficient_evidence にします。引用検証は引用の存在だけを確認し、生成文の事実的正しさを証明せず、信頼できない出典のプロンプトインジェクションも除去しません。

ロック、失効・取り消し済み認可、出典状態の変化は、遅れた結果を抑止し、後続ステップを防ぎます。開始済みのリモート要求や推論は完了する場合があり、送信済みテキストは撤回できません。

モバイル FFI は改良した語彙検索と BM25 retrieve に対応します。モデル設定・推論 UI は Flutter に追加していません。モデルを使う操作は設定済みデスクトップデーモンを利用します。

クラウドオブジェクト同期

デスクトップ CLI は PKCE、ループバックコールバック、固定プロバイダーエンドポイントでブラウザー OAuth を行います。CloudBegin は sudo 下で、呼び出し元、プロバイダー、クライアントに結び付く期限付きチケットを作ります。ネットワーク要求はデーモン外で行います。CloudComplete はコミット前にチケットと現在の認可を確認します。ロック、ログアウト、再起動は未完了チケットを無効化し、遅い結果がログインを復活させることを防ぎます。

State.cloud_accounts はトークンをローカルに暗号化保存します。状態はアカウントメタデータだけを返します。バックアップ、ペアリング、保管庫同期、MCP にトークンは含みません。ログインは保管庫メンバー資格を作りません。各デバイスで各プロバイダーに1アカウントを接続し、再ログインは新認可の成功後だけ置換します。

State.cloud_sync は永続送信箱と受信箱の受領記録を同じ暗号化状態に保存します。CloudSyncEnqueue は転送 I/O の前に正確なシリアライズ済みエンベロープバイトと署名記述子を書きます。オブジェクト ID はそのバイトの SHA-256 で、再試行は同じ ID を使います。CloudSyncWork は暗号文と一覧カーソルを返し、OAuth トークンは返しません。sync::execute はサービスミューテックスを保持せず、上限付きアップロード、ダウンロード、一覧取得を行います。CloudSyncAck はプロセスローカルのセッション世代を確認し、アップロードフラグ、発見 ID、ダウンロードバイト、保管庫マージを一緒にコミットします。記述子が先に届くとオブジェクト待ちになります。ロック、解除、ログアウトは世代を増やし、遅い確認によるインポートを防ぎます。

memories cloud sync はデーモンでトークンを更新し、OneDrive または Google Drive のアプリフォルダーでアップロード・ダウンロードします。この HTTP は書き込みロック外で動き、トークンは IPC で返しません。テストは MemoryTransport とループバックの Graph/Drive フィクスチャを使います。完了キューペイロードはハッシュ受領記録と、プロバイダー・受信者別の公開マーカーに圧縮します。記録はローカルに残り、クラウド履歴を削除しません。欠落オブジェクトは永続指数遅延で再試行します。保留容量は一覧取得にバックプレッシャーをかけます。プロバイダーワーカーはアカウントごとに直列で、無効セッションの更新・インポート結果を拒否します。

したがって CLI 認可と cloud sync は実装済みで、転送はローカルフィクスチャでテスト済みです。実際の OneDrive や Google Drive の同意、更新、2デバイス収束、オフライン再試行、取り消しは検証済みとして提供していません。モバイルのログイン・同期コントロールは AppAuth と共有 Rust ワーカーを使います。実同意とプラットフォーム検証はリリース条件です。モバイルのバックグラウンド同期は無効です。

取り消しはキュー済みクラウドエクスポートを破棄し、次のオブジェクト操作前に取得済み処理を無効化します。開始済みネットワーク要求は撤回できません。

明示的デバイス同期は別経路です。sync export と sync import は完全な認証済みエンベロープを交換します。オンラインの sync send と sync receive は同種パケットをステートレスリレーに渡します。送信成功はリレーの受信だけを意味します。未知の旧エポック書き込みは隔離し、ローカル確認後だけ sync reapply で再署名できます。権限分岐は両分岐で所有者である人が、選択ヘッドと破棄するポリシーチェーン全体に署名する必要があります。互換性のない所有権移転はブロックを維持します。

デスクトップ状態の境界

Request::DesktopStatus は初期化・ロック状態、ストア数と接続数、設定済みプロバイダー種別、同期キュー数を返します。解除操作のディスパッチ前に動き、暗号化状態の複製・コミット、アイドル・昇格タイマーへの接触、識別子、アカウント概要、コンテンツ、認証情報の公開を行いません。ロック中の応答にはこれらの詳細がありません。MCP 許可リストはこの要求を拒否します。

CLI ライブラリはローカルダッシュボードと Windows/macOS トレイを提供します。memories tray と独立した memories-tray はネイティブのメインスレッドイベントループを使います。HTTP サービスと上限付き状態プローブは別スレッドで動き、デーモンが忙しくてもトレイやブラウザーを妨げません。プローブは通常の OS 認証 IPC で同じディレクトリの CLI を呼び、期限を設け、子プロセスを片付けます。Windows パイプ読み取りのプローブ期限は3秒です。失敗時は詳細を消去し、ロックは次のポーリングで詳細を隠します。ポーリングは解除アイドル時間や昇格を更新しません。

HTTP 面は埋め込みリソースと固定の状態投影だけを提供し、任意のサービス要求をディスパッチできません。127.0.0.1 だけで待ち受けます。唯一のデータエンドポイントは GET /api/status で、プロセスごとにランダム生成する256ビットトークンで保護します。ランチャーはトークンを URL フラグメントに入れます。ページはアドレスバーから削除し、タブのセッションストレージにだけ保持して Authorization ヘッダーで送ります。起動 URL 全体がダッシュボード能力なので共有しないでください。予期しない Host、外部 Origin、クロスサイト取得メタデータは拒否します。CORS、第三者リソース、フレーム埋め込み、変更ルートはありません。ブラウザーが受け取るのは型付き状態投影で、汎用 IPC ブリッジ、認証情報、記憶本文、アカウント名、パス、認可トークンではありません。

トレイは明示的なメニュー操作でローカルデーモンを起動できます。トレイやダッシュボードを閉じると自身の HTTP リスナーと監視を停止し、独立デーモンを停止・解除しません。認証は引き続き CLI で行います。同じ OS アカウント内の悪意あるプログラムは既存のローカル信頼境界内です。

Linux ビルドは同じループバックダッシュボードとトークン境界の memories webui を含みます。ネイティブトレイイベントループは Windows/macOS でのみコンパイルします。Linux にネイティブトレイはありません。

ローカル TOML は秘密ではないストレージ、リレー、デスクトップ設定だけを含みます。明示指定したファイルの欠落、未知のキー、不正な値はストアを開く前に拒否します。相対ストレージパスは設定ファイル基準で解決します。パス変更は別ストアを選択し、データを移行しません。リレー URL は既存のリモート TLS 制約を維持し、認証情報を含められません。