سجل التغييرات

GitHub

كل تغيير جدير بالذكر، إصدارًا بعد إصدار. الملف نفسه يأتي مع المستودع ومترجم إلى جميع اللغات الـ19.

[1.259.0] — 2026-10-25

قطار أسطول الوكلاء الثاني، ستة إصلاحات: تواريخ التقارير مثبَّتة من جهة الخادم، والترميز الجغرافي للخريطة يخزّن مؤقتًا ويقرأ المدن الروسية، والمساعدة ×18 تستشهد بتسميات الأزرار المترجمة، وجُمل الواجهة تتوقف عن خلط اللغات، ومقارنات الراتب تُحتسَب من جهة الخادم — وحزمة JS تُشحن مضغوطة مسبقًا (التحميل البارد 3.1 MB → 598 KB).

أُصلح

  • تواريخ التقارير الملفَّقة (CAR-101): يثبّت موجّه التقييم تاريخ اليوم من جهة الخادم الآن («يجب أن يكون حقل Date: هو حرفيًا — انسخه كما هو؛ ولا تلفّق تاريخًا أبدًا»)، وتعيد fixReportDate كتابة أي تاريخ منحرف إلى اليوم عند كل موقع قبول (فرع Anthropic، والرديف الفرعي لـ Gemini، وذيل المتوافق مع OpenAI، و/api/deep، وخط المعالجة الآلي) مع تحذير وسجل نشاط — تصحيحٌ لا رفض. 349/789 من تقارير الإنتاج كانت تحمل تواريخ ملفَّقة؛ والجديدة لن تُلفّق أبدًا.
  • الترميز الجغرافي للخريطة (CAR-105): سلاسل المدن السيريلية في صفوف hh.ru/Habr تصل الآن إلى المُرمِّز الجغرافي؛ وذاكرة مؤقتة دائمة محدودة الحجم (data/geocode-cache.json، تحت withFileLock) تعني أن المدينة المحلَّولة لا تضرب المزوّد مرتين أبدًا؛ وتُخصَّص نداءات الترميز الجغرافي ميزانية لكل طلب فيمتلئة الخريطة تدريجيًا بدل الحجب 13.9 ثانية.
  • خلط اللغات في الواجهة (CAR-108): أُصلحت 23 تسريبة موسومة بمفاتيح عبر 17 من 19 قاموسًا (85 قيمة) — «все matching» و«только remote» و«Открыть Scan» وقمع «Evaluated → Applied…» وغيرها صارت جملًا مترجمة كاملة تعيد استخدام مفردات المنتج الخاصة بكل لغة. ووُسِّع i18n-no-latin-leaks بجدول الشظايا + تحقيق القمع (أحمر→أخضر).
  • انقلاب حكم العملة (CAR-109): تُحتسَب مقارنة الراتب من جهة الخادم في comp-compare.mjs وتُدمَج بصيغة قاعدية واحدة (Candidate minimum: … per YEAR (raw: …) مقابل JD offer: …)؛ وتُطبَّع صيغ الشهري ×12 والاختصارات k/к/тыс/萬 والفاصلة العشرية قبل المقارنة؛ ولا يمكن لتحويلٍ غير مؤكد أن يقلب الحكم وحده (حالة zh-TW «€80–100k ниже минимума» ماتت). النموذج لا يضرب أبدًا.
  • تسميات أزرار المساعدة ×18 (CAR-107): كانت حزم المساعدة المترجمة تستشهد بتسميات إنجليزية («⚡ Run live» و«Save» و«Scan now») لم تعد الواجهة تعرضها — 263 استبدالًا عبر 18 لغة، مُشتقَّة من مصادر العروض؛ ويرث مساعد التوثيق الإصلاح.

أُضيف

  • حزمة مضغوطة مسبقًا وتحميل بارد قابل للتخزين المؤقت (CAR-104): تُنتِج make-bundle.mjs الحزمتين bundle.js.br (brotli q11) و.gz وقت الإصدار؛ وبرمجية وسيطة محصورة في الحزمة تفاوض br > gz مع Vary: Accept-Encoding وpublic, max-age=300, must-revalidate + ETag/304؛ مع حارس طزاجة (لا تخدم القرينة المدمجة ما هو أقدم من حزمة الهوية أبدًا)، وتُعيد الجلبات المباشرة للمصنوعات 404، وCSP مطابق بايتًا بايتًا. التحميل البارد: 3.1 MB → ~0.6 MB على السلك (−80%)؛ والزيارات المتكررة خلال 5 دقائق تنقل ≈0 بايت.

ملاحظات

  • جاءت الإصلاحات كلها من أسطول الوكلاء بأدلة أحمر→أخضر (13 + 28 + 1 + 30 + 7 حالات جديدة عبر أجنستها) وأُدخلت في جولات مراجعة (أُصلحت تنبيهات CodeQL #579/#580/#584 في الشيفرة — تُحلَّل عناوين URL الرديفة عبر new URL().host، وأُسقِطت سلسلة موجّه ميتة).
  • أرقام استكمال الدرجات لـ v1.258.0 مُسجَّلة الآن في CAR-129 (updated: 22، reportScoreless: 159).
  • ما تُرِك عمدًا دون تنفيذ: لا إصلاح رجعي لتواريخ التقارير التاريخية البالغة 349 (الاستكمال الرجعي عملية تشغيل تحتاج موافقة المالك)، ولا عرض تجميعي للخريطة (تبقى CAR-125 في الطابور خلف إصلاح الترميز الجغرافي هذا).
  • الاختبارات 5823 (+74). لم تُمَسّ أي مصادر ماسح (السجل 121 = 116 EN + 5 RU · 116 محوّلاً)؛ ولا مفاتيح i18n (يحرّر CAR-108 قيم المفاتيح الموجودة فقط).

[1.258.0] — 2026-10-25

ستة إصلاحات من أسطول الوكلاء في قطار واحد: عدّاد الشركات في #/scan يتوقف عن خلط كونين، والبحث العميق يفرض المصادر، وأخطاء النماذج تُضيء الحقل، وحالات التحميل تنال هياكلًا عظمية وعنوان h1 فوريًا، والتقييمات تخزّن بادئة موجّهها البالغة 37k من الرموز مؤقتًا.

أُصلح

  • عدّاد «الشركات النشطة» في #/scan (CAR-100): كان البسط يعدّ الشركات غير المكررة عبر جميع صفوف النتائج كلّها (1554 في الإنتاج — hh.ru وحدها تسهم بمئات) بينما كان المقام يعدّ الشركات المتتبَّعة المدعومة بواجهة API (~90) — كونان في كسر واحد. الاقتران (a): يعدّ البسط الآن الشركات بين الصفوف التي جلبها فحص المتتبَّع المدعوم بـ API نفسه (تُطابَق عبر _entry ?? company؛ وتخرج صفوف جهات التوظيف hh.ru/telegram من العدّ)؛ ونُقِل الاحتياطي ما قبل الفحص إلى الكون ذاته (كان يمكن أن يُقرأ «104/90»).
  • تلفيق البحث العميق (CAR-110): يحمل موجّه البحث العميق الآن عقدًا صارمًا — كل ادعاء واقعي ينتهي بـ [source: domain.com] (لا تسمية للمصدر تعني عدم ذكر الادعاء؛ واختلاق وسم أسوأ من كتابة «unknown»)، والوقائع المجهولة تُكتَب unknown، ويجب أن ينتهي التقرير بقسم ## Data freshness. مراسٍ للطزاجة: تاريخ اليوم بتوقيت UTC + url اختيارية للشركة على POST /api/deep (محدودة، ولا تُجلَب من جهة الخادم أبدًا).
  • أخطاء النماذج تُبرز الحقل (CAR-130): يوسم POST الفاشل أول حقل نموذج بـ aria-invalid + .is-error ويركّز عليه (WCAG 3.3.1)؛ وتُمسَح العلامة عند التحرير. وتنبيه الخطأ الشبكي واعٍ بالنشر الآن — الـ loopback يحتفظ بتنبيه أمر التطوير، والأصل المنشور يحصل على «الخادم لا يستجيب» بدل نصيحة bash web-ui/bin/start.md (كانت لافتة الاتصال تحمل الترميز الصلب ذاته).
  • حالات التحميل (CAR-112): يعرضان #/map و#/tracker عنوان h1 فورًا (كان هدف التركيز في الموجّه لا يوجد إلا بعد وصول البيانات)، وتستبدل أداة هياكل عظمية مشتركة (Skeleton.rows، صفوف لمعان aria-hidden داخل منطقة role="status" تعيد استخدام common.loading) نص «جارٍ التحميل…» المجرد في المتتبّع ونتائج الفحص وهيكل الخريطة؛ ويوقف prefers-reduced-motion النبض.
  • تخزين موجّه التقييم مؤقتًا (CAR-111): يقسّم buildEvaluationPromptParts الموجّه البالغ ~37k من الرموز إلى بادئة مستقرة بايتًا بايتًا (السيرة الذاتية + الملف الشخصي + ملفات الأنماط + التعليمات) وذيل JD؛ ويرسل مسار Anthropic [prefix + cache_control: ephemeral] + [JD] — فتُحتسَب فاتورة البادئة بمعدل قراءة الذاكرة المؤقتة (أرخص بـ ≈10×) في كل نداء بعد الأول. وعند غياب البادئة أو عدم تطابقها يرتد المسار بأمان إلى الطلب القديم المطابق بايتًا بايتًا؛ وتظل سلسلة المتوافقة مع OpenAI بلا مساس (التخزين المؤقت هناك من جهة الخادم).

ملاحظات

  • جاءت الإصلاحات الستة كلها من أسطول الوكلاء بأدلة أحمر→أخضر (5 + 7 + 7 + 7 + 8 حالات جديدة) وجولات مراجعة؛ وتنبيها CodeQL الأولان لـ CAR-111 (#579/#580) أُصلحا في الشيفرة — يُحلِّل رديف الاختبار مضيف URL بدل المطابقة بالسلسلة الفرعية، وأُسقِطت سلسلة الموجّه الكاملة الميتة.
  • نُفِّذ استكمال الدرجات على الإنتاج (نقطة نهاية v1.256.0، بموافقة المالك): updated: 22، missingReport: 0، reportScoreless: 159 — 159 صفًا بلا درجة تشير إلى تقارير تسبق رؤوسُها كتلة الآلة أو تحمل صيغ درجات غير قابلة للتحليل؛ ولا يمكن استرجاعها إلا بإعادة تقييم أو بمرور محلِّل أوسع (مُسجَّل في CAR-129).
  • ما تُرِك عمدًا دون تنفيذ: لا تغيير nulls-last لعمود التنقّل (غرابة سابقة الوجود: Infinity عند الترتيب التنازلي)، ولا إعادة تسعير رجعية لسجلات الاستخدام القديمة، ولا إبراز بأسلوب .is-error لنماذج مرشّحات الفحص (نطاق CAR-130 محصور في مساعد الإرسال المشترك لصفحة النمط + تنبيه api.js).
  • الاختبارات 5749 (+36). لم تُمَسّ أي مصادر ماسح (السجل 121 = 116 EN + 5 RU · 116 محوّلاً)؛ ولا مفاتيح i18n (يعيد تنبيه CAR-130 استخدام conn.down؛ ومنطقة الهيكل العظمي تعيد استخدام common.loading).

[1.257.0] — 2026-10-25

إصلاحان من أسطول الوكلاء: مساعد المساعدة داخل التطبيق يفهم الديفاناغاري والتابية، وصفحة الاستخدام تُظهر ما يكلّفه Hermes فعلًا.

أُصلح

  • استرجاع مساعد التوثيق للـ hi/ta (CAR-103): كان صنف الكلمة في محلّل الكلمات المفتاحية لـ docs-assistant هو [\p{L}\p{N}\u30fc]+ — دون علامات الدمج. كل ماترا ديفاناغارية (ा ै ्…) وكل علامة حرف علة تابية (ே ை ்…) كانت تقطع الكلمة إلى شظايا؛ وقاعدة الطول كانت تُسقط الشظايا القصيرة (استعلام هندي كان يطابق 0 أقسام)، والكلمات الأطول كانت تُستأصل رؤوسها إلى بقايا عشوائية تصطدم بأقسام غير ذات صلة. يُبقي الصنف على \p{M} الآن؛ ومسار bigram الخاص بالـ CJK لم يُمَسّ. استعلاما hi «मैं स्कैन कैसे चलाऊं?» وta «ஸ்கேன் எப்படி இயக்குவது?» يسترجعان الأقسام الصحيحة من الحزم المشحونة مع التطبيق.
  • تكلفة الاستخدام لـ Hermes (CAR-106): كان normalizeUsage() يطوي استخدام المزوّد إلى {in, out} ويسقط صامتةً cost كما يبلّغ عنه بوابة Hermes — أظهر #/usage قيمة $0.0000 عبر 9.5 M من رموز Hermes (صف جدول التسعير الخاص به هو 0/0). يكتسب شكل سجل الاستخدام حقل cost? اختياريًا متوافقًا خلفيًا؛ ويفضّل المُجمِّع التكلفة التي يبلّغ عنها المزوّد لكل سجل، ولا يعود إلى تقدير جدول التسعير إلا عند غيابها؛ والقيم التالفة/السالبة تُسقَط ولا تُختلَق أبدًا.

ملاحظات

  • كلا الإصلاحين جاءا من أسطول الوكلاء بأدلة أحمر→أخضر (3 + 5 حالات جديدة؛ 14/14 و10/10 خضراء؛ والجيران 78/78 و61/61). كانت طلبات السحب الأولى (#470/#471) مبنية على قاعدة worktree قديمة تصادمت مع v1.256.0 التي دُمجت بأسلوب squash — وعُوّض عنها بـ cherry-picks نظيفة (#472/#473).
  • ما تُرِك عمدًا دون تنفيذ: لا إعادة تسعير رجعية لأسطر data/llm-usage.jsonl التاريخية (لا تحمل حقل تكلفة؛ والسجلات الجديدة وحدها هي المستفيدة).
  • الاختبارات 5713 (+8: docs-assistant ×3، usage ×5). لم تُمَسّ أي مصادر ماسح (السجل 121 = 116 EN + 5 RU · 116 محوّلاً)؛ ولا مفاتيح i18n.

[1.256.0] — 2026-10-25

جودة بيانات المتتبّع: المسمّى الوظيفي لا يُسجَّل أبدًا بوصفه الشركة، ولوحة الوظائف لا تُسجَّل أبدًا بوصفها جهة التوظيف، والصفوف بلا درجة تتوقف عن الظهور أولًا — ونقطة نهاية تُنفَّذ مرة واحدة تستكمل الدرجات الناقصة من التقارير نفسها.

أُضيف

  • استكمال الدرجات (CAR-129): POST /api/tracker/backfill-scores يملأ خلية الدرجة للصفوف التي يحمل تقريرها المرتبط درجة قابلة للتحليل (181 صفًا مُقيَّمًا كان له تقرير دون درجة). الصفوف الحاصلة على درجة، والقيم النائبة الصريحة (N/A)، والصفوف بلا تقرير، والتقارير بلا درجة لا تُمَسّ إطلاقًا؛ ولا يُعاد كتابة خلية الدرجة وحدها، تحت قفل الملف؛ ويُتحقَّق من شكل الدرجة عند موقع الكتابة ويُطبَّع وفق اصطلاح المتتبّع X.X/5؛ والتنفيذ idempotent ويعيد {ok, updated, missingReport, reportScoreless}.

أُصلح

  • المسمّى الوظيفي ليس الشركة أبدًا (CAR-128): كان guessCompanyRole يعتبر الجانب الأيسر من سطر عنوان مفصول بشرطة هو الشركة، لكن اللوحات تكتب بالترتيبين معًا — «Senior Frontend Engineer - Grafana Labs» سُجِّل فيه المسمّى الوظيفي بوصفه الشركة (13 صفًا: Grafana وCircleCI…). يرجّح الآن استدلال محدود بحدود الكلمات على كلمات المسمّيات جانب المسمّى الوظيفي، ولا يصبح نوع التوظيف أبدًا جهة توظيف («Senior Engineer - Remote (EU)» لا يُسجَّل منه شيء بدلاً من «Remote (EU)»).
  • لوحة الوظائف ليست جهة التوظيف أبدًا (CAR-127): سجّل المسار الاحتياطي المبني على slug النطاق صفوف hh.ru بوصفها «hh» (120 صفًا). ينضم slugا hh وhabr إلى قائمة «ليست جهة توظيف»؛ ويُنفَّذ استدلال جهة التوظيف في صميم الجملة («в компании X»، «X ищет») الآن على مضيفات لوحات الوظائف (hh.ru/kz/uz/by وhabr.com) أيضًا — حيث يسمّي نص الصفحة جهة التوظيف الحقيقية. اكتُشف سبب الجذر في الطريق: \b/\w ASCII في أنماط الاستدلال تلك لم تطابقا حرفًا سيريليًا قط — ميتة صامتةً منذ v1.248.4؛ وتحلّ محلها lookbehinds يونيكودية وأصناف \p{L}.
  • الصفوف بلا درجة تُرتَّب أخيرًا (CAR-129): كان ترتيب الدرجة في المتتبّع يستخدم قيمة نائبة -1، فلما كان الترتيب التصاعدي هو الافتراضي ظهر كل صف بلا درجة قبل كل صف مُدرَّج. تُرتَّب القيم الفارغة أخيرًا الآن في الاتجاهين (يحتفظ مرشّح الدرجة بـ -1 — «غير الحاصل على درجة يفشل في مرشّح ≥4» هي الدلالة الصحيحة هناك).

ملاحظات

  • هذا الإصدار لا يُرحِّل الصفوف التاريخية: إصلاحات المُحلِّل تنطبق على التقييمات الجديدة؛ والدرجات قابلة للاسترجاع عبر نقطة نهاية الاستكمال، بينما خلايا جهة التوظيف «hh» البالغ عددها 120 تحتاج إعادة تقييم، لا إعادة كتابة.
  • جولة مراجعة opus-5-5 مدموجة: أُسقط نمط «X ищет» غير المُرسَّى قبل الشحن (أي تسلسل بحرف كبير قبل الفعل كان سيُسجَّل جهة توظيف — ثابت عدم التلفيق)، وأُضيفت مراسٍ لأول الجملة «В…»، وكاتب الاستكمال يعيد فحص الخلية الهدف (توجد صفوف # مكررة بعد التحريرات اليدوية)، ويحافظ على عدد أعمدة الصف القصير المشوّه يدويًا، ويتوقف عند أول سطر خارج الجدول. النقطة داخل اسم منقّط («Сбер. IT») لا تُميَّز عن نقطة جملة بالنسبة لمرساة «в компании» — فتُسجَّل البادئة المتحفظة («Сбер»)؛ والنمط المُرسَّى بالفعل يلتقط الصيغة الكاملة.
  • ما تُرِك عمدًا دون تنفيذ: لا استخراج للمقارن من tracker.js إلى مكتبة قابلة للاختبار الوحدوي (تبقى بوابة الفحص الثابت للمصدر؛ مُسجَّلة في CAR-129 عملًا لاحقًا)، ولا تغيير nulls-last لعمود التنقّل (غرابة سابقة الوجود: Infinity عند الترتيب التنازلي)، ولا ترحيل بيانات لصفوف «hh».
  • الاختبارات 5705 (+10: 5 هوية في auto-pipeline-jd-gate، و2 لـ CAR-128، وبوابة ترتيب CAR-129، و4 للاستكمال بينها تثبيت المسار العدائي — ناقص حالات v1.248.x المستبدلة). لم تُمَسّ أي مصادر ماسح (السجل 121 = 116 EN + 5 RU · 116 محوّلاً)؛ ولا مفاتيح i18n.

[1.255.2] — 2026-10-24

ثلاثة إصلاحات مرئية للمستخدم من الانحدار الحي وتقرير انهيار في الإنتاج: انهيار عرض #/scan، والفحص اللغوي الأعمى للفيتنامية، وتكرار ضياع كتلة الملخص في zh-TW.

أُصلح

  • انهيار #/scan (CAR-99): كتب توليد بوابات العدّ منذ v1.253.0 الحرفيّة FALLBACK_SOURCES بفاصلة مزدوجة زائدة في نهاية كل عنصر — 120 ثغرة إسقاط في المصفوفة. عندها احتفظ new Set(FALLBACK_SOURCES.map((s) => s.value)) في عرض الفحص بـ undefined، وألقى id.length في مُصنِّف الشركة الخطأ TypeError: Cannot read properties of undefined (reading 'length') عند كل عرض صفحة (التُقط عبر logbuf في الإنتاج). أُزيلت الثغرات، وبوابة جديدة (4 مواصفات، مُتحقَّق منها بالأحمر) تنفّذ الملف وتفشل عند أي ثغرة أو عنصر غير قابل للاستخدام أو undefined في مجموعة معرّفات المحوّلات — بوابة الانحراف النصية وحدها لم تكن ترى هذا الصنف.
  • الفحص اللغوي الأعمى للـ vi (CAR-97): الفيتنامية نصّ لاتيني ولم يكن لها مدخل في جدول كلمات التوقف لضمان الجودة الحي، فحسبت «كلمات توقف vi» الإصابات الإنجليزية وقُرئت إجابة فيتنامية على أنها report not in vi (انحدار حي: vi 2، en 2). للفيتنامية الآن جدولها الخاص من عشر كلمات وظيفية — تقرير فيتنامي خالص يجتاز، والإنجليزي ما يزال يفشل.
  • فقدان zh-TW لكتلة SCORE_SUMMARY (CAR-98): كان التذكير اللغوي الختامي يقول فقط إن الصيغة الآلية يجب ألا تُترجم، ولا يقول أبدًا إن كتلة الملخص يجب أن توجد — تقرير zh-TW قصير (5,983 محرفًا) حمل كتل A–G لكنه أغفل الكتلة كلها (تكرار من صنف v1.239.2). تنصّ تعليمة الافتتاح والتذكير الختامي الآن على أن الكتلة إلزامية وأن التقرير لاغٍ دونها.

ملاحظات

  • هذا الإصدار لا يغيّر عن قصد أي مصدر ماسح، ولا عدد السجل (121 = 116 EN + 5 RU · 116 محوّلاً)، ولا توصيلات المزوّدين — إنه إصلاحات فقط، لذا بوابات العدّ لم تُمَسّ.
  • الاختبارات 5695 (+9: car99-fallback-holes ×4، car97-vi-lang-check ×4، ثابت محثّ CAR-98 ×1). المتصفح 143/143. إعادة الفحص الحي للـ vi/zh-TW ترافق انحدار ما بعد النشر.

[1.255.1] — 2026-10-24

جولتا إصلاح من المراجعة: مراجعة Opus للغة الفيتنامية (9 نتائج) والمراجعة الثانية لإصلاحات CAR-91/92 (5 إصلاحات إلزامية) — كلاهما أُغلق باختبارات أحمر→أخضر.

أُصلح

  • جولة مراجعة الـ vi (تابع CAR-88): المحرف الهانغي (신) الذي تسرّب إلى project.subtitle / project.roleHint صُحّح (độ khớp tín hiệu)، مع بوابة تفشل على أي محرف CJK/Kana في قيمة vi لا يحمله قاموس EN؛ وروابط markdown الست المباعدة بمسافات في docs/help/vi.md (what-is career-ops، apply for a job، set up playwright وثلاثة أخرى) صُحّحت بشرطات إلى سلاسل الأدلة الحقيقية، مع بوابة «لا مسافات في روابط URL».
  • حدود عناوين التقييم (CAR-92 r2 H1): & و. و/ و' أصبحت محارف كلمات في الحد الأيسر لحرف الكتلة — فلم تعد ## Q&A و## Plan B و## Ph.D. requirement و## E-commerce تُسجَّل ككتل A/B/D/E؛ ويُقبل مُنهي نهاية السطر المجرد فقط بعد رمز كلمة كتلة (Block/блок/블록/…)؛ وخرج - من أصناف المُنهي الإملائي لتنجو عناوين E-commerce/ई-मेल.
  • التقارير المرقّمة بالأوكرانية/الروسية (CAR-92 r2 H2): كاشف التسلسل А Б В Г Д Є Ж أصبح مساعدًا مشتركًا الآن؛ وحين يجد 3+ أحرف تسلسل في مستوى عنوان، يصبح ذلك المستوى مرجع القاطع — فلن تقتطع الأقسام الفرعية المرقّمة بالأحرف ### A. التقرير عند الكتلة Б.
  • دورة حياة الصفوف المحمَلة (CAR-92 r2 M1): الصفوف التي يحملها مصدر فاشل إلى الفحص التالي تُختَم بـ carriedSince، وتُسقَط بعد 30 يومًا أو 5 عمليات حمل متتالية، وتُلحق بعد الصفوف الجديدة بدلًا من أن تتراكم من جديد صامتةً إلى الأبد.
  • مقام gemini-synthesis والشرعية (CAR-92 r2 M2) ومسار درجة المتن في الـ subprocess (M3): قُرئت من ملف النتائج، وأُصلحت باختبارات حمراء.
  • بوابة انحراف حزمة التحميل البارد حُدّثت لقاموس vi (90 وسم script / 87 قابلة للحزمة)، وأُزيل عنها ربط الاختبار غير المستخدم (CodeQL 572).

ملاحظات

  • لغة عدّ المحولات في شريط «أحدث إصدار» لـ README.vi التي رفعتها المراجعة تقع في شريط السابق وتطابق EN README بايتًا ببايت أصلًا — تُركت دون مساس حفاظًا على تناظر EN↔vi (موثّق في متن الـ commit).
  • الاختبارات 5686 (+26: eval-validate-opus-r2، scanner-carryover-r2، تأكيدات بوابة vi). السجل دون تغيير عند 121 مصدراً (116 EN + 5 RU) · 116 محولاً.

[1.255.0] — 2026-10-24

تنضم الفيتنامية (Tiếng Việt) بوصفها اللغة التاسعة عشرة لواجهة المستخدم — قاموس من 1525 مفتاحًا بموازاة كاملة مع EN، وكشف vi/vi-VN، وحزمة المساعدة الكاملة، ونسختا README و CHANGELOG المطابقتان، وتكامل صفحة الهبوط cvstart.org، و🇻🇳 في مبدّل اللغة.

أُضيف

  • الفيتنامية (vi) — 1525/1525 مفتاحًا بموازاة كاملة مع en؛ detect() يقبل vi وvi-VN؛ الفيتنامية LTR (لا تُضاف أبدًا إلى RTL_LANGS). تبقى «Pipeline» كما هي — مقترض تقني قياسي مدرج في القائمة البيضاء.
  • docs/help/vi.md كاملة (33 H2 / 125 H3)، إضافة إلى نسختي README.vi.md وCHANGELOG.vi.md، وسلاسل السقالة الفيتنامية في prompts.mjs (LOCALE_NAMES + SCAFFOLD_STRINGS) — فمخرجات LLM بالفيتنامية تعمل من الصندوق.
  • صفحة هبوط cvstart.org بالفيتنامية — site/src/i18n/vi.json، ومدخل locale في sitemap، ولقطة شاشة dashboard-vi.png؛ يكتسب مبدّل اللغة 🇻🇳 (19 موضعًا).
  • بوابات التعداد 18 → 19 — LANGS، ومجسّات detect، وتدقيق i18n، وموازاة changelog، وكتلة ترجمات README، ومسح الـ locales — إضافة إلى tests/i18n-vi-locale.test.mjs الأحمر أولًا (139 سطرًا).

ملاحظات

  • صفحة الهبوط تكسب vi — انحراف مقصود عن سابقة ta (ذلك الإصدار أبقى الهبوط على 17 عمدًا)؛ موثّق في مواصفة الإصدار.
  • vi بالكتابة اللاتينية، لذا لا تنطبق بوابة no-latin-leaks (تحرس اللغات غير اللاتينية)؛ المصطلحات التقنية اللاتينية هي القاعدة هنا.
  • أرضية الاختبارات: 5634 → 5642 (الحالة المتخطاة الواحدة = اختبار الالتقاط الاختياري للمتصفح، دون تغيير).

[1.254.0] — 2026-10-24

إصدار تقوية من جولة المراجعة بالطراز الأقصى: لقطة الماسح لم تعد تفقد صفاً، وأحد عشر انتهاكاً لثوابت طبقة LLM أُصلحت، وثلاثة وعشرين إصلاحاً إلزامياً للواجهة هبطت، وانضم ATS Paylocity إلى الماسح — يقدم السجل الآن 121 مصدراً (115 EN + 5 RU) مع 115 محولاً.

أُضيف

  • Paylocity ATS (الأب #5687): لوحات لكل مستأجر على recruiting.paylocity.com، اللوحة الميتة 302 → JobNotFound تُربط بـ 404 ليُقاعد الإدخال في الحجر، سقف max_jobs مع علم بتر. السجل: 121 مصدراً = 116 EN + 5 RU · 115 محولاً؛ بوابات العد مُعاد توليدها.

أُصلح

  • سلامة لقطة الماسح (R-12): الفحص الذي لا يحاول شيئاً يحتفظ الآن باللقطة (nothing scanned)؛ والاستبدال الكامل يحمل الصفوف القديمة للمصادر الفاشلة — مختومة لكل مدخل — مع إعادة تمريرها عبر المرشحات الحالية، هابطة في filtered فقط.
  • أحد عشر انتهاكاً لثوابت طبقة LLM: توجيه اللغة يفتح ويغلق prompts deep/mode؛ subprocess Gemini يمرر --lang، الخروج غير الصفري → 502، لا يسرّب stderr للعميل، يحترم 300 ثانية ويسجل usage؛ الfallback اليدوي يحمل رابط الوظيفة؛ الـ truncation وتحذيرات الحزمة تظهر في /api/mode؛ لا يمكن للعميل تجاوز فئة الإنفاق؛ انقطاع العميل يجهض استدعاء المزود الجاري؛ قاطع العناوين المكررة لا يدمّر تقارير صالحة؛ مستخرجا score/legitimacy متوافقان مع المدقق؛ تشديد القبولين الخاطئين للتسلسل الأوكراني ووا العربية.
  • جولة مراجعة Opus 5-5 على الإصلاحات نفسها (8 إلزامية): تسجيل القاطع متعدد الحروف، مصفحات عنوان أوسع، توصيل إجهاض subprocess Gemini، إسناد الحمل بختم الإدخال، الصفوف المحمولة تعيد مرور الفلاتر الحالية، مستوى العناوين المرجعي بعدد الحروف المميزة.
  • ثلاثة وعشرون إصلاحاً إلزامياً للواجهة: في واجهات التوريد (إلحاق المُرضّح أحادي الصفحة، لوحة مفاتيح صفوف pipeline، استعادة مرشحات البحث المحفوظ، إعادة ضبط select المصدر، رجوع الافتراضي في config، تسرب المستمعين، إغلاق SSE عند النهاية، teardown العداء، fetch عارٍ، التحميلات الفاشلة التي تبدو فارغة، تصادم عالمي، حفظ التركيز) وواجهات المساعدة (الرابط العميق الميت للـ help، تسربات مستمعي help، إعادة تسليح الكتابة فوق الفارغة في two-pager، طيران مفرد للتشغيلات المدفوعة، نهايات تدفق صامتة، مسارات خطأ بسبينر أبدي، صفوف شبح للمرشحات الفاشلة، تكرارات docs-fab + اللغة).

ملاحظات

  • الجولة كلها راجعتها Opus 5-5 بأقصى صرامة — النقولات قبل الدمج (21 وجداً، 13 أُصلحت) والإصلاحات نفسها بعد ذلك (8 إلزامية، كلها هنا باختبارات أحمر→أخضر).
  • أرضية الاختبارات: 5262 → 5634 (372 مواصفة جديدة عبر المصادر والماسحات وطبقة LLM والواجهة).

[1.253.1] — 2026-10-24

وجدان HIGH أمنيان من المراجعة بالطراز الأقصى أُصلحا: عناوين IPv6 الحرفية لا تعود تتجاوز حارس SSRF للماسح، وتعبير الهروب في ماركداون السيرة لا يتراجع تربيعياً بعد الآن.

أُصلح

  • الحرفيات IPv6 كانت تتجاوز حارس SSRF (http-json.mjs): حرفية IPv6 بأقواس جعلت dns.lookup يرمي فيفتح الحارس. الآن تُنزع الأقواس ويُصنَّف الحرفي عبر isIP — بلا DNS وبلا فشل مفتوح.
  • ReDoS في هروب ماركداون السيرة (security.mjs): كان النمط يتراجع تربيعياً — < + ~100k مسافة كانت تكلف ~16 ثانية؛ الآن ~1 مللي بفئة مسطحة محدودة. كل ما كان يُهرَّب يُهرَّب.

ملاحظات

  • كلا الإصلاحين يحمل اختبارات أحمر→أخضر (3 حالات IPv6 جديدة + ReDoS بحد زمني؛ 5511 اختباراً، +7).
  • ملفات مصادر الماسح غير متأثرة — الحارس في النقل المشترك الذي تسلكه الماسحتان.

[1.253.0] — 2026-10-24

عشرة مصادر وظائف جديدة تنضم إلى الماسح — Atlassian وBWI وComputrabajo وDover وGoogle وKalibrr وMagneto365 وPlatsbanken وTech in Asia وZoho Recruit — يقدم السجل الآن 120 مصدراً (115 EN + 5 RU) مع 115 محولاً، ويُبقي مطابق الأدوار على التفريق بين العناوين التي تختلف فقط برمز قصير بأحرف كبيرة.

أُضيف

  • عشرة مصادر منقولة من الأب 1.38.0، لكل منها محول fetch-walk وحزمة اختبارات معزولة CI (fetchImpl وهمي، بلا شبكة): Atlassian (تغذية JSON واحدة بلا مصادقة، روابط iCIMS، allowlist https+icims.com)، BWI (ItemList JSON-LD، JSON.parse أولاً)، Computrabajo (أمريكا اللاتينية، فك الكيانات، «remoto» الإسبانية تُقرأ remote)، Dover (ترقيم DRF لكل مستأجر، عرض Remote (International)، لوحات متحقق منها بـ UUID)، Google Careers (صفحات أولى لكل عبارة، صاحب البطاقة يتفوق، إزالة تكرار بين الاستعلامات)، Kalibrr (مجمع SEA، معرف التغذية كمعرف صف)، Magneto365 (لاتينية، إيقاع ثابت بين الصفحات)، Platsbanken (واجهة JobTech السويدية، نوافذ لكل كلمة مفتاحية)، Tech in Asia (مفاتيح Algolia تُكتشف من بناء الموقع)، Zoho Recruit (لوحة hidden-input، إثراء تفاصيل محدود، عملة ISO-4217 فقط).
  • عدّاد السجل: 120 مصدراً = 115 EN + 5 RU · 115 محولاً؛ بوابات العد الخمس أُعيد توليدها من السجل الحي؛ fallback قائمة #/scan وروابط cvstart.org وhelp §17 ×18 تتبع.

أُصلح

  • مطابق الأدوار (نقل #5688): العناوين التي تختلف فقط برمز قصير بأحرف كبيرة («HR BP» مقابل «HR GP»، «AWS» مقابل «GCP»، حتى في النصوص المختلطة) لم تعد تُطابق ضبابياً كوظيفة واحدة؛ تُقرأ الرموز من العنوان الخام مع استثناء كلمات الضجيج، والحارس يقع مباشرة قبل نسبة جاكار.
  • نجت النقولات من مراجعة Opus 5-5 بأقصى صرامة (21 وجداً): رمي على اللوحات الفارغة بصمت عند انحراف الترميز (google/bwi)، الفحص المُجهز مسبقاً للإجهاض يرمي بدل إرجاع []، ترتيب decode-then-strip في ماسحات LATAM (شكل XSS للـ strip-then-decode)، https+allowlist على روابط صفوف atlassian، تأكيدات مضيف ترفض المنافذ، تحليل الصفحات المتأخرة داخل try (الأجزاء تبقى)، وصدق الاختبارات (الميزانيات محسوبة بدقة، عقود الإكراه مثبتة بصدق). 13 وجداً أُصلحت؛ والذيل [spec] متتبع منفصلاً.

ملاحظات

  • المصادر الخمسة الروسية تبقى web-ui-only (لا محولات منبع — عمداً)؛ كل مصدر EN له محوله.
  • سقّة التغطية: الملفات الست الأكبر رفعت إلى ≥95 % branch (27 حالة جديدة)؛ بقايا الكود الميت الدفاعية موثقة لكل ملف.
  • المصادر الجديدة تُختار بـ provider: <slug> في portals.yml — لا تغيير على الإعدادات القائمة.

[1.252.1] — 2026-10-17

لافتة الإصدار في الويكي يتحقق منها الآن سكربت بدلاً من مسح يدوي — التراجع v1.252.0 لم يكتشفها إلا يدوياً — وتتجاوز توجيهات الـ locale صراحةً language.output للملف الشخصي ولغة الوظيفة.

أُضيف

  • scripts/wiki-banner-check.mjs — البوابة التي طالبها التراجع: تقرأ كل Home*.md في نسخة الويكي وتقارن اللافتة مع package.json ومع عدّادات السجل الحية (scanner adapters من سجل البوابات — 105، لا 109 المنتهية في اللافتة؛ route modules من server/lib/routes/؛ UI locales من مجموعة CHANGELOG). نمط اللافتة مستقل عن اللغة بالشكل لا بالكلمات: صفحات Home المترجمة تترجم التسمية والعدّادات («Текущий релиз»، «Aktuel udgivelse»، «адаптеров сканера»، «enhedstests») وأرقامها انحرفت أكثر (5177) من الصفحة الإنجليزية (5245). يأخذ --tests N الرقم الذي طبعه test:ci الطازج؛ ويمنع --check-only الاستنساخ الضمني للاستخدام دون اتصال. اختبار fixture دون اتصال في tests/wiki-banner-check.test.mjs.

أُصلح

  • لافتة الويكي Home ×18 تعود للتزامن (تُدفع مع هذا الإصدار): مسح v1.252.0 كان يغير الشارات والروابط لكنه لم يغير سطر اللافتة قط، ولم يشير إليه أي شيء ميكانيكي. البوابة أعلاه تجعله فحصاً مانعاً للإصدار.
  • توجيه الـ locale يحدد أولوية اللغة (buildLocaleDirective): «This UI locale overrides the profile’s language.output setting and the job posting’s own language». قاعدة الأب رقم 6 نفسها تأمر بالكتابة في language.output — بدون جملة الأولوية كان النموذج يحل التعليمين المتناقضين بتناقض حسب الـ locale، وهذا هو تشتت عمود اللغة في v1.252.0. ثبتته tests/locale-directive-language-output.test.mjs على نص التوجيه (17 locale غير الإنجليزية + إنجليزية فارغة).

ملاحظات

  • ملاحظة على شكل ta evaluate (§3، راقب): أول تشغيل حي لـ v1.252.0 أنتج evaluate من 48 336 حرفاً دون Block G ودون SCORE_SUMMARY — بشكل حلقي لا لغوي (CAR-70 لغوي). إن تكرر في الإصدار القادم فسيحصل على مهمة Linear مستقلة، منفصلة عن CAR-70.
  • وفق FIX-PROMPT: يبقى الأب للقراءة فقط؛ والتجاوز يعيش بالكامل في توجيه الـ UI.

[1.252.0] — 2026-10-17

تمت مزامنة شوكة الأب مع career-ops-hq/career-ops — 264 التزاماً من المنبع، الأب 1.36.0 → 1.37.0 — مع صيانة انحرافي الشوكة، ويعيد النشر تثبيت الأب العامل على تلك القاعدة.

أُضيف

  • وضع السوق الفيتنامي (vi) من المنبع (modes/vi/، tuyen-dung / ung-tuyen): BHXH/BHYT/BHTN، thử việc، lương tháng 13، trợ cấp thôi việc — السوق الحادي والعشرون في جدول أوضاع الأب.
  • مزود لوحة Tech in Asia (منبع): يقرأ فهرس Algolia العام job_postings الذي تستعلم عنه واجهة وظائف techinasia.com نفسها — لوحة شركات ناشئة في جنوب شرق آسيا، نحو 300 وظيفة حية عند المعاينة، 273 منها إندونيسية. تُكتشف المفاتيح من جديد في كل تشغيل من بناء الموقع، ورابط التقديم الخاص بجهة العمل يتفوق على صفحة اللوحة، والراتب يُترك عمداً دون إرفاق (حقول الراتب في الفهرس أعلام لا أموال).
  • ثمانية مستندات جديدة لإشارات شرعية الإعلان Block G (modes/oferta-signals/08–17): بلد في مصطلحات المزايا، وسم موقع منصة طرف ثالث، ترخيص الوكالات، تجاوز متطلبات الهجرة، محتوى ممنوع حسب الولاية القضائية، عرض نطاق pay-transparency، سؤال المحامي عن الحد الأدنى للأجور، الإفصاح عن الفرز الآلي، الإفصاح عن العقد محدد المدة، القوة الشرائية عند الانتقال.

تغيير

  • تحصينات في جهة الأب تسافر مع القاعدة: فحص story-provenance يعمل بالوحدات والجمل ويُبقي أرقام user-cannot-confirm خارج التفاوض وATS ومخرجات المقابلة؛ بوابة حقائق السيرة الذاتية تعمل على كل مصمّم وتقرأ الادعاءات المعاد صياغتها والمهيكلة؛ يرفض LaTeX الفتحات المستخرجة المنتهية قبل الكتابة؛ يُتخطى مسح launchd للمتابعات عندما تكون المتابعات مطفأة؛ يُبقي update-system مسح تعديلاته المحلية ضمن حد argv.
  • انحرافا الشوكة نجيا من الدمج: providers/telegram.mjs (محلل حصري للشوكة، ADR-0001) وLOCATIONISH_RE بالتONEY المحيط Unicode في telegram-channel.mjs (ADR-0002). يسرد مستند اللوحات الآن صف telegram-channel المحسّن من المنبع، وصف telegram الحصري للشوكة، وTech in Asia، وافتراضي max_pages لـ Tencent مرفوعاً 20 → 100.

ملاحظات

  • لا تغيير في سلوك SPA في هذا الإصدار: إنه قطار التوثيق بالإضافة إلى إعادة تثبيت الأب. يعمل النشر الآن على الأب 1.37.0؛ جدول الحالات القانونية لا يمسه فرق الأب — حالات المتعقّب تُعرض كما كانت تماماً.
  • حلّ دمج المنبع تعارضين: docs/SUPPORTED_JOB_BOARDS.md (كلا صفي telegram محفوظان) وtest-all.mjs (نسخة walkTree من copyDirSync في المنبع تُدخل حارس .git اليدوي للشوكات للشوكات المتداخلة؛ قائمة الاستيراد هي الاتحاد).

[1.251.1] — 2026-10-12

مرشح التخصص يطابق الآن الكلمات المميزة للدور فقط — الأقدمية وأسماء الوظائف العامة لم تعد تطابق وظيفة بمفردها — وremote-qa يفصل الشكل عن اللغة حتى لا يحمرّ A–G بسبب الانجراف.

أُصلح

  • مرشح التخصص يُسقط الأقدمية وأسماء الوظائف العامة من المطابق: «Senior PHP Developer» كان يطابق «Senior Java Developer» عبر Senior/Developer المشترك. يُبقي المطابق على الرموز المميزة فقط (PHP، Go، Platform، SRE، Backend…)؛ الدور بلا رموز مميزة («Software Engineer») يرجع لمطابقة العبارة الكاملة. حدود الكلمات باقية: «Go» لا تطابق «Golang» أو «Google» أبداً.
  • remote-qa يفصل الشكل عن اللغة: يُحكم علم A–G فقط برموز الكتل/SCORE_SUMMARY/looping؛ انجراف report not in <locale> ينتقل إلى علمه الخاص وعمود warnings (الجدول يكسب العمود الرابع المفقود؛ تُحفظ الرموز لكل صف).
  • شريط الخريطة 50/50 حقيقياً عند 390 بكسل (تقسيم 58/42 ترك البحث عند 124 بكسل وقصّ علامه المساعدة)، وقاعدة CSS الميتة .job-map-job-select أُزيلت.
  • CodeQL 552 — المتغير غير المستخدم OVERLAYS في اختبار design-qa أُزيل.

ملاحظات

  • الأميال لا يزال المالك يؤجلها. انحراف لغة ta يبقى قيداً موثقاً في backend hermes (2–26 % نثر بين التشغيلات؛ A–G يصمد): remote-qa يبلغ عنه كنتوقع. قائمة الرموز العامة مقصودة بالحد الأدنى — توسيعها سطر لكل لغة.

[1.251.0] — 2026-10-12

قائمة الخريطة تُصفّي الآن حسب التخصص من الإعدادات (config/profile.yml → target_roles.primary): اختر «Product Manager» أو «Backend Engineer (Go / PHP)» وستبقي الخريطة على الوظائف التي يحمل عنوانها كلمات هذا الدور. محدد قائمة الوظائف من v1.250.0 أُزيل — كان أداة خاطئة (تصحيح المالك).

أُضيف

  • فلتر التخصص: تعرض القائمة التخصصات من الإعدادات (target_roles.primary)؛ اختيار واحد يبقي الوظائف التي يحمل عنوانها أحد الرموز المميزة للدور (حدود الكلمات، بلا حالة الأحرف — «Go» لا تطابق «Google» أبداً)؛ Reset يعيد الكل.
  • محدد قائمة الوظائف من v1.250.0 أُزيل — البديل: فلتر بالتخصص، وليس قائمة وظائف (تصحيح المالك).

تغيير

  • Two mobile-map height specs: the floor moves 600 -> 540 px (the toolbar takes ~90 px of the viewport).

ملاحظات

  • الأميال لا يزال المالك يؤجلها. المطابقة عمداً بالعنوان فقط بكلمات الإعدادات: مطابقة الشركات أو الأوصاف ستجذب وظائف غير ذات صلة إلى التخصص. الوظيفة خارج كل الأدوار المكونة تبقى مرئية تحت «All».

[1.250.0] — 2026-10-12

تصبح صفحة الخريطة قابلة للعمل: محدد الوظائف فوق الخريطة يطير إلى أي وظيفة مرئية ويفتح بطاقتها (بما في ذلك سطح المكتب)، والبحث النصي يضيق الخريطة حسب الشركة أو المسمى — وكلاهما يبقى بعد إعادة التحميل.

أُضيف

  • محدد الوظائف: قائمة فوق الخريطة تعرض الوظائف المرئية مرتبة بالشركة+المسمى؛ الاختيار يطير إلى الدائرة ويفتح البطاقة — على سطح المكتب أيضاً.
  • بحث نصي: يضيق الخريطة حسب الشركة+المسمى، يُحفظ في map-prefs، Reset يمسحه.
  • زر FAB لا يغطي الإسناد على #/map بكل العروض.

أُصلح

  • مواصفتا ارتفاع الخريطة المحمولة: الحد يصبح 540 بكسل (الشريط يأخذ ~90 بكسل من العرض).

ملاحظات

  • الأميال يؤجلها المالك للإصدار التالي. 4 مفاتيح i18n جديدة تدخل القواميس الـ18 وتُعاد اللقطة المجمعة. المحدد يفتح دائماً البطاقة (التنقل يهزم غرضه)؛ توجد الدائرة عبر المرجع العكسي __job — ليس _point الذي يمتلكه L.Circle بالفعل.

[1.249.0] — 2026-10-11

تعطي خريطة الوظائف الآن الأولوية للملاءمة: يبرز تدرّج هادئ من الفيروزي إلى الرمادي أفضل الوظائف، وتُحفظ فلاتر التقييم ومدة القيادة، ويستخدم الهاتف خريطة بكامل الارتفاع مع معاينة عند اللمس، ويشارك المتتبع فلتر مدة القيادة وترتيبها.

[1.248.8] — 2026-10-11

موازنة الأصل: يتزامن الفرع وweb-ui مع دلتا الـ115 كوميت من المنبع — مصدر PageUp جديد، وخلايا URL المتعقب تُحلل كروابط ماركداون، وحالة Assessment — بالإضافة إلى عمل اللغة ta/ja: التقارير المتكررة تُقطع وتُسمى، وهيكل العناوين يبقي A–G مستقرة، وحصة السكربت تُقرأ من النثر فقط.

أُضيف

أُصلح

  • مصدر PageUp جديد (105 محول EN / 110 مصادر)؛ خلايا URL المتعقب تُحلل كروابط ماركداون (الرابط هو مفتاح إزالة التكرار)؛ حالة Assessment تصل عبر states.yml.
  • التقرير المتكرر يُقطع ويُسمى (report looping (block B repeated))، هيكل عناوين ## A) … ## G) لغير الإنجليزية.
  • حصة السكربت تقرأ النثر فقط (الجداول وSCORE_SUMMARY والكود والروابط مستبعدة) — تقرير ياباني بجداول لاتينية لم يعد يتأرجح.
  • /api/evaluate يحذر report not in <locale> وremote-qa يطبع الرموز في عمود.

-

[1.248.7] — 2026-10-11

دور الترويسة الآن يقرأ اصطلاح الأصل الفعلي — # Evaluation: {Company} — {Role} — بدلاً من افتراض # <الدور> — <الشركة>، فلا يحمل المتعقب بعد الآن «Evaluation: <الشركة>» كدور؛ والتقرير بلغة خاطئة يحذر بدلاً من أن يُحفظ بصمت؛ وكلام النموذج قبل H1 يُقتطع من التقارير المحفوظة.

أُصلح

  • التسمية المحلية تُزال أولاً (Evaluation:، Оценка вакансии: و16 صيغة أخرى)؛ بعد التسمية Company — Role → الدور هو الجانب الأيمن؛ بدون تسمية Role — Company → الأيسر؛ الجزء الذي يسمي الشركة يحسم؛ الدور ليس أبداً الشركة ولا كلمة تسمية — البديل هو سطر المنشور المنظف.
  • cleanup-plan يجمع N من الأسطر (— N dirty-URL line(s))، لا يعد الملفات — ملف بخمس روابط قذرة كان يعطي 1 لا 5.
  • التقرير بلغة خاطئة يحذر: تفتح التعليمة وتُغلق بتعليمة اللغة الإلزامية (التقرير كله، الجداول مشمولة)، ويتحقق خط الأنابيب من لغة التقرير المحفوظ — الانجراف يظهر كتحذير report not in <locale>.
  • بلا كلام النموذج قبل H1 — يبدأ التقرير من سطر عنوانه.

ملاحظات

  • غير منقول وغير ممسوس (تحقق في انحدار v1.248.6): جلب embed، هيكل أسطر المنشور («Компания : X»)، إزالة تكرار «## Rejected»، رفض جذر النطاق قبل الجلب، صدق recon/link-check، وأنماط cleanup. تحقق اللغة تحذير — التقرير (المحتوى متحقق منه A–G + النتيجة) يُحفظ؛ يرى المشغل الانجراف ويمكنه إعادة التقييم.

[1.248.6] — 2026-10-10

تلميع ما بعد الانحدار لسلسلة تيليجرام: المنشور الحقيقي يحافظ على هيكل أسطره (تُوجد تسمية «Компания : X» وسطر الدور حيث هما فعلاً)، ودور المتعقب يأتي من ترويسة التقرير بدلاً من سطر خام من المنشور، والأسطح التشغيلية (recon، cleanup-plan، link-check) تُبلّغ بما تدّعي الإبلاغ عنه.

أُصلح

  • منشور t.me لم يعد يلتصق بسطر واحد: يصبح <br> فاصل أسطر قبل إزالة الوسوم وتُفك كيانات HTML الرقمية؛ نمط تسمية الشركة يقبل الشكل بمسافة قبل النقطتين.
  • دور المتعقب يأتي من ترويسة التقرير (H1 # <الدور> — <الشركة>); يُنظف السطر البديل — بدون هاشتاغات، بدون إيموجي، ≤80 حرفًا.
  • ## Rejected لم يعد يتكرر: يُنشأ القسم مرة واحدة؛ كل رفض يضيف سطره داخله.
  • جذر النطاق يُرفض قبل الطلب — عنوان URL للقمامة لا يكلف شيئًا.
  • Recon يحسب إشارة العقد بدلاً من تأكيدها (honours rejected: يتحقق من markPipelineRejected في الكود المنشور)؛ عداد العلامات لا يطبع «0» مرتين.
  • cleanup-plan يُبلغ أرقامًا حسب الفئة (t-role للنقل، أسطر dirty-URL، أسطر test-row) بدلاً من grep -c واحد كان يعد سطر نجاحه هو.
  • link-check يعتبر 5xx من github.com غير مُتحقق منه — خلف جدار البوتات، لا كروابط مكسورة.

ملاحظات

  • غير منقول وغير ممسوس (تحقق في انحدار v1.248.5): جلب embed نفسه، عقد التخطي في pipeline، اختبارات _setLookup غير المتصلة، قبول الترتيبية uk، حدود الكلمات في مرشح الدور، ووضع cleanup-apply. العد حسب الفئة في cleanup-plan يقرأ تسميات مخرجات سكربت التنظيف نفسه — إعادة تسميتها ستكسر العدادات بصمت.

[1.248.5] — 2026-10-10

تحصين ما بعد الانحدار: إدخالات المنشور المفرد t.me تجلب الآن نص المنشور نفسه (شكل embed)، والإدخال المرفوض يخرج من مجمع مؤقت التقييم من جانب الخادم، وترقيم الكتل الأصلي في التقرير الأوكراني مقبول — بالإضافة إلى أن اختبارًا واحدًا كان يستخدم الشبكة الحية سرًا أصبح غير متصل للأبد.

أُصلح

  • إدخالات t.me يتم تقييمها أخيرًا: صفحة المنشور المفرد تقدم رأس القناة فقط في HTML عادي (~0.2 كيلوبايت — «View in Telegram» ولا شيء آخر)، كان النموذج يتلقى وصفًا فارغًا وكل إدخال تيليجرام كان يموت في التقييم. الجلب الآن يعيد كتابة t.me/<قناة>/<id> (وشكل التغذية t.me/s/…) إلى شكل embed (?embed=1&mode=tme) — نفس المضيف، تحقق SSRF دون تغيير — ويقرأ المنشور من .tgme_widget_message_text (بديل: og:description). لا يوجد نص للأداة → رفض في خطوة الجلب (telegram post has no text، rejected: true) قبل إنفاق أي رموز LLM.
  • يتوقف المؤقت عن الدفع مجددًا للإدخالات المرفوضة (عقد من جانب الخادم): الإدخال المرفوض يُعلَّم الآن في data/pipeline.md — يخرج سطره من سياج URL ويهبط في قسم ## Rejected مع سبب قصير (idempotent، لا يتكرر أبدًا). المؤقت يأخذ عناوين URL العارية من السياج، لذلك يتم تخطي الإدخال المعلَّم بشكل طبيعي — دون الاعتماد على أجزاء سكربت المؤقت الداخلية. Recon يطبع pipeline rejected marks: N + honours rejected: yes (server-side) بدلاً من البحث في السكربت.
  • التقارير الأوكرانية تجتاز تحقق A–G مرة أخرى: نموذج uk يرقم الكتل حسب ترتيب ألبومه الخاص (А Б В Г Д Є Ж)، ومرور المتشابهات كان يحسب فقط А/В/Е — بالضبط الكتل C، D، F، G كانت مفقودة في الإنتاج (2/2 إعادة إنتاج). يقبل المدقق الآن التسلسل الترتيبي الأوكراني عندما تظهر العناوين بالترتيب (نفس الانضباط مثل abjad لـ ar والديفاناغاري لـ hi)، ومطالبة التقييم لكل locale تطالب الآن صراحةً بـ A–G اللاتينية.
  • بوابة الكلمات المفتاحية للدور تعمل بالكلمات لا السلاسل الفرعية: جذور linkedin.com/ و x.com/ كانت تمر بالبوابة لأن lead/it عاشت داخل نص واجهة الصفحة. الكلمات المفتاحية تطابق الآن على حدود الكلمات Unicode، وجذر النطاق (URL بدون مسار) يُرفض قبل استدعاء LLM.
  • اختبار الوحدة لم يعد يحتاج إلى الشبكة الحية: اختبار no-hints (tests/auto-pipeline-jd-gate.test.mjs) كان يستبدل نقل HTTP لكنه كان يجري استعلام DNS حقيقيًا — أخضر في CI فقط لأن العداء كان لديه اتصال. اكتسب safe-fetch خطاف _setLookup() (المحلل نفسه قابل للاستبدال في الاختبارات؛ كود الإنتاج لا يتجاوزه أبدًا)، والاختبار يحل دون اتصال.

أُضيف

  • أنماط سير العمل cleanup-plan / cleanup-apply في deploy.yml: تنظيف القمامة QA في الإنتاج (post-qa-cleanup) يعمل من جانب الخادم دون SSH من حاسوب محمول. السجل يحمل أرقامًا فقط — لا أسماء ملفات ولا معاينات للأسطر، لأن السجل عام وأسماء الملفات تحتوي على أسماء الشركات. خطوة Verify تُتخطى لأنماط التنظيف.

ملاحظات

  • غير منقول: مترجم المواقع بحدود الكلمات وجدولولايات USPS من الأصل (موثق منذ v1.248.1). عقد تخطي الإدخالات المرفوضة يعيش من جانب الخادم (الوسم في data/pipeline.md)، وليس في سكربت المؤقت — فهو خارج المستودع ومقصود عدم تعديله.

[1.248.4] — 2026-10-10

تكملة جولة الانحدار: سلسلة حل الدور لمدخلات Telegram — منشور سيريلي بوظيفة حقيقية ينتج الآن تقريرًا مسمّى بدل ملف unknown-role مرفوض — ولا يُستدعى الـLLM إلا للمدخلات التي تستحق التقييم.

أُصلح

  • سلسلة الدور تعمل للمنشورات السيريلية: قائمة الكلمات المفتاحية اكتسبت разработчик/программист/инженер/аналитик/менеджер/руководитель/тимлид/лид/дизайнер/тестировщик/QA/архитектор/специалист/директор/DevOps/SRE (القائمة القديمة كانت لاتينية فقط: 0 من 40 منشورًا حقيقيًا حصل على دور)، ويُستشار رأس التقرير (parseReportHeader — النموذج يكتب الدور في H1)، وأول سطر مفهوم للمنشور هو الملاذ الأخير.
  • انتقلت بوابة الهوية إلى ما قبل نداء الـLLM: الإدخال بلا شركة وبلا أي أثر للدور يفشل عند خطوة الجلب (rejected: true) — لا حرق رموز لتقييم كان سيُرفض على أي حال.
  • لم يعد t.me/s/<channel>/<id> يسمي الشركة «S» — يُتخطى مقطع المعاينة؛ وكلتا صيغتي الرابط تُحلّان إلى القناة.
  • تُحترم SELF-Labels «Компания: X» في منشورات Telegram (و«…в компании X» وسط الجملة لمضيفي المراسلة).

أُضيف

  • فشلات auto-pipeline تحمل rejected: true في خطأ SSE — يستخدم مؤقت التقييم على الخادم هذا العلم لتخطي مدخل pipeline بدل إعادة المحاولة كل ساعتين.

ملاحظات

  • غير منقول: مُصرّف كلمات الموقع المحدود بالكلمات وجدول USPS (موثّق منذ v1.248.1).
  • كتلة «Translations» في README تُولَّد الآن من قائمة واحدة قياسية، مع اختبار مطابقة في CI (17 رابطًا لكل ملف، وself لا يُربط أبدًا) — وحصلت ar/pl/uk على الكتلة؛ وأُزيل انحراف الفواصل |/·.

[1.248.3] — 2026-10-10

تكملة جولة الانحدار: لم يعد مؤقت التقييم يستطيع بأي حال أرشفة نفايات Telegram بلا اسم كتقرير، ولم يعد تنظيم QA يحذف وظائف Telegram حقيقية، وعادت إسناد الخريطة مرئيًا، وجرس لوحة القيادة يُقرأ بـ ≥ 4.5:1.

أُصلح

  • يحقن auto-pipeline قبل الحفظ: تقرير بلا نتيجة 0–5 أو بلا كتل A–G يُنهي الجولة عند خطوة evaluate (rejected: true في حمولة SSE) — لا ملف تقرير ولا صف متتبع. مدخلات t.me التي عبرت بوابة الطول في v1.248.2 أنتجت نفايتين إضافيتين؛ الآن تُرفض المدخلات بلا اسم بـ company/role not identifiable.
  • لم يعد guessCompanyRole يختلق شركة من مضيفات المراسلة — t.me وtelegram.me وvk.com وlinkedin.com وغيرها في EMPTY_DOMAINS: منشور Telegram يرجع إلى اسم القناة، والإدخال بلا اسم يُرفض بدل أرشفته كـ unknown-role.
  • يقرأ post-qa-cleanup نتيجة الرأس أولًا: يقطع auto-pipeline كتلة SCORE_SUMMARY قبل الحفظ، فكانت العبارة القديمة summary-only تعتبر كل وظيفة Telegram محفوظة نفاية — في الإنتاج 8 من 41 تحمل نتيجة في الرأس و--apply كان سيحذفها. نتيجة الرأس (عبر parseReportHeader) هي الإشارة الأولية الآن؛ والكتلة احتياط. يطبع dry-run السبب لكل ملف.
  • إسناد Leaflet مرئي على #/map — كان زر docs يغطيه (خرق لترخيص OSM)؛ رُفع الزاوية 96px.
  • جرس لوحة القيادة يُقرأ بـ ≥ 4.5:1 — تسميات dash-chip ونسخة --manual انتقلت إلى --foggy-strong (كانت 4.31:1).

أُضيف

  • فشلات auto-pipeline تحمل rejected: true في خطأ SSE — يستخدم مؤقت التقييم على الخادم هذا العلم لتخطي مدخل pipeline بدل إعادة المحاولة كل ساعتين.

ملاحظات

  • انحراف ar/ja لم يتكرر في إعادة التشغيل (انظر v1.248.2).
  • تنظيف الإنتاج لا يزال ينتظر «نعم» صريحة من المالك (CAR-61c)؛ وبهذا الإصلاح لن يتمكن التنظيف من حذف وظائف Telegram الحقيقية.

[1.248.2] — 2026-10-10

جولة الانحدار: لا يحوّل مؤقّت التقييم بعد الآن نفايات pipeline إلى «Last evaluation»، ونجا تحليل SCORE من الصيغ الحقيقية، وأخيراً يتحدث المتتبع لغتك.

أُصلح

  • تقارير JD الفارغة لا تُكتب بعد اليوم. رُفعت بوابة JD في auto-pipeline من 50 إلى 200 حرف قبل نداء الـLLM — الصفحات البديلة (example.com/qa-v167-…) تنتهي بخطأ SSE + تحذير في الكونسول بدل تقرير …-t-role-<ts>.md كانت لوحة القيادة تعرضه كـ«Last evaluation» (42 ملفًا في الإنتاج).
  • تحليل SCORE_SUMMARY ينجو من الصيغ الحقيقية: ‏«4,2/5» و«4.2 / 5» و«4.2» و«SCORE :» كلها صالحة؛ الفاصلة مع 1–2 خانة عشرية ومع 3 خانات آلاف (الرمز القديم كان يقرأ «4,200» كـ4.2 ويعبر بوابة 0–5). يكتب الفشل سطر SCORE: فقط في السجل — لا محتوى التقرير أبدًا (سجلات CI عامة).

أُضيف

  • scripts/post-qa-cleanup.mjs: dry-run افتراضيًا، و--apply بنسخ احتياطية تلقائية (*.bak-<ts>، والتقارير تُنقل إلى qa/cleanup-backup-<ts>/): صفوف ZZ-QA-TEST في المتتبع، وتقارير *-t-role-* بلا SCORE صالح، ومدخلات example.com في pipeline.

ملاحظات

  • انحراف ar/ja في جولة الانحدار لم يتكرر في إعادة التشغيل (كلاهما: lang ✓ + A–G ✓) — دخول ta في language-check والمقوّى بمحلل SCORE يُشحنان كدفاع معمّق.
  • تنظيف الإنتاج ينتظر «نعم» صريحة من المستخدم: أولًا خطة dry-run، ثم --apply.

[1.248.1] — 2026-10-09

‏location_filter يكتسب طبقتَي الأب always_allow وblock_hard (CAR-60) — سلسلة موقع متعددة الدول تنجو من قائمة حظر الإخوة، والحظر الصريح الصارم لا يمكن إنقاذه بعد الآن.

أُصلح

  • ‏always_allow يتغلب على block: مع block: [romania, poland, croatia] وalways_allow: [united kingdom]، تمرّ خلية workable المدمجة «London, United Kingdom · Romania · Poland · Croatia» — الإقليم الأم خيار متاح (حالة workable الاستهلاكية #4806، الآن بالصيغة الأبوية).
  • ‏block_hard يتغلب على always_allow: مصطلحات بمستوى بلد يجب ألا تُنقذ بصدمة always_allow في موضع آخر من السلسلة.
  • ‏strict: true يحسب الآن block_hard طبقةً مقيِّدة؛ وقسم location_filter في docs/help يوثّق الطبقتين ×18.

ملاحظات

  • لم يُنقل هذه المرة عمدًا: مُصرِّف كلمات موقع الأب المحدود بحدود الكلمات وجدول ولايات USPS (يحتفظ web-ui بمطابقة السلاسل الفرعية؛ الجدول يخدم إعدادات مركزية أمريكية — أرشِفه تحت CAR-60 عند الحاجة). تبقى صيغة allow-list لاختبار workable الاستهلاكي حكمًا ثانيًا إلى جانب الصيغة الأبوية الجديدة.

[1.248.0] — 2026-10-09

مطابقة الأب: خمس إصلاحات موردين/liveness من الأعلى نُقلت — اللوحات التي نقلت API تستمر بالعمل، ولا يعود يُفوت بانر الإغلاق في سطر مستقل.

أُصلح

  • ‏Gupy يتبع الـAPI إلى portal.gupy.io ويرسل أسماء الفلاتر التي يقرؤها الـAPI فعلًا (workplaceType/type) — كانت الأسماء الجمعية القديمة تُتجاهل بصمت؛ لم يعد country يُرسل (بلد مُعدّ مسبقًا يرسم تحذيرًا باسم الإدخال). أصحاب العمل «Confidencial» يسقطون بمطابقة تامة للوسم (بينما «Confidencial Seguros» يبقى)، وs max_pages مُسقف عند 100 — الـAPI تجيب 400 بعد الإزاحة 10,000، وتحذير الاقتطاع يقترح الآن تضييق الكلمات المفتاحية.
  • ‏Workable يحتفظ بكل بلدان وظيفة متعددة البلدان: الإخوة تحت رابط الوظيفة نفسه يُطوون في صف واحد („London, United Kingdom · Romania · Poland · Croatia“) بدل فوز أول بلد.
  • ‏Liveness: بانر في سطر مستقل ليس جزءًا من السطر الأعلى — «Sign in if you want to apply» / «Get notified when this position is filled» تحت الوظيفة يُقرأ كجملة الإغلاق التي هي، بينما «until filled» الحقيقي العابر للأسطر يُقرأ نشطًا كالعادة.
  • ‏Radancy يقرأ عنصر job-location شقيقًا في ترميز البطاقات القديم (تخطيطات عائلة Barclays تضع الموقع بعد </a>) — الصفوف بلا موقع خاص تبقى فارغة بدل استعارة موقع الجار.
  • روابط SmartRecruiters الاحتياطية تحتفظ بالـslug المُعد — وظيفة بلا ref موثوق تصنع رابطها العام من slug المستأجر، لا من اسم العرض أبدًا.

أُضيف

  • عدم-نقل موثّق: إصلاح _http للوكيل fetchImpl من الأعلى (web-ui لا يملك فرع وكيل — نقله يُبطل فحص الهوية لحارس DNS-rebinding ويضيف اعتماد undici يتجنبه المستودع عمدًا)؛ verify-ats الأعلى (+226 سطرًا) وcv-facts (web-ui ينفذ تسجيل ATS وتحليل CV الخاصين به)؛ لوحة الأب Go TUI وسكربتات CLI؛ إعادة ترتيب imports في Teamtailor (شكلي).

ملاحظات

  • فجوة معروفة كمتابعة: طبقة always_allow في مرشح الموقع لدى الأب (اختبار workable الاستهلاكي ينجو بفضلها من حظر UK) غير موجودة في web-ui؛ عبّر النقل عن الحكم الاستهلاكي نفسه عبر اختبار allow-list. سُجلت كتغيير منفصل.

[1.247.0] — 2026-10-09

اكتمل ذيل جولة التصميم CAR-49…58 — كل النتائج الثانوية والتحسينية المتبقية، بالإضافة إلى الخريطة الداكنة التي أجّلها الإصدار السابق عمدًا.

أُصلح

  • الخريطة تعرض سمة داكنة حقيقية. التكبير/الطبقات/الإسناد أصبحت داكنة في v1.246.0؛ والآن البلاطات تتبع أيضًا: يرسم الوضع الداكن طبقة OSM بانعكاس CSS (دون مفاتيح المورّدين)، ويتوفر preset Carto-dark بالمفتاح عبر MAP_TILE_DARK_URL (مضيفه مسموح في CSP img-src). يعاد تركيب الطبقة حيًّا عند تبديل السمة.
  • صناديق التنبيه الصفراء لها صيغ داكنة (config، batch، تحذير الواجهة) عبر ميكانيكا الرموز من v1.246.0 — واكتُشف انحدار في الطريق: .callout a كان يطغى على .btn-primary؛ الآن بمجال :not(.btn).
  • رابط بطاقة المعلومات في Apply لا يُقطع بعد الآن في منتصف الكلمة.
  • أزرار رأس السيرة الذاتية بنظام أيقونة واحد (نص؛ اختفى خليط 📁/📄/💾).
  • تبويبات حالة المتتبع بحالة أحرف واحدة — حالة الجملة مع مراعاة اللغات (CJK/ar/hi/ta بلا صيغ جنس).
  • أيقونات الشريط العلوي بمجموعة SVG واحدة بالحدود — اختفى خليط 🔔/🌙/🩺؛ وزر السمة يرسم الشمس/القمر عبر CSS.
  • بطاقة Pipeline في لوحة القيادة فقدت تظليلها الوردي (الحلقة عند hover/focus فقط).
  • حذف عمليات البحث المحفوظة يبدو مدمّرًا فعلًا (.btn-danger، لا شبح محايد).
  • معاينة pipeline لها حالة فارغة حقيقية (عنوان + تلميح + زر إجراء، نمط المتتبع).
  • بيانات الوقت/التكلفة بنمط واحد: يرسم UI.pageMeta ⏱ + التكلفة سطرًا واحدًا تحت عنوان العرض (evaluate/deep/auto/mode-page/orientation).
  • ‏auto-pipeline فقد ✨ — العنوان h1 الوحيد المزخرف عاد إلى الحافة اليسرى المشتركة.
  • رابط مستندات batch صار رابطًا مضمّنًا.
  • ‏interview-digest / orientation لهما حالات فارغة مصممة (عنوان + تلميح + زر إجراء).
  • تصدير career-plan معطّل ما دام الخطة فارغة، والإجراءات في صف واحد.
  • ‏stats: أُزيل العنوان المكرر «Market report»، ويتسع العنصر النائب للمنطقة (نص أقصر ×18، عرض ثابت).
  • لم يعد config يسرّب مسارات مطلقة — يعرض displayPath() الخادمي ~/… أو اسم الملف مجردًا.
  • مساعد LLM_PROVIDER ثلاثة أسطر قصيرة (×18 + pre-line) بدل جدار mono من 150 حرفًا.
  • بطاقة EMAIL في الملف الشخصي تبقي العنوان سطرًا واحدًا (حذف؛ الكسر فقط ≤480px).
  • نص Health لم يعد يكسر الكلمات («Run buttons» كاملة؛ overflow-wrap anywhere).
  • الكود المضمّن في help ينجو من RTL (عزل LTR، nowrap، قابل للتمرير).
  • حبة «Live evals» في الواجهة لا تتصادم بعد الآن في ru/ar (التفاف مرن، أيقونات لا تنضغط).

أُضيف

  • ‏preset البلاطات الداكنة (MAP_TILE_DARK_URL + الإسناد) موثّق في الكود؛ وإضافة CSP img-src تغطي مضيف Carto له.

ملاحظات

  • الافتراضي للبلاطات الداكنة هو انعكاس CSS لـOSM — أغلقت Carto بلا مفتاح خرائطها خلف مفتاح API (تم التحقق بطلب)؛ لذا preset المفتاح اختياري لا افتراضي.

[1.246.0] — 2026-10-09

أُصلحت جميع النتائج العشر الكبرى من جولة التصميم الأولية CAR-48 — بما في ذلك العائق وكل السبع الكبرى.

أُصلح

  • ‏Apply بالوضع الداكن: رابط بطاقة المعلومات مرئي من جديد. كانت البطاقة تحتفظ بسطحها الفاتح في الوضع الداكن؛ وكان الرابط «Need Playwright? See …» عند ≈1.0:1. إن .callout--info الواعي للسمة (رموز surface/border/text/link) يرفع الرابط الداكن إلى ≈7.3:1.
  • لم يعد RTL يقلب التركيبات الرقمية. حبوب النتيجة («1.5 / 5») ونطاقات التقارير («≥ 4.5»، «< 3.5») و«/ 5.0» في لوحة القيادة تحصل على عزل اتجاهي (span بالاتجاه LTR)؛ وأعاد قاموس ar صياغة بعض النطاقات بالكلمات حيث يكون النثر أوضح.
  • ‏markdown السيرة الذاتية يبقى LTR. يُصَرّف حقل التحرير والمعاينة بـdir="ltr" في العربية؛ ويبقى الإطار المحيط RTL.
  • عمود DATE في التقارير لا يكسر تاريخ ISO بعد اليوم (nowrap + أرقام جدولية).
  • ينتهي الشريط الجانبي فوق HUD الاستخدام (احتياط منفذ التمرير + تلاشٍ) — آخر عنصر تنقّل لا يمر تحت اللوحة بعد اليوم؛ مع انعكاس RTL.
  • المسح على الجوال @390: زر «Save search» مرئي بالكامل — يلتف صف عناصر التحكم وينضغط بدل أن يُقصّ عند الحافة.
  • عناصر تحكم الخريطة تتبع السمة الداكنة (التكبير، الطبقات، الإسناد). بقيت البلاطات كما هي عن قصد: مصدرها مثبّت من الخادم عبر CSP img-src.
  • لم يعد زر المحادثة العائم يغطي محتوى تفاعليًا — حشوة تمرير الصفحات تصفّره (أزرار Disable في Portals، حبوب النتيجة في Reports، إدخال two-pager، إسناد Leaflet).
  • سجل النشاط يتحدث لغة الواجهة: 22 مسار إجراء مُعرَّب ×18 لغة (مع fallback إلى المعرّف الخام للمجهول) ورقائق التصفية مترجمة؛ ويبقى عمود TARGET — يملؤه auto-pipeline.
  • نماذج assessments تحصل على تسميات حقيقية (حالة الجملة، ربط htmlFor/id) بدل العناصر النائبة فقط.

ملاحظات

  • ليس في هذا الإصدار: بلاطات الخريطة الداكنة (تتطلب توسيع CSP img-src — تغيير على الخادم، تُرك عمدًا بلا تنفيذ من العميل)؛ والصيغ الداكنة لصناديق التنبيه الصفراء (config، batch) — ميكانيكا الرموز جاهزة للتكملة.

[1.245.0] — 2026-10-09

التابية (தமிழ்) تنضم بوصفها اللغة الواجهية الثامنة عشرة — أول لغة جديدة منذ موجة الـ17 لغة، بمطابقة كاملة للمفاتيح.

أُضيف

  • التابية (ta): 1449/1449 مفتاحًا بمطابقة كاملة مع en، دون فقدان أي عنصر نائب، وباعتمادات تقنية هندية على طراز الـhi (المزودون وأسماء النماذج والمسارات والأوامر تبقى بالحروف اللاتينية). يقبل detect()‏ ta وta-IN وta-LK؛ التابية LTR (مثبَّتة باختبار).
  • ‏docs/help/ta.md كاملًا (33 عنوان H2 / 125 عنوان H3، أعداد المصادر مدققة مقابل السجل الحيّ، مراسي canary الخاصة بـHermes، YAML حرفيًا)، إضافة إلى مرآتي README.ta.md وCHANGELOG.ta.md.
  • بوابات التعداد 17 → 18: LANGS، مجسات detect، تدقيق i18n، مطابقة سجلات التغيير، حارس RTL، وقائمة langs في CI — ما يستكمل أيضًا hi الغائبة سابقًا عن قائمة CI.

ملاحظات

  • صفحة cvstart.org الرئيسية تبقى على 17 لغة في الوقت الحالي — ترجمتها مهمة منفصلة؛ ومزامنة محتوى الموقع تنشر بالفعل docs/help/ta.md وسجل تغيير التابية.
  • تبقى REPORT_LABELS في report-header.js عند 17 — تحليل التقارير التابية سيأتي مع توليد التقارير التابية في المستودع الأصلي.

[1.244.2] — 2026-10-08

تلميع صفحة المسح: المشغّل وشريط الحالة ولوحة إعادة النشر والمرشحات أُعيد تصميمها كواجهة متسقة — وجدول النتائج لم يعد يمكن تمديده ببيانات اللوحة.

تم الإصلاح

  • خلايا الراتب تعرض نطاق المبلغ فقط. بعض اللوحات تضع وصف المزايا كله في حقل الراتب — الخلية المرئية تعرض الآن جزء المبلغ فقط وتنقل النص إلى التلميح (سابقًا: خلية من 6 أسطر تمتد كل صف).
  • الصفوف ذات العنوان الفارغ تعرض اسم الشركة (ثم شرطة محايدة) بدل خلية فارغة ضخمة.
  • شارة الأقدمية لا تلتف أبدًا في عمودها ذي العرض الثابت.
  • الصفوف بلا درجة تعرض «◎ —» باهتة مع تلميح يوضح أن مقارنة الصفحتين لم تجد كلمات مطابقة (سابقًا: لا شيء، بدت مكسورة بجانب الصفوف المصنفة).

أُضيف

  • إعادة تصميم الواجهة: بطاقة المشغل (صف عناصر تحكم محاذى، زر أساسي مهيمن)، شريط حالة الطرفية مع نقطة الحالة (خامل/قيد التشغيل/تم/خطأ) يدعم reduced-motion، لوحة إعادة النشر لها سقف ارتفاع مع رأس ثابت (مجموعة من 1,560 عنصرًا كانت ترسم لوحة بـ 155,000 بكسل)، وكتلة المرشحات كشبكة متجاوبة موحدة مع تذييل محاذى.

ملاحظات

  • كل ما عدا ذلك في #/scan مطابق لـ v1.244.1 — التغيير هو تلميع الواجهة والإصلاحات الأربعة أعلاه فقط. الاختبارات 5045 → 5068 unit.

[1.244.1] — 2026-10-08

تم الإصلاح

  • Scan icons announce real values. The boost/fit/score icons’ accessible names leaked the raw dict templates (“Fit: {band}”, “Boosted by {by}”) — {band}/{by}/{score} are now substituted (band word, booster keyword, numeric score). [HIGH a11y, caught live in the v1.244.0 regression round]
  • Title pipes split correctly. A 4-segment title like «C++ | Rust | Go Developer | Onsite» no longer lifts “Go Developer” out as a “country” — the split demands the segment resolves to a real country (conservative Countries.detectCountry).
  • Meta dates render for every row. daysSince accepted date-only ISO, but the API serves full timestamps for ~83% of dated rows — those rows showed no date segment.

ملاحظات

  • كل ما عدا ذلك في #/scan مطابق لـ v1.244.0 — التغيير هو الإصلاحات الثلاثة أعلاه فقط.
  • لم يُفعل عمدًا: حالة المرشحات في هاش الـURL وتنقل الصفوف بلوحة المفاتيح وتحليل 5 lakhs INR (متابعات قائمة).

[1.244.0] — 2026-10-08

نتائج المسح تُقرأ كقائمة لا كجدار: كل وظيفة = سطران، والإشارات أيقونات، والمسح من 700 صف جدول مُصفّح بدل صفحة بعرض 37,000 بكسل.

تم الإصلاح

  • تشريح الصف. كل وظيفة تُعرض كصف محدود من سطرين: السطر 1 العنوان، والسطر 2 company · location · source · date · work-type. شارة التعزيز وشريط ملاءمة العنوان ودرجة المطابقة أصبحت أيقونات بأسماء وصولية مترجمة وتلميحات (قارئات الشاشة تقرأ «Соответствие: сильное» / “Fit: strong” لا جدارًا من الكلمات)؛ وشارتا الثقة والنقل طُويتا في نفس المسار. أما الأقدمية والراتب فتبقيان عمودين مساعدين لسطح المكتب فقط.
  • نظافة العنوان. مقطع | Germany | Remote الختامي يُفصل من العنوان إلى سطر البيانات — بإدراك يونيكود، وفقط عندما يكون الذيل مؤشر نمو عمل حقيقيًا والقطعة الوسطى بشكل مكان (الفواصل المشروعة مثل «C++ | Rust | Go Developer» لا تُفصل أبدًا).
  • انتهى التدفق الأفقي. تخطيط جدول ثابت، min-width: 0، عنوان/بيانات بسطر واحد مع قطع نقطي والنص الكامل في التلميح: صفر تجاوز للصفحة وصفر تمرير داخلي للجدول عند 1440 بكسل و390 بكسل (كانت الصفحة القديمة تتجاوز بـ 675 بكسل على الهاتف).
  • التصفيح. النتائج تُعرض 50 في الصفحة (25/50/100/200 قابلة للاختيار) — مسح من 700 صف يصبح ~4,600 بكسل بدل ~37,000 بكسل، ويحمل الـ DOM ~1,000 عقدة بدل 5,500+.

أُضيف

  • اختبارات عقد التخطيط: الصف ذو السطرين، الأسماء الوصولية للأيقونات (en + ru)، ميزانية عُقد التصفيح، وحارس عد/ترتيب title-fit تعمل في حزمة المتصفح — لا يمكن للتصميم الجديد أن يتراجع بصمت.

ملاحظات

  • الاختبارات 5036 → 5045 وحدةً، وحزمة المتصفح أكتسبت عقود التخطيط، ومتوسط التغطية 98.14 % سطور / 89.34 % فروع(الحد 96/86).
  • ما يجده الماسح، وصيغ الدرجات، وlast-scan.json لم تُمَس — يبقى title-fit تعليقًا توضيحيًا.
  • ليس في هذا الإصدار: حالة المرشحات في هاش الـURL وتنقل الصفوف بلوحة المفاتيح (لاحقًا)؛ وتحليل 5 lakhs INR (قديم).

[1.243.2] — 2026-10-08

تم الإصلاح

  • نسخة النشر القابلة للنشر قُطعت كـ v1.243.2. وسم git الخاص بـ v1.243.1 أعيد توجيهه بعد النشر، وgit fetch --tags على الخادم يرفض بشكل صحيح الكتابة فوق وسم موجود — لذلك لم يكن v1.243.1 قابلاً للنشر إطلاقًا. هذا الوسم يحمل الشجرة المطابقة (إصلاح window-ليسنر النافذة على أساس v1.243.0) بالإضافة إلى هذه الزيادة في الإصدار. لم يتغير أي شيء آخر؛ حزمة npm 1.243.1 احتوت الإصلاح بالفعل.

ملاحظات

  • كود التطبيق مطابق لـ v1.243.1 — الجديد هو وسم النشر فقط (رفض git fetch --tags على الخادم الوسم v1.243.1 المُعاد توجيهه).
  • لم يُفعل عمدًا: إجبار تحديث الوسم على الخادم (الوسوم المنشورة لا تُنقل أبدًا).

[1.243.1] — 2026-10-08

تم الإصلاح

  • نافذة «تسجيل النتيجة» تُغلق الآن فعلًا عند التنقل. كان حارس v1.243.0 يستمع لـ hashchange على document حيث لا يُطلق هذا الحدث أبدًا — وصل الإصلاح ميتًا وبقيت النافذة تحجب العرض التالي (اكتُشف حيًّا في الإنتاج بجولة انحدار v1.243.1). يستمع الحارس على window؛ والاختبار يُرسل الحدث هناك أيضًا وقد تحقق منه أحمر Against الكود المكسور.

[1.243.0] — 2026-10-08

طبقة المتصفح تحفظ عملك وتتحدث بلغتك: لا خسارة للتعديلات غير المحفوظة، ولا إخفاقات صامتة، ولا إنجليزية صامتة في واجهة مترجَمة، وتباين AA في كل مكان.

تم الإصلاح

  • التعديلات غير المحفوظة تنجو من إعادة التصيير. يحتفظ محرّر السيرة الذاتية بمخزن «متسخ» ويعيده عند كل تصيير — «إلغاء» أو تبديل اللغة أو الانتقال إلى CV Studio يطلب تأكيدك الآن بدل تجاهل التعديلات؛ وخطّة المسار المهني تحفظ نصّها المولَّد بالطريقة نفسها. إخفاقات التحميل في Config/CV Studio/career-plan/memory/two-pager تُظهر خطأً وتعطّل «حفظ» بدل الكتابة بصمت فوق الملف بقيم فارغة.
  • نافذة «تسجيل النتيجة» لم تعد تنجو من التنقّل. فتحها على #/tracker ثم النقر على عرض آخر كان يتركها تحجب الصفحة كلها (اكتُشفت في اختبار الانحدار ذي المحطتين لـ v1.242.1) — تُغلق الآن عند تغيّر المسار؛ وشقيقاتها في عرض الفحص توقف تدفقات SSE وتفصل مستمعيها عند التنقّل أيضًا.
  • تحليل الرواتب والكلمات المفتاحية يقرأ كل خطوط الكتابة. شرائح الكلمات المفتاحية تستخدم حدود كلمات Unicode (السيريلية وc++ و.net تُرشَّح صحيحةً بدل أن تُصفَّر الصفوف)؛ ومحلّل رواتب مشترك واحد يصلح $182.9K - $240K وот 100 000 руб و100 тыс. руб. و50 000 Kč (كانت تُقرأ 50 مليون دولار) ودلالات النطاق ($100-150K)؛ وشرط «Germany or Netherlands» الإلزامي لم يعد يُحسب مطابِقًا ومخالفًا في آنٍ واحد.
  • التدفقات تستقر مرة واحدة بالضبط. انقطاع اتصال SSE كان يُسلّم الخطأ مرتين وقد يترك زر «توليد» معطّلًا إلى الأبد؛ كل حالة نهائية (done/error/close/throw، بما فيها عملية فرعية قُتلت) تستقر عبر مسار واحد وتعيد تمكين الزر. ويُخرج auto-pipeline إطاره المخزَّن الأخير بدل إسقاطه.
  • الخصوصية والصحة في المسارات الصغيرة. متن تقرير الخلل لم يعد يحمل رابط الوظيفة المقيَّمة أو مسمّيات التقارير؛ خصوصية السيرة الذاتية تحجب روابط linkedin.com/in/… العارية والأسماء المكتوبة بأحرف كبيرة كلها، وتتوقف عن تشويه التواريخ الأوروبية؛ وحلّ الدولة يأخذ أطول تطابق ويرفض التخمين حين تُذكر دولتان («Cambridge, MA» لم تعد → UK)؛ وتنزيل الملفات يحفظ الأسماء السيريلية.
  • الموجّه وإمكانية الوصول. رابط التخطي لم يعد ينتهي إلى 404 في ontent؛ وعنصر التنقّل النشط يحمل aria-current="page"؛ و<main> واحد و<nav> واحد؛ وEscape يغلق الدرج الجوّال (الذي بات خارج ترتيب Tab حقًا وهو مغلق)؛ وscroll-padding-top يُبقي التركيز مرئيًا خلف الأشرطة اللاصقة؛ واللافتة اللاصقة لم تعد تغطي الشريط العلوي.
  • التباين AA في السمتين معًا — كانت الإشعارات المنبثقة في الوضع الداكن بالأبيض على الأبيض (1.10:1): الإشعارات والأزرار واللافتات والروابط على --rausch تُحلّ الآن عبر رموز محايدة للسمة، تحت حماية اختبارات عقد WCAG محسوبة (≥ 4.5:1).
  • وكل ما تبقّى من الجولة: evaluate يعرض تحذير البتر؛ memory/config/two-pager ترفض الحفظ فوق تحميل فاشل؛ scan يتوقف عن ترك تدفقات SSE يتيمة؛ نتائج الفحص تصنّف اللوحات المدعومة بـ API من سجل الخادم بدل تعبير نمطي منحرف؛ «المضي بحذر» في المتتبّع تحذير وليس شارة حمراء؛ الإحصاءات تدمج الحالات المترجمة؛ والرسوم العمودية تُقرأ صحيحةً في RTL؛ وزر المستندات العائم لم يعد يغطي المحتوى على الهواتف؛ وGET /app.js يجيب 404 بدل غلاف الفهرس؛ وGET /api/runners يسرد أفعاله.

أُضيف

  • الدنماركية تنضم إلى الكشف التلقائي — متصفح da-DK يحصل الآن على واجهة الدنماركية (القاموس كان مكتملًا والكشف هو ما كان يفوّته)؛ وzh-Hant* يُطابَق مع الصينية التقليدية. cv-diagnostics — قائمة فحص السيرة الذاتية — مترجَمة بالكامل (28 مفتاحًا من diag.* × 17). أُضيفت 26 تسمية لمواصفات الحقول؛ وحُذف 31 مفتاحًا ميتًا؛ وقوائم المزوّدين لم تعد تدّعي أن Hermes «آخرها في الترتيب التلقائي»؛ وتسميات aria للزر العائم وللقائمة صارت مترجمة.

ملاحظات

  • الاختبارات 4812 → 5036 وحدةً، و118 + عقود تنقّل/تباين جديدة متصفحًا. متوسط التغطية 98.15 % سطور / 89.34 % فروع (الحد الأدنى 96/86).
  • ليس في هذا الإصدار: إعادة تصميم #/scan (المرحلة 4 — v1.244.0، والمواصفة مُسوَّدة بالفعل)؛ ومفتاح قاموس مخصص export.docxFailed (الفشل يعيد استخدام common.error)؛ و5 lakhs INR ما زال يُحلَّل كـ 5 (قائمة من قبل).

[1.242.1] — 2026-10-08

تم الإصلاح

  • أرشيف الإصدار لم يعد يحتوي على روابط رمزية لـ node_modules. حمل وسم git الخاص بـ v1.242.0 رابطًا رمزيًا node_modules في الجذر وآخر في site/node_modules (أدخلها git add -A الشامل متجاوزًا أنماط التجاهل المنتهية بمائل)، ففشل فك الضغط tar لنشر الخادم — تراجع النشر بأمان وبقي الإنتاج على 1.241.1. أُخرج الرابطان من التتبع ووُسّعت أنماط التجاهل؛ لم يتأثر حزمة npm أبدًا (تستثني npm دليل node_modules عند الحزم).

ملاحظات

  • كود التطبيق مطابق لـ v1.242.0 — تغليف فقط. محتوى «تصحيح المصادر» يذهب إلى الإنتاج بهذا النشر (v1.242.0 لم يصل إلى الإنتاج إطلاقًا: تراجع نشر الخادم بعد فشل tar).
  • لم يُفعل عمدًا: إعادة وسم v1.242.0 (نشر npm الإصدار 1.242.0 بالفعل؛ حزمة السجل نظيفة — تستثني npm دليل node_modules عند الحزم).

[1.242.0] — 2026-10-07

طبقة بيانات الماسح أصبحت جديرة بالثقة من جديد: المصادر الميتة عادت إلى الحياة، والاستجابة المشوّهة لم تعد تُقرأ كأنها لوحة فارغة، ورابط لوحة وظائف معادٍ لم يعد قادرًا على تحويل المسح.

تم الإصلاح

  • المصادر الميتة عادت إلى الحياة. justjoin (تغيّر غلاف الـAPI إلى {data, meta.next.cursor}) تقرأ كتالُجها الكامل عبر مسار مؤشّر مع حقول الراتب الجديدة؛ nofluffjobs كانت تجيب 400 بدون salaryCurrency — يُرسَل استعلام الأب الإلزامي وتُصفَّح النتائج (pageTo). himalayas و jobicy كانتا تريان أحدث ~20 إعلانًا فقط من أكثر من 100 ألف — والآن تتجولان في الكتالُج الكامل (ترقيم offset / cursor مع سقف صفحات).
  • الاستجابة 200 ذات الشكل الخاطئ ترمي خطأً في الصفحة الأولى. نحو 40 مصدرًا كانت تقرأ الردود المشوّهة أو صفحات التحقق كأنها «صفر وظائف» وينجح المسح بصمت. حرّاس جديدة في server/lib/sources/_shape.mjs (requireArray / requireContainer / requireObject) تجعل الفشل مسموعًا في كل العائلات؛ فشل صفحة لاحقة يحفظ الصفحات المجمّعة؛ والترقيم يتوقف على الطول الخام للصفحة لا على العدد المُرشَّح.
  • SSRF: فحص المورّد بالجزء من النص استُبدل بتثبيت مضيف دقيق بعد التحليل. lever (clever.com يحتوي lever.co)، greenhouse (5 مضيفات + مضيفات path-slug القديمة boards[.eu].greenhouse.io)، ashby، smartrecruiters، workable، gem REST، ibm، arbeitsagentur، hecklerkoch (www فقط)، workingnomads (كان http://169.254.169.254 قابلًا للوصول متجاوزًا حارس DNS)، remoteok، remotive، rss، successfactors. redirect:'error' في كل مكان؛ روابط الوظائف يجب أن تكون https: على المضيف المثبَّت (javascript: / data: / خارج المضيف تُهمَل).
  • مدخل portals واحد سيئ التهيئة لم يعد قادرًا على إسقاط المسح بالكامل. resolveAdapter يلتقط استثناءات المحوّلات، وdetectApi ملفوف لكل شركة، والمحوّلات التي ترمي تُعيد null؛ وأخطاء fetch في comeet تُحرِّر ?token= قبل أن تصل إلى السجلات أو سجلات الحجر.
  • الترقيم والطزاجة. workday تتجول في المستأجرين فوق 100 إعلان (صفحات offset، MAX_PAGES)؛ telegram يحفظ أحدث المنشورات ويصفّح بـ ?before= بدل حفظ الأقدم بصمت؛ tencent تواصل عندما يغيب Count؛ taleo تحلّل جداول العناوين الفرنسية؛ avature تتوقف على الطول الخام؛ أختام تواريخ UTC (انزياح amazon بيوم شرق UTC، torre، workingnomads، trudvsem)؛ فك كيانات HTML (geekjob، getmatch، hh)؛ mycareersfuture تُصدر شكل الحقول الاثني عشر الكامل.
  • إحكام كشف العمل عن بُعد. arbeitsagentur، vdab، rippling، teamtailor: نسبة العقد (“Verpleegkundige (100%)”، bundesweit) وكلمة “distributed” (“Distributed Systems Engineer”) لم تعدا تضعان الوظائف الميدانية كـ Remote.

أُضيف

  • tests/adapters-pin-coverage.test.mjs يُكمل تغطية فروع تثبيت المضيف التي أدخلها ذلك التثبيت.

ملاحظات

  • الاختبارات 4419 → 4812 وحدةً، و118 متصفحًا. متوسط التغطية 98.15 % سطور / 89.36 % فروع (حدّ البوابة 96 / 86).
  • ليس في هذا الإصدار: ملاحظات العميل من نفس جولة المراجعة (المرحلة 3 — views، libs، CSS/a11y، i18n)؛ sources/habr.mjs ما زالت بلا ملف اختبارات مخصص (إعفاء ratchet).

career-ops-ui v1.267.1 · page 2/11 · mirror of the project changelog for cvstart.org