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

GitHub

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

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

جميع التغييرات المهمة في career-ops-ui. التنسيق وفق Keep a Changelog، والإصدارات وفق SemVer.

الترجمات: 🇬🇧 English · 🇪🇸 Español · 🇧🇷 Português · 🇰🇷 한국어 · 🇯🇵 日本語 · 🇷🇺 Русский · 🇨🇳 简体中文 · 🇹🇼 繁體中文 · 🇫🇷 Français · 🇵🇱 Polski · 🇺🇦 Українська · 🇩🇰 Dansk · 🇩🇪 Deutsch · 🇮🇹 Italiano · 🇹🇷 Türkçe · 🇮🇳 हिन्दी

ملاحظة بشأن الترجمة (v1.70.0) — أُضيفت العربية كإحدى ثلاث لغات واجهة جديدة. يترجم هذا الملف أحدث الإدخالات؛ السجل الكامل في 🇬🇧 CHANGELOG الإنجليزي وهو المرجع المعتمد.


[1.134.1] — 2026-08-05

تصليب التحقق من الصحة — إصلاحات كشف عنها تدقيق شامل للمشروع.

أُصلح

  • لم يعد successfactors يُهدر الوظائف المُجمَّعة عند فشل في منتصف المسح (انحدار في تحويل «إطلاق خطأ اللوحة الميتة» بإصدار v1.134.0) — لم تكن حلقة الترقيم (pagination) الخاصة به تحتوي على try/catch، فكان الفشل في الصفحة 2 وما بعدها (بعد نجاح الصفحة الأولى) يُطلِق خطأً ويُهدر كل ما جُمِع مسبقاً؛ وإذا كان ذلك الفشل من نوع 404 (بقيمة startrow خارج النطاق)، كان en-scanner يحجر مستأجراً (tenant) حيّاً بوصفه ميتاً لأيام. أصبح الآن يُطابق سلوك phenom/radancy: لا يزال الفشل في الصفحة صفر يُطلِق خطأً (لوحة ميتة)، لكن الفشل في صفحة لاحقة يُبقي على النتائج الجزئية.
  • أصبحت رقاقات (chips) تصفية #/scan قابلة للتشغيل عبر لوحة المفاتيح (WCAG 2.1.1) — كانت رقاقات الأوجه (وأيضاً رقاقة «مسح») عناصر span بمعالج نقر فقط، دون tabindex أو دور (role)، فلم يكن بمقدور مستخدمي لوحة المفاتيح وقارئات الشاشة الوصول إليها أو تبديلها. تحمل الآن role="button" وtabindex="0" وaria-pressed، وتُفعَّل بمفتاحي Enter/Space.
  • أصبحت ثلاث سلاسل نصية إنجليزية مُثبَّتة يدوياً (hardcoded) مُترجَمة الآن — كانت تلميحة شارة الثقة (trust-badge tooltip) في #/scan، وعنوان عمود إعادة التموضع (relocation) في #/scan، وعنوان عمود النتيجة في #/dashboard سلاسل حرفية عارية لا تراها بوابة تكافؤ الترجمة (i18n parity gate) — لأنها لم تكن مفاتيح (keys) قط — فبقيت بالإنجليزية في كل لغة غير الإنجليزية. أصبحت الآن scan.trustTip + scan.col.reloc (مفتاحان جديدان) + إعادة استخدام لـtrack.col.score، مع حارس (guard) ثابت المصدر.

[1.134.0] — 2026-08-05

تكافؤ مع المشروع الأصل career-ops v1.25.0.

أُضيف

  • مصدر مسح جديد: getManfred (manfred) — تغذية على مستوى اللوحة بأكملها لوظائف تقنية في إسبانيا والاتحاد الأوروبي بأجور منشورة، من www.getmanfred.com/api/v2/public/offers (بلا مصادقة، مثبَّتة المضيف + HTTPS فقط، كتالوج كامل باستدعاء واحد). مصدر + مُحوِّل + مجموعة اختبار معزولة عن CI (tests/sources-manfred.test.mjs)؛ أصبح السجل الآن 73 مصدراً = 68 إنجليزية + 5 روسية (ALL_ADAPTERS 68). يظهر في مرشِّح المصدر بصفحة #/scan وعلى الصفحة الرئيسية لـcvstart.org.

أُصلح

  • كانت تغذية a16z Speedrun تُقتَطع بصمت إلى 50 وظيفة (#2404) — تُقيِّد التغذية الصفحة الواحدة بـ50 وظيفة، بينما كان المصدر يطلب PER_PAGE = 100، فتوقّف الترقيم بعد الصفحة الأولى. جرى تصحيحها إلى 50.
  • أصبحت اللوحات الميتة تُطلِق خطأً بدلاً من أن تُقرأ وكأنها “حيّة لكن فارغة” (#2379) — cryptocurrencyjobs، وphenom، وradancy، وsuccessfactors: أصبح فشل الجلب الذي لا يُحسَم فيه أي طلب الآن يُطلِق خطأً (بحيث تُسجِّل صحة #/portals والمسح فشلاً حقيقياً)، بدلاً من ابتلاعه كقائمة فارغة؛ الفشل في منتصف المسح بعد نجاح واحد على الأقل يُبقي على النتائج الجزئية.
  • أصبح workable يستخدم الآن واجهة الودجت العامة (#5ab8425) — جرى التحوّل إلى apply.workable.com/api/v1/widget/accounts/<slug>، التي تُعيد قائمة النشر الكاملة لحساب كبير في طلب واحد، بحيث لم تعد الحسابات الكبيرة تُقتَطع.

ملاحظات

  • لم يُنقَل (خاص بواجهة سطر الأوامر فقط أو غير مُعكَس في web-ui): إعادة كتابة أداء تجميع العناوين الخاصة بـdetect-reposts #2389؛ إصلاحات مفتاح الشركة الخاصة بـUnicode (إزالة تكرار المتتبِّع الخاص بـweb-ui آمنة بالفعل للأحرف غير اللاتينية)؛ scan --since؛ cv-facts؛ مسار تدقيق قالب السيرة الذاتية / PDF؛ doctor؛ توجيه المحتوى غير الموثوق للأوضاع.

[1.133.1] — 2026-08-02

أُصلح

  • #/funded (الشركات الممولة) يعرض النتائج الآن — خطآن كانا يجعلان الجدول يظهر دائماً “لا توجد شركات ممولة” حتى عندما يُعيد سكربت المشروع الأصل company-funded.mjs قائمة كاملة. (1) كان العرض يقرأ النتائج تحت res.candidates، بينما يُصدرها المشروع الأصل تحت companies (كل عنصر بالشكل {company, amount, round, funding: { sources: [{ source, url, observed_date }] } })؛ يقرأ العميل الآن المفتاح الصحيح ويُطابق شكل الأدلة الفعلي. (2) كان جدول النتائج يُمرِّر خلاياه إلى UI.el('tr', {}, …) كوسائط متغيرة (varargs)، لكن UI.el(tag, attrs, children) يتوقع أن يكون children عقدة واحدة أو مصفوفة، لذا لم يكن يُعرَض سوى العمود الأول (الشركة) فقط — أصبحت الخلايا الآن تُمرَّر كمصفوفة. جرى التحقّق في متصفح فعلي: تُعرَض 11 شركة عبر التغذيات الأربع بأعمدة الشركة / إشارة التمويل / المصدر / التاريخ، مع روابط أدلة عاملة، ودون أي أخطاء في وحدة التحكم (console). أصبح المرور الفارغ الآن يُظهر أيضاً تشخيصات كل مصدر على حدة، بحيث يمكن تمييز يوم إخباري هادئ عن تغذية محظورة.
  • ضمانات انحدار جديدة في tests/parity-routes-v1133.test.mjs: أصبح سكربت المشروع الأصل الوهمي (fake) يُصدر الآن شكل الإخراج الحقيقي companies (كانت التركيبة (fixture) الأصلية تعكس شكل candidates الخاطئ — وهذا بالضبط سبب انطلاق الخطأ للإنتاج)، إضافة إلى كناري (canaries) ثابتة المصدر تتحقق من أن funded.js يقرأ res.companies (وليس res.candidates أبداً) ويبني صفوف الجدول بخلايا كمصفوفة (+1 ← 2144).

[1.133.0] — 2026-08-01

أُضيف

  • اكتشاف الشركات المموَّلة (#/funded، تكافؤ مع المشروع الأصل #2117) — عرض جديد للقراءة فقط يُمرِّر سكربت company-funded.mjs الخاص بالمشروع الأصل career-ops عبر GET /api/company-funded: قائمة أولية للمراجعة تضم الشركات التي حصلت مؤخراً على تمويل، مُكتشَفة من تغذيات تمويل عامة مُثبَّتة المضيف (TechCrunch، وPR Newswire، وThe Guardian، وHacker News). يُشغِّل التمرير السكربت بالخيارين --json --dry-run (إخراج JSON إلى stdout، دون كتابة ملفات)، ولا يُمرِّر مدخلات المستخدم أبداً إلى --sources، ويحمل تحديد معدّل (rate limiting)، وهو مُشغَّل من قِبل المستخدم فقط (زر اكتشاف، لا يُشغَّل عند التحميل أبداً). وحدة مسار جديدة server/lib/routes/funded.mjs + public/js/views/funded.js، ضمن قسم الاستقطاب.
  • موجز المقابلات الأسبوعي (#/interview-digest، تكافؤ مع المشروع الأصل #2129/#2130) — عرض جديد للقراءة فقط يُمرِّر سكربت weekly-digest.mjs الخاص بالمشروع الأصل (بدون LLM) عبر GET /api/interview/weekly-digest: تجميع آلي لملاحظات جلسات المقابلات — الشركات والجولات التي أُجريت معها مقابلات هذا الأسبوع، والكفاءات المتكررة، والثغرات المفتوحة المُقدَّرة بأفضل جهد. يُمرَّر النطاق الاختياري ?from=&to= فقط عندما يكون كلا الطرفين بصيغة YYYY-MM-DD صالحة؛ النطاق الفارغ يُنتج موجزاً صالحاً بقيمة available:true. أُضيف إلى server/lib/routes/interview.mjs + public/js/views/interview-digest.js، ضمن قسم التحليلات.
  • يتّبع كلا المُمرِّرين عقد “الفشل الآمن” available:false المُعتمَد عندما يكون سكربت المشروع الأصل غير موجود (بيئة CI، التثبيتات المستقلة). 26 مفتاح ترجمة (i18n) جديداً ×17 لغة؛ مجموعة اختبار جديدة معزولة عن CI tests/parity-routes-v1133.test.mjs (+5 ← 2143).

ملاحظات

  • تجاوز المشروع الأصل career-ops الإصدار v1.24.0 بإضافة صفحة متتبّع المتابعة (Follow-up Tracker) الخاصة بتطبيق web/ المبني على Next.js (#1422) وتصيير PDF من جهة الخادم (#2182) — لم يُنقَل ذلك: تمتلك career-ops-ui بالفعل مسار تمرير خاصاً بالمتابعة ومُشغِّلات PDF خاصة بها، وتصليب followup-cadence.mjs الكامن يصل مجاناً عبر مسار التمرير القائم على shell out. تغييرات set-status.mjs / tracker-utils.mjs داخلية بحتة لواجهة سطر الأوامر (CLI) ولا تُعكَس هنا.

[1.132.0] — 2026-07-31

غُيّر

  • استُخلصت منظومة عرض نتائج #/scan إلى public/js/lib/scan-results.js (تسديد ديْن عقد حجم الملف — كان public/js/views/scan.js قد بلغ نحو 1254 سطرًا). انتقلت المنظومة — renderResults، وbuildChipRow، وgetRows، وبانيات الصفوف/الأوجه، ورسّامات خيارات الأقدمية/البلد، ومرآة سجلّ FALLBACK_SOURCES — إلى مصنع window.ScanResults.create(ctx) يُغلق على كائن سياق يوفّره العرض (عناصر التصفية، ومجموعات الأوجه النشطة، ومقسِّم الصفحات، وبيانات الصفحة الثنائية، ودالة جلب lastResults). لا تغيير في السلوك — نُقلت الدوال حرفيًا وأُعيد ربط متغيرات الإغلاق ميكانيكيًا إلى ctx.*؛ أصبح scan.js الآن نحو 906 سطرًا. (لا يزال فوق الحد المستهدف البالغ 800 سطر — من المخطط إجراء عملية استخلاص ثانية؛ عقد حجم الملف لعرضَي JS المتبقيين الشاذّين، scan.js وconfig.js، مُتتبَّع في docs/sdd/CONVENTIONS.md.)
  • تقرأ الاختبارات الثابتة للمصدر الآن الملفين عبر tests/helpers/scan-src.mjs::loadScanSrc() (على غرار loadAppCss())؛ يقرأ tests/scan-fallback-sources.test.mjs الآن مرآة السجلّ من scan-results.js.
  • بوابة انحدار جديدة داخل المتصفح — يُهيّئ tests/playwright-scan-filters.mjs ملف data/last-scan.json مُعَدًّا مسبقًا ويُشغّل كل مرشّحات #/scan (المصدر، الأقدمية، العمل عن بُعد، العمر، تضمين/استبعاد النص)، مُتحقِّقًا من أعداد الصفوف بدقّة، بحيث يُتحقَّق من الاستخلاص مقابل سلوك المتصفح الفعلي (يُشغَّل عبر npm run test:e2e:browser). أُضيفت معرِّفات ثابتة لعناصر التصفية (#scan-filter-*، #scan-apply) لأجله.

صيانة

  • أصبحت لافتة “أحدث إصدار” في README مُختصرة إلى ملخّص من سطر واحد + رابط إلى سجل التغييرات الكامل (يُتقاعَد الجدار السردي الطويل متعدد الإصدارات — يعيش التاريخ في CHANGELOG*.md). طُبِّق ذلك عبر جميع اللغات الـ17.

[1.131.2] — 2026-07-31

غُيّر

  • تقسيم app.css إلى ثلاث صفحات أنماط مرتّبة (ديْن عقد حجم الملف — كان الملف الواحد قد بلغ نحو 1990 سطرًا، متجاوزًا كثيرًا الحد الصارم البالغ 800 سطر). أصبح الآن app.css (نحو 672 سطرًا — إمكانية الوصول، رموز التصميم/السمة، الشريط الجانبي، المحتوى الرئيسي، الأزرار، غلاف المحتوى)، و**components.css** (نحو 595 سطرًا — البطاقات، الشبكات، مقسِّم الصفحات، الشارات، الجداول، النماذج، السجل/وحدة التحكم، markdown، مبدّل اللغة، مرشّح الرقائق، شريط الاتصال)، و**overlays.css** (نحو 737 سطرًا — التنبيه المنبثق (toast)، درج الإشعارات، النافذة المنبثقة (modal)، المتفرقات/الاستجابة، انعكاس [dir="rtl"]، docs-fab، usage-hud)، كل منها ضمن الحد الصارم.
    • القطع متواصل ومرتّب، لذا يكون التتالي (cascade) مطابقًا حرفيًا بايتًا ببايت للملف قبل التقسيم؛ يحمّل index.html الملفات الثلاثة كعناصر <link> مرتّبة. لا تغيير في السلوك أو الترميز أو الترجمة (i18n).
    • أصبحت الاختبارات التي تتحقق من CSS تقرأ الآن السلسلة المُدمَجة عبر مُساعد مشترك tests/helpers/css.mjs::loadAppCss(). يُثبّت ملف اختبار جديد tests/css-modularization.test.mjs هذا التقسيم (وجود الملفات · كل منها ≤ 800 سطر · ترتيب عناصر <link> في index.html) ← المجموعة 2138. جرى التحقق داخل المتصفح: تُحلَّل صفحات الأنماط الثلاث جميعها وتُطبَّق قواعدها.

[1.131.1] — 2026-07-31

أُصلح

  • اتساق تثبيت المضيف للمحوّلات (adapters) في مصدرَي v1.130.0 (متابعات مراجعة الذكاء الاصطناعي، دفاع في العمق؛ لا تغيير في السلوك للمدخلات الصالحة):
    • محوّل a16z-speedrun-talent يعيد الآن التحقّق من تجاوز api: / a16z-speedrun-talent: عند buildEndpoint (HTTPS + مضيف مطابق تمامًا speedrun-talent-network.com) ويعود إلى التغذية القياسية عند فشل التحقّق — تكافؤًا مع محوّل cryptocurrencyjobs، بحيث لا تصل قيمة من مضيف مختلف إلى منفذ الجلب أبدًا (كان يعتمد سابقًا فقط على حارس assertSpeedrunUrl عند وقت الجلب). أصبح فحص تطابق المضيف الدقيق الآن تعبيرًا نمطيًا واحدًا مُصدَّرًا SPEEDRUN_TALENT_HOST_RE يتشاركه الحارس والمحوّل.
    • مُحلِّل cryptocurrencyjobs — يستخدم cleanUrl الآن حارس المضيف المطابق تمامًا نفسه المستخدَم في assertCryptocurrencyJobsUrl وتجاوز المحوّل (كان يستخدم endsWith، الذي يقبل النطاقات الفرعية). لم يعد المُحلِّل أبدًا أكثر تساهلًا من حارس SSRF: يُستبعَد رابط عنصر من sub.cryptocurrencyjobs.co.
    • ‏+2 اختبارَين → المجموعة 2135.

[1.131.0] — 2026-07-31

أُضيف

  • لوحة تبويبات المراحل بأسلوب CRM في #/tracker (منقولة من عرض /pipeline الخاص بتطبيق الويب للمشروع الأصل). يُستبدل شريط رقائق القمع + القائمة المنسدلة للحالة في المتتبِّع بـشريط تبويبات مراحل: تبويب الكل بالإضافة إلى تبويب لكل حالة قياسية — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — يعرض كل منها عداداً حياً لكامل السجل التاريخي، مع تضمين المراحل ذات العدّ الصفري بحيث يظل القمع بالكامل مرئياً دائماً (المظهر النمطي لـCRM). التبويب النشط يقود عملية التصفية؛ والنقر عليه مجدداً يمسح التصفية ويعود إلى الكل. تحافظ الصفوف على تدرّج لون النتيجة والشرعية وإمكانيات PDF والتقرير، وتُظهر خلية الشركة الآن شعار العلامة التجارية عند تفعيل الشعارات (معطّلة افتراضياً ← صفر طلبات إضافية).
    • مسار جديد للقراءة فقط GET /api/tracker/stages يُعيد القمع القياسي (التسميات مرتّبة) + خريطة طيّ للأسماء البديلة، مصدرها server/lib/states.mjs (templates/states.yml، مع احتياطي مُضمَّن) — بحيث لا يُبرمج العميل أبداً القائمة البيضاء للحالات. يبقى رد GET /api/tracker القديم بلا معامِلات دون تغيير ({ rows } فقط).
    • مكتبة عميل جديدة نقية ومُختبرة وحدويًا public/js/lib/tracker-stages.js تُصنّف الصفوف وفق مراحل الخادم، متسامحة مع تنسيق markdown العريض الشارد والأسماء البديلة المترجَمة (مثال: aplicadoApplied). التبويبات قابلة للوصول (role tablist/tab، وaria-selected، ومساحة لمس ≥44 بكسل، والعدادات ضمن الاسم المتاح للوصول لكل تبويب). لا مفاتيح i18n جديدة. المجموعة 2133.

[1.130.0] — 2026-07-31

أُضيف

  • مصدرا مسح جديدان منقولان من المشروع الأصلي career-ops v1.24.0 (داخل العملية، دون تبعيات جديدة؛ يظهر كلاهما في قائمة Source المنسدلة بـ#/scan وعلى الصفحة الرئيسية لـcvstart.org):
    • a16z Speedrun (a16z-speedrun-talent، ‏#2231) — تغذية JSON على مستوى اللوحة بأكملها لشبكة مواهب a16z Speedrun. مضيف مُثبَّت على speedrun-talent-network.com، HTTPS فقط، ترقيم صفحات يبدأ من 0 مع حدّ أقصى لعدد الصفحات، وتمرير q/إعداد لكل شركة، وفشل بأسلوب آمن.
    • Cryptocurrency Jobs (cryptocurrencyjobs) — لوحة وظائف الويب3 cryptocurrencyjobs.co، تُستوعب عبر تغذية RSS 2.0 العامة الخاصة بها (بلا مصادقة). فكّ ترميز كيانات XML على مرحلتين، قوائم عن بُعد فقط، واستخراج جهة التوظيف من ذيل العنوان "… at <Company>".
    • أصبح إجمالي السجل الآن 72 مصدرًا = 67 إنجليزية + 5 روسية (ALL_ADAPTERS = 67 محوّلاً إنجليزيًا).

أُصلح

  • echojobs — تبقى الوظائف الهجينة قابلة للتمييز عن العمل عن بُعد (تكافؤ مع المشروع الأصلي، ‏#2258). أصبحت علامة hybrid غير الحسّاسة لحالة الأحرف تُنتج الآن "<City> · Hybrid" (أو Hybrid مجردة عند غياب المدينة) وworkplaceType: 'Hybrid'، بدلاً من الانطواء ضمن Remote.
  • radancy — دعم ترميز TalentBrew القديم ونقل جزء نتائج JSON (تكافؤ مع المشروع الأصلي a3e6df9)، محكوم بـopts.fetchJson قابل للحقن.

ملاحظات

  • لم يُنقل — ميزات خاصة بـCLI المشروع الأصلي فقط. يبقى السطح الكبير لـCLI/الأوضاع في career-ops v1.24.0 خارج web-ui، الذي هو عارض + كتابة رقيقة عبره، لا مضيف أوضاع: جداول الامتثال/الاختصاص القضائي، دفتر هاتف جهات الاتصال + vCard، تفريغ محاضر المقابلة النصية/اكتشاف منصّة المكالمات، تعيين حالة السجل، تسجيل النتيجة، الفرز الثنائي المرحلة، تشابه إعلانات الوظائف، مخطّط عنصر السيرة الذاتية للطلب المُصدَّر، اكتشاف Playwright-MCP لـdoctor، وملف portals/fix-slugs.mjs. تغييرات تنسيق المسح التي تعيش في scan.mjs الخاص بالمشروع الأصلي — ماسح Interamt.de بواسطة Playwright، مسح iCIMS الشامل العكسي لأنظمة ATS، مرشّح العمل عن بُعد حسب أهلية الدولة، ضبط وتيرة بحث DNS، إزالة تكرار rltr في StepStone، وعمود الشركة الموحَّد في سجل المسح — لا تنطبق: يُشغّل web-ui ماسحات EN/RU داخل العملية ولا يستدعي scan.mjs.
  • مُغطّى مسبقًا. إصلاح طيّ التشكيل في role-matcher (‏#2209) نُقل في v1.127.0، لذا فهو بلا أثر هنا.

[1.129.1] — 2026-07-29

أُصلح

  • متابعات مراجعة الذكاء الاصطناعي على منافذ web من v1.128/v1.129 (كلها استشارية، أُصلحت من الأصل): أسبقية المستوى في job-facets.js (المعدِّل الصريح يتغلّب الآن على كلمة الإدارة — Senior Engineering Managersenior، كان lead)؛ لم يعد fallback في states.mjs مثبَّتًا (تُحفظ القراءة الناجحة، ويُعاد fallback دون تخزين — الأب غير المتاح مؤقتًا عند الإقلاع يُقرأ ثانيةً في الاستدعاء التالي) + console.warn عند ملف موجود لكنه تالف؛ score-tone.js — الصف بلا درجة محايد (muted) لا أحمر؛ يتخطّى domainFromName() الـslugs غير ASCII قبل /api/logo؛ +حارس عزل في tests/states.test.mjs. +4 اختبارات → 2073.

[1.129.0] — 2026-07-29

أُضيف

  • وجه المستوى + عمود المدة في #/scan — مكتبة job-facets.js التي شُحنت في v1.128.0 صارت الآن موصولة بواجهة المسح (كانت منطقًا فقط). قائمة المستوى الجديدة تصنّف عنوان كل وظيفة إلى lead/staff/senior/متوسط/junior/متدرب (JobFacets.seniorityFromTitle) وتُملأ تلقائيًا مما هو موجود فعليًا في النتائج (كوجه الدولة)؛ العناوين بلا كلمة مستوى تمرّ دائمًا. تُحفظ في عمليات البحث المحفوظة وإعادة التعيين والتطبيق. يكتسب الجدول عمود المستوى (شارة) وعمود المدة بلا رموز (اليوم / ، من JobFacets.daysSince). 12 مفتاح i18n ×17، +3 اختبارات → 2069.

[1.128.0] — 2026-07-29

أُضيف

  • أربعة حلول منقولة من تطبيق الويب الخاص بالمشروع الأب (../web/، Next.js)، أُعيدت كتابتها بجافاسكريبت خام/ESM دون تبعيات جديدة: (1) يقرأ server/lib/states.mjs ملف templates/states.yml مباشرةً كمصدر وحيد لمفردات حالات المتتبِّع (مع احتياطي للـCI) — ويلغي إعادة المزامنة اليدوية للقائمة البيضاء كل إصدار؛ يطوي POST الأسماء البديلة (الإسبانية/القديمة) إلى التسمية القياسية، ويجمّع قمع GET حسب الحالة القياسية؛ (2) شعارات الشركات في صفوف مستضافة على ATS عبر domainFromName() (~90 علامة→نطاق)؛ (3) score-tone.js — درجة لون رباعية المستويات (≥4.2/3.8/3.0 + احتياطي حرفي)؛ (4) job-facets.js — أوجه seniority/source/days. +21 اختبارًا.

ملاحظات

  • غير منقول (مفهوم فقط): طبقة الإجراءات الوكيلة للأب (actions/registry.ts + api/assistant/route.ts) — مخطط لحين تحوّل docs-fab إلى مساعد فاعل. لا مصادر جديدة (السجل 70)، لا تغييرات i18n/help.

[1.127.0] — 2026-07-29

أُضيف

  • ثلاثة مصادر مسح جديدة (تكافؤ مع career-ops v1.23.0) — يضم السجل الآن 70 محوّلاً (65 EN + 5 RU): Flowxtra (مُجمِّع شامل بلا مصادقة)، VDAB (واجهة كلمات مفتاحية لخدمة التوظيف الفلمنكية)، وiCIMS (بوابات careers-<tenant>.icims.com، منفصلة عن jibeapply). كما يعود Cursor إلى قائمة الـCLI (parent #2115): يكتشف cli-detect الآن cursor (10 أدوات)، واستُعيدت القائمة في help/README/config ×17.

أُصلح

  • انتقل agenticjobs من كشط HTML إلى واجهة REST (#2167)؛ يستعيد Greenhouse المدينة من /offices عندما يكون location.name مجرد نمط عمل (#2104)؛ تكافؤ role-matcher (#1933/#2164/#2009: بادئة MTS، أساس product، طيّ التشكيل، خلاف ما دون الأساس).

ملاحظات

  • غير منقول. معظم v1.23.0 سطح CLI/لوحة تحكم لا يستخدمه web-ui (batch-tailor، discover-ats، أوضاع NL/PT، سمات PDF، لوحة Go، updater/doctor)؛ سكربتات الترحيل دون تغيير. VERSION الأب → 1.23.0.

[1.126.1] — 2026-07-25

أُصلح

  • نقطتا انحراف في قائمة CLI فوّتتهما إعادة مزامنة v1.126.0 — (1) مقدّمة تبويب API keys في #/config (config.providerModelNote، i18n ×17) كانت تسرد 7 واجهات فقط — تُدرَج الآن Antigravity وGrok Build بعد OpenCode؛ (2) صف ثانٍ في جدول المقارنة داخل دليل المساعدة (×17) وملف help للموقع المبني في CI كانا لا يزالان يعرضان Inside Claude Code / Codex / Cursor / Gemini CLI — المجموعة القديمة مع Cursor — والآن القائمة الكاملة. كلاهما استخدم فواصل شرطة مائلة/نقطة وسطى لم تغطّها أنماط مسح v1.126.0. أُعيد توليد لقطة i18n؛ وتبقى المجموعة 1969.

[1.126.0] — 2026-07-25

أُضيف

  • علامة تبويب أدوات AI CLI تكتشف الآن جميع واجهات career-ops الثماني من الدرجة الأولى — تمّت مزامنة قائمة #/config مع docs/SUPPORTED_CLIS.md للمشروع الأب: يكتسب server/lib/routes/cli-detect.mjs واجهتَي Grok Build CLI (grok) وKimi CLI (kimi)، وتفحص Antigravity الآن ثنائيّها القياسي agy أولاً. يُبلّغ مسح PATH للقراءة فقط الآن عن 9 أدوات؛ وما زال لا يُشغّل أي ثنائي يجده.

غُيّر

  • إعادة مزامنة التوثيق مع career-ops.org/docs — طُوبِقت كل واجهة توثيق مع صفحات المشروع الأب الحيّة (قُرئت الـ31 كلها). قائمة مساعدي الذكاء الاصطناعي القياسية (help ×17 + README ×17) تسرد الآن الواجهات الثماني من الدرجة الأولى — Claude Code، Codex، OpenCode، Antigravity CLI، Grok Build CLI، Qwen Code، Kimi، GitHub Copilot CLI — إضافةً إلى Gemini CLI (غلاف قديم). تحافظ حزم المساعدة على بنية 29 H2 / 105 H3.

[1.125.4] — 2026-07-23

غُيّر

  • تبعيات site (dependabot #151–#153) — sharp 0.34.5→0.35.3 وsvgo 4.0.1→4.0.2 وfast-uri (dev) 3.1.3→3.1.4 في site/؛ بناء Astro أخضر، دون تأثير على SPA/الخادم.

ملاحظات

  • مسح تكافؤ مع المشروع الأب (career-ops 37d17ec..254764a، بعد v1.22.0) — لا شيء يُنقل: حارس الصف الخاطئ في set-status (#2108) خاص بـ CLI فقط (في web-ui تُختار صفوف المتتبّع صراحةً في الواجهة ولا يستدعي أي مسار set-status.mjs)، وRisk Summary للأوضاع المترجمة (#2109) يمسّ ملفات modes/<lang>/ التي لا يقرؤها web-ui أبدًا (يقرأ فقط modes/*.md في المستوى الأعلى)، والتحقق من الـ manifest في update-system (#2111) خاص بالمحدِّث فقط، والباقي وثائق المشروع الأب (README تركي، SIGNATURES ×4، SCRIPTS.md، تشكيل es). يبقى VERSION الأب 1.22.0parentVersion دون تغيير.

[1.125.3] — 2026-07-23

أُصلح

  • كانت مطالبات LLM بالدنماركية والهندية تُجيب بالإنجليزية (أبلغ عنها مستخدم) — لم يُوسَّع LOCALE_NAMES ولا كتل SCAFFOLD_STRINGS الخمس في server/lib/prompts.mjs لتشمل da وhi، فكان resolveLocale() يعود إلى en، وتفقد كل مطالبة ذكاء اصطناعي — البحث المعمّق (المباشر واليدوي)، الأوضاع، التقييم، المقابلة، التواصل، CV Studio — توجيه # Output language في هاتين اللغتين. أصبحت كلتاهما الآن مدعومتين بالكامل: توجيه اللغة + سقالة مترجمة. بوابة الانحدار في tests/locale-scaffold.test.mjs تمسح الآن قائمة اللغات القياسية السبع عشرة بدلاً من 12 مثبّتة يدويًا، وبوابة بنيوية جديدة تُفشل أي مفتاح سقالة يعود إلى الإنجليزية — لغة مستقبلية تُغفل prompts.mjs لن تُنشر بعد الآن (+12 اختبارًا، المجموعة الآن 1969).

[1.125.2] — 2026-07-22

أُصلح

  • البحث المعمّق عبر Gemini: خطأ HTTP 502 (MALFORMED_FUNCTION_CALL) (#145، مساهمة من @Alien10140) — كان موجّه /api/deep المباشر يطلب من النموذج «Use WebFetch / WebSearch» وحفظ الموجز في ملف، لكن مزوّدي واجهات API بلا أدوات ليس لديهم قناة أدوات؛ فكان Gemini يردّ باستدعاء دالة بدل النص، فيظهر ذلك كخطأ 502 فارغ. أصبح لدى buildDeepPrompt وbundleProjectContext علم headless: التشغيلات المباشرة (Anthropic/Gemini/سلسلة الاحتياط) تتلقى موجّهًا بلا أدوات يكتب الموجز من السياق المضمّن، بينما يحتفظ موجّه النسخ واللصق الخاص بـ Claude Code بتعليمات الأدوات. ‎+1 اختبار في tests/critical-fixes.test.mjs.

غُيّر

  • رفع نماذج Gemini الافتراضية بعد إيقاف gemini-2.0-flash (#144، مساهمة من @Alien10140) — القائمة المنسدلة في الإعدادات، واحتياطي الخادم في gemini.mjs (الذي كان يخالف التلميح بصمت)، وسلسلة احتياط OpenRouter، وconfig.geminiModelHint ×17، ودليل المساعدة ×17 كلها تشير الآن إلى gemini-3.6-flash. البوابة الجديدة ضد الانحراف tests/gemini-default-model.test.mjs (+5 اختبارات) تثبّت كل الأسطح على القيمة الحرفية نفسها — وأصبحت الحزمة الآن 1957 اختبارًا.

[1.125.1] — 2026-07-21

أُصلح

  • SuccessFactors: يحتفظ مستأجرو RMK متعددو العلامات التجارية بمسار علامتهم (تكافؤ مع المشروع الأصلي، ‏#2099، بعد v1.22.0) — الشركات القابضة التي تُشغّل عدة علامات تجارية مستحوذ عليها عبر مثيل RMK واحد مشترك تميّزها بجزء من مسار الرابط (careers.nemetschek.com/Bluebeam/ مقابل …/Vectorworks/)؛ كان المحوّل يختزل عنوان URL المُهيَّأ إلى أصله، فيمسح بصمتٍ إعلانات العلامة التجارية الرئيسية فقط. أصبحت نقطة النهاية الآن تحافظ على بادئة العلامة التجارية، ولا تحذف سوى جزء لاحق مثل /search/ أو /tile-search-results/، بحيث لا يتكرر أي شيء على نفسه أبداً؛ ويبقى المستأجرون ذوو النطاق الواحد دون تغيير بايت واحد. دالة مساعدة جديدة مُصدَّرة باسم resolveTenantBase + كتلة اختبار واحدة منقولة في tests/sources-successfactors.test.mjs.

[1.125.0] — 2026-07-21

أُضيف

  • cvstart.org: قسم “مصادر الوظائف” على الصفحة الرئيسية — قسم جديد بين لقطات الشاشة وقائمة المقارنة يسرد جميع مصادر المسح الـ67 كشرائح قابلة للنقر (62 لوحة/نظام ATS إنجليزي + 5 لوحات روسية تحت عنوان فرعي خاص بها)، ويرتبط كل منها بالموقع العام الخاص بالمصدر. تُزامَن القائمة مع سجل المحوّلات الحي عند البناء (sync-assets.mjsfacts.sources)، بحيث لا يمكن أن تنحرف أبداً عن التطبيق؛ وخريطة روابط منسَّقة في Sources.astro محمية باختبار tests/site-sources.test.mjs الجديد. اكتسب شريط التنقّل العلوي مرساة مصادر جديدة؛ و4 مفاتيح i18n جديدة للموقع ×17. كما أُصلحت قائمة inLanguage في JSON-LD الخاص بالصفحة الرئيسية، التي كانت لا تزال تفتقد hi.

[1.124.0] — 2026-07-21

أُضيف

  • خمسة مصادر مسح (تكافؤ مع المشروع الأصلي career-ops v1.22.0، ‏#1808/#1572/#2024/#2055) — Welcome to the Jungle (واجهة JSON على مستوى اللوحة بأكملها)، وAgentic Engineering Jobs (لوحة وظائف الهندسة العميلة/الذكاء الاصطناعي)، وJobvite (نظام ATS لكل مستأجر بلا مصادقة)، وGem (نظام ATS لكل مستأجر)، وAlibaba Group (واجهة JSON لصفحة التوظيف، على غرار نمط Meituan/Tencent). كل واحد منها زوج (مصدر ومحوّل) مُثبَّت على مضيف ومعزول عن CI؛ يوفّر السجل الآن 67 محوّلاً (62 إنجليزية + 5 روسية)؛ حُدِّث احتياطي قائمة Source المنسدلة في #/scan وفحص الانحراف الخاص بها؛ وخمس مجموعات اختبارات جديدة tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.

أُصلح

  • Arbeitsagentur: العمل عن بُعد على مستوى البلد بأكمله فقط حين تكون قيمة homeofficetyp مساوية لـ VOLLSTAENDIG (تكافؤ مع المشروع الأصلي، ‏#1981) — استعلام homeoffice=nv_true يُعيد أيضاً وظائف هجينة، لذا يتحقّق تمرير العمل عن بُعد الآن من كل نتيجة عبر نقطة نهاية تفاصيل الوظيفة على دفعات صغيرة، ويتعامل مع الفشل بأسلوب آمن: أي خطأ في البحث يُبقي على المدينة الحقيقية للوظيفة بحيث تظل مرشِّحات الموقع سارية.
  • SmartRecruiters: كانت روابط الوظائف العامة تُبنى دون /postings/ (تكافؤ مع المشروع الأصلي، ‏#2047) — أصبحت الروابط الآن تصل إلى صفحة الوظيفة العامة بدلاً من خطأ 404 لدى المستأجرين الذين يُسقط موقعهم العام هذا الجزء من الرابط.

ملاحظات

  • شحن المشروع الأصلي v1.22.0 أيضاً تغييرات من جهة CLI لا تستدعيها الواجهة عبر الصدفة أو تغطّيها مسبقاً: قالب السيرة الذاتية بالصينية المبسّطة (zh-CN) وطباعة PDF، ووضع /expand، وتعديلات ذاكرة التخزين المؤقت لمِحثّات المزوّدين (Gemini/OpenAI/Ollama)، وتفصيل الرموز لكل خطوة (تملك الواجهة مقياس استخدامها الخاص)، وتسلسل قفل الكتابة الخاص بالمتتبّع (تُمرّر الواجهة عمليات الكتابة عبر withFileLock منذ v1.21)، وأعلام المسح visa_filter وتاريخ النشر المطلق (تملك الواجهة مرشِّح عمرها الخاص «منشورة خلال»)، وبذر إزالة تكرار المصادر التي سبق رصدها (يحتفظ ماسح الواجهة بإزالة التكرار الخاصة بسجل المسح).

[1.123.0] — 2026-07-17

أُضيف

  • مصدر مسح Oracle Recruiting Cloud (تكافؤ مع المشروع الأصلي career-ops v1.21.0، ‏#1929) — واجهة recruitingCEJobRequisitions REST بلا مصادقة لمواقع التوظيف Oracle Fusion/ORC (JPMorgan Chase وOracle وBNY Mellon وAmerican Express وHoneywell وغيرها): مضيف مُثبَّت على *.fa[.<region>][.ocs].oraclecloud.com، ورقم الموقع يُستخرج من careers_url الخاص بكل شركة متابَعة، وترقيم صفحات بالإزاحة مع حدّ أقصى صارم لعدد الصفحات، وترويسات شبيهة بالمتصفح واعية بـ WAF. يوفّر السجل الآن 62 محوّلاً (57 إنجليزية + 5 روسية)؛ حُدِّث احتياطي قائمة Source المنسدلة في #/scan وفحص الانحراف الخاص بها؛ ومجموعة اختبارات جديدة معزولة عن CI باسم tests/sources-oraclecloud.test.mjs.

أُصلح

  • كاشف إعادة النشر: العناوين الأساسية تبقى متمايزة عن أخواتها ذات اللاحقة المتخصصة (تكافؤ مع المشروع الأصلي، ‏#1922) — لم يعد العنوان «Senior Analytics Engineer» يُجمَّع مع «Senior Analytics Engineer, People Analytics»: حين تكون رموز أحد العنوانين مجموعة جزئية صارمة من رموز الآخر وتكون الكلمة الإضافية تخصصاً حقيقياً لا كلمة أساسية، يُعامَل العنوانان بوصفهما وظيفتين قابلتين للنشر منفصلتين. صارت تعليقات إعادة النشر مثل «(Repost)» و«relisted» تُعامَل الآن كضوضاء وصفية عبر كلمات توقف. +2 تأكيدين في tests/detect-reposts.test.mjs.

ملاحظات

  • شحن المشروع الأصل v1.21.0 أيضاً تغييرات من جهة CLI لا تستدعيها الواجهة عبر الصدفة أو تغطّيها مسبقاً: تحذير إعادة التقديم لشركة سبق التقديم لها (تملك الواجهة فترة تهدئة لإعادة التقديم منذ v1.84.0)، وأعلام --format/--report لخطاب التقديم، وأوضاع prompt البريد الإلكتروني للمقابلة (الإشارات الحمراء / معلومات اللجنة / التغيّب عن المقابلة)، وحفظ إشارات الثقة وصحة البوابات في المسح (تُشغّل الواجهة ماسحها الخاص داخل العملية مع trust-validator وصفحة صحة البوابات)، وامتدادات الإحصاءات وفجوة الراتب (تُنقَل بالقراءة فقط وبأسلوب fail-soft).

[1.122.0] — 2026-07-16

أُضيف

  • الهندية (हिन्दी) — اللغة السابعة عشرة — قاموس واجهة كامل (نحو 1,110 مفتاحاً)، ودليل المساعدة الكامل داخل التطبيق (تكافؤ 29 قسماً رئيسياً / 105 قسماً فرعياً)، وREADME.hi.md، وCHANGELOG.hi.md جديد (يبدأ من v1.122.0، على غرار سابقة الألمانية والإيطالية والتركية)، وصفحة الهبوط cvstart.org مع صفحات المنهجية/الرخصة/سجل التغييرات/المساعدة، ومبدّل اللغة (🇮🇳)، والكشف التلقائي عن لغة المتصفح، ولقطة شاشة موطّنة للوحة التحكم. أصبح كل بوابة تكافؤ ×16 تعمل الآن ×17: تكافؤ قاموس i18n واللقطة المرجعية، وبوابتا الأقسام الرئيسية/الفرعية لدليل المساعدة، وتكافؤ سجل التغييرات، وفحص check-i18n في الموقع، ومسح Playwright للغات.

[1.121.0] — 2026-07-16

أُضيف

  • cvstart.org: صفحات المنهجية والرخصة وسجل التغييرات — اكتسبت صفحة الهبوط ثلاثة أقسام جديدة بكل اللغات الست عشرة، إلى جانب كتلة المقارنة القائمة: /methodology/ (معيار التقييم السداسي الأبعاد من 0.0 إلى 5.0، وعتبة التقديم عند 4.0، وقواعد ما لا يُفعل أبداً — ملخّص مُوطَّن من career-ops.org/methodology)، و**/license/** (نص MIT القانوني الكامل مع الإشارة إلى NOTICE.md)، و**/changelog/** (هذا الملف نفسه، مُعروضاً لكل لغة من ملفات CHANGELOG الست عشرة المترجمة في المستودع). إدخال جديد المنهجية في الترويسة وروابط الموارد في التذييل؛ أصبح sync-assets.mjs الآن يزامن CHANGELOG ×16 وLICENSE إلى الموقع وقت البناء، بحيث لا يمكن للصفحات أن تنحرف عن المستودع أبداً.
  • روابط المنهجية عبر التوثيق — أصبح README (بكل اللغات الست عشرة)، وقائمة §1 المرجعية في دليل المساعدة داخل التطبيق (بكل اللغات الست عشرة)، والويكي، تربط جميعها إلى career-ops.org/methodology (إلى جانب الأسئلة الشائعة والمسرد) بجوار أدلة career-ops.org/docs القائمة.

تغيّر

  • تحديث شارة الإصدار وشعار README (1850 اختبارًا، الإصدار v1.121.0) — كانت الشارة لا تزال تعلن عن v1.119.5.

[1.120.0] — 2026-07-16

أُضيف

  • بيان CareerOps (تكافؤ مع الأصل v1.20.0) — أطلق المشروع الأصل بيان CareerOps (MANIFESTO.md · career-ops.org/manifesto) ويُبرزه الآن من README الخاص به، ومن أداة التحديث، ومن لوحة تحكم Go. تحذو الواجهة حذوه: رابط جديد في تذييل الشريط الجانبي يفتح صفحة البيان (مفتاح i18n جديد footer.manifesto في كل اللغات الست عشرة)، ودليل المساعدة داخل التطبيق اكتسب القسم 29 «بيان CareerOps» بكل اللغات الست عشرة، وREADME يشرح ماهية البيان وكيفية توقيعه، وتذييل صفحة الهبوط cvstart.org يربط إليه أيضاً.

ملاحظات

  • أصلح المشروع الأصل v1.20.0 أيضاً كبت المهارة المعروفة في وضع upskill المستهدف، وأسكت dotenv كي يبقى مخرج scan --json القياسي قابلاً للتحليل، وأصلح قالب السيرة الذاتية بصيغة HTML كي يبقى عنوان الدور مع نقاطه — وهي أسطح من جهة CLI لا تستدعيها الواجهة عبر الصدفة؛ لم يتطلّب الأمر أي تغيير في كود الواجهة.

[1.119.5] — 2026-07-13

أُصلح

  • زر اللغة في صفحة الهبوط لم يعد ينكسر — مع أعلام v1.119.2 كان نص المبدّل في الترويسة (مثل «🇷🇺 Русский») قد ينكسر حتى ثلاثة أسطر على عروض سطح المكتب الضيقة؛ نص المبدّل وكل خيارات القائمة المنسدلة أصبحت الآن whitespace-nowrap — العلم + الاسم الأصلي دائماً في سطر واحد. كما انتقلت قائمة اللغات في التذييل من شبكة صلبة بعمودين إلى صفٍّ ملتفٍّ من عناصر بسطر واحد — «🇧🇷 Português (Brasil)» لم يعد ينكسر في منتصف الاسم أيضاً.

[1.119.4] — 2026-07-13

تغيّر

  • LICENSE يسمّي المؤلف — سطر حقوق النشر أصبح: Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors (نص MIT القانوني كما هو). ملف NOTICE.md جديد يفصّل الترخيص: من يملك حقوق النشر، وما الذي يغطيه منح MIT بالضبط (الكود، الوثائق، الترجمات، صفحة الهبوط، الويكي)، وما لا يغطيه (بياناتك أثناء التشغيل، المشروع الأب، محتوى لوحات الوظائف، العلامات التجارية)، وجدول مكونات الطرف الثالث (express/js-yaml — MIT؛ Astro/Tailwind — MIT؛ خطا Figtree وJetBrains Mono — SIL OFL 1.1؛ sharp — Apache-2.0) وسطر إسناد اختياري.

[1.119.3] — 2026-07-13

أُضيف

  • SECURITY.md — سياسة الأمان التي كان يشير إليها CONTRIBUTING أصبحت موجودة الآن: الإصدارات المدعومة، مسار الإبلاغ الخاص (تم تفعيل الإبلاغ الخاص عن الثغرات في GitHub على المستودع — تبويب Security → «Report a vulnerability»)، نموذج التهديد لتطبيق مستخدم واحد مرتبط بـ localhost (ضمن النطاق: XSS عبر إعلانات وظائف عدائية / SSRF / اجتياز المسارات / تسرب الأسرار / إضعاف CSP؛ خارج النطاق: حجب الخدمة عن localhost الخاص بك ومشكلات المشروع الأب)، وخط الأساس للتحصين للمراجعين.

[1.119.2] — 2026-07-13

أُضيف

  • CONTRIBUTING.md — دليل المساهم الذي طالما أشارت إليه صفحة الهبوط وREADME أصبح موجوداً الآن: الإعداد، خريطة المشروع، القواعد الصارمة للأمان/عدم البناء، مستويات الاختبار، شرح «السجلّين» لإضافة مصدر فحص، عقد i18n ×16، اصطلاحات الالتزامات/طلبات السحب، وعملية الإصدار.
  • أعلام اللغات على صفحة الهبوط — يعرض الآن مبدّل لغات cvstart.org وشبكة اللغات في التذييل ولافتة «اقرأ بلغتك» علم كل لغة بجانب اسمها الأصلي (نفس مجموعة المؤشرات الإقليمية في <select> لغة التطبيق؛ يتدهور إلى حروف المنطقة حيث تغيب محارف الأعلام).
  • إصلاحات تذييل صفحة الهبوط — رابط Discussions الميت (الميزة غير مفعّلة في المستودع) يشير الآن إلى ويكي المشروع، ويذكر التذييل المؤلف: Sergei Emelianov (sergey-cv.com · LinkedIn).

[1.119.1] — 2026-07-13

أُصلح

  • مرشِّح المصادر في #/scan لحق بالسجل — القائمة الثابتة FALLBACK_SOURCES خلف قائمة Source المنسدلة (تُستخدم فقط عندما يتعذّر الوصول إلى GET /api/scan/sources) كانت متخلفة بصمت منذ v1.87.0: كان ينقص الاحتياطي دون اتصال 20 مزوّداً (Amazon وAvature وSAP SuccessFactors وGet on Board وDassault Systèmes وbeesite وHigherEdJobs وJibeApply (iCIMS) وsoftgarden وCornerstone وPhenom وRadancy وDeutsche Bahn وEchoJobs وTKMS وHeckler & Koch وRheinmetall وLaraJobs والجديدان Meituan / Tencent). زُومنت مع كل الـ61 وتحميها الآن فحص انحراف يُفشل CI كلما اختلفت قائمة العميل عن سجل الخادم (القيم والتسميات معاً). +1 اختبار (1845).

[1.119.0] — 2026-07-13

تكافؤ مع مشروع career-ops الأب v1.19.0 + تحديث صفحة الهبوط cvstart.org.

أُضيف

  • مزوّدا فحص جديدان — Meituan (zhaopin.meituan.com) وTencent (careers.tencent.com): واجهتا JSON عامتان بلا مصادقة للوحات التقنية الصينية، تُكتشفان من المضيف أو تُختاران عبر provider: صريح، مع بحث من جهة الخادم لكل كلمة مفتاحية وتقسيم صفحات وإزالة تكرار حسب URL — الآن 61 محوّلاً (56 إنجليزية + 5 روسية). +20 اختباراً (1844).
  • كتلة المساهمين على صفحة الهبوط — يعرض cvstart.org صور كل من ساهم بكود (واجهة GitHub /contributors وقت البناء، مع ترشيح البوتات)، مترجمة إلى اللغات الست عشرة كلها، مع رابط إلى مخطط المساهمين الكامل.
  • عدّاد نجوم GitHub مباشر على صفحة الهبوط — تُحدَّث شارة الترويسة الآن من جهة العميل عبر واجهة GitHub عند كل زيارة (لقطة وقت البناء تبقى احتياطاً)، وإعادة بناء أسبوعية مجدولة لـ Pages تُبقي اللقطة وقائمة المساهمين حديثتين؛ نداءات الواجهة في CI موثّقة برمز token.

أُصلح

  • طلبات Workday CXS تحمل ترويسات شبيهة بالمتصفح (الأب #1813) — المستأجرون خلف Cloudflare (شوهد مباشرةً: geico) يردّون بـ 500 على الطلبات الخالية من UA/accept-language/origin/referer الاعتيادية؛ يستنتج الجالب الآن الـ origin واسم الموقع من عنوان CXS نفسه. ونالت طلبات Glints نفس UA المتصفح + origin/referer، وكلاهما من الثابت المشترك BROWSER_LIKE_USER_AGENT في http-json.mjs.

[1.118.4] — 2026-07-10

أُصلح

  • عمليات فحص hh.ru كانت تعيد 0 نتيجة من عنوان IP روسي (روابط النطاق الفرعي الإقليمي) — من عنوان IP سكني روسي، يعيد hh.ru توجيه البحث عبر 302 إلى نطاق فرعي إقليمي (sochi.hh.ru، spb.hh.ru، …) ويعيد روابط الوظائف على ذلك النطاق الفرعي. كان المحلل يبحث عن رابط العنوان على المضيف الثابت https://hh.ru/vacancy/ ولا يطابق أيًّا من الروابط الإقليمية، فكان الفحص العامل تمامًا يسجّل 0 بصمت. أصبح الآن يقبل أي مضيف *.hh.ru (إعلانات adsrv.hh.ru/click?… تظل مستبعدة — لا تملك مسار /vacancy/<id>) ويوحّد كل رابط نتيجة إلى https://hh.ru/vacancy/<id>. تم التحقق مباشرةً: يجري الآن تحليل 17 وظيفة حقيقية من صفحة sochi.hh.ru كانت تعطي 0 سابقًا. ‏+1 اختبار (1824).

[1.118.3] — 2026-07-10

أُصلح

  • كان hh.ru يعيد 0 نتيجة بصمت (صفحة فحص VPN البينية) — يعيد hh.ru الآن توجيه الشبكات التي يصنّفها كـ VPN/بروكسي (عناوين IP لمراكز البيانات) عبر 302 إلى صفحة بينية /vpncheeck (“VPN мешает работе сайта”) تستجيب بـ HTTP 200 دون أي بطاقة وظيفة، فكان الفحص يبلغ عن 0 دون أي خطأ. يكتشف الماسح الآن إعادة التوجيه عبر عنوان URL النهائي للاستجابة، ويعطّل hh.ru لبقية التشغيل، ويطبع تلميحًا صادقًا: يجب أن يخرج الترافيك فعلًا عبر IP سكني — قد يبقى VPN/بروكسي على مستوى النظام نشطًا حتى مع إيقاف مفتاح المتصفح. ‏+1 اختبار (1823).

[1.118.2] — 2026-07-10

صيانة

  • متابعة صفحة الهبوط (#118) — جرت مطابقة site/README.md مع Astro 7 (ترقية الأمان في #116)، وأزيل استيراد غير مستخدم، وأضيفت 4 حراسات قابلة للتنفيذ لسكربتات بناء صفحة الهبوط: بوابة تكافؤ i18n تفشل فعليًا مع قاموس معطوب، وsync-assets لا يكتب أبدًا خارج site/ — المجموعة 1822. حُلّ تنبيهان من CodeQL (أحدهما أُصلح في المصدر والآخر رُفض بوصفه سلوك بناء مقصودًا).

[1.118.1] — 2026-07-10

أُصلح

  • مسح hh.ru من خارج روسيا — يعيد hh.ru الآن HTTP 451 (حجب قانوني إقليمي) لعناوين IP غير الروسية على صفحات البحث العامة. يعامل الماسح 451 مثل 403: بعد أول حجب يُعطَّل hh.ru لبقية التشغيل مع سطر صادق في السجل يشير إلى عنوان IP روسي / مخرج VPN، فلا تُهدر الاستعلامات المتبقية ولا بقية المصادر الروسية. حُدِّث دليل المساعدة §7 بجميع اللغات الـ16. +1 اختبار (1818).

[1.118.0] — 2026-07-09

حزمة التكافؤ مع مشروع career-ops الأب v1.18.0.

أُضيف

  • 9 مزوّدي فحص جدد — Cornerstone OnDemand (csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — الآن 54 محوّلًا. كما يتعرّف محوّل Lever على لوحات مستأجر الاتحاد الأوروبي (jobs.eu.lever.co).
  • حالة Hired في المتتبِّع (تكافؤ مع states.yml الأب): العروض المقبولة تحصل على حالة قياسية خاصة وشارة احتفالية ولافتة «حصلت على الوظيفة» في #/tracker؛ ويحسبها القمع والتحويلات كأنها اجتازت كل المراحل.
  • تبويب الإجمالي في #/stats — تمرير للقراءة فقط لسكربت الأب stats.mjs (ملخص المتتبِّع الإجمالي، معدلات القمع التراكمية، إجماليات الماسح، تغطية البوابات) بالإضافة إلى ملاحظات التعويضات من salary-gap.mjs (المرغوب مقابل المعلن مقابل الفعلي، لكل طلب). مساران جديدان GET /api/stats/lifetime وGET /api/stats/salary-gap — استدعاءات صدفة بلا تكلفة توكنات، وتدهور آمن {available:false} من دون المشروع الأب.
  • 28 مفتاح i18n جديدًا في اللغات الـ16 كلها؛ وتحديث دليل المساعدة §14/§26 بكل اللغات.

الاختبارات

  • +38 اختبار وحدة (ثلاث مجموعات تكافؤ للمزوّدين + مسارات التمرير/الحالة) — الإجمالي 1817.

[1.117.2] — 2026-07-06

إصلاح المتتبِّع الفارغ لاستدعاءات التكافؤ الخارجية. تخرج سكربتات الأصل بالرمز 1 مع JSON منظم {error} عندما لا يحتوي المتتبِّع على طلبات بعد؛ وكانت لوحة المتابعة وتبويب أنماط الرفض يعرضانها كـ«script-error». يمرر المساران الآن ذلك كحالة فارغة سليمة (available:true, empty:true) فتعرض الواجهة رسالتها الصادقة «لا شيء بعد». تم التحقق مباشرة مع أصل حقيقي.

جديد: لا شيء.

[1.117.1] — 2026-07-06

تقوية v1.117.0 (فرز CodeQL). تحمل الآن نقاط النهاية الثلاث ذات الاستدعاء الخارجي (GET /api/followup، POST /api/followup/seed، GET /api/stats/patterns) محدِّد المعدل المشترك حسب IP (تنشئ عملية فرعية لكل طلب؛ no-op على loopback). استخراج نص الرابط في «أضِف إلى السيرة» يزيل الوسوم حتى نقطة ثابتة ثم يحذف كل </> متبقٍ — تعقيم كامل مثبت لنص مطالبة LLM. لا تغيير في سلوك المدخلات الصحيحة.

جديد: لا شيء.

[1.117.0] — 2026-07-06

حزمة التكافؤ مع الأصل — ست قدرات من career-ops الأصل إلى الواجهة. (1) لوحة إيقاع المتابعة في #/followup: استعجال لكل طلب (🔴/🟠/🟡/🔵) من followup-cadence.mjs، مع زر زرع تواريخ المتابعة (followup-seed.mjs --backfill). (2) أنماط الرفض: تبويب إحصاءات رابع يشغّل analyze-patterns.mjs (قراءة فقط) — توزيع النتائج والتوصيات ومعدل التقدّم لكل مزوّد ATS. (3) أضِف إلى السيرة: بطاقة في CV Studio تحوّل رابطًا أو نصًا ملصوقًا إلى نقاط ATS مبنية فقط على ذلك المصدر (اقتراحات فقط، دون كتابة؛ جلب الروابط محمي من SSRF). (4) 4 مزوّدي فحص جدد — beesite وHigherEdJobs (RSS) وJibeApply (iCIMS) وsoftgarden — يضم السجل الآن 50 محوّلاً (45 EN + 5 RU)، كلها في قائمة Scan. (5) خطوة الفحص المسبق للمُقصيات في قائمة Apply. (6) مشغّل reconcile (/api/run/reconcile). مسارات الاستدعاء الخارجي تتدهور بصدق دون سكربتات الأصل.

  • وحدة مسارات جديدة server/lib/routes/followup.mjs (الـ31) + مسارات جديدة + 8 ملفات source/adapter. اختبارات: 6 + 7 جديدة؛ المجموعة 1737 → 1750. 41 مفتاح i18n جديدًا ×16. المساعدة §13/§17/§24/§26 موسّعة ×16.

جديد: GET /api/followup، POST /api/followup/seed، GET /api/stats/patterns، POST /api/cv-studio/add-entry، POST /api/run/reconcile.

[1.116.0] — 2026-07-06

إعادة تصميم مقياس الاستخدام + أول اختبار شامل للأدوات. جرى إصلاح مقياس استخدام الذكاء الاصطناعي (v1.114.0) وتثبيته بشكل صحيح: أصبح الآن مثبَّتًا أسفل الشريط الجانبي الأيسر (بعرض الشريط كاملًا، بنفس السطح) ويحجز في الأسفل مساحة تساوي ارتفاعه بحيث لا تُغطّى القائمة أبدًا — يظل التنقّل وتذييل الإصدار يمرّان بحرّية فوقه. يُحدَّث مباشرةً (كل 15 ثانية، وعند تركيز التبويب وتغيير المسار)، ويعرض كل صف نافذة الآن <الرموز> · <التكلفة التقديرية> الحقيقية (تُقاس الأشرطة مقابل نافذة 30 يومًا) بدل “نسبة” ثابتة عند 100%. كذلك: حاجز typeof دائم في مستورد السيرة يُغلق من المصدر الإيجابية الكاذبة المتكررة لخلط الأنواع في CodeQL، واختبار شامل جديد بـPlaywright يشغّل كلتا الأداتين الدائمتين في متصفح حقيقي.

  • public/js/lib/usage-hud.js + app.css، server/lib/cv-import.mjs. اختبارات: tests/playwright-widgets.mjs (2 E2E) + tests/usage-hud.test.mjs (10). المساعدة §6 موسّعة ×16.

جديد: لا شيء.

[1.115.0] — 2026-07-06

صقل التصميم (محافظ، مع الإبقاء على هوية المرجاني). تمريرة تحسين خفيفة على نظام التصميم المشترك — دون إعادة هيكلة ودون تغيير اللوحة اللونية. تُرفع الآن بطاقات المقاييس في لوحة التحكم وتكتسب حدًّا مرجانيًا عند التمرير (مثل بلاطات الإجراءات السريعة)؛ وتُرفع بطاقات المحتوى قليلًا؛ وتكتسب أزرار primary / dark / danger ظلًّا في السكون ورفعًا لطيفًا عند التمرير لإحساس بالعمق؛ وتُحاذى الأرقام الكبيرة عبر tabular-nums؛ وتحصل عناصر التحكم التفاعلية على هالة مرجانية ناعمة خلف حلقة لوحة المفاتيح بسمك 2 بكسل. تحترم كل الحركة prefers-reduced-motion، والهالة مقصورة على عناصر التحكم — وليست *:focus-visible عامة.

  • CSS فقط (public/css/app.css)؛ دون تغييرات في العلامات أو i18n أو المسارات أو CSP. اختبارات: tests/design-polish-v1115.test.mjs (5). جرى التحقق مباشرةً عبر Playwright.

جديد: لا شيء.

[1.114.0] — 2026-07-06

مقياس استخدام وتكلفة الذكاء الاصطناعي في الشريط الجانبي (أسفل اليسار). يوجد الآن قسم الاستخدام مضغوط في أسفل الشريط الجانبي (بطاقة ثابتة أسفل اليسار إن لم يوجد شريط جانبي؛ أسفل اليمين في RTL) في كل صفحة. يعرض استخدامك لرموز LLM عبر نوافذ 24 ساعة / 7 أيام / 30 يومًا — كلٌّ بصيغة <الرموز> · <النسبة%> بشريط أخضر (النسبة من كامل المدة) — بالإضافة إلى تذييل بالتكلفة التقديرية لـ24 ساعة. البيانات هي تجميع GET /api/usage للقراءة فقط من data/llm-usage.jsonl (محليًا فقط)، نفس مصدر صفحة #/usage؛ التكلفة تقديرية وعمليات الوضع اليدوي مجانية ولا تُحتسب. قابل للطي — يبدّل العنوان وتُحفظ الحالة.

  • عنصر واجهة جديد public/js/lib/usage-hud.js يُحمَّل من index.html، يُركَّب في الشريط الجانبي فوق تذييل الإصدار (بديل الزاوية الثابتة). آمن لـ CSP؛ متوافق مع السمة ومعكوس لـ RTL. دون مسار خادم جديد. اختبارات: tests/usage-hud.test.mjs (8). 3 مفاتيح i18n جديدة ×16.

جديد: لا شيء.

[1.113.0] — 2026-07-06

مساعد “اسأل المساعدة” عائم في كل صفحة. يطفو الآن زر دردشة على شكل روبوت بتدرّج لوني في الزاوية السفلية اليمنى (السفلية اليسرى في RTL) من كل صفحة. انقره لفتح دردشة مضغوطة تجيب عن أسئلة الاستخدام اعتمادًا فقط على دليل المساعدة داخل التطبيق بلغتك — نفس نقطة النهاية لصفحة #/docs-assistant (POST /api/docs-assistant/ask)، لذا لا يقرأ أبدًا سيرتك أو ملفك أو المتتبِّع. مباشر بمفتاح LLM؛ دون مفتاح → مطالبة جاهزة للتشغيل. يعرض الرأس صورة روبوت + حالة اتصال؛ تُدخل الشارات أسئلة شائعة؛ Esc أو النقر خارجًا يغلقه؛ ويختفي في صفحة #/docs-assistant.

  • عنصر واجهة جديد public/js/lib/docs-fab.js يُركَّب عالميًا من index.html؛ آمن لسياسة CSP؛ أنماط متوافقة مع السمة ومعكوسة لـ RTL في app.css. دون مسار خادم جديد. اختبارات: tests/docs-fab.test.mjs (8). 6 مفاتيح i18n جديدة ×16. المساعدة §1 موسّعة في مكانها.

جديد: لا شيء.

[1.112.0] — 2026-07-06

دمج التوثيق وضمان الجودة. دون تغيير مرئي في الشيفرة. حُدِّث مستند اصطلاحات SDD (docs/sdd/CONVENTIONS.md) إلى 30 وحدة مسار الحالية (كانت 24) وخط أساس الاختبارات الحالي؛ وجرى دمج مطالبة ضمان الجودة النهائية لكامل المشروع (qa/QA-REGRESSION-PROMPT.md) — تحديث آلية الإصدار (v1.111، parentVersion 1.17.0، نشر مُشغَّل بحدث الإصدار)، وتصحيح جدول إضافات §14 (إعادة وسم استبعاد Scan إلى v1.109.0) وتوسيعه بإغلاق CodeQL في v1.111 — بحيث يصلح وحده كمطالبة انحدار وحيدة لكل الوظائف. يضيف اختبار تغطية واحدًا لفرع الرفع المفرط الحجم.

جديد: لا شيء.

[1.111.0] — 2026-07-06

الأمان — إغلاق متأخّرات CodeQL. ثلاثة تحصينات دفاع متعمّق تُغلق ما تبقّى من نتائج التحليل الساكن من مصدرها بدل تجاهلها (dismiss). يقوم stripDangerousMarkdown الآن بتهريب الرمز < لأي فتح وسم خطير مبتور (حمولة تنتهي بـ<script/<iframe/…)، بحيث لا يحتوي ناتجه بشكل مثبت على أي وسم خطير حي. يقرأ استيراد السيرة حجم المخزن المرفوع عبر تحويل صريح Number() — حاجز ضد خلط الأنواع. أصبحت أسطر أدوار الأوضاع الآن سلاسل قالبية مُدمَجة عبر String.replace بدل دوال مخزّنة، مما يزيل استدعاء الإرسال الديناميكي بالكامل. لا تغيير سلوكي مرئي للمستخدم.

  • server/lib/security.mjs، server/lib/cv-import.mjs، server/lib/prompts.mjs. اختبارات: tests/security-hardening-v1111.test.mjs (7) + تحديث اختبار الحارس v1108. دون تغييرات i18n/مساعدة/مسارات.

جديد: لا شيء.

[1.110.0] — 2026-07-06

تحديث الوثائق وضمان الجودة (كل اللغات). دون تغيير في الكود. حُدِّث موجّه QA لكامل المشروع إلى v1.109.0 مع §14 جديد (v1.98→v1.109)، واكتسبت موجّهات تدقيق UX وتصدير التصميم الدائمة مجموعة الصفحات الحالية. كل فقرة مساعدة أُضيفت في v1.100–v1.109 مترجمة الآن إلى جميع اللغات الست عشرة.

جديد: لا شيء.

[1.109.0] — 2026-07-06

مرشّح الاستبعاد في Scan + نظرة عامة على المسار (مطابقة تخطيط الويب). في #/scan، يعامل مربع البحث الآن الفواصل كـأو (“الأدوار المطلوبة”)، ويُخفي حقل استبعاد جديد أي صف تحتوي شركته/دوره/موقعه على أي كلمة مفصولة بفواصل (مثل senior, staff)؛ ويُحفَظ كلاهما في عمليات بحثك المحفوظة. في #/pipeline، يعرض شريط نظرة عامة مضغوط مسارك بنظرة واحدة — N في الوارد، N متتبَّع، وأعداد Applied / Responded / Interview / Offer من المتتبِّع، وكل شارة تربط بـ#/tracker.

  • من جهة العميل فقط (لا مسار/كتابات جديدة). public/js/views/scan.js + public/js/views/pipeline.js. اختبارات: tests/scan-pipeline-ui-v1109.test.mjs (2). 4 مفاتيح i18n جديدة ×16. المساعدة §7 + §8 موسّعة في مكانها.

جديد: لا شيء.

[1.108.0] — 2026-07-06

تعزيز الأمان (فرز CodeQL، الجولة 2). أُصلحت ثلاث نتائج إضافية منخفضة الخطورة: يحلّ باني الموجّهات سطر دور اللغة عبر مفتاح خاص + typeof === function كي لا تتمكّن لغة معدَّلة من الإرسال إلى أسلوب في النموذج الأولي (unvalidated-dynamic-method-call)؛ ويُحدَّد slug اسم ملف PDF بـ200 حرف قبل التعبير النمطي كي لا يتراجع دخل من الشرطات فقط (ReDoS كثير الحدود)؛ ويُجبِر استيراد المستند filename من نوع مصفوفة (ترويسة مكرّرة) على سلسلة (type-confusion). لا تغيير في السلوك للمدخلات الصحيحة.

  • server/lib/prompts.mjs، server/lib/routes/runners.mjs، server/lib/cv-import.mjs + tests/security-hardening-v1108.test.mjs (3). خلال v1.106–v1.108 انخفض تراكم التحليل الساكن من 167 إلى نحو 14، مع إصلاح كل نتيجة ذات صلة أمنية حقيقية ورفض الباقي (إيجابيات كاذبة محميّة/مُعقَّمة + lint بمستوى ملاحظة) مع التبرير.

جديد: لا شيء.

[1.107.0] — 2026-07-06

تعزيز أداة التعقيم (دفاع متعمّق ضد XSS في حالة السكون). stripDangerousMarkdown — التي تُبطل HTML الخطير في markdown السيرة/الوظيفة المخزَّن ليبقى أي مستهلك يتجاوز عميل الهروب-عند-العرض آمناً — تُشغّل الآن إزالة الوسوم حتى نقطة ثابتة (كرّر حتى الاستقرار) بحيث تُلتقط الإزالة التي تعيد تشكيل الحمولة (مثل <scr<script></script>ipt>)، وتطابق وسوم إغلاق script/style وغيرها مع فضلات لاحقة (</script foo>)، وتزيل فاتحاً تنفيذياً غير مغلق (<script …>). سلوك markdown الصحيح دون تغيير — تزيل المزيد فقط.

  • server/lib/security.mjs: حلقة نقطة ثابتة (محدودة بـ8 تمريرات) + أنماط إغلاق [^>]*> + إزالة الفاتح غير المغلق. +3 حالات انحدار في tests/cv-xss-bypasses.test.mjs. يبقى حدّ XSS المرجعي هو الهروب عند الإخراج (UI.md)؛ وهذا يعزز ضمان السكون ويغلق نتائج CodeQL المقابلة.

جديد: لا شيء.

[1.106.0] — 2026-07-06

تعزيز الأمان (فرز CodeQL). أُصلحت ثلاث نتائج حقيقية (وإن كانت منخفضة الخطورة) بعد مراجعة تراكم التحليل الساكن: مسار خطأ عرض المسار الآن يهرّب رسالة الخطأ قبل وصولها إلى DOM (قد يعكس خطأ الخادم مدخلات المستخدم، لذا يُعامَل كغير موثوق — حدّ XSS)، وكتابات خصائص الملف/الإعدادات ترفض مفاتيح __proto__ / constructor / prototype (حماية من تلوث النموذج الأولي احتياطاً — المفاتيح تأتي من مواصفات حقول ثابتة لا من مدخلات خام). معظم التنبيهات المتبقية إيجابيات كاذبة على قراءات/كتابات الماسح المشروعة في data/* وعلى مسارات تحمل بالفعل المحدِّد الخاص؛ رُفضت مع التبرير.

  • public/js/router.js يهرّب err.message عبر UI.escapeHtml قبل innerHTML؛ وserver/lib/routes/content.mjs وserver/lib/routes/config.mjs يحميان مفاتيح النموذج الأولي. لا تغيير في السلوك للمدخلات الصحيحة. اختبارات: tests/security-hardening-v1106.test.mjs (3). لا مفاتيح i18n جديدة.

جديد: لا شيء.

[1.105.0] — 2026-07-06

صفحة استخدام الذكاء الاصطناعي وتكلفته. صفحة جديدة استخدام الذكاء الاصطناعي (الشريط الجانبي، بجوار الصحة) تعرض عدد الرموز التي أنفقتها على توليدات الذكاء الاصطناعي الحيّة — التقييمات والتقارير والمحادثات — مفصّلة حسب المزوّد خلال آخر 24 ساعة و7 أيام و30 يوماً وكل الوقت، مع تكلفة تقديرية بالدولار. كل نداء حيّ يضيف سجلاً صغيراً {provider, in, out} إلى data/llm-usage.jsonl (لا يُرسَل شيء إلى أي مكان)؛ التشغيلات بلا مفتاح (الوضع اليدوي) لا تكلّف شيئاً ولا تُسجَّل.

  • وحدة مسار جديدة (الثلاثون) server/lib/routes/usage.mjsGET /api/usage (تجميعات للقراءة فقط) + server/lib/llm-usage.mjs (recordUsage يوحّد أشكال الاستخدام لدى Anthropic/OpenAI/Gemini ويضيف بأفضل جهد؛ وreadUsage/aggregate يجمّعان حسب نافذة 24س/7أ/30ي/الكل × المزوّد) + server/lib/llm-pricing.mjs (جدول أسعار قابل للتعديل لكل مزوّد $/1M رمز — الرموز دقيقة، والدولارات أسعار قائمة تقريبية يمكنك تصحيحها؛ ولا تُحتسب فاتورةً). التسجيل موصول بنقاط الإرسال (runActiveProvider + routes/llm.mjs).
  • عرض جديد public/js/views/usage.js (#/usage، تبويبات النوافذ). اختبارات: tests/usage-routes.test.mjs. 17 مفتاح i18n جديد ×16 (usage.* + nav.usage). المساعدة §6 موسّعة في مكانها.

جديد: server/lib/routes/usage.mjs؛ server/lib/llm-usage.mjs؛ server/lib/llm-pricing.mjs؛ public/js/views/usage.js.

[1.104.0] — 2026-07-06

شعارات الشركات في جدول الفحص (مع حفظ الخصوصية). مفتاح جديد في المظهر ضمن إعدادات التطبيقإظهار شعارات الشركات في جدول الفحص (معطّل افتراضياً) — يرسم شعار كل شركة بجوار اسمها في #/scan. الشعار هو أيقونة الشركة المجلوبة من نطاقها الخاص ويُمرَّر عبر وسيط على الخادم (GET /api/logo)، بحيث لا تعرف أي خدمة شعارات خارجية أيّ أصحاب عمل تطالعهم. الوظائف على بوابة توظيف مشتركة (Greenhouse وLever وAshby …) تُظهر شارة حرفية ملوّنة بدل أيقونة البوابة، وأي شعار يفشل تحميله يعود إلى الشارة نفسها.

  • وحدة مسار جديدة (التاسعة والعشرون) server/lib/routes/logos.mjsGET /api/logo?domain=. تتحقق من النطاق (دون مخطط/مسار/loopback)، وتجلب /favicon.ico عبر safeGet الآمن ضد SSRF (وضع binary جديد يعيد البايتات الخام + content-type؛ وتثبيت DNS والتحقق من إعادة التوجيه وحد الحجم دون تغيير)، وتُجري استشعار توقيع الصورة كي لا تقدّم أبداً صفحة خطأ HTML كصورة، وتخزّن الإصابات والإخفاقات في LRU بالذاكرة، ولا تكتب شيئاً على القرص.
  • مكتبة عميل جديدة public/js/lib/company-logo.js (window.CompanyLogo): معطّلة افتراضياً عبر علم في localStorage؛ وتتخطى مضيفات ATS المشتركة لصالح صورة رمزية حرفية حتمية؛ واحتياطي img.onerror آمن لـCSP. اختبارات: tests/logo-routes.test.mjs. 5 مفاتيح i18n جديدة ×16 (appear.*). المساعدة §2 موسّعة في مكانها.

جديد: server/lib/routes/logos.mjs؛ public/js/lib/company-logo.js.

[1.103.0] — 2026-07-06

الإعدادات: «أدوات CLI للذكاء الاصطناعي» — أيّها مثبَّت. يعتمد career-ops على Claude Code لكنه يعمل مع أي CLI وكيلي يتبع معيار skills المفتوح. يعرض تبويب جديد أدوات CLI للذكاء الاصطناعي في إعدادات التطبيق (#/config) أيّاً من — Claude Code وCodex وGemini CLI وOpenCode وGitHub Copilot CLI وQwen وAntigravity — مثبَّت على الجهاز الذي يشغّل الخادم، ومساراتها. إنه فحص للـPATH للقراءة فقط: يتحقق فقط من وجود كل ملف تنفيذي ولا يشغّله إطلاقاً (دون --version، دون تنفيذ)، ولا يكتب شيئاً ولا يمسّ بيانات المستخدم.

  • وحدة مسار جديدة (الثامنة والعشرون) server/lib/routes/cli-detect.mjsGET /api/cli-detect. يحلّ الكشف مسار الملف التنفيذي من قائمة سماح ثابتة من 7 عناصر عبر process.env.PATH (وسائط .cmd/.exe/.bat في ويندوز؛ بت التنفيذ في POSIX)؛ ولا يمكن أبداً تشغيل ملف خبيث على PATH عبر هذا المسار.
  • تبويب جديد «أدوات CLI للذكاء الاصطناعي» في public/js/views/config.js (تحميل مؤجَّل، رابط عميق عبر #/config?tab=cli). اختبارات: tests/cli-detect-routes.test.mjs. 8 مفاتيح i18n جديدة ×16 (cli.* + config.tabCli). المساعدة §2 موسّعة في مكانها.

جديد: server/lib/routes/cli-detect.mjs.

[1.102.0] — 2026-07-05

«اسأل الدليل» — محادثة مستندة إلى دليل المساعدة المدمج. صفحة جديدة اسأل الدليل 💬 (الشريط الجانبي، تحت المساعدة): اكتب سؤالاً مثل «كيف أفحص بوابات الوظائف؟» لتحصل على إجابة مستمدة فقط من دليل مساعدة التطبيق بلغتك — تعرض الأقسام التي استُخدمت ولا تقرأ أبداً سيرتك الذاتية أو ملفك أو بحثك عن عمل. الأمر يتعلق بكيفية استخدام التطبيق، لا بك. مع مفتاح LLM تجيب مباشرةً؛ ودون مفتاح تسلّمك موجّهاً جاهزاً معبّأً مسبقاً بأقسام المساعدة ذات الصلة.

  • وحدة مسار جديدة (السابعة والعشرون) server/lib/routes/docs-assistant.mjsPOST /api/docs-assistant/ask. استرجاع بلا تبعيات: يُقسَّم دليل لغتك إلى أقسام ## ويُقيَّم بتداخل الكلمات المفتاحية مع سؤالك؛ تُدمَج الأقسام الأعلى، وعلى النموذج الإجابة منها أو القول إن الدليل لا يغطيه (دون اختلاق ميزات/مسارات). سلسلة مزوّدين مشتركة، احتياطي يدوي، محدودة المعدل، دون كتابة، ولا تقرأ بيانات المستخدم.
  • عرض جديد public/js/views/docs-assistant.js. اختبارات: tests/docs-assistant-routes.test.mjs. 14 مفتاح i18n جديد ×16 (docs.* + nav.docsAssistant). المساعدة §1 موسّعة في مكانها.

جديد: server/lib/routes/docs-assistant.mjs؛ public/js/views/docs-assistant.js.

[1.101.0] — 2026-07-05

CV Studio: كيّف سيرتك الذاتية + اكتب خطاب تقديم لوظيفة محددة، عبر قائمة تحقق بمستوى مسؤول التوظيف. بطاقة جديدة التكييف مع وظيفة في #/cv-studio: الصق وصف وظيفة (واختيارياً دوراً/عنواناً مستهدفاً)، فينتج CV Studio سيرة ذاتية مكيّفة مع ذلك الإعلان بالإضافة إلى خطاب تقديم مطابق، ثم يمرّرهما عبر بوابة قائمة تحقق قبل تسليمهما — الأخطاء error تحجب (تُصحَّح قبل أن ترى النتيجة)، والتحذيرات warn تنصح. الآلية مستخلصة من ممارسة التوجيه المهني إلى قواعد عامة — مسؤول التوظيف يقرأ في ثوانٍ، لذا تذهب الخبرة ذات الصلة إلى الأعلى، ويطابق العنوان دور الوظيفة، وتحمل النتائج أرقاماً محددة، ويبقى الخطاب تشويقاً قصيراً بجسر واحد «المتطلب ↔ حقيقتك المطابقة». يستند فقط إلى سيرتك الذاتية وملفك ووثيقتك المكوّنة من صفحتين، ولا يختلق أبداً — دون شركات أو أدوار أو تاريخ مضمّن.

  • نقطة نهاية جديدة POST /api/cv-studio/tailor (توسّع وحدة cv-studio الحالية — دون وحدة سابعة وعشرين): buildTailorPrompt + بوابة عامة TAILOR_INSTRUCTIONS، مبنية على bundleProjectContext، وسلسلة مزوّدين مشتركة، وموجّه يدوي دون مفتاح، ومحدودة المعدل، دون كتابة. تُصدَّر النتيجة إلى Markdown / PDF / DOCX عبر شريط report-export.js المشترك.
  • الاختبارات: +3 في tests/cv-studio-routes.test.mjs. 10 مفاتيح i18n جديدة ×16 (cvs.tailor*). مرجع عام docs/prompts/resume-cover.md. المساعدة §24 موسّعة في مكانها.

جديد: docs/prompts/resume-cover.md.

[1.100.0] — 2026-07-05

الوثيقة المكوّنة من صفحتين: تعبئة تلقائية بالذكاء الاصطناعي من سيرتك الذاتية + معاينة + تصدير إلى PDF/DOCX/Markdown. تلتقط الوثيقة (#/two-pager) ما تريده فعلاً من دورك التالي، لكن سابقاً كان عليك كتابة كل حقل يدوياً أو نسخ موجّه إلى أداة أخرى. الآن يعمل ✨ مساعد التعبئة بالذكاء الاصطناعي مباشرةً مع مزوّدك المُهيّأ — يقرأ فقط سيرتك الذاتية + الملف الشخصي (عبر bundleProjectContext، دون اختلاق أي شيء)، ويصوغ جميع الحقول (من أنا / ما أحب / الأساسيات / ما أكره / العوائق الحاسمة / غير القابل للتفاوض / البيئة المستهدفة) ويملأ النموذج لتراجعه وتعدّله وتحفظه. بدون مفتاح API يعود إلى نافذة نسخ الموجّه كما كان. زر جديد 👁 معاينة وتصدير يعرض الوثيقة كمستند منسّق مع شريط تنزيل .md / حفظ بصيغة PDF / حفظ بصيغة DOCX / نسخ.

  • تصدير .docx بلا تبعيات. ملف جديد server/lib/docx.mjs يُنتج .docx بصيغة Office Open XML صغيراً لكن صالحاً (أرشيف ZIP بضغط DEFLATE للأجزاء الأربعة من OOXML، مع CRC-32 لكل إدخال) — دون تبعية تشغيل جديدة (تبقى التبعيات express + js-yaml). مسار جديد POST /api/export/docx (server/lib/routes/export.mjs، وحدة المسار السادسة والعشرون؛ عديم الحالة، محدود بـ200 كيلوبايت، دون كتابة / دون LLM / دون جلب URL). مدمج في public/js/lib/report-export.js المشترك، لذا يحصل تقرير السوق وخطة المسار المهني والتوجيه المهني أيضاً على تصدير DOCX.
  • تستخدم التعبئة التلقائية المباشرة سلسلة المزوّدين المشتركة (runActiveProvider / providerAvailable)؛ ويُحلَّل YAML العائد ويُعاد ضبطه إلى شكل الوثيقة المحدود (parseYamlFields + normalizeTwoPager) — تُسقَط المفاتيح غير المعروفة وتُحدَّد المصفوفات/السلاسل. الوضع اليدوي محفوظ.
  • الاختبارات: tests/export-routes.test.mjs. 4 مفاتيح i18n جديدة ×16 (export.saveDocx، twoPager.preview، twoPager.aiFilling، twoPager.aiFilled).

جديد: server/lib/docx.mjs؛ server/lib/routes/export.mjs.

[1.99.0] — 2026-07-05

صفحة صحة البوابات (#/portals). يراقب الماسح مجموعة من الشركات في portals.yml؛ وقد ينكسر رمز ATS بصمت فيختفي ذلك الموظِّف من كل عمليات المسح المستقبلية. تعرض صفحة Portals الجديدة كل شركة مُراقَبة، وعند Check portal health تفحص كل careers_url عبر safeGet المثبّت على DNS (آمن ضد SSRF) وتُعلّم الميتة (رمز 404 = مُستبعَدة بصمت) — للقراءة فقط. كما تُقوّي مُبلّغ الأخطاء في v1.98.0 بعد المراجعة: يلتقط مخزن الأخطاء الحلقي الآن إخفاقات الشبكة في fetch، ويُخفي المُنقّي مفاتيح المزوّدين غير المُعنونة.

جديد: server/lib/routes/portals.mjs; public/js/views/portals.js.

[1.98.0] — 2026-07-05

مُبلّغ الأخطاء المدمج (تكافؤ مع واجهة web-v0.2.0 للمشروع الأصلي). يجمع زر 🐞 Report a bug في درج الإشعارات لقطة تشخيصية بحدٍّ أدنى للخصوصية — الإصدارات، شاشتك، المتصفح، ملخّص فحوصات /api/health، وآخر 20 خطأً من مخزن حلقي جديد من جهة العميل — بالإضافة إلى بصمة حتمية لإزالة التكرار (co-web-<base36>)، ويتيح لك مراجعة نص Markdown الدقيق ثم يفتح مشكلة GitHub مُعبّأة مسبقًا. لا يُرسَل شيء تلقائيًا؛ ولا يحمل أبدًا سيرتك الذاتية أو ملفك أو إجاباتك أو روابط الوظائف أو المفاتيح. مكتبتان جديدتان logbuf.js + bug-report.js؛ 11 مفتاح i18n ×16؛ tests/bug-report.test.mjs.

جديد: public/js/lib/logbuf.js; public/js/lib/bug-report.js.

[1.97.1] — 2026-07-05

تصليب مدفوع بالمراجعة وتكافؤ في التوثيق (متابعة لـ v1.97.0). كشفت مراجعةٌ لسجلّات مراجعة الذكاء الاصطناعي عن إصلاحات فعلية:

  • fit-score.js (شارة الملاءمة في المسح). لم تعُد salaryFloor() ترفع معدّلاً دون سنوي إلى حدٍّ أدنى سنوي زائف — إذ تُرجِع «at least 500 EUR/day» و«$80/hr» و«6000 monthly» الآن null بدل عائق صفقة بقيمة 500k/80k. صار تطابق البلد بالكلمة الكاملة (\b…\b)، فلم تعُد «Germany» تطابق الصفة «German» (ولا «Nigeria» داخل «Nigerian») لتُطلق انتهاك «مطلوب في مكان آخر» زائفاً. ‏+3 اختبارات في tests/fit-score.test.mjs.
  • تكافؤ التوثيق. صار كل README مُترجَم يُعلن 16 locales باتساق — فقد ظلّ عدّ/قائمة صفّ Help (‏×13) ونصّ قسم الترجمة + ملاحظة «أضِف المفتاح إلى كل ملفات N» (‏×8) على أعداد ما قبل v1.85 (‏8/9). صُحِّح عدّ المحوّلات في المساعدة داخل التطبيق §17 إلى 46 محوّلاً — 41 إنجليزية + 5 روسية عبر الحُزم الـ16 كلّها.

لا تغيير سلوكي يتجاوز إرشاد شارة الملاءمة؛ لا إضافة مسارات أو مفاتيح أو i18n.

[1.97.0] — 2026-07-05

مصدر ماسح Dassault Systèmes + كنسة جودة على ثلاث جبهات.

  • مصدر مسح جديد — Dassault Systèmes (تكافؤ مع المشروع الأصلي career-ops، ‏#1498). يعكس server/lib/sources/dassault.mjs + server/lib/portals/adapters/dassault.mjs مزوّد Exalead عديم التوكنات لـ«بحث البطاقات» من المشروع الأصلي (التغذية العامة خلف 3ds.com/careers/jobs). إنه نقطة نهاية عالمية واحدة، لذا يُختار عبر المزوّد (provider: dassault) أو يُكتشف تلقائياً من مضيف 3ds.com، ومثبّت مضيف SSRF على www.3ds.com مع redirect:'error'. تُحلَّل XML دون DOM (خرائط <Meta> لكل <Hit>)، وتُستخرج المدينة/البلد من سلسلة الفئة المُترجمة، ولا تُحفَظ الإعلانات إلا حين يكون رابطها العام على *.3ds.com. يوفّر السجل الآن 46 محوّلاً (41 EN + 5 RU)؛ رُفع عدّ ALL_ADAPTERS، وتأكيدات المعرّف المُرتّب ومجموعة EN لـ /api/scan/sources من 40 → 41. المجموعة tests/sources-dassault.test.mjs (10 حالات).
  • نقل إصلاحات المتانة من المشروع الأصلي. يتحمّل مُحلّل Avature الآن نوعين من ترميز المستأجرين الحيّ (article--result بلاحقة فهرس الموضع + مرساة عنوان JobDetail دون فئة، ‏#1541)؛ ويحمي Get on Board من قيمة published_at تساوي 0/سالبة (لا مزيد من تواريخ 1970 الزائفة)؛ ويحدّ SuccessFactors الصفحة الأخيرة كي لا تتجاوز MAX_JOBS (‏#1528).
  • إصلاحات تدقيق الخادم. لم يعُد safe-fetch يتعلّق على استجابة تتجاوز الحدّ — إذ يحسم مسار حدّ الحجم الوعد مباشرةً بدل انتظار حدث 'end' الذي لا يُطلقه مجرى مُتلَف أبداً (إصلاح جلبات /api/pipeline/preview والأنبوب التلقائي للصفحات الكبيرة). صار تسجيل نشاط SSE stream.* قابلاً للوصول من جديد (نُقل فحص /api/stream/ فوق حارس «تخطّي GET» الشامل).
  • إصلاحات تدقيق SPA. يحمي مبدّل تبويبات #/stats من تسابق العرض غير المتزامن — إذ لم يعُد بإمكان نتيجة تبويب بطيء أن تطمس تبويباً أحدث انتقل إليه المستخدم بالفعل. صار تأكيدا حذف المقابلة التجريبية والتواصل المهني يمرّران عنواناً + متناً صحيحين (لا مزيد من حوار بمتن فارغ).
  • إصلاحات الترجمة. تصحيح قيم قاموس غير مترجمة — الأوكرانية config.modes* (Adaptive Framing / Exit Narrative / Location Policy)، والروسية eval.jdLbl («Job Description»)، والإيطالية dash.quick.contactoSub («referral» ← «segnalazione») — إضافةً إلى ترجمة العبارة النمطية الإنجليزية 16 locales في سجلات تغيّر ru/uk/ja/ko/zh-CN/zh-TW.

جديد: server/lib/sources/dassault.mjs؛ server/lib/portals/adapters/dassault.mjs.

[1.96.0] — 2026-07-04

التوجيه المهني (Epic 27). صفحة #/orientation جديدة تجيب عن سؤال «أي الاتجاهات تناسبني فعلاً؟» — وهي القراءة التي قد تحصل عليها من اختبار مهني، لكنها مُستنتَجة من سيرتك الذاتية وملفك الشخصي بدلاً من استبيان. انقر إنشاء الملف، فيُعيد النموذج أفضل المسارات المهنية المطابقة لك (أيّ من الأنماط الثمانية — الوظيفي، والإداري، والمُتواصِل، والأخصائي، والمُحلِّل، والمُبتكِر، والمدير، وريادي الأعمال — يناسبك، مع أدلّة)، وميلاً نحو نوع مهني، وأدواراً موصى بها، ونقاط قوة مهنية مرتبطة بسيرتك الذاتية، ونزعات أسلوب العمل، وتوصيات للتطوير. إنه تأمّل بالذكاء الاصطناعي لكيفية قراءة سيرتك الذاتية — وليس اختباراً نفسياً: لا يختلق الإنجازات ولا يبلّغ عن درجات رقمية كأنها مُقاسة. صدّره إلى Markdown أو PDF؛ لا يُكتب شيء على القرص.

  • مسار جديد server/lib/routes/orientation.mjs (وحدة المسار الرابعة والعشرون) — يبني POST /api/orientation/generate مُوجِّه الملف من السيرة الذاتية+الملف الشخصي+الورقة المكوّنة من صفحتين+الذاكرة عبر تعاقب المزوّدات المشترك، مع بديل يدوي للنسخ واللصق ودون كتابة أي ملفات.
  • يعيد استخدام report-export.js من أجل Markdown/PDF/النسخ، ضمن مجموعة التنقّل Growth.
  • الاختبارات: tests/orientation-routes.test.mjs (صياغة تأمّلية / لا درجات مُختلَقة، وضع يدوي مبذور بالسيرة الذاتية/الملف الشخصي). 7 مفاتيح i18n جديدة ×16 لغة، والمساعدة §28 ×16.

جديد: #/orientation؛ server/lib/routes/orientation.mjs.

[1.95.0] — 2026-07-04

خطة المسار المهني (Epic 26). صفحة #/career-plan جديدة تحوّل سيرتك الذاتية وملفك الشخصي إلى خطة تطوّر ملموسة ومخصّصة. اختر أفقاً (6/12/24 شهراً) وتركيزاً اختيارياً، ويقوم النموذج — بقراءة سيرتك الذاتية وملفك الشخصي وصفحتك المزدوجة (two-pager) ومذكّرتك — بكتابة لقطة لنقطة الانطلاق، وتحليل SWOT لنقاط القوة/النمو، وأهداف بصيغة SMART / OKR / WOOP، ومسارات بديلة، وخطة للمهارات الصلبة/الناعمة، وخريطة طريق شهراً بشهر، وطرق تتبّع التقدّم، والمزالق، وخطوات الدعم. يخطّط انطلاقاً مما تُظهره موادّك فعلاً، ولا يختلق أبداً وقائع عن تاريخك. حرّره داخلياً، واحفظه في طبقة المستخدم (config/career-plan.md)، وصدّره إلى Markdown أو PDF.

  • مسار جديد server/lib/routes/career-plan.mjs (وحدة المسارات الثالثة والعشرون) — GET/PUT /api/career-plan (يكتب config/career-plan.md) + POST /api/career-plan/generate (سلسلة المزودين المشتركة، تراجع يدوي، دون اختلاق). PATHS.careerPlan.
  • يعيد استخدام المساعد المشترك report-export.js (v1.94.0) لـ Markdown/PDF/النسخ، ومجموعة تنقّل النمو جديدة.
  • الاختبارات: tests/career-plan-routes.test.mjs (التحديد، رحلة ذهاب-وإياب GET/PUT، موجّه مُغذّى بالسيرة الذاتية/الملف الشخصي وواعٍ بالأفق). 20 مفتاح i18n جديد ×16 locales، المساعدة §27 ×16.

جديد: #/career-plan؛ server/lib/routes/career-plan.mjs؛ PATHS.careerPlan.

[1.94.0] — 2026-07-04

الإحصاءات، مُعاد تصميمها (Epic 25). صفحة #/stats أصبحت الآن قسم الإحصاءات بثلاث علامات تبويب، برسوم بيانية حقيقية وبيانات أكثر بكثير. علامة تبويب جديدة تقرير السوق تطلب من النموذج تحليلاً للرواتب وسوق العمل لأدوارك المستهدفة في منطقة وعملة تختارها — ملخّص تنفيذي، الرواتب حسب المستوى مع مئينات P10/P25/P75/P90، أبرز أصحاب العمل، جدول للمهارات المطلوبة، تواتر المزايا، توزيع المكتب/الهجين/العمل عن بُعد، اتجاهات على مدى 12–24 شهراً، وإرشادات للتفاوض. كل رقم موسوم بأنه تقدير توجيهي من معرفة النموذج، ولا يُقدَّم أبداً كبيانات مُستخرَجة. علامة تبويب جديدة خط الأنابيب الخاص بي ترسم بيانات متتبّعك: توزيع الدرجات، قمع الحالات، أبرز الشركات والأدوار، الطلبات عبر الزمن، ومعدلات التحويل. عرض الدور المستهدف الأصلي (الشواغر/الرواتب حسب البلد + اتجاه اللقطات المحفوظة) ينتقل إلى علامة تبويب ثالثة، الآن مع محدِّد عملة ونظرة عامة على الإعلانات حسب الدور.

  • صدّر أي تقرير إلى Markdown أو PDF، أو انسخه — عبر المساعد المشترك report-export.js (تنزيل Markdown كـ blob؛ PDF عبر مشغّل PDF المضمّن الحالي).
  • مسار جديد server/lib/routes/market.mjs (وحدة المسارات الثانية والعشرون) — يبني POST /api/stats/market موجّه تحليل سوق من سيرتك الذاتية/ملفك الشخصي (فيعرف أدوارك المستهدفة)، والمنطقة، والعملة، ويمرّره عبر سلسلة المزودين المشتركة، ويرجع إلى موجّه نسخ-ولصق دون مفتاح. لا كتابة أي ملفات.
  • الاختبارات: tests/market-routes.test.mjs (تحديد المنطقة/العملة، موجّه موسوم بالأمانة، وضع يدوي مُغذّى بالسيرة الذاتية/الملف الشخصي). 36 مفتاح i18n جديد ×16 locales، المساعدة §26 ×16.

جديد: #/stats مُعاد تصميمها إلى علامات تبويب؛ server/lib/routes/market.mjs؛ public/js/lib/report-export.js.

[1.93.0] — 2026-07-04

طبقة الذاكرة (Epic 24). صفحة #/memory جديدة تحتفظ بملاحظة قصيرة قابلة للتحرير «تذكّر هذا عنّي» يبقيها المساعد في ذهنه في كل مهمة:

  • ملاحظة واحدة، في كل مكان — لأنها مُضمَّنة داخل bundleProjectContext، تصل الملاحظة تلقائياً إلى كل طلب ذكاء اصطناعي (التقييم، المقابلة التجريبية، التواصل المهني، CV Studio) عبر كل المزودين. اكتبها مرة واحدة؛ فتوجّه كل شيء.
  • توجيه لا حقائق — تلتقط تفضيلاتك وطريقتك المفضّلة في العمل (النبرة، التنسيق، العوائق الحاسمة، الإيقاع)، ولا تلتقط أبداً ادعاءات واقعية جديدة عن خبرتك — فتلك تبقى فقط في سيرتك الذاتية وملفك الشخصي و two-pager. تُحفَظ في طبقة المستخدم في config/memory.md، ولا تُستبدَل أبداً بالتحديثات.
  • اقتراح من بياناتك — يستخرج POST /api/memory/suggest أنماطاً سلوكية من متتبّع طلباتك ويصيغ نقاطاً لتراجعها وتحرّرها. يقرأ متتبّعك؛ لا يختلق حقائق أبداً، ولا يجري أي نداء مباشر.

جديد: server/lib/routes/memory.mjs (وحدة المسارات الحادية والعشرون — GET/PUT /api/memory + POST /api/memory/suggestpublic/js/views/memory.js، PATHS.memory، وكتلة config/memory.md مُضافة إلى bundleProjectContext. 11 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/memory-routes.test.mjs.

[1.92.0] — 2026-07-04

CV Studio (Epic 21). صفحة #/cv-studio جديدة تمنح سيرتك الذاتية ثلاث أدوات أمينة، معظمها محلي:

  • تشخيص السيرة الذاتية — درجة حتمية من 0 إلى 100 مع شرح لكل فحص (الأثر المُقاس كمياً، الأفعال الضعيفة، الكلمات الطنّانة، الطول، الأقسام الأساسية، بيانات الاتصال). على جانب العميل بالكامل (window.CvDiagnostics) — بلا نموذج لغوي، لا شيء مُختلق، وكل ملاحظة مشروحة كي تقرّر أنت ما تغيّره.
  • قناع الخصوصية — إخفاء البيانات الشخصية (البريد الإلكتروني، الهاتف، الروابط/المعرّفات، عنوان الشارع، واختيارياً اسمك ← الأحرف الأولى) قبل مشاركة سيرتك كنموذج أو لقطة شاشة. يعمل بالكامل في المتصفّح (window.CvPrivacy)؛ ويُبلغ بدقّة عمّا أخفاه ولا يخزّن الأصل أبداً.
  • Make it human / مطابقة النبرة — الصق سطراً أو فقرة جامدة وأعد كتابتها بنبرتك أنت، مبنيةً على جانب الخادم على voice-dna.md و writing-samples/. حاجز صارم: يجوز له إعادة الترتيب والتشذيب وإعادة النبرة، لكنه لا يُدخل أبداً حقيقة أو مقياساً أو إنجازاً غير موجود أصلاً في النص. يعمل مباشرةً عبر سلسلة المزودين المشتركة، أو يعيد لك مطالبة جاهزة للنسخ واللصق دون مفتاح.

جديد: server/lib/routes/cv-studio.mjs (وحدة المسارات العشرون — POST /api/cv-studio/humanizepublic/js/views/cv-studio.js، public/js/lib/cv-diagnostics.js، public/js/lib/cv-privacy.js، PATHS.voiceDna + PATHS.writingSamplesDir. 29 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/cv-diagnostics.test.mjs، tests/cv-studio-routes.test.mjs. (معرض القوالب، والتصدير إلى Word، وأرشيف PDF للإعلانات تُتابَع كأعمال لاحقة في CV Studio.)

[1.91.0] — 2026-07-04

التواصل المهني والبحث المعمّق عن الشركات (Epic 16). صفحة #/networking جديدة تحوّل شركةً إلى خطة قابلة للتنفيذ للحصول على مقابلة، مبنية على سيرتك الذاتية وملفك الشخصي و two-pager:

  • ملف الشركة — موجز مركّز عمّا تفعله الشركة، والإشارات الحديثة الجديرة بالاقتباس، وخطاطيف «لماذا أنا مناسب» المستخلصة من خلفيتك الحقيقية.
  • بمن تتصل — من 3 إلى 5 شخصيات مستهدفة (مدير التوظيف، مسؤول توظيف داخلي، مساهم فردي أقدم في الفريق، معرفة دافئة/من الخريجين) مع سلسلة بحث LinkedIn محددة للعثور على كل منهم. لا يختلق أبدًا أسماء حقيقية.
  • أدفأ مسار للتعريف — أكثر طريق دافئ واقعي للدخول بالنسبة لخلفيتك أنت (صاحب عمل/مدرسة/مجتمع مشترك، مسار من الدرجة الثانية، أو رسالة مباشرة باردة عالية الإشارة) ولماذا.
  • مسودّات التواصل — رسائل قصيرة ومحددة لأهم الشخصيات، مبنية على نقاط إثباتك الحقيقية.
  • مباشر أو يدوي — يعمل مباشرةً عبر سلسلة المزودين المشتركة بأي مفتاح، أو يعيد لك مطالبة جاهزة للنسخ واللصق (بديل أمين، لا شيء مُختلق). حفظ الخطة يحفظ خطة مكتملة في طبقة المستخدم (networking/net-{company}-{role}-{date}.md)؛ وتعرض الصفحة الخطط المحفوظة وتفتحها وتحذفها.

جديد: server/lib/routes/networking.mjs (وحدة المسارات التاسعة عشرة)، public/js/views/networking.js، PATHS.networkingDir. يعيد استخدام سلسلة server/lib/llm-dispatch.mjs من v1.90.0. 24 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/networking-routes.test.mjs.

[1.90.0] — 2026-07-04

Mock Interview 2.0 (Epic 15). تحوّل صفحة #/mock-interview الجديدة سيرتك الذاتية وملفك الشخصي والـ two-pager وبنك القصص إلى تدريب مقابلة دوراً بدور:

  • تدريب حواري — حدّد الدور المستهدف (+ الشركة / الوصف الوظيفي اختيارياً) ويفتتح المُحاوِر بسؤال مُركَّز. تحصل كل إجابة تُرسلها على ردّ منظَّم: Feedback (نقاط القوة + الفجوة بمنهج STAR+R)، وScore (N/5)، وNext question يسبر أضعف جزء في إجابتك الأخيرة. كل ذلك مبني على مستندك الحقيقي في الخادم — ولا يختلق أبداً خبرة لا تملكها.
  • واعٍ ببنك القصص — يُضمَّن interview-prep/story-bank.md في المطالبة (بنفس مستوى الثقة الممنوح لـ cv.md) كي تشير الملاحظات إلى أفضل قصصك.
  • مباشر أو يدوي — مع وجود مفتاح مزوّد، يُنفَّذ الدور مباشرةً عبر السلسلة المشتركة (Anthropic → Gemini → OpenAI → Qwen → OpenRouter → GitHub Models)؛ ومن دون مفتاح تحصل على مطالبة جاهزة للنسخ واللصق (احتياطي أمين، بلا إجابات مختلقة).
  • جلسات محفوظة — انقر حفظ النص للاحتفاظ بمقابلة منتهية في طبقة المستخدم (interview-prep/mock-{company}-{role}-{date}.md)؛ وتعرض الصفحة الجلسات المحفوظة وتفتحها وتحذفها.

جديد: server/lib/routes/interview.mjs (وحدة المسار الثامنة عشرة)، public/js/views/mock-interview.js، server/lib/llm-dispatch.mjs (سلسلة المزوّدين المشتركة)، PATHS.storyBank، bundleProjectContext({ extraFiles }). 30 مفتاح i18n جديد في كل 16 لغة. الاختبارات: tests/interview-routes.test.mjs.

[1.89.0] — 2026-07-04

ملاءمة المرشّح للسوق — الـ two-pager (Epic 14). تتيح لك صفحة #/two-pager الجديدة تدوين ما تريده أنت فعلاً من دورك المهني القادم، على غرار «Mnookin two-pager» من كتاب Never Search Alone:

  • مُنشئ موجَّه — سردية بصيغة المتكلّم «من أنا»، وملاحظة «البيئة المستهدفة»، وخمسة محرّرات لقوائم الرقائق: loves وmust-haves وhates وdeal-breakers وnon-negotiables. تُحفظ في طبقة المستخدم للمشروع الأب (config/two-pager.yml) عبر PUT /api/two-pager — ولا تُستبدل أبداً بتحديثات النظام.
  • مساعد التعبئة بالذكاء الاصطناعي (POST /api/two-pager/draft) — يبني موجّه Mnookin جاهزاً للتشغيل مع تضمين سيرتك الذاتية + ملفك الشخصي، لتشغّله في أي نموذج لغوي وتلصق النتيجة مرة أخرى. يستخدم موادك الخاصة فقط؛ ولا يُختلق شيء.
  • شارة الملاءمة-لما-تريد — يُظهر كل إعلان على #/scan الآن درجة ملاءمة ◎ N (من جانب العميل، عبر window.FitScore) تقارن نوع العمل والبلد والحد الأدنى للراتب والانتقال في الإعلان مع الـ two-pager الخاص بك. صادقة بحكم التصميم: عندما لا يقدّم الإعلان إشارة قابلة للمطابقة، لا تُعرض أي شارة (ولا رقم مُختلق أبداً). تُوزَن انتهاكات deal-breakers أكثر من الكراهيات الخفيفة.
  • تُغذّي كل تقييم — يُضمَّن الـ two-pager المحفوظ في bundleProjectContext، بحيث تمزج جميع تقييمات النماذج اللغوية اللاحقة تفضيلاتك المعلَنة مع مطابقة السيرة الذاتية مقابل الوصف الوظيفي.

جديد: server/lib/routes/two-pager.mjs، public/js/views/two-pager.js، public/js/lib/fit-score.js، PATHS.twoPager. 27 مفتاح i18n جديد عبر جميع الـ 16 لغة. الاختبارات: tests/two-pager-routes.test.mjs، tests/fit-score.test.mjs.

[1.88.0] — 2026-07-04

تحسينات المشكلة #29 — فجوات i18n في المسح + نظافة الـ API.

  • تعريب آخر سلاسل المسح المضمّنة بشكل ثابت (خارطة الطريق v1.69.4): تمرّ الآن حبوب ملخّص المصدر (N جديدة / M مطابقة)، وتنبيهات N وظائف جديدة، وشارة reloc عبر t() — 4 مفاتيح جديدة (scan.pillNew، scan.pillMatching، scan.newOffers، scan.relocBadge) عبر جميع الـ 16 لغة. لم يعد المستخدمون غير الناطقين بالإنجليزية يرون نصاً إنجليزياً متناثراً في مسار المسح الأساسي.
  • تعطيل ترويسة X-Powered-By (خارطة الطريق v1.69.5): app.disable('x-powered-by') في createApp() — لم يعد الخادم يُعلن عن Express. (بقيّة تلك الملحمة سبق تسليمها: يزيل parentVersion تعليق release-please الخاص به، ومبدّل السمة في الوضع الفاتح، وإغلاق النوافذ المنبثقة عند تغيير المسار، وتعريب «Score» (rep.score) في التقارير.)

الاختبارات: tests/scan-i18n-gaps.test.mjs + تأكيد غياب X-Powered-By في tests/security-headers.test.mjs.

[1.87.0] — 2026-07-04

4 مزوّدي مسح جدد بلا مصادقة (تكافؤ مع career-ops الأصل v1.16.0). يكبر سجل الماسح من 41 → 45 محوّلاً (40 EN + 5 RU) — جميعها عامة، بلا مصادقة، مثبّتة على المضيف، redirect:'error' (آمنة من SSRF)، ولكل منها اختبار معزول لـ CI:

  • Get on Board (getonbrd) — JSON:API عام على مستوى البوابة (تقنية LATAM/عن بُعد)، يُختار بحسب المزوّد، مع ترقيم صفحات. server/lib/sources/getonbrd.mjs.
  • Amazon (amazon) — JSON بحث عام من amazon.jobs، يُكتشف بحسب المضيف أو provider: amazon، مع ترقيم بالإزاحة. server/lib/sources/amazon.mjs.
  • Avature (avature) — نظام ATS من *.avature.net لكل مستأجر، يُحلَّل من HTML، يُكتشف بحسب المضيف أو provider: avature. server/lib/sources/avature.mjs.
  • SAP SuccessFactors (successfactors) — قائمة بلاطات RMK لكل مستأجر (*.successfactors.eu/.com، jobs2web.com)، تُحلَّل من HTML. server/lib/sources/successfactors.mjs.

يوفّر كلٌّ منها sources/<slug>.mjs (مع meta مُكتشف تلقائياً → قائمة #/scan المنسدلة) و portals/adapters/<slug>.mjs ضمن ALL_ADAPTERS (قاعدة السجلّين) + tests/sources-<slug>.test.mjs. ارتفع عدّ ALL_ADAPTERS وكذلك تأكيدات المعرّفات المرتّبة ومجموعة EN في /api/scan/sources من 36→40؛ ويسرد GET /api/scan/sources الآن 45.

[1.86.0] — 2026-07-03

إحصاءات حسب الأدوار المستهدفة (#/stats) — إحصاءات سوق الوظائف والرواتب لأدوارك المستهدفة. تقرأ صفحة تحليلات جديدة أدوارك المستهدفة من الملف الشخصي (config/profile.yml → غير مضمّنة بشكل ثابت) والوظائف من آخر عملية مسح، ثم تعرض لكل دور وبلد:

  • الوظائف حسب البلد ومتوسط الراتب حسب البلد (USD) — مجمَّعة على جانب العميل (public/js/lib/role-stats.js، مع إعادة استخدام window.Countries) من البيانات المتفرّقة التي تجمعها الماسحات بالفعل. تُطبَّع الرواتب بأي عملة إلى USD عبر جدول FX تقريبي بشكل صريح، مع تنبيه بشأن حجم العينة — ولا تُلفَّق أبداً.
  • مرشِّحات الدور والبلد ومخططات أعمدة واتجاه مضمّنة بصيغة SVG مكتوبة يدوياً (بلا اعتماديات جديدة، آمنة لـ CSP — تستخدم addEventListener فقط).
  • حفظ لقطة (POST /api/stats/snapshot) يحفظ التجميع الحالي في data/role-stats.jsonl؛ ويتتبّع مخطط الاتجاه (GET /api/stats/trend) أعداد الوظائف عبر الزمن — عرض «الديناميكية». هجين صادق: تأتي اللقطات من بيانات مسح محلية، وتُحدَّث عند الطلب.
  • مترجَمة بالكامل في جميع الـ 16 لغة (26 مفتاح i18n جديد).

جديد: server/lib/routes/stats.mjs (وحدة المسارات الـ 16)، وpublic/js/lib/role-stats.js، وpublic/js/views/stats.js، وPATHS.roleStats؛ اختبارات role-stats.test.mjs (7) + stats-routes.test.mjs (5).

[1.85.0] — 2026-07-03

اللغات الألمانية والإيطالية والتركية (تكافؤ اللغات مع المشروع الأصلي career-ops v1.16.0). أصبحت الواجهة الآن متوفّرة بـ 16 لغة — تنضمّ de 🇩🇪 وit 🇮🇹 وtr 🇹🇷 إلى الـ 13 لغة القائمة.

  • ترجمة كاملة للواجهة — تُرجمت جميع مفاتيح i18n الـ 730 في public/js/lib/locales/i18n-dict.{de,it,tr}.js؛ ويسرد مبدّل اللغة Deutsch / Italiano / Türkçe، ويتعرّف الاكتشاف التلقائي للغة المتصفّح على de/it/tr (public/js/lib/i18n.js).
  • دليل المساعدة داخل التطبيق — تُرجمت docs/help/{de,it,tr}.md (البنية الكاملة 19 H2 / 75 H3)، ويقدّمها GET /api/help/:lang.
  • التوثيق — أُضيفت README.{de,it,tr}.md وCHANGELOG.{de,it,tr}.md؛ وتغطّي الآن بوابة تكافؤ لغات CHANGELOG 15 لغة غير EN.
  • سقالة المطالبات — عُرّبت server/lib/prompts.mjs (LOCALE_NAMES + SCAFFOLD_STRINGS) للّغات الثلاث الجديدة، بحيث يتبع مخرج الـ LLM لغة الواجهة.

وُسِّعت جميع بوابات التكافؤ (i18n-locale-files وi18n-coverage وcheck-changelog-parity وlang-switcher-rtl) لتشمل مجموعة الـ 16 لغة.

[1.84.0] — 2026-06-30

cooldown إعادة التقديم + التعويض في pipeline.md (تكافؤ مع المشروع الأصلي career-ops v1.15.0). ترقيتان للماسح:

  • cooldown إعادة التقديم (#1201): يتخطّى مسح EN الآن الأدوار لدى الشركات التي تقدّمت إليها مؤخراً، لتبقى النتائج مُركّزة على الفرص الجديدة. هيّئ نوافذ لكل شركة في config/profile.yml تحت مفتاح re_apply_windows: (last_apply_date وsame_role_days وapplied_to: [roles] ومفتاح cross_role_bucket الاختياري)؛ مطابقة الشركات غير حساسة للترقيم + مبنية على حدود الكلمات (server/lib/cooldown.mjs). معطّلة عند غياب المفتاح؛ ويعرض سجل الفحص Cooldown skipped: N.
  • التعويض في pipeline.md (#1017): تحفظ العروض الممسوحة الآن راتبها في عمود trailing اختياري (url | <salary>) في data/pipeline.md. يبقى الرابط مفتاح إزالة التكرار (يُحذف عمود | comp عند القراءة)، وتُطهَّر قيمة الخلية (دون حقن صفوف/أعمدة وتُبطَّل الصيغ البادئة)، وتبقى ملفات pipeline المحتوية على روابط فقط متوافقة مع الإصدارات السابقة. يشحن مع tests/cooldown.test.mjs + اختبارات تعويض pipeline. عدد المصادر ثابت عند 41 (كلاهما ترقيات لمنطق الفحص، ليستا لوحتَين جديدتَين).

[1.83.0] — 2026-06-30

كاشف إعادة النشر / الوظائف الوهمية (تكافؤ مع المشروع الأصلي career-ops v1.15.0). لوحة جديدة 🔁 الوظائف المُعاد نشرها / الوهمية في #/scan تُحدّد مجموعات الشركة+الوظيفة التي أُعيد إدراجها تحت روابط URL مختلفة خلال نافذة متحرّكة مدتها 90 يوماً — إشارة إلى خطوط توظيف قديمة ووظائف وهمية. يستند إلى مطابق ضبابي لعناوين الوظائف (server/lib/role-matcher.mjs) وكاشف للقراءة فقط (server/lib/detect-reposts.mjs) يعمل على data/scan-history.tsv، ويُعرض عبر GET /api/scan/reposts. كذلك: يُبلّغ parentVersion في /api/health الآن عن رقم semver فقط (يُحذف تعليق release-please # x-release-please-version). يشحن مع tests/detect-reposts.test.mjs. عدد المصادر ثابت عند 41 — الكشف عن إعادة النشر ميزة تحليلية وليس لوحة جديدة.

[1.82.0] — 2026-06-30

مصدر فحص NoDesk (تكافؤ مع المشروع الأصلي career-ops v1.15.0). أصبحت تغذية RSS للوظائف عن بُعد على مستوى اللوحة بأكملها من NoDesk مصدر فحص من الدرجة الأولى — أضف إدخال provider: nodesk ليظهر في قائمة Source المنسدلة في #/scan (41 محوّلًا إجمالًا: 36 إنجليزي + 5 روسي). المضيف مثبّت على nodesk.co مع redirect:'error' (حماية من SSRF)؛ وتُقسَّم العناوين على Role at Company (لا تحتوي NoDesk على وسم للموقع، لذا يبقى الموقع فارغاً)؛ وجميع الصفوف عن بُعد. يشحن مع مجموعة اختبار tests/sources-nodesk.test.mjs معزولة CI؛ مجموعة الاختبارات الوحدوية الكاملة على الأخضر عند 1523.

[1.81.0] — 2026-06-29

تكافؤ مع المشروع الأصلي career-ops — 13 مصدر فحص وظائف جديد. ينقل أحدث دُفعة مزوّدين من main في Fighter90/career-ops إلى الماسح الداخلي للعملية. واجهات API عامة على مستوى اللوحة بأكملها (مُختارة بالمزوّد): Arbeitnow وHimalayas وJobicy وLanding.jobs و4 Day Week وThe Muse وThe Hub وJobspresso (RSS) وHacker News “Who is hiring?” (خطوتان عبر Algolia). لوحات بولندية (تُكتشف عبر المضيف أو provider:): JustJoin.it وNoFluffJobs (بحث POST). ATS لكل مستأجر (يُكتشف تلقائياً من careers_url): Pinpoint (<slug>.pinpointhq.com/postings.json) وRippling (ats.rippling.com/<slug> → لوحة api.rippling.com). كل مصدر مثبّت بالمضيف مع redirect:'error' (حماية من SSRF) وقابل للاختيار في قائمة Source المنسدلة في #/scan — يضم السجل الآن 40 محوّل ماسح (35 إنجليزي + 5 روسي). يضيف 13 مجموعة اختبار معزولة CI لكل مصدر؛ مجموعة الاختبارات الوحدوية الكاملة على الأخضر عند 1513.

[1.80.0] — 2026-06-28

خمسة تحسينات للمسح (أفكار من job-crawler، أُعيدت كتابتها). (1) مصدر Teamtailor — مواقع <slug>.teamtailor.com لكل مستأجر عبر تغذية /jobs.rss العامة، يُكتشف تلقائياً من careers_url (المضيف مثبّت + redirect:'error')؛ يضم السجل الآن 27 محوّلاً. (2) حجر المصادر — المصدر الذي يعيد 404/410 دائمًا يُسجَّل في data/scan-quarantine.json ويُتخطّى في عمليات المسح اللاحقة (إصلاح ذاتي: يُعاد بعد 14 يومًا). (3) الحد لكل مصدر — حقل اختياري في #/scan يحدّ من عدد الوظائف لكل board (∞ افتراضيًا). (4) نُشر خلال — مرشّح عُمر من جهة العميل (24 ساعة / 7 أيام / 30 يومًا). (5) عمليات البحث المحفوظة + ★ المفضلة — سمِّ مجموعات المرشّحات وأعد استخدامها وميّز الوظائف؛ تُحفظ في localStorage مع تحقّق دفاعي (تُعاد تهيئة الذاكرة المؤقتة التالفة بنظافة)؛ وتُعاد تهيئة ذاكرة النتائج قبل كل مسح وتُملأ مباشرةً.

[1.79.0] — 2026-06-28

مصدر فحص WeWorkRemotely (تطابق مع career-ops v1.14.0). أصبحت تغذية RSS للوظائف عن بُعد على مستوى اللوحة من We Work Remotely مصدر فحص من الدرجة الأولى — أضف إدخال provider: weworkremotely ليظهر في قائمة Source في #/scan (26 محوّلًا إجمالًا). المضيف مثبّت على weworkremotely.com مع redirect:'error' (حماية من SSRF)؛ وتُقسَّم العناوين على Company: Role. كذلك تُقتطع كلمات title_filter المفتاحية قبل فحص الطول (parent #1261).

[1.78.2] — 2026-06-27

تحسين i18n وتجربة الاستخدام (متابعات لـ v1.78.1). أصبح الاسم الوصفي للشعار مترجماً في جميع اللغات الـ 13 (nav.logoHome). الضغط على Enter في البحث العام أثناء وجودك في #/scan يفرض إعادة تصيير كي لا يُفقد المصطلح المُعبّأ مسبقاً (حارس المسار نفسه). تُرجم health.title إلى البولندية (Kondycja) والدنماركية (Systemtilstand) — كان سابقاً بالإنجليزية. الاختبارات 1235 → 1238.

[1.78.1] — 2026-06-27

إصلاحات تجربة Scan. يتحدّث جدول نتائج #/scan الآن تلقائياً أثناء الفحص ومرة أخرى عند انتهائه — دون إعادة تحميل يدوية. يعرض البحث العام في الشريط العلوي تلميح Enter، وعند إدخال استعلام ليس رابطاً ينتقل إلى #/scan مع تعبئة حقل البحث مسبقاً (كان #/tracker). أصبح الشعار الآن رابطاً إلى لوحة التحكم (الصفحة الرئيسية).

[1.78.0] — 2026-06-27

مرشّح جغرافي في صفحة Scan — فلترة النتائج حسب الدولة، مع الأعلام. قائمة الدولة الجديدة في #/scan تعرض كل دولة مكتشفة في نتائجك (رمز العلم + العدد)، لتُبقي فقط الوظائف المرتبطة بدولة معينة — إلى جانب مرشّح Remote/Hybrid/Onsite، حتى تبحث عن العمل المرتبط بدولة والعمل عن بُعد معاً. مدعوم بمساعد جديد countries.js يربط موقع الإعلان النصي الحر (أسماء الدول والمرادفات و~100 مدينة رئيسية) بدولة ISO + علم؛ والاكتشاف متحفظ ولا يخمّن أبداً.

[1.77.0] — 2026-06-27

إضافة الدنماركية (Dansk) كلغة الواجهة الثالثة عشرة. ترجمة كاملة لواجهة المستخدم ودليل المساعدة المدمج (19 H2 / 75 H3) وREADME وCHANGELOG. تنضم الدنماركية إلى منتقي اللغات بالأعلام؛ وتغطي الآن منظومة i18n (المُجمِّع، التدقيق، بوابات التكافؤ، اللقطة) 13 لغة.

[1.76.0] — 2026-06-26

تطابق مع career-ops v1.13.0 الأصلي — ست مصادر وظائف جديدة، وتقوية الماسح، وجدول نتائج بلا حد أقصى.

أُضيف

  • ست مصادر ATS لكل مستأجر — BambooHR وBreezy HR وComeet وPersonio وRecruitee وSolidJobs. تُكتشف تلقائيًا من مضيف careers_url (يتطلب Comeet عنوان api: كاملًا)؛ ويُثبَّت كل مضيف بنمط regex مُرسَّخ + redirect:'error' (حماية من SSRF). قابلة للاختيار في قائمة Source في #/scan — يضم السجل الآن 25 محوّلًا (20 إنجليزي + 5 روسي). يضيف مساعد fetchText لتغذية Personio بصيغة XML.
  • trust_filter — تقييم ثقة اختياري (0–100، مستوى high/medium/low، أعلام)، للتعليق فقط. الصفوف دون high تحصل على شارة ⚠ محايدة لغويًا في #/scan؛ ولا تُستبعد أي وظيفة أبدًا.
  • Arbeitsagentur remoteMatch + remoteMaxPages — اكتشاف العمل عن بُعد عبر الإعداد: title أو filter (homeoffice=nv_true من جهة الخادم + ترقيم الصفحات) أو off.

تغيّر

  • لا حد لنتائج المسح. أُزيل حد العرض MAX_STORED_RESULTS (2000) — تُخزَّن كل النتائج المطابقة ويُصفِّحها جدول #/scan (200/صفحة).
  • متانة مرشّح العنوان — الاختصارات القصيرة (COO، SDR…) تُطابَق على حدود الكلمات؛ ولم يعد إعداد title_filter المعطوب يُعطّل المسح. كلا الماسحَين.

اختبارات

  • +32 حالة (1190 → 1222): sources-ats-providers وtitle-filter وarbeitsagentur-remote وtrust-validator وحارس scan-result-cap المُعاد كتابته («بلا حد»).

[1.75.2] — 2026-06-19

docs: تكافؤ توثيقي كامل لمُجمِّعات الماسح في الإصدار v1.75.0 عبر جميع اللغات الـ 12. دون تغيير في الكود — يوائم التوثيق المُوجَّه للمستخدم مع المصادر السبعة التي وصلت في الإصدار v1.75.0:

  • دليل المساعدة (12 لغة). يكتسب §5 كتلة content_filter (تبويب عبر كلمات مفتاحية للوصف/المقتطف، نظير location_filter) وملاحظة عن المُجمِّعات؛ ويُدرج §7 المصادر السبعة الجديدة في جولة الفحص بنقرة واحدة وفي التعداد الكامل للقائمة المنسدلة Source؛ ويُصحَّح عدد المحوّلات في §17 من القيمة القديمة “11 adapters” إلى “19 adapters — 14 English + 5 Russian”. لم يُضَف أي عنوان ##/###، لذا تبقى بنية 19 H2 / 75 H3 المُقفلة دون تغيير.
  • README (9 لغات كاملة). نقطة جديدة “Aggregator boards (v1.75.0)” أسفل مصادر الفحص، إضافةً إلى شارة الإصدار المرفوعة إلى v1.75.2. (ملفات README المختصرة لـ pl/uk/ar ليس لها قائمة لكل مصدر، وهي متروكة عمدًا دون تغيير هناك.)
  • وثائق مرجعية. يكتسب docs/portals-examples.md قسمًا جاهزًا للنسخ واللصق بعنوان “Aggregator boards” يضم كتل تهيئة provider: / <provider>: دقيقة للمصادر السبعة جميعًا؛ ويُحدَّث docs/PROJECT.md إلى 19 adapters؛ ويوثّق docs/sdd/CONVENTIONS.md التمييز بين السجلّين (sources/registry.mjs للقائمة المنسدلة مقابل portals/registry.mjs للجلب)، واختيار المُجمِّع المبني على provider: المُمرَّر بوصفه opts.company، ومُطهِّر كتابة الفحص (scan-sanitize.mjs)، وعدد اختبارات الإصدار v1.75.1 (1190).
  • QA. أُضيف qa/QA-REGRESSION-PROMPT-v1.75.2-FULL.md — مُشغِّل بوابة الإصدار للسطح الكامل، مُحدَّث لدورة مُجمِّعات الفحص في الإصدار v1.75.x.

[1.75.1] — 2026-06-19

fix(scan): صقل المتانة على المصادر المُدارة بالإعدادات في الإصدار v1.75.0. ثلاثة إصلاحات تعزيز صغيرة من المراجعة بعد الإصدار (دون تغيير في السلوك لأي فحص سليم):

  • تأخيرات ترقيم الصفحات المراعية للإلغاء. أصبحت فترات التهذيب بين الصفحات لكل من Glints (300 ms) وJobstreet/SEEK (200 ms) تُحَلّ فورًا عند إطلاق AbortSignal الخاص بالفحص، عبر مساعد جديد delay(ms, signal) في server/lib/http-json.mjs، بحيث لا يستطيع عميل منقطع إبقاء فحص قيد الترقيم مفتوحًا لفترة توقف إضافية.
  • خطأ وصفي عند الاستجابة غير المنسّقة بـ JSON. أصبح fetchJson يغلّف جسم استجابة 2xx غير المنسّق بـ JSON (مثل صفحة صيانة HTML تُقدَّم بالحالة 200) على هيئة non-JSON 2xx response from <url> بدلًا من إظهار SyntaxError مجرّد، بحيث يُسمّي سجل أخطاء الماسح لكل مصدر نقطة النهاية المُختلّة السلوك.
  • تطبيع أقوى لكتابة الفحص. أصبح normalizeScanScalar يطوي علامة الجدولة الرأسية وتغذية الصفحة وفاصلَي السطر/الفقرة في Unicode (\v \f U+2028 U+2029) إضافةً إلى \r \n \t — وهي مجموعة فائقة صارمة، بحيث لا يبقى أي فاصل سجل/سطر قد تعتمده جدول بيانات أو عارض حتى يصل إلى scan-history.tsv.

[1.75.0] — 2026-06-19

feat(scan): نقل التكافؤ مع المشروع الأصلي career-ops v1.12.0 — سبعة مصادر وظائف جديدة، وتصفية المحتوى، وإصلاحات أمنية/جودة. تشغّل web-ui ماسحاتها الخاصة داخل العملية (فهي لا تستدعي scan.mjs الخاص بالمشروع الأصلي عبر shell out)، لذا لا تتدفق تغييرات المزوّد والمسح في الإصدار الأصلي v1.12.0 تلقائيًا — يعيد هذا الإصدار تنفيذ المنطبق منها وفق عقد المحوّلات في web-ui.

  • سبعة مصادر ماسح جديدة. ثلاثة مُجمِّعات للعمل عن بُعد على مستوى اللوحة بأكملها — RemoteOK وRemotive وWorking Nomads — تندرج ضمن النمط المُكتشَف تلقائيًا server/lib/sources/*.mjs (تُختار عبر provider: remoteok / remotive / workingnomads). وأربعة مُجمِّعات إقليمية مُوجَّهة بالتهيئة — careers الخاص بـ IBM وArbeitsagentur (وكالة العمل الاتحادية الألمانية) وGlints (جنوب شرق آسيا) وJobstreet / SEEK — تقرأ كتلة تهيئة <provider>: لكل مُدخَل؛ ويمرّر en-scanner الآن مُدخَل الشركة المُحلَّل إلى كل جالب (fetcher) كي تتمكن من قراءته. تظهر السبعة جميعها تلقائيًا في القائمة المنسدلة للمصادر في #/scan.
  • content_filter (المشروع الأصلي #974). كتلة اختيارية في portals.yml (قائمتا كلمات مفتاحية positive / negative) تُبوِّب الإعلان بناءً على نص وصفه/مقتطفه — تحاكي دلالات location_filter؛ والإعلانات بلا وصف تمرّ دائمًا. مُوصَّلة بكلا الماسحين EN وRU.
  • تقوية كتابة المسح (المشروع الأصلي #1098). تُطهَّر الآن بيانات تعريف الموجزات الخارجية قبل أن تستقر في data/scan-history.tsv وdata/pipeline.md: تُطوى أحرف التحكم (لم يعد بإمكان سطر جديد في اسم الشركة/المسمّى حقن صف TSV)، ويُحيَّد أي = + - @ في البداية ضد حقن صيغ جداول البيانات.
  • secondaryLocations في Ashby (المشروع الأصلي #1073). يطوي مصدر Ashby الآن تسمية منطقة كل موقع ثانوي إضافةً إلى addressLocality / addressCountry البريديَّين داخل سلسلة الموقع (مع إزالة التكرار)، بحيث يظهر دور مؤهَّل للعمل في الاتحاد الأوروبي تقرأ تسميته الأساسية مثلًا “Canada” أمام location_filter.
  • التحقق من شكل تقرير التقييم (المشروع الأصلي #819). تُعلِّم المزوّدات داخل العملية في /api/evaluate (Anthropic / OpenAI / Qwen / OpenRouter / GitHub Models) الآن أي تقرير A–G / SCORE_SUMMARY مُشوَّه على هيئة مصفوفة warnings غير قاتلة؛ ومسار تقييم Gemini يرث هذه الحماية مسبقًا من gemini-eval.mjs الخاص بالمشروع الأصلي.
  • docs: أُضيف Antigravity CLI إلى قوائم المساعدين المدعومين في جميع ملفات README الاثني عشر (يُقابل مزوّد Gemini).

موروث مجانًا من git pull الخاص بالمشروع الأصلي (تستدعي web-ui هذه عبر shell out): الخط الاحتياطي CJK لملفات PDF اليابانية (#1053)، وخطوط PDF الآمنة لأنظمة ATS (#1074)، وحماية CJK لـ LaTeX (#1054)، وإصلاحات tracker/merge/followup/dashboard، وأوضاع modes/zh الصينية (تَسرُد web-ui الأوضاع ديناميكيًا).


[1.74.3] — 2026-06-18

docs(parent-source): توجيه مستودع career-ops الأصلي إلى تفرع Fighter90/career-ops. تشير واجهة web-ui الآن إلى تفرع المشرف بوصفه المشروع الأصلي في كل موضع يُستخدم فيه كمصدر فعلي: القيمة الافتراضية CAREER_OPS_REPO في مُثبِّت bin/setup.sh، وكل رابط git clone / «مبني فوقه» / الإعداد في جميع ملفات README الاثني عشر، ووثائق الوكلاء (CLAUDE.md وAGENTS.md وGEMINI.md و.github/copilot-instructions.md وdocs/). يبقى إسناد التأليف إلى santifer (وإخلاء المسؤولية عن الواجهة غير الرسمية) دون تغيير — انتقلت فقط روابط المصدر/الاستنساخ. يتحقق tests/sh-files.test.mjs الآن من أن المُثبِّت يستنسخ التفرع.


[1.74.2] — 2026-06-17

fix(health): إظهار GITHUB_MODELS_API_KEY كفحص اختياري في #/health وفي /api/status/providers. كان مزوّد GitHub Models في الإصدار v1.74.0 قابلاً للتهيئة في #/config لكنه لم يكن له صف في صفحة Health وكان مفقوداً من سطح المزوّدين keysConfigured. تمت إضافة الفحص الاختياري (بنفس صياغة “set / unset (manual mode)” المستخدمة مع المزوّدين الخمسة الآخرين للتقييم المباشر) وgithub (+ GITHUB_MODELS_MODEL الخاص به) إلى /api/status/providers، بحيث أصبح توجيه المزوّد النشط وصفحة Health يعكسان الآن جميع المزوّدين الستة. تم توسيع اختبار صف health في tests/api.test.mjs ليشمل جميع المزوّدين الستة.


[1.74.1] — 2026-06-17

docs + test: قسم “تثبيت مساعد ذكاء اصطناعي” في README؛ تغطية كاملة للفروع لموصّل Gemini. تمت إضافة جدول التثبيت/تسجيل الدخول إلى README — روابط التثبيت لـ Claude Code / Gemini CLI / Codex / Qwen Code / OpenCode / GitHub Copilot CLI + تعيين مزوّد #/config لكل منها + «سجّل الدخول قبل المتابعة» (يعكس دليل البدء السريع في career-ops.org/docs؛ يوضّح أن واجهة الويب هي البديل المستقل الذي لا يحتاج إلى CLI). يغطّي tests/gemini-connector.test.mjs الجديد (8 حالات) كل فرع من فروع runGemini — بلا مفتاح، نجاح، خطأ في API، إكمال فارغ/محظور، جسم استجابة مشوّه، انتهاء المهلة، خطأ في الشبكة، hasGeminiKey — ليصل server/lib/gemini.mjs إلى 100% من التعليمات البرمجية. التغطية الإجمالية: 96% أسطر / 88% فروع / 96% دوال. مجموعة الاختبارات 1126 → 1134.


[1.74.0] — 2026-06-17

feat(llm): GitHub Models (Copilot) كمزوّد سادس + التوافق القانوني لستة مساعدين. يُدرج career-ops.org/docs ستة مساعدين لترميز الذكاء الاصطناعي — Claude Code، Gemini CLI، Codex، Qwen Code، OpenCode، GitHub Copilot CLI. تدعم web-ui الآن جميع الستة: خمسة منهم يرتبطون بمزوّدين نشطين موجودين (Anthropic / Gemini / OpenAI / Qwen / OpenRouter)، ويحصل GitHub Copilot CLI على موصّل مخصص لـ GitHub Models — runGitHubModels (OpenAI-compatible؛ PAT من GitHub بنطاق models)، قابل للتهيئة في #/config (GITHUB_MODELS_API_KEY + GITHUB_MODELS_MODEL) وقابل للتحديد عبر LLM_PROVIDER=github؛ السادس في ترتيب auto. تُدرج حزم المساعدة وملفات README الآن الستة القانونيين (تمت إعادة تسمية Qwen CLI إلى Qwen Code؛ تمت إضافة Gemini CLI + GitHub Copilot CLI)، ويُضيف README جدولاً كاملاً لمرجع الأوضاع وروابط محوّلات البوابات إلى career-ops.org/docs حتى يمكن تتبّع كل ميزة إلى المشروع الأصل. يُوسّع tests/llm-provider-context.test.mjs مصفوفة حدود الجلب لتشمل جميع المزوّدين الستة (cv.md + profile.yml مضمّنة + العناصر المُعادة)؛ تمت إضافة مفاتيح GITHUB_MODELS_* الجديدة إلى جميع قواميس 12 لغة إقليمية. الحزمة 1125 → 1126.


[1.73.0] — 2026-06-17

feat(llm): موصّل Gemini العام + سياق السيرة الذاتية/الملف الشخصي الموثَّق عبر جميع مزودي الخدمة. تمت إضافة server/lib/gemini.mjs (runGemini) — عميل Gemini generateContent بدون أي تبعيات خارجية يعيد نفس البنية {markdown, usage, error} التي يعيدها العملاء المتوافقون مع Anthropic / OpenAI. الإصلاح: كانت /api/mode/:slug و/api/deep تُمرّران المطالبات عبر gemini-eval.mjs المخصص للتقييم فقط، مما جعل Gemini Run live يعيد تقييماً بدلاً من القطعة المطلوبة (رسالة تقديم، تواصل، موجز). تستدعيان الآن runGemini مع bundleProjectContext، فيُدمَج cv.md + config/profile.yml مضمَّنَين لـ Gemini تماماً كما مع كل مزود آخر — فتصبح الرسائل والموجزات مفصّلة ومخصَّصة. يحاكي tests/llm-provider-context.test.mjs الجديد حدود HTTP لكل مزود ويتحقق من أن المزودين الخمسة جميعهم (Anthropic / Gemini / OpenAI / Qwen / OpenRouter) يُدمجون cv.md + profile.yml مضمَّنَين ويعيدون القطعة (مصفوفة mode + deep + evaluate، 9 حالات). تحتفظ /api/evaluate بـ gemini-eval.mjs المضبوط للوظائف. Suite 1116 → 1125.


[1.72.0] — 2026-06-17

feat(modes): يُعيد Run live الآن القطعة النهائية مباشرةً (عقد إخراج من تنفيذ واحد). كُتبت قوالب modes/<slug>.md الأصلية لجلسات Claude Code التفاعلية — إذ يتوقف بعضها (cover وcontacto وغيرها) لطرح أسئلة توضيحية قبل إنتاج النتيجة، مما كان يجعل Run live في واجهة الويب يُصدر استبياناً بدلاً من القطعة المطلوبة. يُغلّف buildModePrompt الآن كل وضع في عقد إخراج غير تفاعلي: يُجري التحليل (تفكيك وصف الوظيفة، وملاحظات الشركة، وكلمات ATS المفتاحية، والفجوات بين الملف الشخصي↔والوظيفة، وخيارات النبرة/الزاوية) بصمت، ويختار قيمًا افتراضية معقولة من cv.md / config/profile.yml لكل ما كان القالب يسأل عنه عادةً، ولا يُخرج سوى القطعة النهائية — مختتمًا بتذكير خاص بكل وضع «output ONLY {the cover letter / outreach message / …}». وهكذا، يُعيد النقر على Run live في #/cover الآن خطاب التغطية نفسه؛ ويسري الإصلاح ذاته على جميع الأوضاع العامة (cover وcontacto وinterview-prep وproject وtraining وfollowup وpatterns) في كل 12 لغةً محليةً (تُكتب القطعة بلغة الواجهة عبر توجيه اللغة المحلية). Suite 1103 → 1116.


[1.71.2] — 2026-06-17

docs(i18n): ينشر مراجعة اتساق الوثائق. يسرد قسم “Translations of this guide” في كل ملف README الآن جميع اللغات الـ 11 المرافقة (كانت بعضها تحذف English/Français أو تحتوي على رابط ذاتي)، مع استعادة السطر الفارغ قبل فاصل القسم. تمت إعادة تسمية موجّه انحدار ضمان الجودة الكامل إلى الإصدار الحالي، ومزامنة الوثائق (CLAUDE.md، CONVENTIONS، LOCALIZATION، PROJECT-CONTEXT) مع الإصدار الحالي وعدد الاختبارات (1103). لا تغييرات في الكود أو السلوك — وثائق فقط، لذا تظل ترجمات المساعدة/واجهة المستخدم وجميع الميزات من 1.70.0–1.71.1 دون تغيير.


[1.71.1] — 2026-06-17

fix(i18n): دليل المساعدة داخل التطبيق مترجم الآن بالكامل بجميع اللغات الـ 12. تمت إضافة docs/help/{pl,uk,ar}.md (يحتوي كل منها على البنية المُتحقق منها 19 H2 / 75 H3) حتى يقدّم #/help حزمةً أصيلةً باللغات البولندية والأوكرانية والعربية بدلاً من الرجوع إلى الإنجليزية — يعيد GET /api/help/{pl,uk,ar} الآن محتوى اللغة الخاصة به. تم ربطه بجميع بوابات المساعدة (help-ui، help.test، help-ru-config-section، canonical-docs-coverage). كما اكتملت جميع قوائم الترجمة بـ 12 لغة: قسم «Translations of this guide» في ملفات README (9 ملفات README)، وترويسات «Translations:» في ملفات CHANGELOG المترجمة (8 ملفات)، وتم تحديث أعداد التوثيق القديمة. Suite 1100 → 1103.


[1.71.0] — 2026-06-16

feat(cover): إنشاء ملف PDF لخطاب التقديم مباشرةً من #/cover. يُنتج وضع cover (المُضاف في v1.70.0) نص الخطاب؛ وتُقدِّم النتيجة الآن زرَّ Generate PDF الذي يُصيِّر النص عبر مسار markdown→PDF المُضمَّن المشترك (POST /api/stream/pdf/inlinegenerate-pdf.mjs)، وهو المسار ذاته الذي يستخدمه interview-prep. يمكنك الآن إعداد الخطاب وإرسال ملف PDF دون مغادرة SPA.

test/docs: تعزيز مراجعة v1.70.0. تمت إضافة تغطية معزولة عن CI لوضع cover (قائمة السماح + تجميع الطلب)، ومُبدِّل <select> الأعلام + RTL العربية (dirFor/<html dir>)، وtop.langLabel في كل إعداد محلي، وتوصيل PDF خطاب التقديم، وتوجيه الإعداد المحلي في prompts.mjs + السقالات البرمجية لـ fr/pl/uk/ar. تم تحديث المراجع القديمة «جميع الـ 8» إلى 12 إعداداً محلياً في docs/sdd/CONVENTIONS.md وفي طلب انحدار QA للمشروع بأكمله.


[1.70.0] — 2026-06-16

feat(i18n): ثلاث لغات واجهة مستخدم جديدة — البولندية (pl) والأوكرانية (uk) والعربية (ar، مع دعم كامل لـ RTL) — لترتفع بالـ SPA إلى 12 منطقة محلية، لتتطابق مع جميع اللغات الواردة في README مشروع career-ops الأصلي. تأتي كل منطقة محلية جديدة مزودة بقاموس كامل مؤلف من 697 مفتاحاً (public/js/lib/locales/i18n-dict.{pl,uk,ar}.js)، خاضعٍ للتحقق عبر مجموعات الاختبار الحالية للتكافؤ والتغطية وعدم تسرب الحروف اللاتينية وعدم وجود بيانات شخصية. يضيف الدعم العربي توجيهاً حقيقياً من اليمين إلى اليسار: يضبط i18n.js السمة <html dir="rtl"> للمناطق المحلية RTL، فيما يعكس كتلة [dir="rtl"] المحددة النطاق في app.css واجهة التطبيق (الشريط الجانبي، ودرج الإشعارات، والجداول وعروض الاقتباس في markdown، والمسافات المضمّنة) — بينما تبقى المناطق المحلية LTR دون تغيير بايت واحد. يُعرِّف المفتاح الجديد top.langLabel (×12) محدد اللغة لقارئات الشاشة.

feat(ui): يحل محدد اللغة <select> بأيقونات الأعلام محل صف الأزرار الذي كان يلتف على عدة أسطر. مع 12 منطقة محلية، كان صف .lang-btn القديم يمتد على ثلاثة أسطر في الشريط الجانبي؛ أما <select> الأصلي (كل خيار مسبوق برمز تعبيري لعلم) فيتوسع بشكل أنيق، ويدعم لوحة المفاتيح وقارئات الشاشة بدون إعداد إضافي، كما يظل آمناً مع CSP (معالج التغيير عبر addEventListener، دون JS مضمّن). تتراجع الأعلام إلى أحرف المنطقة حين تفتقر المنصة إلى رموز الأعلام، فتبقى تسمية اللغة دائماً المعرِّف الأساسي.

feat(cover): نقل وضع خطاب التقديم من المشروع الأصلي (career-ops v1.10.0 + تحية v1.11.0) إلى الـ SPA. صفحة #/cover جديدة ضمن مجموعة التنقل «الطلبات»، مبنية على منفذ الأوضاع العام: وصف الوظيفة + الشركة/الدور + تحية اختيارية ← خطاب مخصص مُولَّد من cv.md / modes/_profile.md. أُضيف cover إلى MODE_ALLOWLIST في الخادم وكتلة i18n باسم cover.* (×12 منطقة محلية).

chore(compat): تتبع مشروع career-ops الأصلي v1.11.0. تم التحقق من سلامة عقد القراءة/الكتابة — يبقى data/applications.md مصدر الحقيقة بصيغة markdown (فهرس تتبع SQLite في v1.11.0 هو ذاكرة تخزين مؤقت مشتقة)، وتظل أعمدة أداة التتبع معيَّنة بحسب الترويسة. يُبلّغ parentVersion الآن عن الإصدار 1.11.0.

fix(i18n): سد ثغرة كامنة تمثّلت في غياب اللغة الفرنسية (المضافة في v1.61.0) من LOCALE_NAMES وSCAFFOLD_STRINGS في server/lib/prompts.mjs — إذ كانت استدعاءات LLM بالفرنسية تعود صامتةً إلى إخراج باللغة الإنجليزية وسقالات إنجليزية. fr/pl/uk/ar جميعها متصلة الآن بمسار المنطقة المحلية للمطالبات.

متابعات معروفة: يعود دليل المساعدة داخل التطبيق (docs/help/) إلى اللغة الإنجليزية للمناطق pl/uk/ar (واجهة التطبيق نفسها مترجمة بالكامل)؛ كما أن إعداد المقابلة التفاعلي وميزة اكتشاف نظام ATS العكسي ومزودي الفحص الأحدث في المشروع الأصلي لم تُتَح بعدُ في الـ SPA.