
halo-record v0.2.7
سجلات وقت التشغيل المقاومة للعبث لوكلاء الذكاء الاصطناعي. متصلة بسلسلة تجزئة، خالية من التبعيات، يمكن لأي شخص التحقق منها.
halo-record
مسارات تدقيق مقاومة للتلاعب لوكلاء الذكاء الاصطناعي — سجلات وقت التشغيل المتسلسلة هاشيًا، تُعرض كتقرير وقت تشغيل يمكن لعملائك التحقق منه بأنفسهم.
كل إجراء يقوم به وكيلك (استدعاءات الأدوات، استدعاءات النموذج، الوصول إلى البيانات، الموافقات) يصبح سجل وقت تشغيل واحد في سجل إضافي فقط، متسلسل هاشيًا؛ وتقرير وقت التشغيل هو تلك السلسلة معروضة كصفحة HTML ذاتية التحقق. أي طرف يحمل نقطة تحقق من السلسلة يمكنه التحقق من أن السجلات خلفها لم تُعدَّل أبدًا، دون الوثوق بمن أنتجها — نقطة التحقق تلك هي الجزء الحامل للثقل: السلسلة وحدها مقاومة للتلاعب ضد الجميع باستثناء الطرف الذي يشغّل المسجّل (LIMITS.md §1). عندما يسأل فريق الأمن لدى العميل "ماذا فعل وكيلك ببياناتنا؟"، تسلّمهم رابطًا بدلًا من فقرة. المراجعات الأمنية تطرح بالفعل أسئلة الذكاء الاصطناعي بجانب قائمة SOC 2 — وبشكل متزايد تأتي تلك الأسئلة من ISO 42001، ومواد حفظ السجلات في قانون الذكاء الاصطناعي الأوروبي، واستبيانات العملاء الخاصة. اليوم لا يزال الضمان المكتوب يمرّ. الرهان وراء هذا المشروع هو أنه لن يمرّ طويلًا.
مُشار إليه في Help Net Security (أغسطس 2026).
صيغة السجل مفتوحة ومجانية للتنفيذ. هذه الحزمة هي التنفيذ المرجعي: المسجّل، والمدقّق، وعميل الشاهد، وخادم التقرير.
هل تستخدم halo-record، أو تفكر في ذلك؟ أخبرني من أنت ولأي غرض → من يستخدم halo-record؟
تحقق بنفسك
يُطلب منك وضع مسجّل داخل وكيلك. لا ينبغي أن تقبل ذلك بالإيمان:
- صفر تبعيات وقت التشغيل. المكتبة القياسية فقط.
pip install halo-recordيثبّت حزمة واحدة بالضبط. - لا اتصالات شبكية، باستثناء ثلاثة اختيارية — التثبيت على شاهد (يرسل معرّف الموضوع، وعدد السجلات، وبصمتين للسلسلة — الرأس وجذر السلسلة)، وقراءة نقاط تحقق الشاهد مرة أخرى (يرسل معرّف الموضوع)، وطابع زمني RFC 3161 (يرسل فقط هاش حالة نقطة التحقق إلى جهة ختم زمني). جميعها معطّلة ما لم تستدعها؛ محتويات السجلات لا تغادر بنيتك التحتية أبدًا.
- وسائط الأدوات الخام تُهشَّر، مع ملخص منقّح بجانبها. تُخزَّن الوسائط كـ هاش قانوني بالإضافة إلى ملخص: نص الوسيطة مع إخفاء أنماط الأسرار والبيانات الشخصية المعروفة، بحد أقصى 200 حرف. المدخل القصير الذي لا يطابق أي نمط يظهر في الملخص كاملًا؛ وضع الهاش فقط (
summaries=False) لا يحتفظ بأي ملخص على الإطلاق. التنقيح بأفضل جهد (تعبير نمطي فوق صيغ الأسرار والبيانات الشخصية الشائعة بالإضافة إلى مُلتقط إنتروبيا شامل): تعامل معه كدفاع في العمق، وليس ضمانًا. حقول النتائج التي تقدمها بما يتجاوزsummaryتُختم كما هي (LIMITS §13). - صغير بما يكفي للتدقيق. ~5,300 سطر من Python (أسطر الكود، دون احتساب الفراغات والتعليقات). اقرأه كله في ظهيرة واحدة.
- Apache-2.0.
- الأوراق من الدرجة الأولى. LIMITS.md (ما لا تستطيع السلسلة إثباته)، PRIVACY.md (ما تحتويه السجلات وما يغادر جهازك)، RETENTION.md (العمل تحت سياسة احتفاظ)، وREVIEWERS.md — الفحص المستقل بأربعة أوامر بالإضافة إلى صيغة اقتباس لنتائج المراجعة.
ما يثبته كل طبقة — التمييز الحامل للثقل في هذا المشروع (LIMITS.md §1): سلسلة تحملها بنفسك تثبت أن السجلات لم تُحرَّر، نسبةً إلى رأس يحمله شخص آخر بالفعل؛ فقط نقاط التحقق المحفوظة خارج المشغّل تثبت أنه لم يُحذف أي منها؛ ولا يوجد هاش يثبت أن كل إجراء قد التُقط.
| الادعاء | سلسلة محفوظة ذاتيًا | + نقاط تحقق خارجية | + التقاط موثوق |
|---|---|---|---|
| كشف التحريرات على أثر راسخ | ✔ | ✔ | ✔ |
| كشف إعادة كتابة التاريخ المُلتزم به | — | ✔ | ✔ |
| كشف نقاط التحقق المفقودة/المتأخرة | — | ✔ (وتيرة متفق عليها) | ✔ |
| إثبات تسجيل كل إجراء | — | — | يعتمد على حدود الالتقاط |
شاهد واحدًا قبل أن تثبّت: تقرير وقت تشغيل نموذجي — بيانات خيالية، سلسلة حقيقية، ويعيد التحقق من نفسه في متصفحك بينما تشاهد.
عرض توضيحي في 60 ثانية
لا حاجة لوكيل. مع uv، لا شيء لتثبيته:``` uvx --from halo-record halo demo --serve
أو الطريقة الكلاسيكية:```
pip install halo-record
halo demo --serve
إما أن يقوم أحدهم ببناء بائع وكيل دعم خيالي مع عميلين، ويشهد السلاسل (مع ملف شاهد محلي يقوم مقام شاهد خارج المشغّل — انظر LIMITS.md §1)، ويقدّم تقارير Runtime المُقيَّدة الخاصة بهم، ويفتح وحدة تحكم المشغّل في متصفحك. ثم جرّب اختبار العبث: احذف سطرًا من أحد ملفات .jsonl وأعد التحميل. يكتشفه التقرير.
سجّل وكيلك الخاص
سطر واحد عند الحدود:```python from halo_record import trace
agent = trace(run_my_agent, profile="my-agent", log="audit.jsonl") # wraps your entrypoint; records the run boundary to ./audit.jsonl — add record_call() or a framework adapter at each tool boundary to capture individual calls
يُشحن أيضًا غلاف تسهيلي `from halo import ...` — لكن اسم `halo` على PyPI يخص حزمة مؤشر طرفية غير ذات صلة، وإذا كانت تلك الحزمة مثبتة فإنها تفوز عند الاستيراد. `halo_record` لا يحمل أي التباس، لذا تستخدمه الأمثلة.
بدون `log=`، تذهب السجلات إلى `~/.halo/my-agent.jsonl` (سلسلة واحدة لكل وكيل). يختم الغلاف حدود التشغيل؛ وتوجد الأدلة في سجلات كل استدعاء. التقطها باستخدام محوّل إطار عمل (المصفوفة أدناه) — أو بشكل صريح، وهو ما يُظهر أيضًا كيفية ارتباط التفويض:```python
from halo_record import Recorder, record_call
rec = Recorder("audit.jsonl")
with record_call(rec, "crm.lookup", {"account": "acct-9"}) as call: # one sealed record per tool call
call.result = crm.lookup("acct-9")
with record_call(rec, "payments.refund", {"amount": 120},
parent_id=rec.last_record_id()) as call: # child links to the action that spawned it
call.result = payments.refund(120)
ثم اعرض التقرير:``` halo report audit.jsonl -o report.html # one chain -> self-verifying HTML halo serve ./records --port 8721 # all tenants, gated per customer
ينتهي الدليل السريع عندما تنظر إلى تقرير وقت التشغيل الخاص بوكيلك في المتصفح. إذا حصلت على ملف JSONL وبدون تقرير، فهناك خطأ ما: افتح تذكرة.
### كتلة التحقق
إذا قامت طبقة حماية أو سياسة بالتحقق من الإجراء، يمكن أن يُرفق حكمها بالسجل — كتلة اختيارية تسجل ما قررته البوابة، مختومة في سلسلة التجزئة مثل كل حقل آخر:```python
from halo_record import build
build("tool_call", "security", tool="payments.refund",
verification={"status": "allowed", "verifier": "gate/1.2",
"policy_ref": "sha256:1f3a...",
"checked_at": "2026-08-01T12:00:00Z"})
الذي يُختم في السجل على النحو التالي:```json "verification": {"status": "allowed", "verifier": "gate/1.2", "policy_ref": "sha256:1f3a...", "checked_at": "2026-08-01T12:00:00Z"}
`record_call(...)` يقبل نفس الكلمة المفتاحية `verification=`. الحقل `status` مطلوب داخل الكتلة؛ بينما `verifier` و`policy_ref` و`checked_at` اختيارية. معنى كل حالة:
| الحالة | ما تُبلغ عنه البوابة | هل نُفِّذ الإجراء؟ |
|---|---|---|
| `allowed` | سمحت بالإجراء | نعم — مضى الإجراء قُدُمًا |
| `blocked` | رفضت الإجراء | يُحدَّده التكامل، لا هذا الحقل — قد يحمل السجل نتيجةً مع ذلك، والحظر بحد ذاته لا يُثبت عدم التنفيذ |
| `modified` | عدّلت الإجراء قبل تنفيذه — يصف `action.input` الإجراء **كما نُفِّذ**، بعد التعديل | نعم، بالصيغة المعدَّلة |
| `unverified` | عملت (أو استُشيرت) لكنها لم تتوصل إلى قرار — وهذا يختلف عن غياب الكتلة، الذي يعني عدم تقديم أي ادعاء تحقق على الإطلاق | نعم — مضى الإجراء دون حكم |
الكتلة يوفّرها كود التكامل الخاص بالمشغِّل، وهي تسجّل ما تُبلغ عنه البوابة — وهو نفس موقف الثقة الخاص بـ `principal` (انظر [LIMITS](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#11-verification-status-is-the-gates-report-not-halos-finding)). الختم يُثبت أن الحالة لم تُعدَّل بعد وقوعها؛ لكنه لا يُثبت أن الفحص جرى، ولا أن الحكم كان صحيحًا، ولا أن إجراءً محظورًا لم يُنفَّذ. هذا ليس تحققًا مستقلًا.
لكي يكون `policy_ref` قابلًا للاستخدام كدليل، استخدم تجزئة محتوى (content hash) لمجموعة القواعد واحتفظ بملف مجموعة القواعد — فالوسم غير القابل للحل يجعل الحقل زخرفيًا.
## الاتصال بما تشغّله بالفعل
| يُلتقط عند الحدود | يُستوعَب من القياسات الآلية الموجودة |
|---|---|
| المسجّل الأصلي (`from halo_record import trace`) | OpenTelemetry GenAI spans |
| اعتراض MCP | LiteLLM callbacks |
| رد نداء LangChain / LangGraph | تصدير Langfuse |
| خطافات OpenAI Agents SDK | أي سجل لبوابة / وكيل عكسي |
| خطاف Claude Agent SDK | خطافات `PostToolUse` في Claude Code وCodex CLI (تُطلَق بعد تشغيل الأداة) |
تُوسم محوّلات الأطر ومسارات الاستيعاب كل سجل بوسم `source`، فيكشف التقرير كيف جُمعت كل قطعة من الأدلة. السجلات الملتقطة والمستوعَبة تعيش في السلسلة نفسها.
بالنسبة إلى LangChain / LangGraph، الأمر عبارة عن معالج رد نداء:```python
from halo_record import Recorder
from halo_record.integrations.langchain import HaloCallbackHandler
recorder = Recorder("audit.jsonl")
result = my_chain.invoke(inputs, config={"callbacks": [HaloCallbackHandler(recorder)]}) # every tool call becomes a record
بالنسبة لـ MCP، تغلّف استدعاءة واحدة جلسة العميل — وبعد ذلك أي وكيل يستخدم MCP يصدر سجلات لكل استدعاء أداة، بغض النظر عن الإطار الذي يقوده:```python from halo_record.integrations.mcp import instrument_client_session
instrument_client_session(session, Recorder("audit.jsonl"), server="stripe") # every session.call_tool() is now recorded
بالنسبة لسجلات البوابة أو الوكيل (Cloudflare AI Gateway، Portkey، nginx أمام النموذج)، قم بتعيين صف سجل إلى السلسلة — موسوم صراحةً كمُستوعَب، وليس مُلتقط عند الحدود:```python
from halo_record.integrations.gateway import record_log
record_log(Recorder("audit.jsonl"), {"tool": "gen_ai:gpt-4o", "model": "gpt-4o", "status": 200, "subject": "acme-corp"})
أي شيء يصدر OpenTelemetry GenAI spans (مثل CrewAI وLlamaIndex ومعظم أطر الوكلاء المزوّدة بـ OTel instrumentation) يصل إلى السلسلة عبر محوّل OTel، وتوفّر حزمة TypeScript محوّلات أصلية لـ Vercel AI SDK ونظام وكلاء JS البيئي. هل تفتقد محوّلًا لمنظومتك؟ افتح issue. معظم المحوّلات لا تتجاوز المئة سطر.
سجّل وكيل البرمجة الخاص بك (Claude Code أو Codex)
يُطلق Claude Code خطاف PostToolUse بعد كل استدعاء أداة. وجّهه إلى halo hook ليصبح كل إجراء — كتابة الملفات، أوامر shell، استدعاءات موصّل MCP — سجلًا في سلسلة محلية. دون أي تغييرات في الكود؛ إدخال واحد في الإعدادات:```json
{
"hooks": {
"PostToolUse": [
{"matcher": "*", "hooks": [{"type": "command", "command": "halo hook"}]}
]
}
}
أضف ذلك إلى `~/.claude/settings.json` وستُسجَّل السجلات في `~/.halo/audit.jsonl` (يمكن تجاوز ذلك باستخدام `$HALO_LOG`). تُتجاهل الأدوات ذات التنسيق البحت التي لا تلمس أي بيانات أو شبكة أو حالة خارجية — فالسلسلة تسجّل إجراءات حدود الثقة، لا التفكير. اضبط `HALO_HASH_ONLY=1` لتسجيل تجزئات المحتوى دون ملخصات. اضبط `HALO_AGENT_VERSION` (واختياريًا `HALO_AGENT_MODEL`) لربط كل سجل ببناء الوكيل الذي أنتجه — فعندما يسأل المدقّق عن الإصدار الذي كان يعمل في نافذة زمنية معينة، يجيب التصدير حسب العمود بدلًا من التذكّر.
يوفّر Codex CLI نفس خطافات دورة الحياة بنفس شكل الأحداث (الخطافات مفعّلة افتراضيًا). أضف هذا إلى `~/.codex/hooks.json` وستُسجَّل أوامر shell الخاصة بـ Codex، وتعديلات `apply_patch`، واستدعاءات MCP في السلسلة نفسها:```json
{
"hooks": {
"PostToolUse": [
{"matcher": ".*", "hooks": [{"type": "command", "command": "halo hook"}]}
]
}
}
يخبر الـ hook بين الاثنين من الحدث نفسه (يضيف Codex كلاً من turn_id و model) ويصنّف كل سجل إما claude-code أو codex؛ اضبط HALO_HOOK_AGENT لفرض أحدهما. كلاهما من الطبقة المُستوعَبة: يُطلق hook من نوع PostToolUse بعد تشغيل الأداة، لذا يُبنى السجل من ما يبلّغ عنه الـ harness.
إذا كنت بحاجة إلى أن يجيب التقرير عن سؤال "تحت أي قواعد جرى هذا التشغيل؟"، فاضبط HALO_AUTHORITY_FILE على لقطة JSON للسلطة الفعّالة للجلسة. حافظ عليها آمنة من ناحية الخصوصية: تجزئات ومراجع، لا مطالبات خام، ولا نص سياسة خاص، ولا أسرار، ولا مخططات أدوات كاملة — تُقنَّع صيغ الأسرار المعروفة عند وقت الختم، لكن التجزئات والمراجع تمر دون مساس ولا يُكتشف النص الحر (انظر LIMITS §6). أعد استخدام snapshot_id فقط ما دامت السلطة الأساسية دون تغيير؛ تُضغط السجلات المتتالية ذات المعرّف نفسه والمحتوى غير المتغير — أما المعرّف المُعاد استخدامه مع محتوى متغيّر فيُخزَّن كاملاً، مع إشعار.```json
{
"snapshot_id": "auth_2026_07_08T1100Z",
"captured_at": "2026-07-08T11:00:00Z",
"scope": "session",
"workspace": {"path_hash": "sha256:...", "git_commit": "abc1234"},
"refs": [
{"kind": "project_rules", "id": "CLAUDE.md", "hash": "sha256:...", "loaded": true, "truncated": false},
{"kind": "mcp_tool_registry", "id": "filesystem", "hash": "sha256:..."}
],
"omissions": [{"kind": "private_policy", "reason": "customer_secret", "hash": "sha256:..."}],
"stale_if": ["project_rules_hash_changed", "mcp_tool_registry_hash_changed"]
}
## ما هو Kitploit؟
[Kitploit](https://www.kitploit.com/) هو دليل مخصص لأدوات الأمن السيبراني مفتوحة المصدر. يقدم مجموعة منسقة من أدوات الاختراق الأخلاقي، وأدوات اختبار الاختراق، وأدوات تحليل الثغرات الأمنية، والمرافق الأمنية الأخرى.```sh
HALO_AUTHORITY_FILE=./authority.json halo hook
يُختم اللقطة (snapshot) في نفس سلسلة التجزئة (hash chain) الخاصة بسجلات الإجراءات. القيمة الافتراضية الجيدة هي لقطة واحدة على مستوى الجلسة عند البدء، بالإضافة إلى لقطة جديدة عند تغيّر القواعد أو المهارات (Skills) أو الخطافات (hooks) أو سجلات أدوات MCP أو سياسة الضغط (compaction policy). للحفاظ على الجلسات الطويلة خفيفة، تُضغط السجلات المتتالية التي تحمل نفس authority.snapshot_id بعد أول لقطة كاملة: تحتفظ السجلات اللاحقة فقط بـ {"snapshot_id": "...", "same_as_previous": true}. يبقى المؤشر مرتبطًا بسلسلة التجزئة، لكن كتلة refs/omissions/stale-if الضخمة لا تُكرَّر مع كل إجراء. (الضغط يتم لكل عملية مسجِّل: الالتقاط بنمط الخطافات الذي يُنشئ عملية واحدة لكل استدعاء أداة يعيد تخزين الجسم الكامل كلما لم تكن اللقطة الكاملة السابقة هي سجل الذيل، لذا تقايض العمليات قصيرة العمر حجم السلسلة مقابل حارس إعادة الاستخدام.)
يُرفق مستخدمو SDK نفس الكتلة مباشرةً — build(..., authority={...}) أو record_call(..., authority={...})؛ الالتقاط بالتجزئة فقط هو نفس الواجهة (summaries=False على أيٍّ منها):```python
from halo_record import Recorder, record_call
rec = Recorder("audit.jsonl") with record_call(rec, "crm.lookup", {"account": "acct-9"}, authority={"snapshot_id": "auth_1", "rules_hash": "sha256:..."}, summaries=False) as call: # hash-only: no summaries, no excerpts call.result = crm.lookup("acct-9")
ثم، المعتاد:```
halo verify ~/.halo/audit.jsonl
halo report ~/.halo/audit.jsonl -o report.html
أي بيئة تشغيل للوكيل تُتيح خطافًا بعد الإجراء يمكنها تغذية الأمر نفسه — يقرأ الخطاف حدثًا واحدًا بصيغة JSON من stdin ويضيف سجلًا واحدًا.
سلسلة واحدة، كاتب واحد في كل مرة. السلسلة قائمة مترابطة: كاتبان يقرآن الرأس نفسه ويضيفان كلاهما سيُفرّعانها (سجلان يدّعيان السلف نفسه)، وسيسمّي التحقق السجلات المتأثرة. يُسلسل Recorder إضافاته الخاصة بقفل جانبي (POSIX flock هنا؛ دليل قفل في حزمة TypeScript)، ويضيف halo hook عبر Recorder، لذا فإن إعداد الخطاف أعلاه مغطى. أي شيء يكتب ملف السلسلة مباشرة — خطاف يدوي، عمال متوازون، شاحن سجلات — يجب أن يحمل قفلًا حصريًا مكافئًا عبر تسلسل قراءة الرأس ثم الإضافة، أو الكتابة إلى سلاسل لكل عملية. LIMITS.md القسم 9 يغطي هذا بالكامل، بما في ذلك الحدود بين اللغات.
عندما يفشل التسجيل
يفشل نمطا التكامل في اتجاهين متعاكسين، عن قصد — اختر النمط الذي يمكنك التعايش مع فشله:
- محوّلات الأطر (LangChain، الخطافات عبر مديري الاستدعاءات) تفشل مفتوحة. إذا تعذّر كتابة سجل (القرص ممتلئ، الأذونات)، يكتمل إجراء الوكيل بشكل طبيعي ويُفقد السجل. يطبع معالج LangChain تحذيرًا صاخبًا إلى stderr ويحصي الفقدان (
handler.lost_records)، لكن لا شيء في السلسلة نفسها يمكنه إظهار سجل لم يُكتب قط — فالسلسلة المتوقفة تظل تُجتاز التحقق. نقاط تحقق الشاهد على وتيرة منتظمة هي ما يجعل السلسلة المتوقفة مرئية: نقطة تحقق متوقعة لا تصل أبدًا هي الإنذار. - غلاف
trace()الأصلي يفشل مغلقًا. إذا تعذّر كتابة السجل، ينتشر الاستثناء إلى إجراء الوكيل — لا دليل، لا إجراء. أكثر صرامة، ويمكنه مقاطعة وكيلك.
لا الإعداد الافتراضي مناسب للجميع؛ اعرف أيّهما تشغّل.
السلامة مقابل الاكتمال (اقرأ هذا الجزء)
كن دقيقًا بشأن ما يثبته كل طبقة — لأنها ادعاءات مختلفة، والاختلافات هي المقصد:
سلسلة محتفظ بها ذاتيًا تثبت السلامة نسبةً إلى رأس مُثبَت: بالنظر إلى رأس سلسلة يملكه شخص ما بالفعل، يصبح أي تعديل أو إعادة ترتيب أو حذف في السجلات خلفه قابلًا للكشف. بحد ذاتها — قبل أن يرى أي طرف خارج المشغّل رأسًا — تثبت السلسلة الاتساق الداخلي، لا التاريخ: يمكن للمشغّل إسقاط سجل وإعادة الختم، وسيُجتاز الملف الجديد التحقق. تصبح السلسلة ملتزمة تاريخيًا في اللحظة التي يخرج فيها رأسها من سيطرة المشغّل.
ذلك هو الشاهد: طرف خارج المشغّل يحتفظ بنقاط تحقق دورية للسلسلة — معرّف الموضوع، وعدد السجلات، وبصمتان للسلسلة (الرأس وجذر السلسلة)؛ الحمولة الدقيقة، ولا شيء غيرها. تجعل نقاط التحقق إعادة كتابة التاريخ الملتزم قابلة للكشف، ونقطة التحقق الفائتة هي بحد ذاتها حدث مرئي:``` halo anchor audit.jsonl witness.jsonl # anchor a checkpoint to a local witness halo anchor audit.jsonl witness.jsonl --check # completeness verdict against it
بالنسبة لـ *time* تحديدًا، يستبدل ختم زمني خارجي وفق RFC 3161 ساعة نقطة التحقق المُعلنة ذاتيًا بإثبات من جهة ختم زمني (Timestamp Authority) لا يتحكم بها المشغّل — "هذه السلسلة بلغت هذا الرأس في موعد لا يتجاوز T"، قابل للتحقق من قبل طرف ثالث دون أي بنية تحتية مستضافة. جهة الختم الزمني الافتراضية هي freetsa.org المجانية (مناسبة للتقييم)؛ وجّهها إلى جهة ختم زمني تجارية (DigiCert / Sectigo / خاصتك) باستخدام `--tsa` لبيئة الإنتاج:```
halo anchor audit.jsonl witness.jsonl --timestamp # attach a TSA time proof to the checkpoint
halo anchor audit.jsonl witness.jsonl --check # reads the token's claimed time
--check يؤكد أن الرمز يرتبط بحالة السلسلة هذه ويقرأ وقته الموثق، لكنه لا يتحقق من توقيع TSA — وهذا متروك عمدًا لأداة قياسية حتى لا يثق المراجع بأي كود من كودنا. للتحقق من الوقت بشكل مستقل (هذا ما تسلّمه لمراجع أمني):```
tsa.token_b64 lives in the witness log; decode the latest one to a standard .tsr file
python3 -c 'import json,base64; cps=[json.loads(l) for l in open("witness.jsonl") if l.strip()]; t=[c["tsa"] for c in cps if c.get("tsa")][-1]; open("token.tsr","wb").write(base64.b64decode(t["token_b64"])); print(t["digest"])' curl -s -o tsa-ca.pem https://freetsa.org/files/cacert.pem # CA for the default TSA (a commercial TSA publishes its own) openssl ts -verify -digest -in token.tsr -CAfile tsa-ca.pem # → "Verification: OK"
حدود أخرى، تُذكر بوضوح: لا السلسلة ولا الشاهد يثبتان أن كل إجراء في العالم الحقيقي مرّ عبر المسجّل. تلك هي **اكتمال الالتقاط** — خاصية تتعلق بمكان وجود المسجّل في المكدس (أدوات التتبع الأصلية، الخطافات، الاستقبال عبر البوابة)، وليست خاصية لأي تجزئة. تحمل السجلات وسم `source` لهذا السبب تحديدًا. جدول الادعاءات تحت "تحقق بنفسك" في أعلى هذه الصفحة هو ملخص لهذه الطبقات الثلاث.
يمكن لأي شخص تشغيل شاهد. الشاهد الذي تشغّله بنفسك يثبّت السجل لصالح *أنت*؛ أما تثبيته لصالح *عميلك* فيتطلب شاهدًا لديه سبب للثقة به. البروتوكول مفتوح في كلتا الحالتين.
الشاهد المستضاف والمعترف به هو السبيل الذي سيستمر به هذا المشروع. الوصول المبكر: [email protected].
## البيانات الشخصية في السلسلة
السلسلة للإضافة فقط: أي شيء يُختم في سجل يبقى فيه، لأن
إزالته ستُفسد التحقق لكل ما يليه. وسائط الأدوات
تُعالج بالفعل — تُخزَّن كتجزئة بالإضافة إلى ملخص منقّح محدود بـ 200 حرف
(وضع التجزئة فقط لا يحتفظ بأي ملخص).
لاحظ القيد في تلك الجملة: *منقّح*، وليس مُزالًا. [LIMITS.md](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md)
القسم 6 صريح في أن الاسم أو العنوان البريدي ليس لهما نمط موثوق، لذا
لا يُكتشف أي منهما ولا يُقنَّع أي منهما. و`subject` ليس الحقل الوحيد الذي
يحمل نصًا تقدّمه أنت — بل `principal` و`approver` و`session_id` و`agent`
و`authority` و`data` والملخصات كلها كذلك.
النمط الذي ينجح: ضع معرّفًا مستعارًا ثابتًا في السلسلة واحتفظ
بالتعيين إلى أي فرد في نظام يمكنك الحذف منه. عندئذٍ يُلبّى طلب المحو
بحذف التعيين. أبقِ `subject` مشيرًا إلى المؤسسة المستأجرة، وليس إلى شخص:
```json
{
"subject": "org:acme-corp",
"principal": "user:u-8f3a91",
"session_id": "sess:7c2e"
}
``````python
from halo_record import build
build("tool_call", "privacy", subject={"id": "acme", "name": "Acme Corp"})
لا يوجد إعداد يفرض هذا — إنه انضباط في كيفية استدعائك للمُسجِّل. فهو يجعل المحو قابلاً للتنفيذ؛ لكنه ليس إخفاءً للهوية، ولا توجد بعد سياسة احتفاظ أو تقليم مدمجة. يحتوي القسم 13 من LIMITS.md على قائمة الحقول الكاملة، ويشرح لماذا يمكن لبصمة الإدخال المخزَّنة تأكيد قيمة قابلة للتخمين حتى بعد زوال التعيين، وينتهي بأسئلة ينبغي للمراجع أن يطرحها.
سجِّل استدعاء نموذج (السؤال الأول للمشتري: "أي نموذج رأى بياناتي؟"):```python from halo_record import record_model_call
record_model_call(rec, provider="anthropic", model="claude-sonnet-4-6", zdr=True, purpose="draft support reply", subject="acme") # tool=model.generate, scope=model:anthropic
## أين يقع هذا في مكدس الامتثال
halo-record هو طبقة أدلة، وليس شهادة. فهو يُنتج الأثر الذي تطلبه أطر التقييم بصيغ مختلفة. ملاحظة نطاق واحدة تحكم كل بند أدناه: هذه ادعاءات سلامة حول السجل؛ أما الاكتمال مقابل المشغّل فيتطلب شاهدًا خارجيًا يحتفظ بنقاط تحقق ([LIMITS.md §1](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md)).
- **استبيانات الأمان ومراجعات SOC 2:** أجب عن أقسام الذكاء الاصطناعي بتقرير Runtime Report قابل للتحقق بدلًا من لقطات الشاشة والنصوص السردية.
- **AIUC-1:** يُنتج أدلة التسجيل المقاوم للعبث (E015.4) وسجلات سلسلة التنفيذ مع أحداث التفويض (E015.2 — مع ثغرة معلنة: لا يتم التقاط آثار الاستدلال) التي تسمّيها ضابطة المساءلة E015 في المعيار. E015 نفسها إلزامية؛ أما E015.2 وE015.4 فهما طبقتها التكميلية: غير مطلوبتين للنجاح، بل يتبنّاهما المورّد عندما يطلبهما عميل أو جهة تنظيمية. وبمجرد تثبيت السلسلة على شاهد يكون للطرف المعتمد سبب للثقة به — أما شاهد يشغّله المشغّل بنفسه فلا يوفّر ذلك — تصبح سلسلة مشهودة باستمرار بدلًا من سلسلة يُعاد بناؤها وقت التدقيق (وما يدخل السلسلة يظل محدودًا بسطح الالتقاط). يوجد تعيين أدلة ضابطة بضابطة، بما في ذلك ما هو خارج النطاق عمدًا، في [`AIUC.md`](https://github.com/bkuan001/halo-record/blob/main/AIUC.md).
- **OWASP Top 10 for Agentic Applications 2026:** ثمانية من التهديدات العشرة تُقابلها قواعد سياسة حتمية على السجل، واثنان مُعلَّمان كخارج النطاق مع الأسباب، والحزمة تُشحن قابلة للتشغيل. تعيين مجتمعي تقريبي، وليس أثرًا رسميًا من OWASP. انظر [`OWASP.md`](https://github.com/bkuan001/halo-record/blob/main/OWASP.md).
- **AARM (CSA):** يُنتج إيصال الإجراء المقاوم للعبث الذي يحدده AARM — R5، والنصف الخاتم من R6 (الهوية مختومة داخل التجزئة، وليست مُوثَّقة تشفيريًا). halo-record هو طبقة الإيصال؛ اقرنه ببوابة إنفاذ للحصول على نظام AARM كامل. انظر [`AARM.md`](https://github.com/bkuan001/halo-record/blob/main/AARM.md).
- **Agentic Trust Controls:** السجلات وقت التشغيل الكامنة خلف ضوابط الأدلة في ATC — تسجيل الإجراءات المقاوم للعبث (RBM-03) ونصف السجل من إثبات السلطة (AID-05؛ النصف الخاص بالإنفاذ يخص البوابة) في سجل متسلسل واحد. انظر [`ATC.md`](https://github.com/bkuan001/halo-record/blob/main/ATC.md).
- **CSA AI Controls Matrix (AICM) / STAR for AI:** أدلة نطاق LOG — سجلات التدقيق المُولَّدة، والمختومة ضد التعديل غير المكتشف، وأحداث الإدخال والإخراج المسجَّلة — مُعيَّنة ضابطة بضابطة في [`AICM.md`](https://github.com/bkuan001/halo-record/blob/main/AICM.md). وربط CSA الخاص بالإصدار v1.1 يصل ذلك النطاق بـ AIUC-1 E015.
- **MITRE ATLAS:** تخفيف قياس عن بُعد للوكيل (AML.M0024) مُنفَّذ بخاصية سلامة لا يطلبها ATLAS نفسه — السجل قابل للتحقق من قِبَل شخص خارج المشغّل. انظر [`ATLAS.md`](https://github.com/bkuan001/halo-record/blob/main/ATLAS.md).
- **EU AI Act / ISO 42001 / NIST AI RMF:** التزامات حفظ السجلات والتسجيل التي تصفها هذه الأطر هي نفس فئة الأثر — مُعيَّنة بتحفّظ في [EU-AI-ACT.md](https://github.com/bkuan001/halo-record/blob/main/EU-AI-ACT.md)، و[ISO42001.md](https://github.com/bkuan001/halo-record/blob/main/ISO42001.md)، و[NIST-AI-RMF.md](https://github.com/bkuan001/halo-record/blob/main/NIST-AI-RMF.md).
لا شيء من هذا يشهد بشيء بحد ذاته. إنه يمنح المُقيِّم لديك شيئًا قابلًا للتحقق لينظر إليه. الحدود — ما لا يفعله halo-record عمدًا، وما ينبغي قوله عندما يسأل مراجع — موثّقة في [`LIMITS.md`](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md).
### إدخال الأدلة إلى منصة GRC الخاصة بك
تقبل معظم منصات GRC (Vanta وDrata وما شابههما) الملفات المرفوعة كأدلة مخصصة مقابل ضابطة. وتصدير halo-record مُصمَّم ليُدرَج في ذلك التدفق:```bash
halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 -o evidence.csv
# scope the export to the actions a control covers
halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 --tool email.send --tool db.query -o evidence.csv
يكتب هذا ملفين لنافذة التدقيق: ملف CSV (صف واحد لكل إجراء مسجَّل، مُجمَّع من اليسار إلى اليمين بترتيب متى → ماذا حدث → مَن → تحت أي صلاحية → ما الذي تم الإبلاغ عنه → المصدر → كيفية التحقق، بما في ذلك ملخص محجوب بلغة واضحة للاستدعاء ونتيجته، وبنية الوكيل والنموذج الذي أنتج كلًّا منهما، والهوية التي عمل نيابةً عنها، والسجل الذي تسبّب فيه، وقرار التخويل ونطاقه، وأي فئات من البيانات الشخصية أو إشارات تهديد مُستوعَبة) وملف بيان (evidence.csv.manifest.json) يربط ملف CSV بمصدره — إذ تربطه تجزئة رأس السلسلة بالسجل القابل للتحقق الذي جاء منه، وcsv_sha256 هو تجزئة الملف المُصدَّر نفسه، لذا فإن ملف CSV المُعدَّل بعد التصدير لم يعد يطابق بيانه. ضيّق نطاق المجموعة باستخدام --tool عندما تغطي إحدى الضوابط إجراءات معينة فقط؛ ويسجّل البيان عامل التصفية، لذا يكشف التصدير المحدود النطاق أنه مجموعة فرعية بدلًا من أن يُقرأ كأنه المجموعة الكاملة. ارفع كليهما مقابل ضابط التسجيل أو المراقبة لديك؛ وأرفق تقرير Runtime Report بصيغة HTML عندما يرغب أحد المراجعين في التحقق من السلسلة بنفسه. يرفض التصدير العمل على سلسلة تفشل في التحقق.
تكامل دفع أصلي — وصول الأدلة إلى منصتك تلقائيًا — مدرج في خطة العمل. مسار الملف أعلاه يعمل اليوم مع أي منصة تقبل الأدلة المرفوعة.
CLI```
halo verify validate schema + hash chain (exit 1 broken, 3 empty chain; CI-friendly) halo report render a chain as a self-verifying HTML Runtime Report (--from/--to: a date-windowed report covering only the review period) halo policy corroborate a chain against a declarative policy pack (per-rule pass / violation / evidence-gap; exit 1 violated, 3 nothing in scope) halo serve serve per-tenant reports over HTTP, access-scoped per customer halo grant designate a report recipient (email or domain) halo viewers list who has unlocked a gated report halo anchor witness a chain head, or --check completeness (exit 1 incomplete, 3 unwitnessed) halo witness-serve run a witness over HTTP: vendors anchor chain heads, viewers fetch checkpoints halo demo scaffold the full vendor demo (record -> witness -> gated report) halo export date-bounded evidence export: CSV + manifest tied to the chain head halo sample emit a valid example log halo hash canonical sha256 of a JSON value halo hook Claude Code PostToolUse hook
## نموذج السلامة
لحساب تجزئة سجل: خذ السجل مع استبعاد `integrity.hash`، مع تعيين `integrity.prev_hash` إلى تجزئة السجل السابق؛ قم بالتقنين باستخدام RFC 8785 (نظام تقنين JSON)؛ ثم SHA-256 على البايتات. قيمة `prev_hash` للسجل الأول هي 64 صفرًا. تعيد عملية التحقق حساب كل تجزئة وتتحقق من كل رابط. لا حاجة لسر؛ فهذا هو المقصود.
هل تعتقد أنك تستطيع التلاعب بسلسلة دون أن يلاحظ المدقق؟ [المحاولات والنتائج موجودة هنا](https://github.com/bkuan001/halo-record/discussions/2).
المرجع الكامل للحقول: [`halo-record.schema.json`](https://github.com/bkuan001/halo-record/blob/main/src/halo_record/halo-record.schema.json).
## TypeScript
نفس المسجّل متاح لـ Node: [`halo-record-ts`](https://github.com/bkuan001/halo-record-ts). نفس تنسيق السلسلة، نفس بروتوكول الشاهد. السجلات المكتوبة بأي من اللغتين يتم التحقق منها بأي من المدققين.
## أمثلة من المجتمع
[trail-halo-poc](https://github.com/AmeyParle/trail-halo-poc) — إثبات مفهوم من المجتمع يربط السلطة الرئيسية لسجل Halo ببيانات اعتماد TRAIL: ربط متبادل بين المؤسسة والوكيل ومنح نطاق موقّعة من المؤسسة مسجّلة في سلسلة Halo، مع مجموعة تحقق خصومية.
## المساهمة
المشكلات والمناقشات وطلبات السحب مرحّب بها — راجع [CONTRIBUTING.md](https://github.com/bkuan001/halo-record/blob/main/CONTRIBUTING.md) للقواعد الأساسية (النسخة المختصرة: الاختبارات مطلوبة، طلبات سحب صغيرة، تغييرات المخطط تُناقش أولاً).
## الترخيص
Apache-2.0