تخطَّ إلى المحتوى
kazma.
EN نجمة 6 ابدأ الآن

بطارية الفحص الشاملة للنظام

بطارية الفحص الشاملة للنظام

Section titled “بطارية الفحص الشاملة للنظام”

ثلاثة تشغيلات مستقلة. الجزء A الأخضر ليس كاظمه خضراء. التقييم في الأسفل.

الجزءما يثبتهما لا يستطيع إثباته
A فحص المحادثةما زال المُشرف قادرًا على استدعاء أدوات القراءة فقطTelegram، وSSE، وأزرار HITL، والنسخ الاحتياطية
B HTTP / التشغيلالعملية، وConfigStore، واسترجاع الذاكرة، ومساحة العمل، وحزمة البحث، وواجهة النسخ الاحتياطيأن يستطيع إنسان الموافقة على بطاقة
C كتابة HITLمقاطعة الرسم البياني ← موافقة ← الملف يستقر على القرص فعلًاناقل السرب، ونقاط تحقق الخط الأنابيب، وإرسال البريد، والنشر على X

الحكم

  • أي فشل (FAIL) في A أو B ← ذلك النظام الفرعي معطوب. توقف عن التخمين.
  • عدم تشغيل C ← لم تُثبِت ‏HITL ولا الكتابات على القرص.
  • اخضرار الثلاثة ← أدوات المحادثة + HTTP + كتابة واحدة موافَق عليها تعمل. ما زال هذا ليس «Telegram يعمل» إلا إذا لُصق C ‏على Telegram.

العنوان الأساسي أدناه هو http://127.0.0.1:9090. غيّره إن كان لديك مختلفًا. لا تبدأ الخادم أو تعِد تشغيله كجزء من هذه البطارية.


الجزء A — فحص المحادثة (قراءة فقط)

Section titled “الجزء A — فحص المحادثة (قراءة فقط)”

رسالتان، بالترتيب، على محادثة الويب أو Telegram.

  1. أرسل فقط: /long mission
    انتظر إشعار الاستلام MISSION ON. تلك الشرطة المائلة لا تُرسَل إلى النموذج — إن لصقت الفحص تحتها في نفس الفقاعة، فلن يعمل الفحص أبدًا.
  2. ثم الصق الكتلة أدناه (بلا شرطة مائلة في السطر الأول).

بعد إعادة تحميل خادم تتضمن سقوط /long mission+المتن (2026-09-17)، يعمل أيضًا لصق واحد يبدأ بـ/long mission زائد الفحص. حتى ذلك الحين، استخدم رسالتين.

نص الفحص (“Read-only tools only” / “Do not write”) يُسلّح audit_only. هذا مقصود. القراءات التشخيصية (config_read، وgit_status، وemail_list, …) على قائمة السماح تلك؛ أما الكتابات وmcp_test_server ودهاليز الخزنة/قاعدة البيانات فلا. فشل tool 'X' is not on the audit_only allowlist على فحص درجة قراءة بعد هذا التغيير هو علّة بوابة حقيقية، وليس «النظام الفرعي معطوب».

You are running Part A of the Kazma full-system battery. Read-only tools only. Do not write files, send email, post to X, mutate memory, dispatch a swarm task, or run shell_exec/python_exec/file_write. If a tool is missing, gated, or returns Error:/⚠️ — that row is FAIL, not a reason to invent a pass.
Continue through EVERY section even if earlier ones fail. Do not synthesize a reassuring summary over a failed probe.
For each row:
| # | Subsystem | Probe | Result | Evidence |
Result is PASS, FAIL, or SKIP (SKIP only if the feature is honestly not configured, with the config key you read). Evidence is one short quote from the tool or the error.
1. Identity — context_info (workspace root, active model, provider).
2. Clock — current_datetime.
3. ConfigStore — config_read agent.max_iterations and safety.hitl.enabled.
4. Memory — memory_search q="kazma" (or memory_list_beliefs). Empty beliefs = PASS "empty", not FAIL.
5. Workspace — file_list "."
6. Git — git_status. SKIP only if not a repo.
7. Web search — web_search q="Kazma AI agent".
8. Fetch — read_url of ONE https URL from step 7. FAIL if SSRF/timeout/empty. Confirm body is fenced (kazma:data).
9. Research stack — research_readiness.
10. Swarm — do NOT dispatch. Confirm check_swarm_task (or equivalent) is registered and answers. FAIL on import/"No swarm".
11. HITL config — config_read safety.require_approval_for. Do not call a danger tool.
12. MCP — mcp_list_resources (not mcp_test_server; that is write-tier). SKIP if no servers.
13. Documents — document_status with **no** document_id/job_id (platform overview: enabled, workers, catalog). Empty catalog = PASS. SKIP if documents.enabled is false.
14. Email — email_list folder=INBOX limit=1. Do not send.
15. Calendar — list_events. FAIL if the user has Google connected and the tool returns silent sandbox.
16. Voice — config_read voice.stt_provider and voice.tts_provider. SKIP if voice disabled.
17. X — x_status if the tool exists. SKIP if not configured. Do not post.
18. Cron — list_scheduled if the tool exists. Empty list = PASS.
19. Host — get_system_stats.
20. Vision — analyze_image only if an image is in this thread; else SKIP.
21. Model routing — active model from (1) plus whether a second provider is configured (names only, never keys). FAIL if provider/model mismatch is obvious.
## Score
- PASS n
- FAIL n ← names
- SKIP n ← names
## What is really broken
One sentence per FAIL: subsystem, tool, exact error. Zero FAIL → "No functional break in Part A" and list SKIPs as unconfigured, not healthy.
Do not claim Telegram/Discord/Slack, backups, Postgres dumps, restic, or HITL buttons work. Do not call this production-ready.

الجزء B — HTTP / التشغيل (أنت من يشغّله)

Section titled “الجزء B — HTTP / التشغيل (أنت من يشغّله)”

‏PowerShell. قد ينطبق تسجيل الدخول التلقائي على loopback في متصفح؛ هذه الصدفة ليست متصفحًا. شغّله من دليل التثبيت الحي ليتمكن .env من تزويد KAZMA_SECRET (السكربت لا يطبع القيمة أبدًا).

‏401 على مسار /api/* مُبوَّب حين لم يُرسَل أي سر هو البوابة تعمل، وليس نظامًا فرعيًا ميتًا. يتبع Invoke-WebRequest إعادات التوجيه، لذا قد يعرض /health/details بلا سر 200 HTML — هذه صفحة تسجيل الدخول، لا تسريبًا لأسماء النماذج. أما JSON فيه active_model بلا اعتماد فهو تسريب.

Terminal window
$base = 'http://127.0.0.1:9090'
Set-Location 'C:\Users\balfa\kazma' # live install; change if yours differs
if (-not $env:KAZMA_SECRET) {
foreach ($p in @((Join-Path (Get-Location) '.env'), 'G:\GitHubRepos\kazma\.env')) {
if (-not (Test-Path $p)) { continue }
$line = Select-String -Path $p -Pattern '^\s*KAZMA_SECRET\s*=' | Select-Object -First 1
if (-not $line) { continue }
$val = ($line.Line -replace '^\s*KAZMA_SECRET\s*=\s*', '').Trim().Trim('"').Trim("'")
if ($val) { $env:KAZMA_SECRET = $val; break }
}
}
$haveSecret = [bool]$env:KAZMA_SECRET
$h = @{ Accept = 'application/json' }
if ($haveSecret) { $h['X-Kazma-Secret'] = $env:KAZMA_SECRET }
Write-Host ('Auth header: ' + $(if ($haveSecret) { 'X-Kazma-Secret set (from env or .env)' } else { 'NONE — gated routes should 401 (gate PASS)' }))
function Probe($name, $path, [switch]$Gated) {
$code = 0; $body = ''
try {
$r = Invoke-WebRequest -Uri ($base + $path) -Headers $h -UseBasicParsing -TimeoutSec 30 -MaximumRedirection 0
$code = [int]$r.StatusCode; $body = [string]$r.Content
} catch {
$body = [string]$_.Exception.Message
if ($_.Exception.Response) { $code = [int]$_.Exception.Response.StatusCode }
}
$snip = if ($body.Length -gt 180) { $body.Substring(0, 180) } else { $body }
$html = $body -match '<!DOCTYPE html>|<html'
$ok = $false; $note = ''
if ($Gated -and -not $haveSecret) {
if ($code -eq 401) { $ok = $true; $note = 'gate-401' }
elseif ($code -in 302, 303) { $ok = $true; $note = 'gate-redirect' }
elseif ($code -eq 200 -and $html) { $ok = $true; $note = 'login-html (redirect followed)' }
elseif ($code -eq 200 -and $body -match 'active_model') { $ok = $false; $note = 'LEAK details JSON unauthenticated' }
else { $note = 'unexpected unauth response' }
} else {
$ok = ($code -eq 200) -and -not $html
if ($html) { $note = 'got HTML, wanted JSON' }
}
[pscustomobject]@{ Name = $name; Code = $code; Ok = $ok; Note = $note; Evidence = $snip }
}
$rows = @(
(Probe 'live' '/health/live'),
(Probe 'ready' '/health/ready'),
(Probe 'deep' '/health/deep'),
(Probe 'auth' '/api/auth/status'),
(Probe 'app-status' '/api/status'),
(Probe 'research-ready' '/api/research/ready' -Gated),
(Probe 'backup-list' '/api/backup/list' -Gated),
(Probe 'backup-status' '/api/backup/status' -Gated),
(Probe 'pending-hitl' '/api/pending-approvals' -Gated),
(Probe 'health-details' '/health/details' -Gated)
)
$rows | Format-Table -AutoSize
$failed = @($rows | Where-Object { -not $_.Ok })
if ($failed.Count) { Write-Host "PART B FAIL:" ($failed.Name -join ', ') } else { Write-Host 'PART B: all HTTP probes returned expected codes' }
if (-not $haveSecret) { Write-Host 'Gated APIs were only checked for 401. Re-run with KAZMA_SECRET (or .env in this directory) to prove the JSON bodies.' }

ثم، ما زلت في PowerShell، من المستودع (أو نسخة النشر التي تشغّلها فعلًا):

Terminal window
cd 'G:\GitHubRepos\kazma' # or C:\Users\balfa\kazma if that is the live process
& '.venv\Scripts\python.exe' scripts\service\kazma_guard.py --status

كيف تقيّم B

الفحصالنجاح (PASS)الفشل (FAIL)
/health/live"status":"alive" وbuild.commitلا عملية / منفذ خاطئ
/health/ready200503 — اقرأ checks لمعرفة الاعتمادية المعطوبة
/health/deep200، و"ok": true503 — مصفوفة failed هي الجزء المعطوب (الإعداد / الاسترجاع / مساحة العمل / البحث / الدماغ / قاعدة البيانات)
/api/auth/status200؛ إن كنت خلف nginx فلا يجب أن يكون undeclared_proxy مُقفَلًا401 غير متوقع؛ أو قفل الوكيل بينما ظننت أنك متصل مباشرة
/api/status"status":"ok" (أو "degraded" مع init_errors مسماة)500 / فارغ
/api/research/readyمع السر: ‏JSON للواجهات الخلفية. بلا سر: ‏401 (نجاح البوابة — المتن لم يُتحقق منه)500؛ أو 200 بلا سر (يفترض أن يكون مُبوَّبًا)
/api/backup/listمع السر: ‏JSON ‏backups (القائمة الفارغة نجاح). بلا سر: ‏401500؛ أو 200 بلا سر
/api/backup/statusمثل backup-list500؛ أو 200 بلا سر
/api/pending-approvalsمع السر: قائمة JSON (الفارغة نجاح). بلا سر: ‏401500؛ أو 200 بلا سر
/health/detailsمع السر: ‏JSON ‏(checks، وليس HTML). بلا سر: ‏401 JSON، أو 303 إلى /login، أو 200 لصفحة دخول HTML إن تُبعت إعادات التوجيه200 JSON فيه active_model ولا اعتماد (تسريب). 500
kazma_guard.py --statusيرى الحارس نفس build.commit الذي يراه /health/liveالحارس متوقف، أو عدم تطابق الالتزام (العملية لم تلتقط السحب)

نقرات بشرية (واحدة لكل بند، 30 ثانية)

  1. الويب: افتح /، أرسل ping. تتدفق الرموز؛ وينتهي الدور برد حقيقي (وليس سلسلة تفكير عالقة).
  2. الإعدادات ← المزوّدون: الصفحة تُصيَّر؛ لا حقول إدخال خام غير منسقة (الصوت/البريد كذلك).
  3. إن كنت تستخدم Telegram يوميًا: أرسل ping إلى البوت. يأتي الرد. إن تخطيت هذا، فTelegram غير مُختبر.

لا تنفّذ POST /api/backup/now كجزء من البطارية الافتراضية (بطيء، يكتب). القائمة/الحالة تكفيان لإثبات أن الـ API حي.


الجزء C — كتابة HITL (محادثة، أدوات خطر عن قصد)

Section titled “الجزء C — كتابة HITL (محادثة، أدوات خطر عن قصد)”

شغّله بعد A وB على نفس القناة التي تستخدمها فعلًا (SSE الويب إن كانت هي اليومية؛ Telegram إن كانت هي اليومية). ستحصل على بطاقة موافقة. وافق عليها. إن لم تظهر بطاقة، فقد فشل C من الآن.

إن كانت المهمة مشغّلة أصلًا من الجزء A، فالصق الكتلة أدناه كما هي. وإلا: أرسل /long on وحده، وانتظر إشعار الاستلام، ثم الصق الكتلة (شرطة /long البادئة في نفس الفقاعة لا تُرسَل إلى النموذج).

You are running Part C of the Kazma full-system battery: one real HITL write.
Create a unique probe file in the active workspace:
path: kazma-battery-probe.txt
contents: one line "kazma-battery <UTC ISO timestamp from current_datetime> <thread id if you have it>"
Use file_write (not python_exec, not shell_exec). Stop and wait for HITL. Do not retry the write, do not YOLO, do not use a different tool to bypass the card.
After the write is approved and succeeds:
1. file_read kazma-battery-probe.txt — FAIL if missing or wrong contents.
2. file_delete kazma-battery-probe.txt — that is a second HITL card; wait again.
3. file_list . — FAIL if the probe file is still there after the delete is approved.
Report:
| Step | Result | Evidence |
| HITL card appeared for file_write | PASS/FAIL | |
| Write landed | PASS/FAIL | |
| HITL card appeared for file_delete | PASS/FAIL | |
| File gone | PASS/FAIL | |
Do not invent a success. Do not send email, post to X, or dispatch swarm.
HITL-card rows: you cannot see the operator's screen. After graph interrupt() + resume, the tool result is ordinary success ("Wrote N lines") — that is the **post-approve payload**, not proof the gate was skipped. Mark those two rows **OPERATOR** (not PASS, not FAIL) and quote the tool result. The operator scores PASS/FAIL from whether ⚠️ Approval required / Approve actually appeared.
Same `hitl approve <uuid>` on write and delete is expected: that uuid is the **thread_id**, not a per-gate id.

كيف تقيّم C

أنت تقيّم صفوف البطاقة من الواجهة، لا من جدول النموذج.

بعد الاستئناف، لا يرى النموذج سوى Wrote N lines / Deleted: …. هذا طبيعي. ‏hitl approve <uuid> في Telegram هو معرّف الخيط (thread_id) (تطابقُ نفس uuid للكتابة والحذف في دور واحد أمر متوقع).

ما رأيتهالمعنى
بطاقة على الويب (أو Telegram) ← موافقة ← الملف موجود ← بطاقة ثانية ← الملف اختفىمسار HITL في الرسم البياني يعمل على تلك القناة
⚠️ Approval required على Telegram، ثم تنفّذ hitl approve / تنقر موافقةنفس النجاح — قد يكون النموذج مع ذلك كتب FAIL؛ تجاهل ذلك
الكتابة تنجح بلا بطاقةHITL متوقف، أو YOLO مشغّل، أو الأداة ليست من درجة الخطر. اعتبره فشلًا ما لم تكن تقصد YOLO
بطاقة على الويب لكنك أرسلت C على Telegramأثبتَّ القناة الخاطئة
خطأ file_write «خارج مساحة العمل»مشكلة ربط، لا HITL

إضافات اختيارية (غير مطلوبة لبطارية خضراء)

Section titled “إضافات اختيارية (غير مطلوبة لبطارية خضراء)”

فقط إذا كان المنتج المقابل هو طريقتك فعلًا في استخدام كاظمه:

الإضافةكيف
البحث العميق/research ← ملخص قصير واحد، انتظر done ‏(مصفوفة الدخان)
السربلوحة السرب ← إرسال صغير واحد؛ يظهر العامل؛ النتيجة أو الخطأ مرئيان
المستنداتارفع PDF واحدًا على /documents؛ تترك المهمة حالة received
الصوتملاحظة صوتية واحدة على Telegram، أو STT الويب إن كنت تستخدمه
إرسال البريدemail_send إلى نفسك في بيئة الحماية أولًا؛ HITL عند الإرسال
كتابة النسخ الاحتياطيالإعدادات ← النسخ الاحتياطي ← تشغيل الآن؛ انتظر حتى لا تكون الحالة «اكتمل» صامتة مع بند خارج الموقع فاشل

الجزء D — ‏restic / نسخ Postgres الاحتياطي / migrate+الخزنة

Section titled “الجزء D — ‏restic / نسخ Postgres الاحتياطي / migrate+الخزنة”

شغّله من دليل التثبيت الحي. لا تستعد أبدًا فوق الشجرة الحية. لا تطبع أبدًا عبارات المرور أو مفاتيح الخزنة أو DSNs.

‏"postgres": false في /api/backup/list يعني أن نسخة الجيل الشامل كانت متقادمة أو متخطاة وقت النسخ، لا أن «هذا التثبيت SQLite». تحقق من KAZMA_DB_BACKEND وkazma-data/backups/pg/pg_shared_*.dump (البصمة PGDMP).

Terminal window
Set-Location 'C:\Users\balfa\kazma' # live install
$env:KAZMA_DATA_DIR = (Resolve-Path '.\kazma-data')
$env:KAZMA_USER_HOME = (Resolve-Path '.\.kazma')
if (-not $env:KAZMA_RESTIC_PASSWORD -and (Test-Path '.\.kazma\restic.pass')) {
$env:KAZMA_RESTIC_PASSWORD = (Get-Content '.\.kazma\restic.pass' -Raw).Trim()
}
# Restore drill: 0=PASS, 1=FAIL, 2=UNVERIFIED (required check did not run).
& '.venv\Scripts\python.exe' -m kazma_core.backup.restore_drill
# restic: local + offsite snapshot lists (newest DATA, not restic latest).
& '.venv\Scripts\python.exe' -m kazma_core.backup.restore --list
# Restore rehearsal into TEMP, then delete the target. Not the live install.
$dst = Join-Path $env:TEMP 'kazma-restore-rehearsal'
if (Test-Path $dst) { Remove-Item $dst -Recurse -Force }
New-Item -ItemType Directory -Path $dst | Out-Null
& '.venv\Scripts\python.exe' -m kazma_core.backup.restore --target $dst
# Expect: env present, config present, databases readable. Then delete $dst.
# Postgres dumps (SKIP if KAZMA_DB_BACKEND is sqlite / no KAZMA_DATABASE_URL).
& '.venv\Scripts\python.exe' scripts\pg_backup.py list
# migrate: export+verify+dry-import. Writes staging under kazma-data/.migrate-export-*
# Prefer a copy of the tree, not the live install, if you do not want staging there.
# kazma migrate export --out $env:TEMP\kazma-bundle.zip --no-assets
# kazma migrate verify $env:TEMP\kazma-bundle.zip
# kazma migrate import $env:TEMP\kazma-bundle.zip --workspace $env:TEMP\kazma-dry --dry-run

كيف تقيّم D

الفحصالنجاح (PASS)الفشل (FAIL)التخطي (SKIP)
تدريب الاستعادةكل الفحوص سليمة، بما فيها vault:decrypt مع أسرار مخزنةأي فشل؛ مفتاح الخزنة لا يفتح شيئًالا نسخ احتياطي شامل بعد
restic --list≥1 نقطة استعادة؛ وعددا اللقطات المحلية والخارجية إن ضُبط بعيدلا عبارة مرور، أو المستودع مفقود، أو فشل اللقطاتrestic ليس على PATH ولا مستودع
بروفة الاستعادة.env + kazma.yaml + قواعد بيانات مقروءة في هدف TEMPخطأ استعادة restic؛ لا .env—
نسخ PGpg_shared_*.dump ببصمة PGDMP؛ غير متقادمة لأكثر من 8 ساعاتالواجهة الخلفية postgres ولا نسخة / بصمة سيئةواجهة SQLite خلفية
تحقق migrateالحزمة صالحة؛ اقتران الخزنة match (أو empty على هدف جديد)أخطاء البصمة/العبث؛ mismatch بلا --reset-vault-key—

فحص الكتابة خارج الموقع هو remote_writable() على s3: / rclone: ‏(PUT+DELETE تحت locks/). البعيد الذي يسرد لكنه لا يستطيع الكتابة فشل.


ما زال خارج هذه البطارية

Section titled “ما زال خارج هذه البطارية”

هذه تحتاج تدريبًا مخصصًا، لا هذه الحزمة:

  • جلسات لاصقة لتعدد النسخ
  • تسجيل دخول OIDC
  • الفحص البصري للمستندات العربية/OCR
  • استخدام الحاسوب عبر المتصفح/Playwright
  • دورات التسليم A→B→A في السرب
  • السفر في الزمن /replay /fork

انظر قائمة فحص الإنتاج، ومصفوفة الدخان، والتعافي من الكوارث، والترحيل.