TgWitness / التوثيق

ما تم اختباره ←

مرجع / الأرشيف والتكاملات

Telegram · مرجع «لوحة القضية»

الإشارات المرجعية، والمقاطع المحددة بدقة، وشرائح الإجراءات، والمناقشات، والوصول المحدود النطاق، وسجل التعليقات التوضيحية الموقعة التي يستخدمها «Case Board».

TgWitness / التوثيق · التحقيق

التحقيق

يوفر «Case Board» لفريق التحقيق رؤية عمل مشتركة للمواد المحفوظة. يمكنك وضع إشارة مرجعية على ملاحظة ما، وتمييز مقطع محدد، وحفظ مجموعة من الإجراءات، ومناقشتها مع الزملاء. تحتفظ البطاقات بمراجع مصادرها وسجل المراجعات الموقّع. وتبقى تعليقات الفريق في مساحة العمل، ويمكن تمييزها بشكل منفصل عن الملاحظات الأصلية في Telegram.

نموذج الأدلة · الوصول · التقارير

موجز التحقيقات المركب

في هذه الصفحة

العمل على قضية#

افتح «التحقيق» → «لوحة القضية» في الوضع «قياسي» أو «خبير». تتبع اللغة اللوحة. استخدم زر «إضافة إلى لوحة» بجانب سجل يومية أو رسالة دردشة محفوظة، أو قم بتركيز المؤشر عليها واضغط على المفتاح B. تُضاف الإشارة المرجعية إلى «صندوق الوارد» بنقرة واحدة. قم بتحرير عنوانها وتصنيفاتها وملاحظتها، أو انقلها إلى مجموعة. تُلحق البطاقة التي تم تغييرها بمراجعة موقعة؛ وإزالتها تحافظ على السجل.

بالنسبة للقضية الأولى، اختر مجموعة وأضف السجلات التي تجيب على سؤال واحد. استخدم التعليقات لمراجعة التفسير، ثم استخدم «العرض» (Presentation) لتصفح البطاقات وسياق المصدر. اختر مواد «لوحة القضية» (Case Board) بشكل منفصل في «استوديو التقارير» (Report Studio) عند إعداد التقرير النهائي. لا يؤدي حفظ شريحة إلى تكوين مرشحات بيانات التقرير تلقائيًا.

حدد نصًا داخل رسالة دردشة محفوظة لإظهار «تسليط الضوء» → «لوحة». حدد لونه و أضف ملاحظة. يتحقق الخادم من الاقتباس الدقيق والنسخة المحفوظة، بما في ذلك الرموز التعبيرية والنص المكتوب من اليمين إلى اليسار و علامات الدمج. لا تقوم الواجهة بتعيين التحديد عبر النص المقنع أو المحوّل.

اضغط مع الضغط على مفتاح Shift على سجلين في محادثة واحدة لـ «Slice between»، أو استخدم «Slice by time»، أو احفظ مرشحات «Journal» الحالية للمحادثة والفترة ونوع الحدث. كل شريحة محفوظة لها شرطها المرجعي الخاص: فتحها في «Journal» يطبق أيضًا محادثات متعددة، وحدود عدد الرسائل، ومرشحات المشاركين. يُظهر خيار «إظهار السجلات المضافة منذ وضع الإشارة المرجعية» الإضافات اللاحقة. يؤدي تغيير مرشحات «Journal» إلى الخروج من الشريحة. من قسم «الأشخاص»، يستخدم خيار «تقسيم إجراءات هذا الشخص» معرّف الفاعل المسجل؛ ولا يفترض أن مؤلف الرسالة قد حرر رسالة ما أو حذفها أو تفاعل معها.

يعرض مربع حوار «الشريحة» معاينة للأعداد قبل السماح بإنشائها. تشمل عبارة «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، ويتم إنشاؤها من نماذج Pydantic أثناء التشغيل بواسطة أداة python tools/build_board_schemas.py. يتم رفض حقول الطلب الإضافية. يتم إنشاء المعرّفات من جانب الخادم عند حذفها. لا يمكن للمتصل توفير معلومات المؤلف والوقت واللقطة والتوقيع . تتبع معرّفات المنح المسماة التنسيق السداسي العشري المكون من 16 رقمًا الموجود في Access؛ أما معرّفات البطاقات فهي مكونة من 32 رقمًا سداسيًا عشريًّا.

صيغة JSON القياسية هي UTF-8، ومفاتيح الكائنات مرتبة، ولا توجد مسافات بيضاء بين الرموز، وUnicode غير مُهرب، ولا توجد قيم NaN أو اللانهاية. هاش التعليق التوضيحي هو SHA-256 للكائن القياسي الذي يحتوي على التنسيق format: "tgwitness-annotations-v1"وجميع حقول المغلف السبعة حتى previous_hash. تفصل علامة التنسيق هذه مجال الهاش الخاص بها عن الملاحظات. التوقيع هو Ed25519 على 32 بايت هاش خام. يبدأ التسلسل من 1. تحتفظ المراجعات بمعرّف البطاقة وتسمي هاش التعليق التوضيحي السابق في «supersedes»؛ ولا يمكنها تغيير نطاق الدردشة. تعتبر عمليات النقل والحالات والإزالة سجلات منفصلة. يرفض جدول SQLite أوامر UPDATE وDELETE.

يحتوي ملف case-board.json على {statement, signature}. يتم توقيع البيان القياسي بواسطة مفتاح مساحة العمل ويحتوي على format: "tgwitness-case-board-v1"، وpublic_key، وcreated_at، و journal_head، وmeaning، وstate. الحالة هي إعادة تشغيل حتمية: annotations_head، وهو مصفوفة items مرتبة (مجموعات، وبطاقات، وتعليقات بما في ذلك العلامات التذكارية)، وstatus_history. تحتفظ العناصر بآخر تجزئة للتعليق التوضيحي، والتسلسل، والمؤلف، والوقت، بالإضافة إلى المُنشئ الأصلي ووقت الإنشاء عبر جميع المراجعات. تتحقق عملية إعادة التشغيل من المراجعات، والعناصر الأصلية، ومراجع المجموعات، ومعرّفات الإجراءات المكررة. كما يربط ملف manifest.json ونقاط الفحص الجديدة annotations_head أيضًا. احتفظ بنقطة فحص بشكل مستقل للكشف عن الاقتطاع أو إعادة الكتابة باستخدام مفتاح توقيع منسوخ.

النسخ النصية#

range.start هو إزاحة نقطة رمز Unicode تبدأ من الصفر، وlength هو عدد نقاط رمز موجب، ويجب أن يساوي quote السلسلة الفرعية الدقيقة لـ payload.text أو payload.caption في الحدث الهدف. لا يتم تطبيق NFC/NFKC أو تحويل الأحرف الكبيرة والصغيرة أو تطبيع الحروف. تنفذ شرائح السلاسل في Python و Array.from(text) في JavaScript نفس طريقة الفهرسة. قد يشغل الجمع بين العلامات ورموز الرموز التعبيرية ZWJ عدة نقاط رمزية. range.version هو تجزئة الحدث الهدف، وليس إصدار الرسالة الحالي أو إزاحة كيان UTF-16 في Telegram. لا تؤدي التعديلات اللاحقة أبدًا إلى إعادة تحديد موقع التمييز تلقائيًا.

تقسيم الهوية والوقت#

يقبل «query» رقم «chat_id» واحدًا بالضبط أو أرقام «chat_ids» غير فارغة، ونطاقًا اختياريًا شاملاً «from/to»، ونطاقات معرفات الرسائل الشاملة (محادثة واحدة فقط)، و«kinds: "all"» أو أنواع البدل الدقيقة/البادئة، و«actors» الصريحة، و«search»، و«hide_system»، و«include_unscoped». تتوسع مجموعات أنواع «Journal» إلى مسنداتها الدقيقة. يستخدم البحث بحث الحمولة NFC/مع معالجة حالة الأحرف في السجل دون تغيير نص المصدر الموقع. تتطلب التواريخ منطقة زمنية ويتم توحيدها إلى توقيت UTC. تقوم التواريخ بتصفية «observed_at». يتم عرض «source_at» الخاص بـ Telegram بشكل منفصل. الحذف الذي لا يحتوي على طابع زمني للمصدر لا يتم اختراع وقت حذف له. السجل المتأخر الذي يتم ملاحظته خارج فترة زمنية لا يدخل فيها؛ يمكن أن تتضمن شريحة معرّف الرسالة حذفًا لاحقًا لتلك المعرّفات.

تحدد «snapshot» وقت الإنشاء، وتسلسل السجل/حد التجزئة، وعدد المطابقات، والتسلسل الأول/الأخير وresult_hash. هذا الأخير هو SHA-256 لمصفوفة JSON القياسية بتنسيق UTF-8 الخاصة بتجزئات الأحداث المطابقة المرتبة أبجديًّا، بما في ذلك [] للشريحة الفارغة. كما أنه يحمل أعداد الأنواع الدقيقة ونموذجًا مصغرًا لوقت الملاحظة مكونًا من 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}: بطاقة، ومعاينة المصدر، وسلسلة المحادثة، وسجل الحالة، والبطاقات ذات الصلة. يُرجع المسار الفرعي للمشاركين خيارات الإشارة المؤهلة. تقوم 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 مقتطفًا موقّعًا بتنسيق 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» الموقّع والتقرير على نفس المواد المُصغّرة. تصف أعداد الشرائح السجلات التي تم الكشف عنها فقط، مع حجب تفاصيل الفاعل الأصلية في اللقطة/الاستعلام. لا تزال الأسماء المكتوبة بنص حر غير المعروفة لبرنامج التخفيض تتطلب المراجعة، كما هو الحال في عمليات التسليم العادية. لا يدعي هذا المشتق الحفاظ على توقيعات التعليقات التوضيحية الأصلية بعد الحجب.

حدود التشغيل#

تشمل المعلمات حدودًا مرنة تبلغ 10,000 بطاقة و50,000 تعليق، وصفحة مقتطفات تصل إلى 5,000 سجل، والتحكم في معاينة الوسائط. تُصدر الحدود المرنة تحذيرات دون حذف السجل. تحتوي صفحات التغذية على 200 بطاقة كحد أقصى. يبلغ الحد الأقصى لمقتطفات شرائح JSON المستقلة 64 ميغابايت؛ قم بتضييق نطاق الاستعلام أو استخدم ملف ZIP الموقّع للمواد الأكبر حجمًا. يحدد أداة التحقق المستقلة سعة إعادة تشغيل التعليقات التوضيحية بـ 256 ميغابايت. لا يتم تمكين أو تنفيذ أي إخطارات خارجية بالتعليقات بواسطة Case Board.

يستخدم القبول التلقائي للميزة بيانات خيالية ونقل Telegram محاكىً للتحقق من التخزين والوصول والعرض والتصدير. انظر نطاق التحقق لمعرفة نطاق فحوصات الأدلة.