Repository navigation
Releases
HaramLite v0.2.9
HaramLite 0.2.9 — «الحوافّ المكشوفة»
حالة هذه الوثيقة: منشورة. الإصدار
v0.2.9منشور عامّاً على GitHub بتاريخ
2026-09-25 (publishedAt = 2026-09-25T13:02:51Z· غير مسودّة · غير prerelease)، وهذا نصّ
النشرة نفسه. والوسمv0.2.9مؤشّر إلى الالتزامfca5882(مقيس: كائن الوسم
8b454c0⇒fca5882). والأرقام أدناه مقيسة محلياً على التزام ساكن
(git statusفارغ قبل القياس وبعده) ولا تُنسب إلى CI إلا حيث نُصَّ على خلافه.المصدر:
git log main..0db0ade— ٥٥ التزاماً، والدمج منmain = ada7b2c
(مقيس:git rev-list --count main..0db0ade= 55). كل بند أدناه مسنود ببصمة التزامه،
لا بذاكرة كاتب.
| الإصدار | 0.2.9 — موحَّد في package.json · src-tauri/tauri.conf.json · src-tauri/Cargo.toml · src-tauri/Cargo.lock (pnpm versions:check ⇒ ✓ · exit 0) |
| إضافة المتصفّح | 1.1.9 — دورة نشر مستقلّة، لا تُوحَّد مع التطبيق (browser-extension/manifest.json) |
| رأس فرع التكامل | 0db0ade |
| قاعدة النطاق | main = ada7b2c (git merge-base main rehearsal/owner-test = ada7b2c) |
| عنصر النشر | Release #36136806340 على 3ff9d95 ⇒ completed · success (بناء على عدّاءات GitHub). وخرج خمسة أصول: HaramLite_0.2.9_x64-setup.exe 196,944,377 بايت (187.8 MiB) · HaramLite_0.2.9_x64_en-US.msi 230,002,688 بايت (219.3 MiB) · SHA256SUMS.txt 194 · build-info.json 3,578 · sbom.cdx.json 422,856 |
١) ما أُصلح
١-١ · الإضافة: الوضع واللغة واللغتان معاً
المشكلة المقيسة: زرّ المشاهدة كان يرسل الطلب بلا وضع، فيقع التطبيق على افتراضيّه
(song) — أي أن الوضع المعروض في الواجهة لم يكن الوضع المُرسَل. وزرّ اللغة لم يكن
موجوداً أصلاً، وكانت اللغة تتبع navigator.languages وحدها.
9d1c1e4—feat(ext): 1.1.9 - the mode choice reaches the player, named bridge errors stop reading as empty replies, and the language has a visible switchd2e3bd3—fix(ext): the displayed mode is the mode that gets sent - the watch request carried none, so the app used its own default (song)2fabfba— زرّ المشاهدة يعود إلى المسار المؤقّت، والأوضاع الصريحة تُحفَظ، وقائمة سماح تمنع الإفراط في الإسقاطa2d1656— جواب جاسوس مستقلّ: الاتجاه عند التبديل الحيّ · مزلاج البدء · ومسربا HTML كانا يعيدان فتح Trusted Typesc800cff— انتظار القراءة الأولى قبل إرسال الوضع · متابعة تغييرات التبويب الآخر · بناء قائمة السياق مرّة واحدة · وطباعة الوضع المُرسَل0521402—i18n(ext): لغة واحدة لكل نصّ — الجرد أولاً، ثم إعادة كتابة الإنجليزية، وقائمة سماح بالأسماء تمنع الرجوع2b1d8c2— إعادة قياس صفوف المتصفّح بعد 1.1.9 (إبقاء المصفوفة صادقة)
القياس: pnpm ext:guard أخضر · pnpm ext:mutants (بوّابة سالبة) بلا ثقوب · صفوف المتصفّح الثلاثة بمكافآتها الرقمية وآثارها الملتزَمة في qa/browser-rows/.
١-٢ · البوت بلغتين + /lang
النصوص كانت عربية مكتوبة في telegram.rs بلا جدول ترجمة. الآن للبوت لغة، و/lang يبدّلها فعلاً.
c11fe88—feat(telegram): the bot speaks English too, and /lang switches for real5d42327—fix(telegram): «نصّا المالك الحيّان كانا نصوصي المرحليّة المتوازية» (تصحيح ذاتي مُعلَن)756d07a— قياس الحدّ الذي سمّاه الجاسوس على النصّ الخام: ليس موجوداً (نفي بالقياس لا بالرأي)
١-٣ · نافذة/شاشة الإعدادات
العطل المقيس: شاشة الإعدادات كانت شريطاً بطول ٦٧ بكسل داخل ترويسة مموّهة
(backdrop-filter ينشئ containing block فيحبس العنصر fixed)، ثم صارت نافذة ثانية، ثم
أُلغيت النافذة الثانية لصالح شاشة داخل النافذة في سبعة تبويبات.
db4e686—feat(ui): an independent settings window opened from Rust, covered by the existing capability2085794—feat(ui): the settings screen moves into the window, in seven tabsa5fcb1e—refactor(ui): drop the second window, settings become an in-window screen03bb637— الشاشة تأخذ الوضع من الرست، و CSS‑ي يكفّ عن إبطالhidden5e5ce0f—fix(ui): the settings screen was a 67px strip inside the blurred header(علّةbackdrop-filter)10d8dfa—fix(settings): unnest the seven tab panels so every tab shows its own group5190f22—test(settings): حكم على خريطةid → تبويبالمعلَنة، لا على حضور DOM9a49379—ci(layout): قياس شاشة الإعدادات لا القائمة المنسدلة وحدهاa00c8d5/ba916f5/3f4e823/73d2b6b— انظر ١-٤
١-٤ · بوّابتا الحرّاس: الأسماء + مُفسَدات رست
الفجوة المقيسة: خطّ الأساس كان يقارن العدد وحده ⇒ اختبار يُحذف ويُوضع مكانه اختبار
تفاهي يمرّ. والحارس الذي لا يسقط قط ليس حارساً.
a00c8d5—feat(gate): compare the rust test *names*, not just the counts— جردُ أسماء فيqa/rust-baselines.json؛ اسم غاب ⇒ يسقط البناءba916f5—feat(qa): a baseline of test *names*, and the two measured holes as mutants— الثقبان المقيسان (نزع حارس واختبار تافه مكانه · اختبار صار#[ignore]) صارا مُفسَدَين3f4e823—feat(qa): a negative gate for rust guards— نظيرext:mutantsللجانب الرست73d2b6b—ci(gate): run the rust mutant gate in the existing job— موصولة بـCI (وإلا فهي نصيحة، قاعدة المشروع §١٠)8252a9d— تثبيت خطّ الأساس بعد إصلاح الجسر
القياس (على 2da7093): pnpm rust:gates ⇒ clippy ١٤/١٤ موضعاً فريداً · ٤١٨ ناجح (الأساس ٤١٨) · ٠ فاشل · ٥ مُهمَل · الجرد ٤١٨/٤١٨ اسماً والغائب صفر · exit 0 — قيس مرّتين بنفس النتيجة.
١-٥ · جرد التبويبات
الشاشة سبعة تبويبات، ولكل معرّف تبويبٌ معلَن في خريطة، والحارس يحكم على الخريطة لا على
حضور العنصر في DOM (وهو ما كان يمرّ على عنصر مخفيّ).
f2114a5,3ce2baf,9fa296c,2471286,96ab31e— فرعagent/settings2(غير مدموج بعد؛ انظر §٣): حذف مسار#advanced-panelالميت · تثبيت الحارس على العنوان · حذف توصيل «المعاينة السريعة» ومستهلكيه · توسيع حارس المسارات الميتة إلى كلsrc5190f22— التبويبات وidالمعلَنة (مدمج)
١-٦ · حذف المسارات الميتة
2471286—refactor(queue): delete the dead quality-select wiring, and widen the dead-path guard to all of src9fa296c—refactor(main): delete the dead quick-preview DOM wiring, and drop its allowlistf2114a5—refactor(settings): delete the dead #advanced-panel path and guard against its return96ab31e—refactor(preview): delete the quick-preview setting and all of its consumers
حدّ أمانة: هذه الأربعة على
agent/settings2ولم تُدمج في فرع التكامل بعد (مقيس:
git rev-list --count 0db0ade..agent/settings2= 5). فحذف المسارات الميتة ليس في 0.2.9
حتى تُدمج — أُثبته هنا ولا أدّعي خلافه.
١-٧ · subcode وأعطال المحرّك
المشكلة: ردّ فشل بلا code يُقرأ في الإضافة «ردّ فارغ» فيضيع السبب.
e5ee662—fix(slots,telegram,bridge): an occupancy connector, a t3 that measures its own resource, and engine subcodes02ef68a—test(bridge): a raw engine message is never a valid subcode824e211—fix(bridge): carry watch and mode together so an explicit clip survives the request file
القياس: pnpm bridge:codes ⇒ ٧ رموز مُصدَرة في ١٧ موضع خطأ، ولكلٍّ مدخل وحالة ترجمة في
ملفَّي الإضافة (٢١ فحصاً · ٠ فاشل) · exit 0.
١-٨ · ترجمة رسائل الواجهة
العطل المقيس: رسائل يصوغها التطبيق (لا الإضافة) تُعرض عربية في واجهة إنجليزية،
وdirection="ltr" — وزيادة مفاتيح ترجمة لا تُصلحه لأن النصّ لا يأتي من الإضافة.
3beea55—fix(i18n): read the backend's error through its stable code, not the raw text58845e2—fix(ui): every displayed backend error goes through errTexta273f08—test(ui): no raw .error read escapes errText, and the codes match Rust both ways34e2dfa—test(ui): عدّString(<catch binding>)عند مصرف العرض أيضاً — مُفسَد هو الذي وجد الثقب3ceb424— ربط عيّنة الإلغاء بالنصّ الذي يبنيهseparator.rsاليوم (وكان التعليق تاريخياً)
حدّ أمانة: هذه الخمسة على
agent/texts2/agent/ui-textsولم تُدمج (مقيس:
0db0ade..agent/texts2= 6). ويبقىط-١٢مفتوحاً فيdocs/BACKLOG-0.3.md:353:
تفصيل المحرّك{e}يبقى عربياً داخل جملة إنجليزية.
١-٩ · إصلاح stderr والتنزيل
العطل المقيس (بلاغ المالك): تنزيل يفشل بعد ١٠٠٪ والرسالة والسجلّ يحملان تقدّماً فقط بلا
سطر الخطأ. السبب الجذري بالقراءة: yt_dlp.rs كان يصرّف stderr إلى بالوعة تُرمى،
ويبني الذيل من stdout وحده — وyt-dlp يكتب ERROR: على stderr. ثم أُعيد إنتاجه بنصّه:
ERROR: unable to download video data: HTTP Error 403: Forbidden.
68b7f5e—fix(ytdlp): stop discarding stderr — a failed download now carries its causeb0d8f2d—feat(ytdlp): retry a transient download failure once — measured, logged, boundedba5a852—fix(ytdlp): a download failure is no longer labelled "ملفات:" (file error)0e9da97—fix(ytdlp): never retry a permanent failure, never spend a valid result36f2e62—fix(qa): the rust baseline gate now compares tests_ignored too124ee13—fix(ytdlp): judge the failure from its ERROR line, and rescue a valid slot on stall6e07746—style(ytdlp): إزاحة توثيق لا تغيير كود
حدّ أمانة: السبعة على
agent/x2-dlولم تُدمج (مقيس:0db0ade..agent/x2-dl= 13).
أي أن إصلاحstderrوالتنزيل ليس في 0.2.9 حتى تُدمج.
١-١٠ · الإلغاء
العطل المقيس: الإلغاء من الواجهة كان يُسجَّل ERROR pipe: خطأ استدلال النموذج: تم إلغاء المعالجة من قبل المستخدم — أي إلغاء المستخدم يُقرأ عطلاً.
705ae1b—fix(pipe): a user's cancel is not a failure — no ERROR line on the engine path1ca3b0d—fix(sep): type the stop in demix, and guard that the type is the one production builds1661a70—test(pipe): إغلاق تفادي الحارس بالتعليق/التجزئة، وحراسة مساري المحرّك والأداة438ac78—test(sep): حصر الحارس النصّي على متنdemix، وجعل الحارس الحيّ غير قابل للتخطّي الصامت9375383— إيقاف الحارس عن رفض الكود الصحيح، ومنع الحارس الحيّ من المرور بلا تنفيذfb9f250— علم المشاهدة يعود إلى المسار المؤقّتb348c38...
HaramLite v0.2.8
إغلاق ثقوب في الأدلّة: حارسٌ كان يقرأ ولا ينفّذ · وأربع عشرة بوّابة
- أُغلق ثقب حقن في «افتح الملف» كان قائماً قبل 0.2.7: مسار فيه
&صار يُمرَّر وسيطاً واحداً بلا مُفسِّر أوامر. - حارس الإضافة كان يقرأ الكود ولا ينفّذه: صار ينفّذ
setAudioTimeعلى ستة مشاهد ⇒ 513 فحصاً · 36 مُفسَداً (كانت 473 · 27). - ثلاث بوّابات كانت تصمت أو تصرخ خطأً وثمانٍ لم تعد تمرّ فراغاً، وبوّابة جديدة
pnpm guards:selfcheckتجعلها أربع عشرة. - سبعة إصلاحات صحّة (سجلّ
throttleلا يطبع أصفاراً ·stftبلا نقص تحت الصفر ·bridgeلا ينفكّ تدفّقه · نفايات CSS كانت تُسقط كتلتين مرئيتين) — بلا تغيير في طريقة الفصل أو الواجهة.
| الأصل | الحجم | SHA-256 |
|---|---|---|
HaramLite_0.2.8_x64-setup.exe |
187.64 م.ب | f23a59ab82edb8156a2298f81b1c625cabdd122f07a5acab4d29f9719969cf6f |
HaramLite_0.2.8_x64_en-US.msi |
364.69 م.ب | 89912fd12ec39e91db162a26907cf90b4fa928c1aa7c09f2c387411feda8baec |
SHA256SUMS.txt |
194 بايت | — |
البصمات مقيسة من الملفين المُنزَّلين من هذه الصفحة لا من مجلد البناء. والتفصيل الكامل في docs/RELEASE-0.2.8.md داخل المستودع.
التثبيت عبر NSIS. النسخة المحمولة لا تدعم التحديث الذاتي — استخدم صفحة الإصدارات.
HaramLite 0.2.7
HaramLite 0.2.7
| الأصل | البايتات | SHA-256 |
|---|---|---|
HaramLite_0.2.7_x64-setup.exe |
197,105,521 | BDF2CBAA2266597980672EF968107E25C0D5FD03724E03417CD96B94E58DD6F8 |
HaramLite_0.2.7_x64_en-US.msi |
389,496,832 | 8022A9FE2BAE2735F5838D5F35404D8970935CC90A1E2F07E329D8D3BF469EAF |
Repair assets (stable)
مصادر معالج الإصلاح الذاتي — لا تحذف هذا الإصدار. الرخص: رخصة NVIDIA CUDA (البند 1.1.2 Distribution Requirements) لأصول CUDA/cuDNN، و MIT لمزوّدي ONNX Runtime — والتفاصيل في THIRD-PARTY-NOTICES.md في المستودع.