アーキテクチャとプロトコル v1
ストレージ
データベーススキーマは header、state、checkpoints で構成されます。形式のメタデータ、ソルト、行の連番を除き、値は認証付き暗号文です。ジャーナルにも暗号文が含まれます。永続的な平文 FTS インデックスはありません。アクセスが許可された通常のメモリは、Unicode を安全に扱う重複付きチャンクに分割され、Jieba でトークン化された後、メモリ内 SQLite FTS5 インデックスに格納されます。キャッシュは保管庫のポリシー、リビジョン、隔離状態をキーとしてクエリ間で再利用されます。編集、同期、ポリシー変更で無効化され、ロックで消去されます。SQLite の一時ストレージは意図的にメモリのみに限定されています。ベクトルは正規化され、メモリ内にのみキャッシュされます。平文インデックスも埋め込みも、バックアップや同期のペイロードには含まれません。
パスワードから導出した鍵でランダムなマスター鍵をラップし、マスター鍵で状態とローカルチェックポイントを暗号化します。各権限エポックには保管庫鍵があり、各リビジョンには、そのエポック鍵でラップされたランダムなデータ鍵があります。コンテンツはシリアライズされ、それぞれ個別に認証される 256 KiB のチャンクに分割されます。チャンクの位置と総数は関連データに結び付けられます。リビジョン署名は、アセット ID、親、ポリシーヘッド、削除マーカーフラグ、暗号文、デバイス証明書を対象とします。
変更は複製した状態上で準備され、暗号化された状態とチェックポイントとともに、synchronous=FULL を使った単一の SQLite トランザクションでコミットされます。読み取りと実行の意図は、配信前にコミットされます。そのためディスク障害時には配信が拒否されます。意図のコミット後にクラッシュすると、結果が不明になる場合があります。
排他的な OS ロックにより、協調するローカル書き込みプロセスは 1 つに限定されます。初期化では同じディレクトリ内に完全なデータベースを構築し、閉じて同期した後、既存の宛先を上書きせずに公開します。ステージングが中断されても再試行を妨げません。各デバイスには専用のローカルストアが必要です。クラウド同期クライアントで稼働中の SQLite ファイルをコピーしても、複数デバイス間のトランザクション安全性は得られません。
ID とトランスポート
ユーザーの Ed25519 鍵は、デバイスの Ed25519 署名鍵と X25519 交換鍵を認証します。証明書だけでは不十分で、各保管庫ポリシーがデバイスを明示的に許可します。同じユーザーに属するデバイスも含め、デバイス鍵は独立しています。初期のユーザー署名権限は、認証付きの受信者向け暗号化パケット内で、承認された個人用デバイスに配信されます。デバイスが失効した後、この権限で保管庫のデバイス許可リストを回避することはできません。
エンベロープには、形式のバージョン、送信元デバイス鍵、受信者交換鍵、一時的な X25519 公開鍵、AEAD ペイロード、Ed25519 署名が含まれます。HKDF がトランスポート鍵を導出します。受信者の ID と一時鍵は認証されます。参加するデバイスは有効期限付きの署名済みリクエストを使い、承認するデバイスの公開鍵を明示的に固定します。リクエストはコミット成功後にのみ消費されます。
初回リリースでは、カメラによる QR スキャンではなく、リクエストと承認の文字列およびファイルを使います。フィンガープリントは完全な SHA-256 ダイジェストです。リストに表示される短縮値だけを承認確認に使ってはいけません。
ポリシーとマージ
保管庫ポリシーは、メンバーシップ、ロール、デバイス許可リスト、単調に増えるデバイス失効集合、エポックを含む署名済みの線形履歴です。ロール確認には直前のポリシーを使います。通常のユーザーは、メンバーシップを変更せずに自分の ID に対して別のデバイスを許可できます。Admin は Admin、Editor、Reader のメンバーシップを変更し、メンバーのデバイスを許可できます。Admin は Owner の追加、削除、変更、デバイスの失効、所有権の移転を行えません。Owner はこれらを行えます。所有権の移転後も Owner は厳密に 1 人です。
アセット履歴は、編集可能なすべての種類(メモリ、カード[knowledge、brain、persona、保護カードのメタデータを含む]、ファイル、認証情報)で共有するコンテンツアドレス方式の DAG を形成します。保存ごとに署名済みリビジョンが追加されます。wiki 専用の別の履歴ストアや自動削除はありません。history は作成者と要約を付けてリビジョンを一覧表示します。diff は 2 つのリビジョン間、または現在の HEAD との間の統一テキスト投影(タイトル、構造化メタデータ、本文)を返します。ファイルの差分はバイナリペイロードを省略し、認証情報のシークレット本文は読み取りや差分では取得できません。アセットに未消費のリビジョンが複数ある場合は競合です。解決リビジョンは、可視の親すべてを指定します。削除マーカーは履歴を削除せず、現在のビューからアセットを除外します。
同期は、候補状態にマージする前にポリシー、リビジョン、監査の完全な履歴を検証します。置き換えられたエポックからの未知の書き込みは隔離されます。受信した新しいポリシースナップショットに含まれないローカルのオフライン書き込みも隔離されます。隔離の確認と再適用はローカルでのみ可能で、信頼できない受信フィールドでは解除できません。
権限の分岐を解決するには、選択したヘッドと破棄するポリシーチェーン全体に対する所有者の署名が必要です。署名者は両方のブランチで所有者でなければなりません。破棄したポリシーも、過去または隔離されたリビジョンの検証用に保持されます。解決に成功すると、選択したポリシーを進めて鍵をローテーションします。競合する解決や互換性のない解決は、安全側に倒して拒否されます。
ローカル API
service::Request は共有の型付き操作インターフェースで、snake case の op 識別子を使ってシリアライズされます。未知のトップレベルフィールドは拒否されます。ローカル IPC は、ビッグエンディアンの 32 ビット長を前置した JSON フレーム(バージョン 1 の Wire ラッパー)を使います。任意の HTTP/WebSocket 待ち受けとリレー RPC は、トークン認証後に同じ WebSocket バイナリ JSON フレーミング(AuthFrame、続いて Wire)を使います。MCP の能力はディスパッチ前に別途確認されます。RunBound は RemoteExec と同様にディスパッチされます。run_bound_prepare はサービスロック内で許可と復号を行い、IPC スレッドはロックを解放してプログラムを実行し、run_bound_finish が結果を監査します。実行バインディングは保管庫ではなく、デバイスローカルの State.run_bindings に保存されます。
ネットワークトランスポートは、トークン認証済みのフレーム化された Requests を運べます。トークンはフラグまたは環境からのみ取得し(TOML からは取得しません)、定数時間で比較され、ストアのロック時に消去されます。リモート呼び出し元は安定した昇格名前空間(ws:remote / relay:remote)を使い、ローカルの cli:{pid} の昇格を継承しません。リモート接続経由のロック解除と sudo はその名前空間を昇格させるため、CLI の単発接続でも昇格が維持されます。デスクトップの HTTP/リレーホストは、handle_client の全機能をディスパッチします(ローカル IPC と同じ昇格ゲートを使います)。モバイル FFI と Share はプラットフォームの拒否リストを維持し、デスクトップ専用機能を電話に追加しません。HTTP 待ち受けは既定でループバックです。ループバック以外へのバインドには --allow-non-loopback と警告が必要です。通常の HTTP/WS に証明書は不要で、--tls-cert / --tls-key により HTTPS/WSS を有効にできます。リレー RPC は信頼境界の外側で WSS と高エントロピーのルーム ID およびトークンを使います。保管庫同期は /v1/channel を維持します。WebUI は読み取り専用の状態投影と制限付きの通常カードエディターを提供し、Request トランスポートではありません。リモートデーモン と SECURITY.md を参照してください。
任意の認可 Center(設定の [[centers]])は、ローカルでの自己ブートストラップと MCP 権限付与の発行を禁止します。登録と権限付与は、明示的なスコープ(allow_all / read / write / read_write / read_write_delete)を持つ Center 署名済みチケットとして配布されます。Center を参照してください。
任意の Center ホストモード(--data DIR)は、DIR/store/ 配下に独立したデーモン形式の暗号化 Store を持ち、運用者が保持するサーバーパスワードで開きます。HTTP コンテンツ RPC は、Service 内の閉じた保管庫単位の権限ディスパッチャーを使います。操作内だけの昇格で保護コンテンツ、プライベートコンテンツ、添付ファイルを扱い、デーモンの MCP 認可は変更しません。これはサーバー側の暗号化であり、クライアントのエンドツーエンド暗号化ではありません。別の管理 HTTP ルートが、ホストストアのロックと解除、および所有者だけがアクセスできる DIR/members.json 内の永続的な名前付き権限付与を管理します。署名済み解除チケットは、ローカルデバイスでのパスワードによる解除だけを許可します。チケット専用 Center にデバイス鍵が渡ることはありません。単一の [[centers]] エントリーで mode = "saas" を指定することにより、デーモンのコンテンツ RPC は、そのホストバックエンドと環境の bearer を使います。並行するローカルコンテンツ経路や MCP 能力の昇格はありません。デバイスと管理操作は、権限付与によるコンテンツ機能に含まれません。境界と移行については Center のホスト型保管庫 を参照してください。
モバイル ABI は crates/ffi/memories.h で宣言されています。ハンドルは数値のレジストリ ID であり、生の Rust ポインターではありません。返された各文字列は memories_free で一度だけ解放する必要があります。不正な JSON には、入力を再表示しない汎用エラーを返します。memories_lock_all はバックグラウンド移行時にグローバルなロック世代を進め、遅れて届く処理中の応答を抑止します。レジストリは、参照カウント付きのハンドルごとのサービスロックを保持します。ネットワーク処理はレジストリや書き込みロックを保持しません。使用中のハンドルは、次のリクエスト前に保留中のロックを適用します。モバイルではプロセス実行と MCP 権限付与の作成を除外します。
Flutter のモード選択(mobile/lib/app_mode.dart)は、Standalone をローカルライブラリに、Center/SaaS を HostedCenterPage に振り分けます。ここで Center はホストストレージを備えたセルフホストサーバーを意味し、SaaS は固定の https://memories.ivjn.us エンドポイントを選びます。どちらも同じ Rust の hosted_* FFI 操作と HostedClient を使います。この選択はデーモン TOML の変更、チケット管理デバイスの登録、ストア間のデータ移動を行いません。
選択したモードは秘密ではない設定です。Center と SaaS は、それぞれ 1 つの URL/トークンプロファイルをプラットフォームのセキュアストレージに保存します。切り替え時にはローカルサービスをロックし、共有を停止し、ホストページとセッションを破棄します。バックグラウンド移行でホストコンテンツを消去し、遅延応答を無効化します。復帰後の再接続は明示的に行います。プロファイルキーとアップグレード時の動作はモバイル設定、利用者向けの手順はモバイルガイドを参照してください。
デスクトップトレイと状態投影
Request::DesktopStatus は、初期化とロック状態、ライブラリ数と接続数、設定済みプロバイダーの種類、同期キュー件数の型付き投影を返します。ロック解除後の操作ディスパッチより前に実行され、暗号化状態の複製やコミット、アイドルや昇格のタイマーへの接触、識別子、アカウント要約、コンテンツ、認証情報の公開を行いません。ロック中の応答には詳細がありません。既存の MCP 許可リストはこのリクエストを拒否します。
CLI ライブラリはローカルダッシュボードと Windows/macOS トレイをホストします。memories tray と独立した memories-tray ランチャーは、どちらもネイティブのメインスレッドイベントループを使います。HTTP サーバーと制限付きの状態プローブワーカーは別々に動作し、デーモンが使用中でもトレイやブラウザーを妨げません。プローブは通常の OS 認証済み IPC を使って同じ場所の CLI を呼び出し、期限と子プロセスの後処理を備えます。HTTP 機能は埋め込みアセット、固定の状態投影、明示的な通常カードと型の編集許可リストを提供します。ロック解除、昇格、シークレットの表示、任意のサービスリクエストのディスパッチは行えません。トークンとブラウザーのオリジン境界は SECURITY.md、使用方法はデスクトップの利用を参照してください。
検索とモデルのオーケストレーション
search::Cache は最大 2 つの保管庫インデックスを所有し、各インデックスは 10,000 チャンク、元のテキストとメタデータ 16 MiB、ベクトル 32 MiB に制限されます。インデックス作成前に、プライベートコンテンツ、認証情報、ファイル、削除済み、隔離済み、競合中のコンテンツを除外します。BM25 のタイトル/本文/メタデータの重みは 5/1/2 です。ベクトル検索はコサイン類似度を使い、ハイブリッド検索は reciprocal-rank fusion で両方の順位を統合します。既定の再ランキングは、制限された候補集合内でクエリの網羅率と完全一致フレーズを優先します。設定したモデルエンドポイントで、学習済み再ランキングを行うこともできます。
Retrieve、RagIndex、RagStatus、RagAsk は、保管庫の認可と MCP 権限付与のスコープを維持します。IPC はサービスのミューテックス外でモデル処理を行い、外部処理の前後と配信前に、解除世代、権限付与の有効性、アクセス権、ソースリビジョンのスタンプを再確認します。署名済みの意図は推論やエクスポートに先行します。成功、失敗、配信したソース ID は、プロンプトや鍵を含めずに監査されます。ソースのアセットとリビジョンの参照は、共有の短縮 ID 投影を使います。チャンクハッシュと [S1] の引用ラベルはアセット ID ではありません。
rag::Runtime はネイティブ ONNX 推論と固定された EmbeddingGemma Q4 アセットを遅延読み込みするか、設定された Gemini/互換の埋め込み URL を呼び出します。設定された生成 URL と再ランキング URL、環境参照の API キー、プロキシ、再試行にも対応します。ネイティブモデルファイルは公開モデルデータであり、暗号化されたユーザーレコードがモデルの重みになることはありません。取得したテキストは生成プロンプト内の信頼できないデータとして扱われ、返された引用 ID は選択したソースに照らして検証されます。これは参照の検証であり、モデルが生成した文章の事実上の正確さを検証するものではありません。
モバイル FFI は改善された字句検索を利用し、BM25 の retrieve に対応します。モデルを使う操作は現在、設定されたデスクトップデーモンを使います。このリリースでは Flutter にモデル設定やモデル推論の UI を追加しません。
デスクトップの暗号処理ジョブ
jobs::Job はツール、固定された入力ファイルとツリー、認証情報バインディング、順序付きの手順、後処理、新しい出力先パスを記述します。CLI の crypto レシピは、S/MIME/OpenPGP と Android/iOS の署名用にこの計画を構築します。承認は短縮 ID の解決前に確認されるため、そのダイジェストは呼び出し元に表示した参照に厳密に結び付けられます。サービスはローカル昇格と保管庫アクセスを確認し、認証情報アセットだけを解決して実行意図をコミットした後、共有コアのランナーを呼び出します。
ランナーはツールを再確認し、入力をコピーして検証し、非公開の作業領域に認証情報を展開します。シェルを使わずにコマンドを実行し、出力を抑止して、成功した成果物だけを公開します。プレースホルダー展開はパスだけを置換し、パスの内容を再帰的に解釈しません。MCP の許可リストとモバイル FFI はプロセスジョブを拒否します。既存の run の意味は変わりません。
AI クライアントスキル
memories inject は CLI 専用のインストール操作です。skills.rs は、バージョン管理された crates/cli/skills/memories/SKILL.md を実行ファイルに埋め込み、文書化された Codex、OpenCode、Claude Code の検出ディレクトリにインストールします。データホームの作成前に動作し、ストアを開いたりデーモンを呼び出したりしません。ユーザーとプロジェクトのスコープは同じ指示文を共有し、ストアパス、保管庫 ID、権限トークン、秘密情報をその文に埋め込みません。
インストーラーはすべての対象を事前確認し、同一のファイルを保持します。内容が異なる場合は --force が必要で、リンクされたスキルファイルやディレクトリを拒否します。各ファイルは宛先ディレクトリ内の同期済み一時ファイルを使って公開します。新しいファイルは、同時に作成されたファイルを上書きせずに公開されます。これはファイル単位の原子性であり、クライアント間のトランザクションではありません。既存の同階層リソースとクライアント設定は保持されます。スキルは通常検索、引用付き検索、設定済み回答、書き込みを既存の MCP または CLI インターフェースに振り分けます。認可能力を追加するものではありません。
クラウド認可
デスクトップ CLI は、PKCE、ループバックコールバック、固定プロバイダーエンドポイントを使ってブラウザー OAuth を実行します。CloudBegin は sudo 下で、呼び出し元、プロバイダー、クライアントに結び付いた期限付きチケットを作成します。ネットワークリクエストはデーモン外で動作し、CloudComplete がコミット前にチケットと現在の認可を確認します。ロック、ログアウト、再起動は保留中のチケットを無効化し、遅れた結果によるログイン復元を防ぎます。
State.cloud_accounts はトークンをローカルデバイス上に暗号化して保存します。状態表示はアカウントのメタデータだけを返し、バックアップ、ペアリング、保管庫同期、MCP はトークンを除外します。ログインしても保管庫のメンバーシップは確立されません。
クラウドオブジェクト同期
State.cloud_sync は、同じ暗号化状態 blob 内に永続的な outbox/inbox 受領記録を保持します。CloudSyncEnqueue は、トランスポート I/O の前に、正確にシリアライズされたエンベロープのバイト列と署名済み記述子を書き込みます。オブジェクト ID はそのバイト列の SHA-256 で、再試行時にも再利用されます。CloudSyncWork は OAuth トークンを含めずに暗号文と一覧カーソルを返します。sync::execute はサービスのミューテックスを保持せず、制限付きの put/get/list を行います。CloudSyncAck はプロセスローカルのセッション世代を確認した後、アップロードフラグ、検出した ID、ダウンロードしたバイト列、保管庫のマージをまとめてコミットします。オブジェクトより先に届いた記述子は保留されます。ロック、解除、ログアウトはセッションを進めるため、遅れた確認応答でインポートすることはできません。memories cloud sync は、デーモンにトークン更新と OneDrive または Google Drive のアプリケーションフォルダー経由のアップロードとダウンロードを依頼します。その HTTP 処理は書き込みロック外で動作します。トークンを IPC 経由で返すことはありません。テストでは MemoryTransport とループバック Graph/Drive フィクスチャーも使います。完了したキューのペイロードは、ハッシュ受領記録とプロバイダー/受信者ごとの公開スタンプに圧縮されます。受領記録はローカルに残り、クラウド履歴を削除しません。見つからないオブジェクトは永続化された指数遅延で再試行し、保留容量によって一覧取得にバックプレッシャーをかけます。プロバイダーワーカーはアカウント単位で直列化され、無効化されたセッションからの更新とインポートの結果を拒否します。IPC ディスパッチは同時接続を最大 16 に制限します。
リモートセッション
デスクトップデーモンは SSH、FTP、TCP、MySQL、Redis、PostgreSQL の接続を所有します。RemoteOpen は認証情報のホスト許可リストを検証し、接続意図を記録してから、書き込みロック外で接続します。SSH はパスワード認証情報またはインポートした OpenSSH 秘密鍵で認証し、任意で OpenSSH 証明書の認証情報を追加できます。CredentialGenerate は sudo 下で SSH 鍵と TLS 証明書を生成します。秘密鍵は認証情報として保存され、返されません。CredentialPublic は保存された情報から SSH 公開鍵または PEM 証明書を導出します。データベースセッションは既定で TLS を有効にし、任意の PEM CA 認証情報(tls_ca)をクライアントのトラストストアに追加できます。ホスト名検証は必須で、証明書のピンニングは実装されていません。各命令はチケットとして提案され、そのフィンガープリントはセッション、連番、正規化された命令を対象とします。RemoteApprove は一度だけ使用でき、昇格した呼び出し元に結び付けられます。RemoteExec は既存セッション上でそのチケットだけを実行します。ロック、アイドル期限切れ、ログアウトは、稼働中の接続と保留中のチケットを破棄します。ファイル操作は FTP を使い、SSH とデータベースのセッションは exec/query を受け付けます。ProxyStart は RemoteOpen と同じ認証情報とホスト許可リストの確認後に、ループバックリスナーをバインドします。ローカルクライアントはシークレットなしで接続し、デーモンが上流の SSH またはデータベースの認証情報を保持します。proxy.start はバインド前に接続意図を、proxy.stop は停止意図を記録します。バインド済みソケットは、閉じて再バインドする期間を挟まずに直接 Tokio に移されます。PostgreSQL SSLRequest と MySQL SSLRequest は TLS アップグレードに先行し、Redis は直接 TLS を使います。PostgreSQL SCRAM は nonce とサーバー署名の両方を確認します。MySQL はプラグイン切り替えを含む native と caching-SHA-256 の認証に対応し、完全なパスワード交換には TLS が必要です。データベースのハンドシェイクは期限が 30 秒、パケット上限が 64 KiB、リスナーごとのクライアント上限が 16 です。ローカルのデータベース区間は平文で、ログインとデータベース起動のフィールドは設定済みの上流 ID を上書きしません。ローカルクライアントは、そのアカウントの権限内で制限のないリモート命令を許可します。ループバックはユーザー単位の認証を提供しません。ロック、保管庫のアイドル期限切れ、明示的な停止、サービスの破棄は、リスナーとアクティブセッションをキャンセルします。プロキシの最長寿命は 30 分で、通信が保管庫の解除期間を延長することはありません。MCP はプロキシを管理できません。サービスは各プロキシワーカーを所有し、停止またはロック時に終了を待つため、成功応答と、まだ命令を転送中の接続が競合することはありません。
設定ファイルの実行
memories file exec は、既存の認可済み Read リクエストと、CLI ローカルのファイル展開およびプロセス監督を組み合わせます。新しいサービスリクエスト、ファイル種類、暗号方式、モバイル/MCP 実行権限は導入しません。デーモンは既存の読み取り経路でファイル配信を監査し、その後 CLI はサービスロックを占有せずにフォアグラウンドの子プロセスを実行します。CLI は直接の子プロセスが終了するまで一時的な平文スナップショットを所有します。その後の保管庫変更やロックは、すでに配信されたスナップショットを変更または失効させません。
復旧
バックアップは、独立した Argon2id/AEAD エンベロープ内に、署名済みのローカル状態と秘密の復旧情報を含みます。復旧は新しいデバイス鍵を生成し、独立した保管庫 ID を作成して、現在のコンテンツと競合ヘッドを保持します。元の署名済み履歴は、暗号化された読み取り専用アーカイブに保持されます。復旧は過去の共有メンバーシップが今も有効だとは主張しません。デバイス専用保管庫、クラウド認可、クラウドの outbox/inbox 受領記録は除外されます。復旧した各デバイスは、クラウドプロバイダーに個別にサインインします。
カードと安全な投影
Kind::Card は通常のメモリと認可を共有し、型付きメタデータを暗号化リビジョン内に保存します。CardLink は同じ保管庫内の有向エッジを追加します。グラフは、現在の曖昧さのない可視ノードと、両端が可視のエッジだけを投影します。検索は前述の制限付きメモリ内 FTS5 キャッシュを使い、通常本文、タグとソース、許可リストにある保護カードのメタデータを対象とします。認証情報の本文がこのインデックスに入ることはありません。検索、一覧、グラフは安全な summary 投影を公開します。カード読み取りは不透明な認証情報参照を保持しますが、その値を解決しません。
protected_card は account/env/token/TOTP/HOTP 入力(otpauth URI インポートを含む)を検証し、認証情報とそのカードを 1 つの候補状態に書き込み、両方を一緒にコミットします。汎用の put は保護参照の追加や置換を行えません。シークレット操作は現在の認証情報リビジョンを解決し、その種類を確認します。otp_code は RFC 6238(TOTP)と RFC 4226(HOTP)を実装し、同じコミットで HOTP カウンターを進め、コードを返す前に配信意図を記録します。HTTP ヘッダー構築は bearer/cookie の値を機密としてマークし、リダイレクトを無効にして応答を抑止します。
メモリとカードのコンテンツには、安定したラベルから正規の認証情報アセット ID への secrets マップを含めることもできます。protect_secret は本文の完全一致箇所を {{secret:LABEL}} に置換し、同じトランザクションで認証情報を作成します。汎用の put は既存マッピングを変更せず維持する必要があり、新しいマッピングの作成や参照先変更は行えません。CLI とモバイルの編集は既存マップを引き継ぎます。MCP の card_write はマップを省略するため、シークレット参照を持つカードの更新は検証に失敗します。クライアント投影は型付き認証情報 ID だけを短縮し、本文マーカーは変えません。バックアップ復旧は曖昧さのないアセット ID を保持するため、マッピングは復旧後も存続します。credential_copy はラベル、保護カード、または認証情報を直接解決し、ローカル昇格を要求します。クリップボードクライアントに UTF-8 平文を返す前に監査意図をコミットします。MCP はこの 2 つの新しい操作を拒否します。汎用の読み取り、検索、グラフ操作でシークレットを解決することはありません。署名済みの過去本文は置換によって変化しません。SECURITY.md の wiki とクリップボードの制限を参照してください。
サービスは、認可されたローカルコピー呼び出し元にだけ {"secret":"..."} を返します。CLI は clipboard.rs でこの応答を消費し、クリップボードへの書き込み成功後にだけ、通常の出力エンベロープ内で {"copied":true} を返します。モバイルは Flutter のクリップボードチャネルを使い、配信前にライフサイクル世代を確認します。監査は credential.copy を delivery_intent として記録し、OS クリップボードの成功受領記録としては扱いません。利用ガイドを参照してください。
State.local_vaults は、暗号化されたローカル状態内でデバイス専用保管庫を示します。local_config は、クライアントが収集したバージョンとディレクトリのメタデータを、そのような保管庫の 1 つに記録します。デバイス承認はこれらの保管庫を除外します。直接のメンバーシップエクスポートと同期は拒否され、store::backup はエクスポートスナップショットから削除します。曖昧さのないアセット ID は、新しい保管庫への復旧後も存続し、グラフとカードから認証情報への参照を保持します。元の署名済み履歴はアーカイブに残ります。