TgWitness / مستندسازی

آنچه آزمایش شده است ←

منبع / آرشیو و یکپارچه‌سازی‌ها

Telegram · مرجع Case Board

نشانک‌ها، برجسته‌سازی‌های دقیق، برش‌های عملیاتی، بحث‌ها، دسترسی محدودشده و تاریخچه حاشیه‌نویسی امضا‌شده مورد استفاده در Case Board.

TgWitness / مستندسازی · تحقیق

تحقیق

کیس‌بورد یک نمای کاری مشترک از مطالب ذخیره‌شده را در اختیار تیم تحقیق قرار می‌دهد. یک مشاهده را بوکمارک کنید، یک بخش دقیق را برجسته کنید، یک مجموعه از اقدامات را ذخیره کنید و آن را با همکاران خود بحث کنید. کارت‌ها ارجاع منابع و تاریخچه بازبینی امضا شده خود را حفظ می‌کنند. حاشیه‌نویسی‌های تیمی در فضای کاری باقی می‌مانند و به طور جداگانه از مشاهدات اصلی تلگرام قابل تشخیص هستند.

مدل مدرک · دسترسی · گزارش‌ها

جریان کاوش مصنوعی

در این صفحه

کار با یک پرونده#

پرونده را در حالت استاندارد یا حرفه‌ای باز کنید. زبان با پنل مطابقت دارد. از دکمه «To» در کنار یک رکورد دفترچه یادداشت یا پیام چت ذخیره شده استفاده کنید، یا روی آن تمرکز کرده و کلید B را فشار دهید. نشانک با یک کلیک به صندوق ورودی اضافه می‌شود. عنوان، برچسب‌ها و یادداشت آن را ویرایش کنید، یا آن را به یک مجموعه منتقل کنید. یک کارت تغییر یافته، یک نسخه اصلاح‌شده امضا شده را ضمیمه می‌کند؛ حذف آن، تاریخچه را حفظ می‌کند.

برای اولین مورد، یک مجموعه را انتخاب کرده و سوابق پاسخ‌دهنده به یک سؤال را اضافه کنید. از نظرات برای بازبینی تفسیر و سپس از Presentation برای مرور کارت‌ها و زمینه منبع استفاده کنید. هنگام آماده‌سازی محصول نهایی، موارد Case Board را به طور جداگانه در Report Studio انتخاب کنید. ذخیره یک برش (slice)، فیلترهای داده گزارش را به طور خودکار پیکربندی نمی‌کند.

برای باز کردن هایلایت در بورد، متن داخل یک پیام چت ذخیره شده را انتخاب کنید. رنگ آن را انتخاب کرده و یک یادداشت اضافه کنید. سرور نقل‌قول دقیق و نسخه ذخیره شده را، شامل ایموجی، متن راست‌خوان و علائم الحاق، بررسی می‌کند. رابط کاربری انتخاب را از طریق متن‌های مخفی‌شده یا تغییر یافته اعمال نمی‌کند.

برای برش بین دو رکورد در یک چت، دو رکورد را با کلید Shift کلیک کنید تا از برش بر اساس زمان استفاده کنید، یا فیلترهای فعلی چت، دوره و نوع رویداد ژورنال را ذخیره کنید. یک برش ذخیره شده، گزاره معتبر خود را دارد: باز کردن آن در ژورنال، چندین چت، محدودیت‌های شماره پیام و فیلترهای بازیگر را نیز اعمال می‌کند. نمایش سوابق اضافه شده از زمان نشانک، افزوده‌های بعدی را جدا می‌کند. تغییر فیلترهای ژورنال، اسلایس را خروجی می‌دهد. از بخش افراد، اسلایس کردن «اقدامات این شخص» از شناسه بازیگر ثبت‌شده استفاده می‌کند؛ این اسلایس فرض نمی‌کند که نویسنده پیام، پیامی را ویرایش، حذف یا به آن واکنش نشان داده است.

پیش‌نمایش کادر محاوره‌ای، پیش از اجازه دادن به ایجاد، شمارش‌ها را نمایش می‌دهد. all شامل هر نوع رکورد شده است، از جمله اسنپ‌شات‌ها، ویرایش‌ها، حذف‌ها، واکنش‌ها، به‌روزرسانی‌های عضویت/سرویس، اقدامات خود، دکمه‌ها، خروجی‌های رسانه‌ای، پیام‌های بازیابی‌شده و انواع رویدادهای آینده. این انتخاب، مشاهدات ذخیره‌شده را توصیف می‌کند. اخطاریه‌های حذف چت‌های ناشناس در زمینه‌ای جداگانه قرار دارند، فقط برای دسترسی به کل فضای کاری در دسترس هستند و هرگز به یکی از چت‌های انتخاب‌شده نسبت داده نمی‌شوند.

مجموعه‌ها دارای دامنه چت اعلام‌شده‌ای هستند. دامنه خالی به معنای کل فضای کاری است. یک مجموعه نمی‌تواند شامل کارت‌هایی خارج از دامنه خود باشد؛ یک شرکت‌کننده محدود به چت نمی‌تواند مجموعه‌ای گسترده‌تر را بخواند. اینباکس یک مجموعه مجازی برای کارت‌های تخصیص‌نیافته است. جستجو و فیلترها فقط کارت‌های قابل مشاهده را پوشش می‌دهند؛ رشته‌ها و @ذکرها دسترسی کارت والد را به ارث می‌برند. نظرات حذف‌شده یک نشانگر حذف در بحث خواهند داشت. هیچ تاریخچه مشاهده‌کننده‌ای ثبت نمی‌شود.

نمایش، تمام کارت‌ها را در مجموعهٔ انتخاب‌شده با نماهای کارت، زمینهٔ منبع و نظرات تیم و کنترل‌های صفحه‌کلید قبلی/بعدی باز می‌کند. این حالت هیچ کنترل ویرایشگری ارائه نمی‌دهد. فید عادی صفحه‌بندی شده است؛ نمایش، فهرست خود را در صفحات بارگذاری می‌کند و جزئیات هر کارت را یکی‌یکی بازیابی می‌کند.

مجوزها#

تمام عملیات به دسترسی view، محدوده فضای کاری/چت و board.read نیاز دارند. دسترسی board.write کارت‌ها، نظرات، جابجایی و وضعیت‌های باز/بازبینی را اضافه می‌کند. دسترسی board.manage مدیریت مجموعه، وضعیت‌های تأیید شده/رد شده، بازنگری/حذف کارت شخص دیگر را مجاز می‌سازد. یک وضعیت یک تصمیم تیمی است، نه نتیجه تأیید رمزنگاری.

پیش‌تنظیمات فرم دسترسی: بازبین = خواندن؛ تحلیلگر = خواندن/نوشتن؛ اپراتور = خواندن/نوشتن/مدیریت، علاوه بر مجوزهای موجودشان. اعطای مجوزهای موجود به‌طور خودکار حقوق جدید را به‌دست نمی‌آورد. مدیر اصلی تمام حقوق را دارد و با عنوان «مدیر اصلی» پست می‌کند. برای انتساب، از اعطای نام‌گذاری‌شده استفاده کنید. لیست اشاره‌ها فقط دسترسی‌های فعلی را که قادر به خواندن کامل کارت والد هستند، فهرست می‌کند.

مجوز چت A نمی‌تواند کارت یا اسلایسی برای A+B دریافت کند، حتی با حدس زدن شناسه آن یا ارائه یک target.chat_id نادرست. متادیتای هدف از هش رویداد امضا شده روی سرور استخراج می‌شود. کلکسیون‌ها، تعداد بحث‌ها، کارت‌های مرتبط و اعلان‌های زنده قبل از پاسخ فیلتر می‌شوند. خروجی‌ها به مجوز export و همچنین board.read نیاز دارند؛ یک صادرکننده موجود بدون دسترسی به برد، آرشیو شواهد عادی را بدون یادداشت‌های تیمی دریافت می‌کند. 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 زمان اجرا تولید می‌شوند. فیلدهای اضافی در درخواست رد می‌شوند. شناسه‌ها در صورت حذف، در سمت سرور تولید می‌شوند. نویسنده، زمان، اسنپ‌شات و امضا را نمی‌توان از سوی فراخواننده تأمین کرد. شناسه‌های اعطای نام‌گذاری‌شده از فرمت ۱۶ هگزادسیمال موجود Access پیروی می‌کنند؛ شناسه‌های کارت ۳۲ هگزادسیمال هستند.

JSON مرجع (Canonical JSON) شامل UTF-8، کلیدهای شیء مرتب‌شده، بدون فضای خالی بین توکن‌ها، یونیکد بدون فرار (unescaped)، و بدون NaN/بی‌نهایت‌ها است. هش حاشیه‌نویسی (annotation hash) عبارت است از SHA-256 شیء مرجع حاوی format: "tgwitness-annotations-v1" و تمام هفت فیلد پاکت (envelope) تا previous_hash. این تگ فرمت، دامنه هش خود را از مشاهدات جدا می‌کند. امضا بر روی ۳۲ بایت خام هش، از نوع Ed25519 است. توالی از ۱ شروع می‌شود. بازنگری‌ها شناسه کارت را حفظ می‌کنند و هش حاشیه قبلی را در فیلد supersedes (منسوخ می‌کند) نام‌گذاری می‌کنند؛ آنها نمی‌توانند دامنه چت را تغییر دهند. جابجایی‌ها، وضعیت‌ها و حذف، رکوردهای جداگانه‌ای هستند. جدول SQLite، دستورهای UPDATE و DELETE را رد می‌کند.

فایل case-board.json شامل {statement, signature} است. بیانیه کانونیکال توسط کلید فضای کاری امضا شده و شامل format: "tgwitness-case-board-v1"، public_key، created_at، journal_head، meaning و state است. وضعیت، بازگشت (replay) تعیین‌کننده است: annotations_head، یک آرایه مرتب از items (مجموعه‌ها، کارت‌ها، نظرات شامل سنگ‌قبرها)، و status_history. موارد، هش، توالی، نویسنده و زمان آخرین حاشیه‌نویسی خود را، و همچنین سازنده اصلی و زمان ایجاد را در طول بازنگری‌ها حفظ می‌کنند. بازپخش، بازنگری‌ها، والدین، ارجاعات مجموعه و شناسه‌های اقدام تکراری را بررسی می‌کند. فایل‌های manifest.json و نقاط کنترل جدید نیز annotations_head را پیوند می‌دهند. یک نقطه کنترل را به طور مستقل حفظ کنید تا قطع یا بازنویسی با یک کلید امضای کپی‌شده را تشخیص دهید.

نسخه‌های متنی#

range.start یک آفست نقطه کد یونیکد با مبدا صفر است، length یک شمارش نقطه کد مثبت است، و quote باید با زیر رشته‌ی دقیق payload.text یا payload.caption در رویداد هدف یکسان باشد. هیچ‌گونه NFC/NFKC، تبدیل حروف بزرگ و کوچک یا نرمال‌سازی گرافم اعمال نمی‌شود. برش‌های رشته‌ای پایتون و Array.from(text) در جاوا اسکریپت همین ایندکس‌گذاری را پیاده‌سازی می‌کنند. ترکیب علائم و ایموجی ZWJ ممکن است چندین کدپوینت را اشغال کند. range.version هش رویداد هدف است، نه نسخه فعلی پیام یا آفست واحد UTF-16 تلگرام. ویرایش‌های بعدی هرگز به طور خودکار یک هایلایت را جابجا نمی‌کنند.

هویت و زمان را برش دهید#

query دقیقاً یک chat_id یا یک مجموعه غیرخالی از chat_ids را می‌پذیرد، به همراه from/to اختیاری (شامل)، محدوده‌های شامل شناسه-پیام (برای یک چت)، انواع kinds: "all" یا وایلدکارد دقیق/پیشوندی، actors صریح، search، hide_system، و include_unscoped. گروه‌های نوع ژورنال به گزاره‌های دقیق خود گسترش می‌یابند. جستجو از جستجوی بار مفید (payload) دفترچه یادداشت با حالت NFC/case-folded استفاده می‌کند، بدون تغییر در متن منبع امضا شده. تاریخ‌ها به یک منطقه زمانی نیاز دارند و به UTC نرمال‌سازی می‌شوند. تاریخ‌ها فیلتر مشاهده‌شده در (observed_at) را اعمال می‌کنند. تاریخ source_at در تلگرام به صورت جداگانه نمایش داده می‌شود. یک حذف بدون مهر زمانی منبع، زمان حذف فرضی ندارد. یک رکورد دیرهنگام که خارج از یک بازه زمانی مشاهده شود، وارد آن بازه نمی‌شود؛ یک برش شناسه پیام می‌تواند شامل یک حذف بعدی برای آن شناسه پیام‌ها باشد.

snapshot زمان ایجاد، مرز توالی/هش دفترچه خاطرات، تعداد تطابق، اولین/آخرین توالی و result_hash را تثبیت می‌کند. مورد آخر، هش SHA-256 آرایه JSON کانونیکال UTF-8 از هش‌های رویدادهای مطابقت‌یافته است که به صورت واژه‌شناختی مرتب شده‌اند، و شامل [] برای یک اسلایس خالی نیز می‌باشد. همچنین شامل شمارش دقیق انواع و یک نمای کوچک ۲۴-بینی از زمان مشاهده است. یک اسلایس یک پرس‌وجو را ذخیره می‌کند، نه رکوردهای منبعی تکراری. هنگام خروجی‌گیری، فایل 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 گزینه‌های ذکر (mention) مناسب را بازمی‌گرداند. روش 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 بدون بار مفید را، به‌طور جداگانه از نشانگرهای ژورنال، صادر می‌کند.

endpoint GET /api/board/export یک سند امضا شده را بازمی‌گرداند. دسترسی محدود به چت، یک افشانامه امضا شده با برچسب واضح دریافت می‌کند، هرگز حاشیه‌نویسی‌های چت دیگر یا کل زنجیره را دریافت نمی‌کند. فایل‌های فشرده کامل مدرک حاوی annotations.jsonl، case-board.json امضا شده و ضمیمه‌های JSON برش (slice) هستند. گزارش HTML/PDF/JSON تنظیمات را برای انتخاب عدم وجود برد، نشانک‌ها/برش‌ها بدون بحث، یا کارت‌ها با نظرات تنظیم می‌کند. این بخش صراحتاً نظرات تیم را از مشاهدات جدا می‌کند. فیلترهای داده‌های گزارش، یادداشت‌های قابل خواندن را نیز محدود می‌کنند؛ فایل‌های منبع امضا شده کامل در زیپ شواهد، کامل باقی می‌مانند.

GET /api/board/slice/{id}/export یک گزیدهٔ JSON امضا‌شده از tgwitness-board-selection-v1 تولید می‌کند؛ ?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 و گزارش حاوی همان محتوای خلاصه‌شده هستند. شمارش اسلایس‌ها فقط سوابق افشا شده را توصیف می‌کند و جزئیات اصلی بازیگر اسنپ‌شات/پرس‌وجو پنهان می‌ماند. نام‌های متنی آزاد که برای کم‌حجم‌کننده ناشناخته هستند، همچنان نیازمند بازبینی هستند، همان‌طور که در واگذاری‌های معمولی نیز چنین است. این نسخه مشتق ادعا نمی‌کند که پس از سانسور، امضاهای حاشیه‌نویسی اصلی را حفظ می‌کند.

محدودیت‌های عملیاتی#

پارامترها شامل محدودیت‌های نرم ۱۰٬۰۰۰ کارت و ۵۰٬۰۰۰ نظر، یک صفحه برش (slice) با حداکثر ۵٬۰۰۰ رکورد، و کنترل پیش‌نمایش رسانه هستند. محدودیت‌های نرم بدون حذف تاریخچه، هشدار می‌دهند. صفحات فید حداکثر ۲۰۰ کارت دارند. گزیده‌های مستقل JSON به ۶۴ مگابایت محدود شده‌اند؛ برای پرس‌وجوی دقیق‌تر یا استفاده از فایل ZIP امضا شده برای محتوای بزرگ‌تر، از آن بهره ببرید. اعتبارسنج مستقل، بازپخش حاشیه‌نویسی‌ها را در ۲۵۶ مگابایت محدود می‌کند. هیچ‌گونه اعلان نظرات خارجی توسط کیس برد فعال یا پیاده‌سازی نشده است.

پذیرش خودکار این ویژگی از داده‌های فرضی و یک انتقال تلگرام شبیه‌سازی‌شده برای بررسی ذخیره‌سازی، دسترسی، رندرینگ و خروجی‌ها استفاده می‌کند. برای دامنه بررسی‌های شواهد، به بخش «دامنه اعتبارسنجی» مراجعه کنید.