参考文献 / アーカイブと連携機能
Telegram · Case Board の参照
ブックマーク、正確なハイライト、アクションスライス、ディスカッション、アクセス範囲の制限、および Case Board で使用される署名付き注釈履歴。
Case Board を使用すると、調査チームは保存された資料を共有して閲覧できます。 観察事項をブックマークしたり、特定の箇所をハイライトしたり、一連のアクションを保存したりして、同僚と議論することができます。 カードには、ソースへの参照情報と署名付きの改訂履歴が保持されます。チームの注釈は ワークスペース内に残り、元の Telegram の観察事項とは区別して識別可能です。

このページでは
案件の取り扱い#
「調査」→「ケースボード」を「標準」モードまたは「エキスパート」モードで開きます。言語設定はパネルの設定に従います。 ジャーナル記録や保存済みのチャットメッセージの横にある「ボードに追加」を使用するか、対象をフォーカスして B キーを押してください。 ワンクリックでブックマークが「受信トレイ」に追加されます。タイトル、ラベル、メモを編集したり、 コレクションに移動したりできます。変更されたカードには署名付きのリビジョンが追加され、削除しても履歴は保持されます。
最初のケースでは、収集対象を選択し、ある質問に対する答えとなる記録を追加してください。コメント機能を使用して 解釈を確認し、次に「プレゼンテーション」機能を使用してカードとソースの文脈を順を追って確認してください。 成果物を準備する際は、Report Studioで「Case Board」の素材を別途選択してください。 スライスを保存しても、レポートのデータフィルターは自動的に設定されません。
保存されたチャットメッセージ内のテキストを選択すると、「ハイライト → ボード」が表示されます。色を選択し、 メモを追加してください。サーバーは、絵文字、RTLテキスト、 結合記号を含め、正確な引用文と保存されたバージョンを確認します。インターフェースは、マスクされたテキストや変換されたテキストを通じて選択範囲をマッピングすることはありません。
1つのチャット内で2つのレコードをShiftキーを押しながらクリックして「その間のスライス」を作成するか、「時間によるスライス」を使用するか、または ジャーナルの現在のチャット、期間、イベント種類のフィルターを保存します。保存されたスライスには独自の 権威ある述語があり、ジャーナルでそれを開くと、複数のチャット、メッセージ数の制限、およびアクター フィルターも適用されます。 「ブックマーク以降に追加されたレコードを表示」を選択すると、後から追加されたレコードのみが表示されます。ジャーナルの フィルターを変更すると、スライスから抜け出します。「People」から「この人のアクションをスライス」を選択すると、記録されたアクターIDが使用されます。 メッセージの作成者がメッセージを編集、削除、またはリアクションしたかどうかは想定されません。
「スライス」ダイアログでは、作成を許可する前に件数がプレビュー表示されます。「all」には、スナップショット、編集、削除、リアクション、メンバーシップ/サービスの更新、自身のアクション、
ボタン、メディアの結果、復元されたメッセージ、および将来のイベント種別を含む、記録されたすべての種別が含まれます。この選択項目は、
保存された観測データを記述しています。 「不明なチャット」の削除通知は別のコンテキストであり、
ワークスペース全体へのアクセス権を持つユーザーのみが利用可能で、選択されたチャットいずれにも帰属することはありません。
コレクションには、チャット範囲が明示されています。範囲が空の場合は、ワークスペース全体を指します。コレクションには その範囲外のカードを含めることはできません。チャット範囲が限定された参加者は、より広範囲の コレクションを閲覧することはできません。受信トレイは、未割り当てのカードのための仮想コレクションです。 検索とフィルターは表示されている カードのみを対象とします。スレッドやメンションは親カードのアクセス権限を継承します。削除されたコメントには、 ディスカッション内に「トゥームストーン」が表示されます。閲覧履歴は記録されません。
プレゼンテーションモードでは、選択したコレクション内のすべてのカードが開かれ、「カード」、「ソースのコンテキスト」、および「チーム コメント」の各ビューと、キーボードによる「前へ」「次へ」の操作が利用可能です。編集機能は提供されません。通常の フィードはページ分割されており、プレゼンテーションモードではリストがページ単位で読み込まれ、カードの詳細が1件ずつ取得されます。
権限#
すべての操作には、view、ワークスペース/チャットのスコープ、および board.read が必要です。board.write により、カード、
コメントの追加、移動、および「オープン」/「レビュー」ステータスの設定が可能です。board.manage により、コレクションの管理、
「確認済み」/「却下」ステータスの設定、他者のカードの修正/削除が可能です。ステータスはチームによる
決定であり、暗号学的検証の結果ではありません。
アクセス権限のプリセット:レビュー担当者 = 閲覧;アナリスト = 閲覧/書き込み;オペレーター = 閲覧/書き込み/管理、 これらは既存の権限に追加されます。既存の権限によって、新たな権限が自動的に付与されることはありません。 メイン管理者はすべての権限を持ち、「メイン管理者」として投稿します。帰属を示すために名前付き権限付与を使用してください。 メンションには、親カードの全文を読み取ることができる現在のアクセス権のみがリストされます。
チャットAに対するアクセス許可では、IDを推測したり、
偽のtarget.chat_idを指定したりしても、A+Bのカードやスライスを取得することはできません。ターゲットのメタデータは、サーバー上の署名付きイベントハッシュから解決されます。
コレクション、ディスカッション数、関連カード、およびライブ通知は、応答前にフィルタリングされます。
エクスポートには、board.readに加えexport権限が必要です。ボードへのアクセス権を持たない既存のエクスポーターは、
チームノートを除いた通常の証拠アーカイブを取得します。SSEは、各バッチ処理の前に現在の権限を再確認します。
保存された契約書#
観察結果と同様に、注釈もワークスペース内の追記専用SQLiteテーブルにトランザクション形式で書き込まれます。
annotations.jsonlは、events.jsonlと同じ読み取り用スナップショットから生成された、その正確な正規形式のエクスポートデータです。
競合する別の注釈ストアは存在せず、board.activityジャーナルイベントもありません。
各行には、正確に以下の内容が含まれています:
{
"seq": 1,
"at": "2026-11-02T14:00:00.000+00:00",
"access_id": "admin",
"access_label": "Main administrator",
"kind": "board.bookmark",
"payload": {"id": "32 lowercase hex digits", "target": {"event_hash": "64 lowercase hex digits"}},
"previous_hash": "64 zeroes for the first record",
"hash": "SHA-256 described below",
"signature": "base64 Ed25519 signature"
}
上記の省略された例はエンベロープを示しています。実際のペイロードには、モデルの
デフォルト値およびサーバーで解決されたターゲットフィールドが含まれます。APIリクエストスキーマは
tgwitness/schemasにあり、python tools/build_board_schemas.pyによってランタイムのPydantic
モデルから生成されます。余分なリクエストフィールドは拒否されます。IDは
省略された場合、サーバー側で生成されます。 作成者、時刻、スナップショット、および署名は、
呼び出し元から指定することはできません。名前付きグラント ID は、Access の既存の 16 ヘックス形式に従い、カード ID は 32 ヘックスです。
正規化されたJSONはUTF-8で、オブジェクトキーはソート済み、トークン間の空白はなく、Unicodeはエスケープされておらず、
NaNや無限大は含まれません。注釈のハッシュは、
format: "tgwitness-annotations-v1"およびprevious_hashまでの7つのエンベロープフィールドすべてを含む正規化されたオブジェクトのSHA-256です。
このフォーマットタグは、そのハッシュドメインをオブザーベーションから分離します。 署名は、
32 バイトの生のハッシュ値に対する Ed25519 です。シーケンスは 1 から始まります。リビジョンではカード ID を保持し、supersedes フィールドに先行する
注釈ハッシュ名を指定します。チャットのスコープを変更することはできません。移動、ステータス変更、削除は
別々のレコードとして扱われます。SQLite テーブルは UPDATE および DELETE を拒否します。
case-board.jsonには{statement, signature}が含まれます。正規のステートメントは
ワークスペースキーによって署名され、format: "tgwitness-case-board-v1"、public_key、created_at、
journal_head、meaning、およびstateを含みます。Stateは決定論的なリプレイであり、annotations_head、
順序付けられたitems配列(コレクション、カード、コメント(トゥームストーンを含む))、およびstatus_historyで構成されます。
各項目は、リビジョンを跨いで、最後の注釈ハッシュ、シーケンス、作成者、時刻に加え、元の
作成者および作成時刻を保持します。リプレイ処理では、リビジョン、
親項目、コレクション参照、および重複するアクションIDがチェックされます。manifest.jsonおよび新しいチェックポイントも
annotations_headをバインドします。チェックポイントを独立して保持することで、切り捨てや、
コピーされた署名キーによる書き換えを検出します。
テキスト版#
range.startは0を起点とするUnicodeコードポイントのオフセット、lengthは正のコードポイント数であり、
quoteは、対象のイベントにおけるpayload.textまたはpayload.captionの正確な部分文字列と
一致する必要があります。NFC/NFKC、大文字小文字の変換、またはグラフェム正規化は適用されません。 Pythonの文字列スライスや
JavaScriptのArray.from(text)は、同じインデックス付けを実装しています。マークとZWJ絵文字を組み合わせると、
複数のコードポイントを占有する場合があります。range.versionはターゲットイベントのハッシュであり、現在のメッセージ
バージョンやTelegramのUTF-16エンティティオフセットではありません。その後の編集によって、ハイライトの位置が自動的に変更されることはありません。
識別情報と時刻の切り分け#
query は、chat_id を 1 つ、または空でない chat_ids を、オプションで範囲指定の from/to、
メッセージ ID の範囲(1 つのチャットのみ)、kinds: "all" または完全一致/プレフィックスワイルドカードの種類、
明示的な actors、search、hide_system、および include_unscoped を正確に受け入れます。ジャーナルの種類グループは、
その正確な述語に展開されます。 検索では、署名付きソーステキストを変更することなく、ジャーナルのNFC/大文字小文字を区別しないペイロード検索が使用されます。
日付にはタイムゾーンが必要であり、UTCに正規化されます。
日付は observed_at をフィルタリングします。Telegram の source_at は別途表示されます。ソースのタイムスタンプがない
削除には、生成された削除時刻はありません。時間間隔の外で観測された遅延レコードは
その間隔には含まれません。メッセージ ID のスライスには、それらのメッセージ ID に対する後の削除が含まれる場合があります。
snapshotは、作成時刻、ジャーナルのシーケンス/ハッシュ境界、一致数、最初/最後の
シーケンス、およびresult_hashを固定します。後者は、一致した
イベントハッシュのUTF-8正規化JSON配列のSHA-256ハッシュであり、空のスライスの場合は[]を含み、辞書順にソートされています。 また、正確な
種類数と、24 ビンの観測時刻のミニチュアも含まれます。スライスはクエリを保存するものであり、重複するソース
レコードを保存するものではありません。エクスポート時、board/slices/<id>.jsonには現在のハッシュと、追加・削除されたシーケンスがリストされます。
検証ツールは、作成時点での結果、続いて現在の結果を再構築します。
追加されたレコードは変更事実として報告されます。元のイベントを削除すると、不変の
証拠チェーンが断たれます。これは、スライスからの通常の削除として黙認されることはありません。
リアクションのスナップショットには、最近のアクター一覧が不完全な場合があります。エクスプローラーは、同じチャット/メッセージの隣接するスナップショット (スライス外の先行スナップショットを含む)を比較し、観測値間の集計カウントの 差分を報告します。欠落している最近のアクターについては、リアクションが削除されたとはみなされません。 最初のスナップショットには、推論された以前の状態は存在しません。アクターの観測値は、 架空のアクション時刻ではなく、それらが提供されたスナップショットに帰属したままとなります。
API およびエクスポート#
GET /api/boardは、collection/chat/author/label/state/from/to/q/kind/comments、offset/limit
およびnewest/oldest順序を受け付けます。GET /api/board/card/{id}は、カード、ソースのプレビュー、スレッド、
ステータスの履歴、および関連カードを返します。participantsサブルートは、該当するメンションの選択肢を返します。
POST /api/board/{bookmark|highlight|slice|collection|comment|status|move|remove}はレコードを追加します。
POST /api/board/slice-previewはクエリを計算します。スライスレコードは
GET /api/board/slice/{id}/recordsでページ分けされます。再計算には常に最新の安定した読み取りスナップショットが使用されます。
ライブ /api/streamは、ジャーナルカーソルとは別に、ペイロードを含まないboard通知を送信します。
GET /api/board/exportは署名付きドキュメントを返します。チャット限定アクセスでは、明確にラベル付けされた
署名付き開示情報を受け取りますが、他のチャットの注釈や完全なメッセージチェーンは一切含まれません。完全な証拠用ZIPファイルには、
annotations.jsonl、署名付きcase-board.json、およびスライスJSONの付録が含まれます。 HTML/PDF/JSONレポートの
設定では、「ボードなし」、「議論のないブックマーク/スライス」、または「コメント付きのカード」を選択できます。この
セクションでは、チームの意見と観察結果を明確に区別しています。レポートデータのフィルタは、
閲覧可能なメモも制限しますが、証拠用ZIPファイル内の完全な署名済みソースファイルは完全な状態で保持されます。
GET /api/board/slice/{id}/export は、署名付きの tgwitness-board-selection-v1 JSON 抜粋を生成します。
?format=csv は、独立した署名のない、扱いやすい表形式のデータを生成します。JSON と ZIP はそのまま維持してください:
python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_KEY_SHA256 --board
python -m tgwitness.verify board-slice.json --evidence evidence.zip --fingerprint TRUSTED_KEY_SHA256
python -m tgwitness.verify case-board.json --evidence evidence.zip --fingerprint TRUSTED_KEY_SHA256
選択チェックでは、署名付きステートメント、正確なソースレコード、および指定された境界におけるクエリの完全性が 検証されます。証拠用ZIPファイルは新しいものであっても構いませんが、その プレフィックスを含まなければなりません。未解決のターゲットは明示的に報告されます。元のスライススナップショットの不一致、変更された 注釈、リプレイ状態の不一致、またはソースの変更があった場合は失敗となります。 注釈のない古いアーカイブについては、 既存の検証動作が維持されます。
引き継ぎのデフォルト設定は「含めない」です。 明示的な含め設定では、すでに
最小化された記録を通じてカードを表示し、アクセス不能または省略された対象を省き、ソーステキストが
最小化されたハイライトを非表示にし、同じメンション/連絡先ルールでチームテキストをクリーンアップし、オプションで
メタデータおよびノート内の既知の出現箇所において、調査員ラベルを R01、R02… に置き換えます。 元の
annotations.jsonlは開示されません。署名済みのtgwitness-case-board-handover-v1サイドカーおよびレポートには、
同じ最小化された資料が含まれています。スライス数は開示されたレコードのみを表しており、元の
スナップショット/クエリのアクターの詳細は非開示となります。 ミニマイザーが認識していないフリーテキストの名称については、通常の引き継ぎと同様に、
引き続きレビューが必要です。この派生データは、編集後の元の
注釈の署名を保持することを保証するものではありません。
運用上の制限#
パラメータには、カード数10,000件およびコメント数50,000件のソフトリミット、最大5,000 件のレコードを含むスライスページ、およびメディアプレビュー制御が含まれます。ソフトリミットに達した場合、履歴は削除されず警告が表示されます。 フィードページは 最大200カードです。スタンドアロンのJSONスライス抜粋は64 MiBまでです。クエリを絞り込むか、 大容量のデータには署名付きZIPを使用してください。スタンドアロン検証ツールでは、注釈の再生は256 MiBまでです。 Case Boardでは、外部へのコメント通知は有効化も実装もされていません。
この機能の自動受け入れテストでは、架空のデータとシミュレートされたTelegram通信を使用して、 保存、アクセス、表示、およびエクスポートを確認します。証拠チェックの範囲については、「検証範囲」 を参照してください。