سجل التغييرات
GitHubكل تغيير جدير بالذكر، إصدارًا بعد إصدار. الملف نفسه يأتي مع المستودع ومترجم إلى جميع اللغات الـ19.
[1.267.1] — 2026-11-04
أُصلح
- إصلاح قطار الإصدارات (بوابات CI الخاصة بـ v1.267.0) — سلسلة عدّ الاختبارات في PROJECT-CONTEXT لم تعد تنكسر عند رأس v1.267.0 (صيغة السهم التي يطابقها eval grader)، وأُعيد تنظيم prompts الـ QA (prompt حي واحد لكل إصدار، وأُرشف v1.266.0)، ورُفعت التغطية لكل ملف فوق ratchet الـ 98/90: يفقد renderer الراتب في applicantpro fallthrough غير قابل للوصول (salaryRangeOf يعطي بما لا يدع الشك undefined أو {min} أو {max} أو {min,max}) مع تثبيت الفروع أحادية الجانب ≥/≤ عبر تدفق fetch، وتُثبّت حزمة board-response-cache تجاوز no-store، و304 المقدَّم من المستدعي ضد لوحة غير محفوظة، والإخلاء عند MAX_ENTRIES.
- الاختبارات: العدد المباشر هو 7395 (أطقم موجة v1.266.0/1.267.0 تحمل مواصفات أكثر مما تتبعته الملاحظات السابقة — تُعاد سلسلة الربط إلى الحد المقيس: 7392 بعد الموجة، +3 اختبارات بوابة في هذا الرقعة)؛ التغطية 98.51 سطر / 90.35 فرع.
ملاحظات
-
وسم v1.267.0 يبقى يشير إلى كوميت الدمج الأحمر — لا يُعاد توجيهه (الخادم يرفض الوسوم المُعاد توجيهها)؛ v1.267.1 هو وسيلة النشر.
-
إصلاح رقعي لقطار v1.267.0: بوابات CI خضراء، وشجرة الكود لم تتغير جوهرياً.
[1.267.0] — 2026-11-04
أُضيف
- أربعة مصادر مسح جديدة — GermanTechJobs و Darwinbox و Keka و ApplicantPro/isolved (السجل 125 → 129 = 124 EN + 5 RU · 124 adapters) — الموجة الثانية من parent-sync مقابل career-ops @
7d8feb6d(87 التزاماً من المستودع الأعلى). GermanTechJobs (#6346): feed RSS على مستوى اللوحة عبرgermantechjobs.de/rss(نحو 626 عنصراً في طلب واحد)؛ صاحب العمل هو آخر مقطع" @ "في العنوان — الوظيفة التي لا يحمل عنوانها المقطع تُسقط ولا تُنسب أبداً إلى اللوحة؛ ويقتصر الاختيار علىprovider:الصريح. Darwinbox (#6416): JSONalljobsبلا مصادقة خلف<tenant>.darwinbox.in، ومعرّف الشركة يأتي من careers URL، مع تجوال POST مصفَّح الصفحات (50/صفحة،max_pages20/200) وتُقرأ نقطة توقف الصفحة القصيرة من عدّاد الصفوف الذي يصرّح به المصدر نفسه. Keka (#6199): طلبان — غلاف careers يُجلب بـredirect:'manual'ويُسمّي سكربته UUID الـ feed (المستأجر المجهول يجيب 302 إلىTenantNotFound.htmlويُقرأ 404 مُسمّى)، ثم كامل المخزون المفتوح في مصفوفة embed-jobs واحدة. ApplicantPro / isolved (#6252):domainIdالرقمي من الـ bootstrap، ثم{success, data:{jobs, jobCount}}؛ إذاjobCount > rowsيُحذَّر أن القائمة غير مكتملة؛ وتفعيل اختياري عبرapplicantpro: { fetchDetails: true }يُغني الوظائف من JSON-LD بمهلة 250 ms. - إعادة استخدام استجابات اللوحات عبر ETag (#6105) — ضمن مسح واحد، تُعاد استجابة لوحة جُلبت في آخر 15 دقيقة كما هي، والأقدم يعاد التحقق منها بـ
If-None-Match(و304 يحفظ الجسم)؛ مفتاح الكاش يغطي method + URL + ترويسات الاعتماد + body، والقراءات المتداخلة تنهار على promise الجاري في الطيران، وCAREER_OPS_HTTP_CACHE=0/_TTL_MSيتجاوزان ذلك. كاش في الذاكرة لكل جولة مسح (لا عقد كاش على القرص في web-ui) — انحراف مُسجَّل.
أُصلح
- التواريخ على أربع لوحات (#6274) — remoteok و remotive و workingnomads و IBM تصدر الآن تاريخ نشر، فيعمل مرشّح «Posted within» عندها؛ طابع remotive الزمني الساذج يُطبَّع إلى UTC (كان خلل العمر لكل جهاز حيّاً فعلاً)، و
_source IBM يطلبdcdateفعلاً. - مفتاح portals.yml مكتوب بخطأ إملائي يُرفض (#6107) — مسح EN يرمي الآن خطأ مُسمّى (الملف + المفتاح + اقتراح أقرب مفتاح، Levenshtein ≤ 2) قبل أي جلب، بدل تجاهل
titel_filter:بصمت. - getro يواصل التجوال بعد pin مميَّز قديم (#6406) — الوظيفة القديمة المثبتة تُسقط كالعادة لكنها لم تعد تُنهي ترقيم الصفحات؛ ينتهي التجوال على صفحة قصيرة حقيقية.
ملاحظات
- لم يُفعل عمداً: مرشّح seen في ماسح RU ليس واعياً باللغة، ومسار تحليل portals فيه لا يجري بوابة المفتاح المخطوء (تسليمات مسجَّلة في مواصفة الموجة — لا لوحة RU تصدر صفوفاً لكل لغة بعد)؛ ويتسلم remoteok نص تاريخه الحامل للإزاحة بدل تطبيعه إلى UTC (شكله الحي حتمي). الاختبارات 7096 → 7243؛ Playwright 173 pass / 0 fail / 1 opt-in skip؛ السجل 129 = 124 EN + 5 RU · 124 adapters (كل بوابات العد أُعيد توليدها من السجل الحي).
[1.266.0] — 2026-11-01
أُضيف
- نسخ اللغات في Personio لم تعد تبتلع بعضها (CAR-223: من المشروع الأصلي #4789 + #5044 + #5285) — الكدس المؤجَّل، نُفِّذ كتسليمه الخاص. جانب المسح (#4789):
scan_history.dedup_include_language: true(تفعيل صارم اختياري — مع OFF يكون السلوك متطابقاً بايت-ببايت) يجعل نسخ اللغات للوظيفة الواحدة تنجو من dedup عبر آلية متغيّرات سجل المشوَد (languageFormsFromUrl/recordUrlVariant/isUnseenLanguageVersion)؛ المفتاح القانوني يجرّد وسائطlanguage/lang/locale. preferred_languages (#5285): يرتّب صفوف نسخ الوظيفة المفضَّلة أولاً (مستقر، وترتيب المزوِّد عند التعادل) — مستقل عن المفتاح (OFF يبقي النسخة المفضَّلة، وON يبقي كل نسخة بهذا الترتيب)، مع نقلvalidatePreferredLanguagesمن validate-portals. personio fan-out (#5044): تُجلب صفحة careers بلا إجبار?language=en(وتُحترم?language=xxالخاصة بالمستأجر) وتُصدر صفاً واحداً لكل نسخة لغة معlanguageوعناوين?language=<code>؛ ويضيفdedupIncludeLanguageجلبات لكل لغة (سقف 5، بإيقاع موزون)؛ أما fallback الـ /xml وروابط الوظائف فبلا تغيير. recruitee يكتسب إصدارlanguageنفسه +preferred_languages(من الخيارات أو من القيد). وتسكن المساعدات المشتركةserver/lib/language-preferences.mjs.
ملاحظات
- تسليمات مسجَّلة، لم تُفعل عمداً: مرشّح seen في ماسح RU ليس واعياً باللغة، ولا لوحة RU تصدر صفوفاً لكل لغة بعد؛ وتبقى مرآة
url-key.jsعلى العميل مفتوحة، وكذلك توصيل التحقق في مسار portals. الاختبارات 7096 → 7203؛ السجل دون تغيير 125 = 120 EN + 5 RU · 120 adapters.
[1.265.0] — 2026-11-01
أُضيف
- مصدرا مسح جديدان — Apple و Bulldogjob (السجل 123 → 125 = 120 EN + 5 RU · 120 adapters) — موجة parent-sync مقابل career-ops @
fe857ecf. Apple (jobs.apple.com، #5496 + #6196): الموقع تطبيق React Router SSR بلا واجهة JSON صالحة، لذا تقرأ المصنة كتلة ترطيب مسار البحث العادي (window.__staticRouterHydrationData)؛ الاكتشاف تقوده القيد (apple.queriesمحاور نصية بترتيب الصلة + محاورapple.teams، بلا افتراضيات — قيد بلا أي منهما يرمي خطأ)، وتُقيَّد الصفحات بـmax_pages(افتراضي 2، سقف 50) مع مهلة 200 ms، ويُرمَّز كل مقطع URL ضد السوروجيت، والوظيفة التي تسميها Apple PIPE تحمل في snippet إيحاء «قد تكون خط مواهب» — لا ترشيح على أساسها. Bulldogjob (bulldogjob.pl، #6253): اللوحة البولندية بلا واجهة JSON كذلك — صفحات الإدراج تحمل__NEXT_DATA__(50/صفحة،totalCount)؛careers_urlللقيد هو البحث الذي بناه المستخدم على الموقع (المرشحات في المسار)، وكل طلب يحمل/page,Nصريحًا، ويتوقف التجوال عند صفحة قصيرة أو الإجمالي المعلن أوmax_pages(افتراضي 25، سقف 100) مع وسم القطع على اللوحات الجزئية. - إعادة هندسة ترقيم صفحات IBM (#6273) — التجوال الثابت على 600 سجل يصبح
max_pages(افتراضي 20، سقف 300، تجاوز على مستوى القيد) مع مهلة 200 ms بين الصفحات وإعادة محاولة لكل صفحة عبرfetchJsonWithRetry؛ الصفحة الأولى الفاشلة ترمي خطأ، والصفحة اللاحقة الفاشلة تحفظ المجموع وتسمّي الصفحة، وفقط الصفحة الكاملة عند سقف القيد نفسه تحذّر «raise max_pages».
أُصلح
- justjoin يؤرخ العروض بـ
lastPublishedAt(#6254) —publishedAtفي واجهة المرشحين يتقدم مع كل تحديث من صاحب العمل، فكانت معظم اللوحة تحمل تاريخ اليوم وmax_posting_age_daysيمرر عروضًا عمرها أسابيع؛ الآن يفوز تاريخ النشر الأقدم مع fallback عند غيابه أو تعذر تحليله. - jobvite يطوي الصفوف التي تتشارك عنوان وظيفة واحدًا (#6127) — feed عام يعيد صف
<job>لكل مدينة لنفس detail URL؛ كان المحلل يحتفظ بأول مدينة ويعدّ الباقي مكررات. الآن الإخوة يسهمون بالمواقع فقط، موصولة بـ·بترتيب الfeed، يبقى أول title/date، ويُعاد تقييم remote على الموقع الموصول. - Liveness: درجة UltiPro (#6090) — UKG بلا نقطة نهاية JSON لكل وظيفة ويجيب 200 للمغلقة، فكانت كل الوظائف الـ 57 المغلقة تُقرأ uncertain. صفحة التفاصيل تضمّن السجل:
OpportunityIsClosedtrue/false → expired/active، وإشعار «opportunity unavailable» → expired، وكل ما عدا ذلك يبقى للمتصفح. بانر Built In «Sorry, this job was removed» صار hard-expired (#6336) — الصفحة تحتفظ بالـ JD كاملًا وبأداة APPLY؛ الآن البانر يفوز، وشارة «Job removed» الشقيقة بلا «sorry» لا تطابق.
ملاحظات
- لم يُفعل عمدًا: النصف parent-side من إصلاح jobvite الخاص بمترجم المواقع في scan.mjs (توثّق web-ui مترجم USPS كـ no-port) وحقل
noteالأبوي لإيحاء PIPE من Apple (شكل الوظيفة في web-ui بلاnote؛ تسافر فيsnippet). الاختبارات 7096 → 7135 (+39)؛ Playwright 173 pass / 0 fail / 1 opt-in skip؛ coverage gate ≥ 98/89؛ السجل 125 = 120 EN + 5 RU · 120 adapters (كل بوابات العد أُعيد توليدها من السجل الحي).
[1.264.3] — 2026-11-01
أُصلح
- موجة تحصين حد الطلبات (LOW №1–3 من
REVIEW-2026-10-31-v1.264.1) —writeRateLimit()(express-rate-limit@7.5.1، 60 req/min route×IP، 429 JSON + Retry-After) يغطي الآن جميع الـ 47 نقطة نهاية المُعدِّلة (كانت 2): استُبدلت 9 حراسllmRateLimitسيّئي النطاق (/api/config— إعادة كتابة.env!،PUT /api/batch،/api/batch/merge، outcome، followup/seed، assessments، stats/snapshot، mock-interview/save، networking/save)، وجُمعت 3 قبل دلو LLM على أغلى المسارات (/api/evaluate،/api/deep،/api/auto-pipeline)، ووُصّلت 33 تسجيلات عارية (محررات CV/profile/modes، كل كتابات tracker، pipeline POST/restore/DELETE، jds، 7×/api/run/*بتعديل حلقة واحد، posting-guard، Playwright-PDF inline، portals toggle/health/track، discover، reports، export/docx، two-pager، career-plan، memory وثلاث مسارات DELETE). يبقى/api/apply-helperفي allowlist بلا حد (حساب محلي خالص، مثبَّت)؛ وتحتفظ 16 مسارًا LLM-خالصة بدلو LLM الشرطي بحكم التصميم. وشيك الاكتمال (tests/rate-limit-coverage.test.mjs، red-first عند 27 عارية) يُسقط CI أمام أي تسجيل مُعدِّل غير مقيَّد مستقبلًا. TRUST_PROXYاختياري + تسليح التحققات من جديد (LOW №1–2) — يقبلapp.set('trust proxy', N)hop-count من env (ليس أبدًا booleantrue— وإلا بُنيت المفتاح على الطرف الأيسر من XFF الذي يتحكم به المهاجم)؛ بلا قيمة افتراضية، يحتفظ loopback بالانحلال الموثَّق بمفتاح مقبس. يصبحvalidate: falseهوwriteValidateConfig()الموجَّه: يُطفأ فقطxForwardedForHeader(يُتجاهَل XFF من Caddy بحكم التصميم بلا trust proxy)؛ وتعود بقية التحققات — بما فيهاtrustProxy— صاخبة، فتظهر أي سوء-تهيئة مستقبليةtrust proxy: trueكـERR_ERL_PERMISSIVE_TRUST_PROXYلا كصمت. أُزيلkeyGeneratorالمخصص عمدًا: يربط express-rate-limit تحققاته الوكيلة بالمولِّد الافتراضي، وعزل المسارات لا يتغير (MemoryStoreواحد لكل استدعاء مصنع).- تغذية النسخ في cvstart.org تبقى ثانيتين (CAR-141) — تحتفظ حالة «Скопировано ✓» الآن بثانيتين وفق معيار القبول (كانت 1,5 ثانية)، مع تثبيت red-first في
tests/site-copy-feedback.test.mjs. يُغلق هذا آخر معيار قابل للإصلاح بوكيل في CAR-141؛ وتبقى إعادة تسجيل الفيديو التجريبي مؤجَّلة بقرار المالك.
تغيّر
- الوثائق تقول 19 لغة (×19) — لم تعد جملتا §19 «Localizing the app» و§32 «Run it from OpenWorker» متأخرتين لغتين كاملتين: كل bundle يقول الآن 19، مع إضافة தமிழ் وTiếng Việt إلى كل تعداد بأسلوب الملف نفسه (ar بالرقم المفوَّظ «التسع عشرة»)، وأُصلح أيضًا بقايا «cả-17» في §32 من
vi.md. بوابات البنية (33 H2 / 125+ H3) مستقرة بايت-ببايت. - نظافة الحالة — يذكر
AGENTS.mdالإصدار v1.264.2 / 7082 اختبارًا (كان v1.86.x / 1566)؛ ويعلّمPLAN.mdالتسليمات 1–7 بأنها Shipped وتقول فقرة قطاره docs ×19؛ ويصف تعليقStatsBar.astroما يحفظهfacts.adaptersفعلًا (123 = إجمالي المصادر، اسم المفتاح التاريخي محفوظ للمستهلكين)؛ وتقول ترويسةi18n.jsإنها 19 لغة؛ ويحمل QA prompt v1.264.2 التغطية الحقيقية (98.45/90.05) وحساب Playwright (176 = 174 harness + 1 opt-in skip + مجموعتان على مستوى السكربت).
ملاحظات
- لم يُفعل عمدًا: تبقى موجة parent-sync وفق port-list المسجَّلة في BACKLOG — يجب أن يتزامن fork أولًا past upstream
a9476866(7 من أصل 10 التزامات في القائمة ليست بعد في شجرة الأب المحلية؛ IBM/UltiPro/Bulldogjob/apple بنطاق S–M، personio language-dedup مؤجَّل إلى تسليمه الخاص). تبقى إعادة تسجيل الفيديو التجريبي لـ CAR-141 مؤجَّلة عمدًا من المالك («видео не надо пока»، 2026-11-01). - الاختبارات 7082 → 7096 (+9 وشيك تغطية + 5 trust-proxy)؛ Playwright 173 pass / 0 fail / 1 opt-in skip (+2 تثبيت chevron داخل حالات قائمة)؛ coverage 98.46 line / 90.10 branch؛ evals 14/0/1skip؛ السجل دون تغيير 123 = 118 EN + 5 RU · 118 adapters.
[1.264.2] — 2026-11-01
أُصلح
- ترويسات مجموعات الشريط الجانبي تنضم إلى عقد القتط (CAR-219) — تسميات مفاتيح تبديل المجموعات (
.nav-v2-toggle > span) تقتطع الآن بعلامة حذف وتحمل تلميحاً مترجَماً عبر آليةsyncLabelTitles()نفسها المستخدمة لعناصر CAR-203؛ سهم المجموعة لا يتقلص أبداً، ومفتاح التبديل يبقى قابلاً للنقر، وRTL صامد. تثبيت بالأحمر أولًا فيtests/nav-v2.test.mjs(+1 → 7082 اختباراً).
تغيّر
- نص cvstart.org يُشحن بكل اللغات التسع عشرة (CAR-220) —
meta.helpDescوhelpTeaser.c1.descوfaq.a2أصبحت مترجَمة في كل لغة من لغات الموقع (كانت في v1.264.1 للإنجليزية فقط عن قصد)؛ وقد أوصل نشر GitHub Pages النسخة المحدَّثة حيّاً إلى cvstart.org. - نظافة قائمة الأعمال والمراجعات (CAR-221/222) — البنود الستة «port when merged upstream» أُغلقت: طلبات السحب السبعة من المستودع الأعلى مدمَجة جميعها، وأربعة بنود سبق نقليها، واثنان من جانب المشروع الأصلي. يصل تقرير
docs/reviews/REVIEW-2026-10-31-v1.264.1.md(0 HIGH / 0 MED، وثلاث متابعات LOW مسجَّلة في BACKLOG)، وتُسجَّل قائمة نقل مزامنة المشروع الأصلي (6 PORT / 3 VERIFY / فجوة مصدر apple؛ ذيل المستودع الأعلى 118 التزاماً @ VERSION 1.38.0).
ملاحظات
- إصلاح ختم مرايا سجل التغييرات (
92a05fcf) يركب هذا الوسم: كل مرآة مصفَّحة الصفحات على cvstart.org تحمل الآن إصدار التوليد الذي أنتجها، فيمارس مقيّدsite-build-after-fanoutمنطقه الحقيقي أخيراً بدلاً من التخطي. - امتناع متعمَّد: خنق طلبات POST المُعدِّلة المتبقية (متابعة LOW رقم 3 من المراجعة) واقتران دلاء trust-proxy — مسجَّلة في BACKLOG لموجة التحصين التالية. تبقى CAR-141 (فيديو العرض التوضيحي) للمالك.
- Tests 7081 → 7082 (+1 تثبيت CAR-219)؛ Playwright 176؛ السجل دون تغيير 123 = 118 EN + 5 RU · 118 adapters.
[1.264.1] — 2026-10-31
أُصلح
- حبوب الشريط الجانبي تقتطع التسميات المترجَمة الطويلة بلطف (CAR-203) — عنصر span لتسمية التنقل أصبح الآن مواطنَ flex صحيحاً (
min-width: 0+overflow: hidden+text-overflow: ellipsis+nowrapفيv2-nav.css)، وتحاكيsyncLabelTitles()فيnav-v2.jsالتسمية المترجَمة في التلميح عبر مفتاحdata-i18nنفسه (صفر مفاتيح i18n جديدة) — التسمية الطويلة «Профинансированные компании» صارت مقروءة من جديد عند التحويم بدل أن تقتطعها قسرياً قاعدةoverflow: hiddenللصف. هدف اللمس 44 px والتلوين النشط ومرآة RTL لم تُمسّ؛ تثبيت بالأحمر أولًا فيtests/nav-v2.test.mjs. - سقف تقييم واحد قدره 480 s لكل لغة (CAR-218) — التقطت remote-QA في v1.264.0 تقييمات عابرة على شكل
502 · 300 s · 0 chعلىesوzh-CN(نجح التشغيل الموجَّه اللاحق، لكن الجدار كان حقيقياً). أصبحEVAL_TIMEOUT_MSالآن480_000وتعيدهevalTimeoutMs(lang)بلا استثناء — ويرث ذلك كلٌّ منGEMINI_EVAL_TIMEOUT_MSوauto-pipeline. تبقى ميزانية الرموز المدركة للغة من CAR-174 (16384 / 32768) هي التقسيم الوحيد لكل لغة.
تغيّر
- الأسئلة الشائعة على cvstart.org تحمل عدّادات المصادر الدقيقة (CAR-217) — يُستبدل النص
{sources} job-board sources: {sourcesEn} international boards plus {sourcesRu} Russian onesمنfacts.json، المولَّد من السجل الحي (123 = 118 EN + 5 RU)، فلا يمكن للأرقام أن تنحرف قط؛ واللغات التي ما زالت على الصياغة الأقدم~{adapters}تحافظ على التقريب عبرadaptersRounded. وترقيات صياغة EN ركبت معها (meta.helpDescوhelpTeaser.c1.descوfaq.a2تذكر قائمة الأوامر، وخط المعالجة المجمَّع مع التراجع، والمتتبع الكانبان).
ملاحظات
- امتناع متعمَّد: تبقى ترقيات صياغة i18n للموقع (
meta.helpDesc/helpTeaser.c1.desc/faq.a2) للإنجليزية فقط في هذا الإصدار — تحتفظ اللغات الأخرى بصياغة صحيحة لكنها أقل دقة حتى موجة التوثيق التالية (وfaq.a7لديها تكسب العناصر النائبة للعدّادات الدقيقة حيث تُترجَم). تبقى CAR-141 (فيديو العرض التوضيحي) للمالك؛ وفرعcar136/m141المُهمَل حُذف مع تسجيل أفكاره على مهمة Linear (قابلة للاستعادة عبر الوسمarchive/car136-m141). - Tests 7041 → 7081 (إعادة كتابة تثبيتَي CAR-203 وCAR-218)؛ Playwright 176؛ السجل دون تغيير 123 = 118 EN + 5 RU · 118 adapters.
[1.264.0] — 2026-10-31
أُضيف
- تحرير حالة المتتبع داخل الصف مباشرة — شارة الحالة في كل صف من صفوف
#/trackerأصبحت<select>مضغوطة بالمراحل القياسية (منGET /api/tracker/stages، وليس قائمة بيضاء مبرمَجة قط). يمرّرPOST /api/tracker/statusسكربتset-status.mjsالقياسي للمشروع الأصلي تحت قفلapplications.md(قائمة بيضاء للحالات عبرstates.mjs، وتمرير--dry-run/--note، و502 لين مع تفاصيل معقَّمة، وتشغيل بمصفوفة argv). النجاح يحدّث الصف في مكانه (فئة النبرة + عدادات التبويبات، مع الحفاظ على التركيز)؛ والفشل يستعيد القيمة ويعرض toast. الصفوف التي لا يستطيع الممرّر مخاطبتها — حالة غير معروفة معدَّلة يدوياً، أو قيمة حارسة للتعبئة الرجعية#— تحتفظ بالشارة للقراءة فقط (إصلاحات مراجعة المسارات من فئة LOW؛ المراجع: لا نتائج HIGH/MED). - ظهور تحذيرات الخادم على كل صفحة ذكاء اصطناعي — صفحات
evaluateوdeepوauto-pipeline(الصفحة والنافذة المنبثقة معاً) وcareer-planوmarketوcv-studio(humanize + tailor) تعرض الآن مصفوفةwarningsمن الخادم (بتر رموز المخرجات، وانحراف اللغة، وتصحيحات التواريخ) كشريطbadge-warn(role="status")؛ ونافذة auto-pipeline المنبثقة لم تعد تُسقط تحذيرات إطار الانتهاء. مفتاح جديدllm.truncatedNotice×19. - موجة تغطية (+111 اختباراً) —
routes/map.mjsبنسبة 100/94.9، وgeocode.mjsبنسبة 96.3/92.9، وcontent.mjsبنسبة 99/84.9، وnetworking.mjsبنسبة 96.4/89.1، وsources/habr.mjsبنسبة 100/98.2 (ملفاتtests/cov-*-routes.test.mjsجديدة ×3، وtests/sources-habr.test.mjs)؛ وأرضية التفرع بقيت عند ≥ 90 %. - حزمة إغلاق CAR-191…216 على Linear (
docs/reviews/2026-10-30-linear-car191-216-closure-bundle.md) — ملف إقفال جاهز للّصق للمالك مع SHA الالتزام لكل CAR وتعليقات الأدلة.
أُصلح
- مصدر مسح Trudvsem — الصفحة الفارغة (
results: {}، وأيضاً «ما بعد النهاية») لم تعد تقتل المسح بأكمله (انتهاء نظيف بلا صفوف)؛ وأغلفة أخطاء الـ API (HTTP-200 معstatus: 500) ترمي استثناءً بنص الـ API نفسه؛ وترقيم الصفحات يمشي الآن على إزاحات السجلات (كانت فهارس صفحات — كانت الصفحات تتكرر بصمت، ~52 فرصة بدل المئات)؛ ويتوقف المشي قبل منطقة فشل الإزاحة العميقة في الـ API (offset × limit ≥ 10000). تحقّق حي من طرف إلى طرف. - habr — تُقشَّر الوسوم من العناوين/الشركات بعد فك ترميز الكيانات (موازاة hh.mjs): لم يعد
<script>في عنوان بطاقة يصل إلى صفوف المسح كترميز حي؛ وعلامات>>المشروعة في العناوين تنجو. - PUT /api/profile (المسار الخام) — تُرفض كتلة
candidate:بلاfull_nameغير فارغ، على السطر نفسه مع مسار دمج الحقول (كانت تدوّمfull_name: null). - صدق التلميحات — أُزيل
.docمن قائمة القبول لرفع السيرة الذاتية ومنcv.uploadHint×19 (لم يدعمه المحلل قط)؛ وconfig.openaiModelHint×19 يذكرgpt-5(الخادم يطابق أي معرّف*-codexإليه)؛ وconfig.anthropicModelHint×19 وافتراضي Anthropic يعكسان الآن فئات المشروع الأصلي — الافتراضيclaude-sonnet-5-5، والمتميزclaude-opus-5-5. - رابط توثيق Claude Code →
code.claude.com(رابطdocs.anthropic.com/en/docs/claude-codeالقديم يرمي TypeError في بوابة الروابط). - المساعدة ×19: ذهب ذكر «كثافة الصفوف» (أُزيل المبدّل من الواجهة في v1.263.0) وأُصلحت 18 عائلة من امتدادات
**bold**المعطوبة — مع إصلاح فئة تسريب المحرِّك ×19 (سطر فارغ ثانٍ بعد كل جدول يسبق فقرة؛ وعلامة الأنبوب خارج الخلايا الغامقة): صفر**حرفي في العرض عبر حزم المساعدة الـ 19 كلها.
ملاحظات
- تغيّر نموذج Anthropic الافتراضي إلى
claude-sonnet-5-5(فئة المشروع الأصلي القياسية). عمليات النشر التي اعتمدت على الافتراضي الصامت القديم (claude-sonnet-4-6) تترقّى تلقائياً — ثبّتANTHROPIC_MODELفي.envللاستثناء. - امتناع متعمَّد: نقطتا المراجعة من فئة LOW تُركتا مفتوحتين عمداً (قائمة الاختيار المضمنة لا تحاكي تدهور
movesReadyالكانبان — الـ toast الصادق عند كل فشل هو السلوك المختار؛ ويبقى فرعcode: 'timeout'مغطى بعقد الكاتب الزائف، لا باختبار >30 s). تبقى CAR-141 (فيديو العرض التوضيحي) للمالك. - نالت المساعدة ×19 جولة نثر ما بعد الإصدار (حذف ذكر الكثافة، وإصلاح فئة تسريب المحرِّك) على
mainبعد شحن v1.263.0 — وهذا الإصدار أول وسم يحملها. - وأيضًا في هذه الشارة: أساس شارة الأدلة (محللات التقارير + شارات العرض)، ومنفّذ fix-report-links (
POST /api/runners/report-links، بطاقة «إصلاح» في#/health)، وتقدير/تأكيد تكلفة الدفعة مع تسجيل الاستخدام — وصلت إلى main بين قصّ الفرع والشارة.
Tests 6905 → 7041 (+136) · Playwright 176 (نجاح 173 / تخطٍّ اختياري 1) · التغطية 98.5 % سطريًا / 90.1 % تفريعيًا · السجل دون تغيير: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.263.0] — 2026-10-30
أُضيف
- طبقة الصقل الحركي — ملف
motion.cssجديد (آخر ورقة أنماط في التطبيق): ظهورات النوافذ المنبثقة والفقاعات (مقياس .97 + تلاشٍ، 130–180 ms)، دخول الـ toast نابضًا + حالة مغادرة ناعمة، نابض ضغط زر تبديل السمة، مقياس ضغط الرقائق/التبويبات scale(.97)، بنية تحتية للتعاقب (خطوات 50 ms، سقف 12)، تلاشي.page-enterعند تغيير المسار (الموجِّه)، وانتقالات هالة التركيز على الرقائق/التبويبات. كل قاعدة آمنة معprefers-reduced-motion(الحركة تسقط إلى لا شيء، وتبقى الشفافية/اللون). - صحة اللمس — 68 قاعدة رفع-عند-التحويم كانت غير محمية: كانت أجهزة اللمس تحتفظ ببطاقة «مرفوعة» عالقة بعد النقر. كل تحويلات التحويم محمية الآن بـ
@media (hover:hover)(معطِّل motion.css)، ولا ينطبق رفع البطاقة إلا على البطاقات التفاعلية حقًا (.card:has(a)،a.card،button.card،[role=button].card) — لا مزيد من إشارة تفاعل زائفة على البطاقات الساكنة. - إتاحة الوصول: كل عنصر تحكم له اسم برمجي. مساعد
A11yDumpالجديد يسمّي جميع مقالب مخرجات LLM للقراءة فقط الـ 16؛ و12 حقلًا كانت بعناصر نائبة فقط (CV Studio ×6، config ×2، بحث scan، قائمة نتيجة tracker، ملاحظة outcome، محرر الخطة، رابط auto، تقرير الخطأ) حصلت علىaria-labels؛ وبوابةa11y-form-wiresتفرض ذلك الآن على الفئة كاملة (كانت 26 موضعًا بلا اسم، أصبحت 0 + قائمة سماح بأسباب موثقة).
أُصلح
- #/scan: لم يعد رأس الجدول الثابت يُرسم فوق بحث الشريط العلوي بعد أن يمرّ تحته (كانت قيمة z مساوية لقيمة الشريط العلوي وكان DOM اللاحق يفوز — الآن مشتقة من الرموز وتحتها)؛ مدخلا «Зарплата от/до» عادا إلى حجمهما الطبيعي (قاعدة flex وهي
.v2-scan-bar .inputتسربت إلى عمود flex الخاص بالفقاعة ووضعت flex-basis بقيمة 200 px كارتفاع — الآن مقيّدة بـ>+ حارس الفقاعة)؛ زر تبديل الكثافة أُزيل بقرار المالك (السباكة بقيت، ومفاتيح i18n أُزيلت ×19). - تحصين سير عمل النشر (F1–F6): مدخل
providerيُتحقق من مجموعة محارفه قبل أي تدبيس في الصدفة؛ تشخيصات hermes تحجب القيم (مرشح مفاتيح غير حساس لحالة الأحرف + قناع قيمة + قطع عند 80 حرفًا في جميع المصارف الثلاثة، مع إخفاء?token=أيضًا)؛ خطوة hermes تحترمinputs.app_dir؛ public_url خلف بوابة https؛ وحارس مكافحة الهبوط إلى إصدارات أقدم لديه 6 مسامير قابلة للتنفيذ (بلا افتراضيات، ترتيب الحارس-قبل-النشر، وregex مراجع صارم). - ذيل المراجعة، بالأحمر أولًا: عودة المائل في استيراد CSV (إعادة الاستيراد تزيل التكرار من جديد)، شريط رأس cv-voice من 4827→13 ms،
statedYearsMinيُحسب بكسل، TOCTOU في التقاط posting-guard، حرف البدل MiniMax CN، تخطي رموز deel، وفحوصات حجم منتقي الاستيراد قبل القراءة. نافذة الاستيراد: تفعيل حارس التنقل، إزالة مدخل الملف عند الإلغاء، قراءة مكررات محمية، وnumعبر reduce. - دفعة UX للمالك: إيقاع رأسي لبطل لوحة القيادة (الأبناء من المستوى المضمّن لحِموا في صندوق سطر واحد)؛ إزاحة الصف النشط بـ −8 px في فهرس المساعدة (قناة مضمنة لكل صف + عمود أرقام)؛ الدرج المحمول (زر إغلاق ✕ مرئي، إعادة تعيين scrollTop، تلاشي –paper الوهمي محصور في
.has-hud)؛ صفحة docs-assistant لم تعد تفيض مع رابط طويل في إجابة (سلسلةmin-widthللشبكة +overflow-wrap: anywhere)؛ شرح «Недавние» (تلميح) + إمكانية مسحها؛ زر حفظ خطة المسار يُعاد تسليحه بعد فشل تحميل؛ التعبئة المسبقة لرابط التقييم لم تعد تحرق نداء LLM على العنصر النائب للّصق؛ وEnter في auto-pipeline يحترم تركيب IME. - التباين (تدقيق WCAG، 296 زوجًا): تدرج docs-fab من 2.43 إلى 6.4:1، زوج toast.success إلى ok-soft (1.75 → AA في الداكن)، قلب btn-dark في البانر إلى
--ink، صيغ فاتحة لـ scan-logbtn/reposts-badge/fab-chip/close، وحدود عناصر النماذج إلى 3:1 (--cv3-input-line، WCAG 1.4.11 — كانت 1.2:1). - مسح بصري: حالة فراغ tracker أصبحت بطاقة بعرض كامل (كانت مقصوصة داخل جدول 760 px عند 390)؛ سطر طرفية scan يُلخَّص بعلامة حذف بدل القص النصفي؛ بطاقة الدردشة العائمة لم تعد تغطي المحتوى عند 390 (هدف 44 px، هامش داخلي 12)؛ حالة فراغ «Application statuses» في لوحة القيادة تتبع نمط v2-empty؛ تلميح «؟» في الإحصاءات ينال فاصلًا + هدف 44 px؛ تبويب الإدخال في خطة المسار يشرح أين تهبط النتيجة؛ ماركداون §1 في المساعدة (18 امتدادًا غامقًا معطوبة).
تغيّر
- اللون المميز من الأزرق → الأحمر القرمزي (بطلب المالك، متناغم مع الشعار، hue 15) — 5 رموز cv3 × 3 كتل سمات؛ نص فقاعة دردشة
docs-assistantيسير على--accent-ink(كان #fff حرفيًا، 2.39:1 في الداكن)؛ وميض funded يسير على--accent-soft. يبقى الخطر على hue 25 بمعالجاته الخاصة. - توثيق: عدّاد جدول الاختبارات في README ×17 (انجراف من حقبة v1.248)، §1 في المساعدة + 18 امتداد ماركداون، «118» في المساعدة fr/it/ta، أسعار المزودين CHECKED_ON 2026-10-30، وحقائق HANDOFF/CONTEXT/TRACEABILITY.
ملاحظات
- امتناع متعمَّد: إعادة تصميم المسح الهيكلي تبقى خارج النطاق (عقد car112 يثبّت التلاشي الحالي حرفيًا)؛ تلاشٍ أيقونة تبديل السمة المتبادل يبقى تبديل
display(عقد Playwright لتبديل السمة يراقبه)؛ مقياس.btn:activeلم يُكرَّر (app.css يملكه)؛ تعاقب الحركة بنية تحتية فقط — بطاقات لوحة القيادة تتبناه لاحقًا؛ ونثر المساعدة ×19 (ذكر الكثافة، ماركداون §1، «118») يركب الموجة التالية من الفان-أوت. - أدلة remote-QA الكاملة: تشغيل موجَّه لـ ja ناجح (376 s / A–G ✓) على v1.262.4؛ وen/it نجحتا سابقًا في حقبة كثيف-الرموز.
Tests 6869 → 6905 (+36) · Playwright 176 · التغطية 98.4 % سطريًا / 89.9 % تفريعيًا · السجل دون تغيير: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.4] — 2026-10-30
أُصلح
jaتنضم إلى لغات التقييم كثيفة-الرموز (ja→ سقف 32768 رمزًا + مؤقّت 480 s). أفصلت إعادة التشغيل الموجَّهة عبر 5 لغات على إنتاج v1.262.3 مهلات التقييم الأربع لتلك الليلة502 · 300 s · 0 chإلى ما هو عابر وما هو حتمي:ar(250 s) وko(291 s) وzh-CN(259 s) اجتازت إعادة تشغيلها، وانحراف اللغة العابر لـruلم يتكرر — لكنjaاصطدمت بالسقف القياسي مرتين بمخرَج صفري (التشغيل الكامل ×19 ذو الرقم 40981578549 والتشغيل الموجَّه 41012725839). فئة الشكل نفسها التي نقلتit/pl. تثبيت بالأحمر أولًا:evalMaxTokens('ja') = 32768،evalTimeoutMs('ja') = 480_000، واللغات الأخرى تبقى على 300 s.
ملاحظات
- امتناع متعمَّد: رقعة أحادية الغرض — إصلاح
jaهو التغيير الوحيد الذي يحمله هذا الإصدار، وهو لا يحمل أي شيء آخر. تبقىar/ko/zh-CNعلى السقف القياسي استنادًا إلى أدلة الليلة (فهي تجتاز؛ وكانت مهلات تلك الليلة عابرة ناتجة عن حمل المزوّد)، وكان انحرافruارتجاف توليد عابرًا لمرة واحدة.
Tests 6868 → 6869 (+1) · Playwright 176 · السجل دون تغيير: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.3] — 2026-10-30
رقعة pl كثيفة-الرموز: remote-QA الكاملة على إنتاج v1.262.1 أمسكت التقييم البولندي وهو يموت عند سقف 300 s القياسي — 502 · 0 ch — مرتين (التشغيل الكامل ×19 ذو الرقم 40960568766 وإعادة التشغيل الموجَّهة من v1.262.2 ذو الرقم 40968958062)، بينما اجتازت 18/19 لغة A–G؛ تنضم pl الآن إلى ta/hi/it بسقف 32768 رمزًا ومؤقّت 480 s، مثبَّتة بالأحمر أولًا (evalMaxTokens، evalTimeoutMs). فئة الشكل نفسها التي نقلت it في v1.262.1. Tests 6867 → 6868.
أُصلح
plتنضم إلى لغات التقييم كثيفة-الرموز (pl→ سقف 32768 رمزًا + مؤقّت 480 s). أمسكت remote-QA الكاملة على إنتاج v1.262.1 التقييم البولندي وهو يموت عند السقف القياسي —502 · openrouter · 300 s · 0 ch— وأعادت إعادة التشغيل الموجَّهة المُرسَلة مع v1.262.2 إنتاجه حرفيًا (تشغيلان 40960568766 و40968958062): 18/19 لغة اجتازت A–G، وitانتهت عند 302 s داخل مؤقّت 480 s كثيف-الرموز، بينما اصطدمتplبالجدار مرتين بمخرَج صفري. مهلة حتمية لا ارتجاف — فئة الشكل نفسها التي نقلتitفي v1.262.1. تثبيت بالأحمر أولًا:evalMaxTokens('pl') = 32768،evalTimeoutMs('pl') = 480_000، واللغات القياسية الـ 18 تبقى على 300 s.
ملاحظات
- امتناع متعمَّد: رقعة أحادية الغرض — إصلاح
plهو التغيير الوحيد الذي يحمله هذا الإصدار، وهو لا يحمل أي شيء آخر؛ محتوى ذيل مراجعة v1.262.2 خرج في إصدار منفصل. - Tests 6867 → 6868 (+1) على فرع الإصدار · Playwright 176 · السجل دون تغيير: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.2] — 2026-10-30
أُصلح
- ذيل مراجعة الموجة — 7 نتائج منخفضة الخطورة، كلٌّ منها بالأحمر أولًا. مداورة الشرطة المائلة العكسية في استيراد CSV: كانت
\في خلية تُكتب مضاعفةً وتُقرأ مضاعفةً، فتفوت إعادة استيراد ملف CSV نفسه إزالة التكرار company+role وقد تنشئ صفًا مكررًا — القارئ الآن يفكّ التهريب\\بعد التقسيم (مداورة الكتابة→القراءة بلا فقد، وإعادة الاستيراد تزيل التكرار). كان تجريد<head>في cv-voice تربيعيًا على الوسوم غير المغلقة — 4827 ms → 13 ms على مُدخل بحجم 64 كيلوبايت الذي يسقّفه المسار. كانstatedYearsMinيشغّل محلّل السنوات كاملًا لكل وظيفة من كل مصدر حتى حين لم يُضبطyears_min— أصبح مؤجَّلًا (lazy)، وذهبت ثواني المعالج في كل مسح كبير. التقاطة حُذفت بين readdir وstatSync كانت تحطّم سرَد posting-guard (TOCTOU — الملفات المختفية تُتخطى الآن). كان الافتراضي CN لـ MiniMax يطابقapi.minimax.cnالتامة فقط — أي عنوان أساسي*.minimax.cnيحصل الآن على نموذج CN. رموز$في Deel غير المراجع السداسية عشرية لم تعد تتسرّب إلى المقتطف حرفيًا. منتقي الاستيراد يفحصfile.sizeقبلfile.text()— سقف الخادم 512 كيلوبايت كان يجيب 413 بعد أن يفسّر المتصفح ملفًا قد يكون ضخمًا — مع إشعارimport.tooLargeمترجم ×19. - تحصين سير عمل النشر (مراجعة workflows F1–F6). كان
providerالمدخل الوحيد الذي يُقحم في الصدفة البعيدة دون تحقق من مجموعة المحارف —'في القيمة كانت تخرج من الاقتباس وتنفّذ شيفرة اعتباطية على الإنتاج؛ يُدرَج الآن في قائمة بيضاء^[A-Za-z0-9_-]+$قبل أي دمج، ولا يستطيع grep حارس المفتاح الاجتياز الكاذب بعد الآن. كانت خطوة تشخيصات hermes تطبع journalctl الخام + مقالب الوحدة إلى السجل العام؛ وكان مرشّحها يفوّت*_API_KEY=بأحرف كبيرة ولا يقنّع شيئًا — الآن حجب مشترك غير حساس لحالة الأحرف + تقنيع القيم + بتر عند 80 محرفًا في المقابض الثلاثة كلها، وسلاسل الاستعلام?token=تُقنَّع أيضًا. كانت خطوة hermes تتجاهلinputs.app_dirوتثبّت/opt/career-ops/src/.envكتابعةً. كانpublic_urlيصل إلى curl دون فحص https (حقن خيار عبر-استهلالية). وحارس منع التراجع — إصلاح حادثة v1.238.0 — لم يكن له بوابة تنفيذية: ستة تثبيتات جديدة في ci-workflows (refs بلا افتراضيات، والحارس يعمل قبل Deploy، وتعبير refs النمطي الصارم). - ذيل نافذة الاستيراد (مراجعة SPA). تُسلَّح النافذة بحارس nav guard نفسه الذي تستخدمه نافذة outcome — التنقل بعيدًا لم يعد يتركها يتيمة فوق عرض آخر. يُزال مُدخل الملف المخفي عند
cancel، لا عندchangeفقط — الإغلاقات المتكررة لم تعد تسرّب مُدخلات إلى document.body. تُقرأplan.duplicatesعبر الصيغة المحمية في المعاينة. تخصيصnumلأداة التتبّع يستخدمreduceبدلMath.max(...spread)— الانتشار يصطدم بحد الوسائط عند ~100 ألف صف.
تغيّر
- التوثيق: بند «118 EN adapters» في دليل المساعدة يحمل العدّ الآن في fr/it/ta (اللغات الـ 15 الأخرى كانت تحمله بالفعل). أُعيد التحقق من أسعار المورّدين على cvstart.org مقابل صفحات التسعير الرسمية — الأربعة كلها دون تغيير، CHECKED_ON → 2026-10-30. جولة انجراف بعد الإصدار أصلحت 42 سطر عدّ/إصدار قديمًا عبر README ×19 وCONTEXT.md وCLAUDE.md وأدلة SDD (بواقي عصر 109/104 وبواقي عصر v1.262.0).
ملاحظات
- امتناع متعمَّد:
window.confirmالأصلي في cv-studio (عصر CAR-179) يبقى — تحويله إلىUI.confirmتابع لاحق، لا بند رقعة؛ تلميح<mark title>للعبارات النمطية يبقى تلميحًا فقط (حد a11y مقبول)؛remote-qa.ymlتحتفظ بـcancel-in-progress: true— إعادة الإرسال تحل عمدًا محل انحدار جارٍ. - remote-QA كاملة على إنتاج v1.262.1: المسارات ×19 ✓ · الموقع ×19 ✓ · الروابط ✓ · LLM حي 18/19 لغة A–G ✓ —
plاصطدمت بمهلة مزوّد واحدة502 · 300 s · 0 ch(ليست من منطقة اللغات كثيفة-الرموز؛ إعادة التشغيل الموجَّهة ترافق هذا الإصدار). - الاختبارات 6841 → 6867 على فرع الإصدار (6864 pass / 0 fail / 3 skip، +26 مقابل v1.262.1) · Playwright 176 · التغطية 98.42 % سطريًا / 89.94 % تفريعيًا · السجل دون تغيير: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.1] — 2026-10-29
رقعة التقييمات الإيطالية: it تنضم إلى اللغات كثيفة-الرموز (سقف 32768 رمزًا + مؤقّت 480 ثانية) بعد أن أمسكها عصر OpenRouter وهي تقتطع التقرير قبل كتلة SCORE_SUMMARY مباشرةً — وأدوات تبديل المزوّد التي جعلت التشخيص ممكنًا تصل في سير عمل النشر.
أُصلح
- تقييم
itمقتطع قبل SCORE_SUMMARY (ذيل CAR-190): remote-QA 40928864980 (أول تشغيل على الأرصدة المعاد شحنها) — تقييمitراوغ 264 ثانية وعاد بـ 15 045 محرفًا عندtok ~15635على سقف 16 384: كتل A–G سليمة، و---SCORE_SUMMARY---مفقود. صنف الشكل نفسه الذي منحtaسقفها في v1.261.1 (CAR-174).itتنضم إلىTOKEN_DENSE_EVAL_LOCALES(ta،hi→ta،hi،it): ميزانية 32 768 رمزًا ومؤقّت 480 ثانية يسريان الآن كلاهما، و/api/evaluate+ auto-pipeline يبقيان على مصدر الحقيقة الوحيد فيllm.mjs. - تقرير
enبلا كتل — خطأ توليد منفرد: التشغيل نفسه رأى تقييمenواحدًا يعود سليم اللغة بلا أيٍّ من كتل A–G؛ إعادة تشغيل موجَّهة نجحت نظيفة (21 091 محرفًا، A–G ✓). لا يُضاف إلى مجموعة كثيفة-الرموز — خطأ واحد ليس تاريخًا.
أُضيف
- سير عمل النشر:
mode=hermesوmode=provider(ذيل عمليات CAR-190):mode=hermesيعيد تشغيل بوابة Hermes ويطبع تشخيصًا كاملًا (ملف الوحدة مع تجريد الأسرار، المستمعون قبل/بعد، مجلة sudo، مجسّات لكل منفذ، رؤية التطبيق نفسه لـHERMES_BASE_URL، رصيد أرصدة OpenRouter)؛mode=providerيبدّلLLM_PROVIDERبحارس وجود المفتاح (يرفض حين يكون*_API_KEYللمزوّد الهدف غائبًا) ويعيد تشغيل التطبيق — هكذا انتقل الإنتاج إلىopenrouterحين نفدت أرصدة Hermes في منتصف الطريق. حارس ref لوضع النشر يُدقَّق لـmode=deployفقط، فتعود إرساليات recon/verify للعمل (تغيير المدخلات المطلوبة في عصر v1.261.3 كان قد أسكتها).
ملاحظات
- امتناع متعمَّد:
enلا يُضاف إلى مجموعة كثيفة-الرموز — تقرير واحد بلا كتل هو خطأ توليد، لا تاريخ حجم. - امتناع متعمَّد: توجيه اللغة المدعَّم للـ ta لا يُوسَّع إلى
it— لم يُلاحظ أي انحراف لغوي في الإيطالية. - امتناع متعمَّد: تسجيل فيديو العرض التوضيحي الجديد لواجهة UI-v2 يبقى على عاتق المالك (CAR-141) — صفحة الهبوط تُضمِّن الآن عبر
youtube-nocookie.comعلى أي حال. - الاختبارات 6841 → 6841 على فرع الإصدار.
[1.262.0] — 2026-10-29
الإصدار الثانوي لمزايا المنبع: لوحة Deel تنضم إلى الماسح (السجل 123)، وملف CSV لأداة تتبّع أخرى يُستورد مباشرةً إلى #/tracker، وبوابة سلامة posting-guard وفحص صوت السيرة الذاتية يصلان كتتابعات/lints، والماسح يتعلم فلتر سنوات الخبرة، وأزرار Apply بسبع لغات إضافية تتوقف عن القراءة كأنها مفقودة — إضافةً إلى استبدال النموذج الافتراضي المتقاعد لـ MiniMax، وتوقّف تلفيق إعادة النشر بين المصادر.
أُضيف
- مصدر لوحة Deel (CAR-184): السجل 123 مصدرًا = 118 EN + 5 RU · 118 محوّلًا — يكتشف تلقائيًا لوحات المستأجرين
jobs.deel.com/<slug>(Klarna وغيرها)؛ وتحميل flight في Next.js يحمل الجرد كله في طلب واحد (المسميات، المواقع، ترتيب العمل، التواريخ، الوصف)، ومسار/api/المحظور لا يُلمس أبدًا، والمستأجر الذي يخدم وظائفه في مكان آخر يجيب بإعادة توجيه يرفضها المصدر بالاسم، والتعويض متعمَّدًا غير مُعيَّن (مبالغ بلا مدى دفع تكون تخمينًا)؛ بوابات العدّ ×5 + المساعدة §17 ×19. - استيراد CSV لأداة التتبّع (CAR-181):
POST /api/tracker/import-csvبمعاينة dry-run والتزام مقفل — اقتباس RFC-4180، وتواريخ بصيغ ISO / اليوم أولًا / اسم الشهر، ومراحل أداة التتبّع الأجنبية تُطوى عبر الحالات القانونية (مرحلة مجهولة تحطّ كـ Evaluated مع ملاحظة، ولا تُهملى أبدًا)، وإزالة تكرار بعنوان URL المطبَّع للنشر المقروء من خلية رابط markdown أو عمود Notes، وحدود 512 كيلوبايت / 2000 صف؛ يكتسب#/trackerزر Import CSV مع نافذة معاينة، وi18n ×19. - تابع بوابة النشر (CAR-182):
POST /api/runners/posting-guard— بوابة سلامة JD الحتمية صفرية-LLM من المشروع الأصل، تُحلَّل برقم التقرير عبر قاعدة بادئة الالتقاطات فيjds/(مبطَّنة أم لا، تُقارن كعدد صحيح) أو مسارٍ منقَّح صريح؛ ويحصل الابن على argv فقط، وسقف 30 ثانية، وعقد فشل-لطيف؛ وإجراء «Posting guard» على#/reports/:slugيصيّر النتائج، وi18n ×19. - فحص صوت السيرة الذاتية (CAR-188): 27 عبارة نمطية من السير الذاتية (
passionate aboutوproven track recordوleveragedوspearheadedوdelve…) زائد إبداقات الشرطة (نطاق سنوات كـ 2022–2024 ليس قرينة؛ و20–30%قرينة) بوصفهاPOST /api/cv-studio/voice-checkللقراءة فقط وبطاقة#/cv-studioتُبرز التطابقات بالضبط؛ وتكبر قائمة Tailor إلى ست ثوابت؛ وi18n ×19. - فلتر سنوات الخبرة للمسح (CAR-180): محلل jd-years (65 صياغة، لا يُسقط عند الشك أبدًا) يقرأ الحد الأدنى المعلَن من أوصاف النشر، وخيار
years_min:الجديد في portals يتخطى المنشورات دون التأهيل بوصفهاskipped_experience(حالة مراقبة في السجل لا تثبّت عنوان URL أبدًا)، ويرافقyearsMinلقطة المسح لواجهة مستقبلية. - أزرار Apply بسبع لغات إضافية (CAR-185/189): الفيتنامية
Nộp đơn ứng tuyển، والبلغاريةКандидатствай/Кандидатстване/Външно кандидатстване(الاسم مرساة إلى بداية التسمية — روابط مقالات النصائح ليست Apply)، والهولنديةSolliciteer/Solliciteren، والإسبانية¡Apúntame!/Postularse(تسميات، لا الفعل — روابط الأسئلة الشائعة لم تعد تعني شيئًا)، والصينية申请职位/投递(مرساة إلى العنصر كله) — المنشورات الحية على تلك اللوحات تتوقف عن القراءةno_apply_control.
أُصلح
- النموذج الافتراضي لـ MiniMax (CAR-187): يُستبدل الافتراضي المتقاعد
MiniMax-Text-01بـMiniMax-M3.1-Flashعلىapi.minimax.ioوMiniMax-M3علىapi.minimax.cn؛ وعنوان URL الأساسي مثبَّت للمورّد (يُرفض مضيف غير مورّد وقت التشغيل ولا يبلغه المفتاح أبدًا)؛ وتلميحة الإعدادات ×19 تسمّي الافتراضيات الجديدة. - إعادة النشر تتطلب المصدر نفسه (CAR-186): دور معروض على LinkedIn وعلى Greenhouse لصاحب العمل لم يُعد يُبلَّغ إعادة نشر — تنقسم العناقيد الآن بحسب
sourceHost()، التي تطوي النطاقات الفرعية الإقليمية فقط على المواقع المعروفة (de.linkedin.com≡www.linkedin.com، لكنca.example.comيبقى منفصلًا)، وتطوي أسماء مضيفي Greenhouse البديلة في مصدر واحد، وتشذّ نقطة لاحقة. - انجراف لغة تقييمات التاميلية (CAR-183): توجيه تاميلي معزَّز يجلس الآن في ذيل المحث المتقلب بجوار ميزانية الحجم (فتحة CAR-174) — تعود تقارير remote-QA بالتاميلية بعد الانجراف المتقطع المرصود في v1.261.2.
ملاحظات
- امتناع متعمَّد: يخرج تابع بوابة النشر بفشل-لطيف — الشوكة لا تحمل
posting-guard.mjsللمشروع الأصل بعد (طلب السحب #6146 في المنبع ما يزال مفتوحًا)، ليجيب الطرف{available:false, reason:"script-not-found"}حتى يجيئه مزامنة المشروع الأصل. - امتناع متعمَّد:
yearsMinلا يظهر كشريحة واجهة في#/scanفي هذا الإصدار — الحقل يأتي في اللقطة، والفلتر عبر إعداد portals فقط. - امتناع متعمَّد: تغييرات Machine Summary المنبعية في modes/reports (#6161/#6160/#6157) غير منقولة — تصل مع المشروع الأصل المُوزَّع، لا كمرايا web-ui.
- الاختبارات 6734 → 6841 على فرع الإصدار؛ مفتاح إزالة التكرار للماسح لم يُلمس (سلوك تطبيع URL لم يتغير).
[1.261.3] — 2026-10-28
رقعة إكمال التصميم: المرحلة الثالثة من تصميم Lovable (الكثافة + تقاعد المرجاني بالكامل)، ومجموعة مضيفين للمسح (32 شركة، 10 لكل مضيف)، وستة إصلاحات موقع في مزوّدي upstream، ومصدر Trakstar Hire (السجل 122)، وتراجع CV Studio + حارس غير المحفوظ — إضافة إلى إصلاحات P3 من الانحدار النهائي وتوازن التوثيق.
أُصلح
- تسمية «related» في عناقيد الخريطة من 3.16:1 إلى 4.68:1 (في السمتين معًا): أُغمِّق
--map-score-midالفاتح إلى#567b75(المقترح#5f7f7aقِيس 4.37 فقط — كان لا بد من درجة أغمق إضافية)؛ الجانب الداكن كان 4.98:1 أصلًا بلا مساس. تثبيت بالأحمر أولًا فيmap-cluster-visual. - حلقة تركيز رابط التخطي: آخر مخطط حرفي
#ff385cصارvar(--accent-c)— كل حلقات التركيز الـ78 تتبع الآن رمز التمييز. - طبولوجيا التمييز في
.tab-btn.is-active(#584، المرحلة 3): كان العنصر يمزج ثلاث عائلات لونية (غسلة مرجانية + نص خطر + إطار أزرق)؛ أصبح زوج تمييز/soft واحدًا. - إصلاحات الموقع في مزوّدي upstream ×5 (#580, CAR-176): علامة
Fully Remoteفي workday (ليست مكانًا)، وتوزيع telecommuting في workable + الولاية فقط عند غياب المدينة، والفاصلة الزائدة في successfactors، وحدّ الكلمة لكلمة remote في lever، وتسميات icims المسبوقة بـLocation. - http-json: لا إعادة محاولة عند انتهاء المهلة (#580) — إحباط الموعد النهائي ليس عابرًا في كلا مساعدي إعادة المحاولة (قاس upstream ~94 ثانية على لوحة Ashby واحدة عند مهل 30 ث × إعادات محاولة).
- توازن التوثيق (#587): آخر عدّادات من عصر 17/18 في HANDOFF/CONVENTIONS/README (نال uk قسم «Локалізація» المفقود؛ امتد سجل الـ§ إلى §32/§33 — تحقّق حساب الـ33 H2).
أُضيف
- المرحلة الثالثة من تصميم Lovable (#584): رموز الكثافة فعّالة — صفوف الجداول ≈32px، وعناصر التحكم 30px، والرقائق 24px (استثناء التباعد في WCAG 2.5.8)؛ انتقل كل مخلف rgba مرجاني إلى أزواج cv3 (
.dash-heroو.badge-badوالهالات و.tab-btn.is-active)؛ أُضيف إعلان--ease-outوصار TOKEN_HANDOFF فارغًا؛ عقد.callout--ok/--danger. - مصدر Trakstar Hire (#583, CAR-177): السجل 122 مصدرًا = 117 EN + 5 RU · 117 محوّلًا — تثبيت مضيف jsapi.recruiterbox.com، والسير بالإزاحة مع توقفات قصيرة/فارغة/مكررة، والحفاظ على الجزئيات، ووسم
trakstarTruncated؛ بوابات العدّ ×5 + المساعدة §17 ×19. - مجموعة مضيفين للمسح (#579, CAR-178): حتى 32 شركة بالتزامن، بسقف 10 لكل مضيف (نمط المحدِّد المُميَّز بمفتاح في upstream) — اللقطة مطابقة بايتًا بايتًا للتشغيل المتسلسل (بوابة محاكاة توقيت بالأحمر أولًا).
- تراجع CV Studio + حارس غير المحفوظ (#582, CAR-179): كومة تراجع محدودة (30) فوق نتائج تشغيل الذكاء الاصطناعي مع
Cmd/Ctrl+Zآمنة على غير QWERTY، وحارس التغييرات غير المحفوظة عند مغادرة المسار (تحسُّس حيّ للوسم، وتأكيد/تراجع/beforeunload)، وi18n ×19. - إصلاحات مزوّدي upstream مُختبَرة ×17 (جزء من CAR-176)؛ يسمّي ملخص remote-QA مصادر المسح الفاشلة +
tok ~Nلكل تقييم (#567، موجودة أصلًا في v1.261.2 — استُخدمت قابلية الملاحظة لفرز هذا الإصدار).
ملاحظات
- التمييز أزرق الآن (مفهوم Lovable): تتبع الإجراءات الأساسية والحالات النشطة وحلقات التركيز
--cv3-accent؛ والأحمر محجوز للخطر (.btn-dangerوtoast.errorونص الخطر). لا يبقى المرجاني إلا في أصل شعار PNG (قرار المالك). - الكثافة: صفوف الجداول ≈32px / عناصر التحكم 30px / الرقائق 24px — استثناء التباعد في WCAG 2.5.8 موثَّق؛ أُعيدت كتابة كناري 44px من v1.26.1 على عقد الرموز.
- CodeQL: أُغلقت كل التنبيهات المفتوحة العشرة (أُستبعدت 4 كإنذارات كاذبة مع تسبيب: فئتا llmRateLimit/atomicWrite الموثَّقتان؛ وأُصلحت 6 في المصدر).
- الاختبارات 6655 → 6734 على فرع الإصدار؛ لم يتغيّر سلوك مصادر الماسح شيئًا عدا المصدر الجديد Trakstar.
[1.261.2] — 2026-10-28
رقعة الثبات والصقل: ذاكرة الترميز الجغرافي المؤقتة تنجو من انهيار في منتصف الكتابة (CAR-173)، وUI.md يصيّر استمرارات النقاط والقوائم المتداخلة، وتُغلَق تسريبات مفاتيح النص المصيَّر في حزم المساعدة ×17، وينال التقييم سقفًا للرموز بحسب اللغة لـ ta (CAR-174)، وتُعاكس عناصر الواجهة RTL عبر الخصائص المنطقية (85 نتيجة)، وتُعاد تأطير لقطات الخريطة ×19 وتجتاز عناقيد الخريطة التباين في الداكن — إضافة إلى المرحلة الأولى من تكامل تصميم Lovable (ورقة tokens-v3.css السلبية)، واستكمال التوثيق (مراجعة الإصدار + المواصفات)، وإعفاءات التغطية لتباين عقد CI.
أُصلح
- فقدان الكتابة الممزَّقة في ذاكرة الترميز الجغرافي المؤقتة (CAR-173, #562): كان كلا مسارَي الإفراغ (إفراغ الإدراج المؤجَّل، وإفراغ الخروج) يكتب
.cache/geocode.jsonعبرwriteFileSyncمجردة — بترٌ ثم كتابة — فكان الانهيار أو OOM أو SIGKILL في منتصف الكتابة يترك ملفًا ممزقًا ويرميJSON.parseفي الإقلاع التالي، فيُهدر بصمت ذاكرة الترميز الجغرافي الدائمة بأكملها (أسابيع من ميزانية Nominatim)، لا يومها فقط. يمرّ موقعا الكتابة الآن عبرfile-lock.mjs::atomicWrite(ملف مؤقت في المجلد نفسه → rename → unlink عند الفشل) — العقد نفسه الذي طبّقه FULL-R1/FULL-M1 علىpipeline.mdوcv.mdوprofile.ymlوcareer-planومدخل الدفعات والذاكرة. وتحقّقت آلية الإفراغ في CAR-142 ذاتها (إفراغ الإدراج المؤجَّل، وإفراغ الخروج، والإغلاق المحدود) سلامتها بالأحمر أولًا: يثبّت الاختباران (a)/(b) أن الإدراجات تبلغ الملف خلال نافذةGEOCODE_SAVE_MSوأنه يبقى JSON صالحًا؛ و(c) بوابة آلية زائد تشغيلات سلوكية لمسارَي الإفراغ معًا تؤكد عدم وجود مخلفات مؤقتة وملفًا قابلًا للتحليل. - استمرار القوائم في
UI.md(#563): كان معالج القوائم يستهلك أسطر-/*المتتالية فقط، فكان سطر الاستمرار المُزاح بعد نقطة يسقط من<ul>المُصدَرة وتتخطى مرحلة الفقرات القطعة — فتسرّب الاستمرار نثرًا خامًا بعلامات**/backtick حرفية (~95 مقطعًا معلقًا لكل لغة عبر حزم المساعدة؛ en.md 95، ru.md 104). ينضم سطر الاستمرار — المسبوق بمسافة بيضاء، وليس كتلة جديدة (عنوان، أو نقطة، أو بديل سياج ملفوف بـ NUL، أو فراغ) — الآن إلى<li>السابق كنص موصول بـ<br/>، مع تشغيلinline()لكل سطر حتى لا تتزاوج علامات التوكيد عبر الوصلة؛ وحارس بديل السياج هو أول محرف NUL، لا مطابقة رمز مجرد. تبقى نقاط-المتداخلة، والقوائم المرقّمة، والأسوار داخل القوائم، والعناوين داخل القوائم فجوة موثَّقة منفصلة (موجة التوثيق التالية). - تسريبات مفاتيح النص المصيَّر في المساعدة ×17 (#561): وجد remote-QA 85 مفتاح i18n خامًا مرئيًا في المساعدة المصيَّرة (السبب الجذري مثبَت بإعادة الإنتاج: الاستهلاك نفسه للنقطة ذات السطر الواحد في
UI.md— استمرار ملتف مصدَر كنص خام أبقى backtick حرفية؛ ووُضعت أقسام المساعدة في v1.260/261 نقاطًا متعددة الأسطر). فُكّت 163 نقطة إلى سطر واحد عبر 17 لغة — مسافة بيضاء فقط، دون لمس كلمة مترجمة واحدة (تحقق قديم/جديد). بوابة جديدةtests/help-rendered-keys.test.mjsتصيّر كل حزمة عبر السلسلة الحقيقية (stripGithubOnlyBlocks+UI.mdمحمَّلة عبر vm) وتفشل عند ظهور أيٍّ من مفاتيح 1,711 في النص؛ بالأحمر أولًا عبر 17 لغة → أخضر. أدوات إعادة الإنتاج مشحونة في المستودع:scripts/remote-qa/help-render-scan.mjs(vm) +help-render-crosscheck.mjs(DOM حقيقي). - يؤكد Ctrl+K في remote-QA عقد لوحة CAR-122 (#561): يصير
prod-regression.mjsيتوقع لوحة الأوامر بعد Ctrl+K (.nav-v2-palette[role=dialog]+ التركيز فيnav-v2-input) أو تركيز البحث القديم كبديل، بدل قبول أياً منهما بصمت؛ يقفل الاختبار الوحدويtests/remote-qa-ctrl-k.test.mjsستة سيناريوهات على DOM وهمي، بالأحمر أولًا 0/6 → 6/6. - تأطير لقطات الخريطة ×19 (#560): تقرير المالك عن
images/job-map-en.png— نصف بحث الشريط العلوي + h1 مبتور في الأعلى، وشريحة رمادية من القائمة الجانبية عند الحافة اليمنى، وعنقود علامات مبتور بالإطار قرب لندن، وخط أفقي أبيض عبر الخريطة عند ~2/3 الارتفاع. يصيرcapture-map-screenshots.mjsينتظر إفراغ طابور الترميز الجغرافي (located + noLoc === total، لا عدّاد N/N — صفوف Remote بلا موقع هيكليًا، فلم يكن الانتظار القديم يتمم قط)، ويخفيheader.topbarو#notif-drawerللقطة، ويقصّ صندوق.job-map-pageبالضبط (لا لوحة مبتورة بحافة الإطار)، ويبتعد خطوتين حتى لا يجلس عنقود منصفًا، ويثبّت ارتفاع الخريطة ويأخذ لقطة إطار عرض مجردة (captureBeyondViewportيعيد أخذ عينات طبقة البلاطات المركّبة ويرسم شرائط بيضاء عند حدود صفوف البلاطات)، ويحاذي حاوية الخريطة على الأعداد الصحيحة. أُعيد التقاط لقطات job-map الـ19 كلها. - فقاعات عناقيد الخريطة — تباين السمة الداكنة + ملاءمة التسمية (#572): مسح المالك P2/P3 — كانت حلقات العناقيد في السمة الداكنة تقوم على تعبئة بيضاء ثابتة (1.83:1)؛ تأخذ الحلقات الآن
var(--paper)مع أرقام لوحة النتيجة (قياسًا 4.98:1 فأكثر، والممتلئة 9.53:1؛ والشريحة الأدنى غير قابلة للتلوين رياضيًا على الداكن وتحافظ على 6.1:1 عبر مسارdata-dimصادق)، وتصير تسميةrelatedتناسب فقاعتها (ملاءمة خط عبر rAF، والأرقام لا تنكمش أبدًا). - تبديل اللغة في
#/scan— إعادة تسليح الهياكل العظمية (تكملة #534، وكيل قيد الطيران، يصل قبل الوسم): تكملة لإصلاح المالك في v1.261.0 (#534) — الهياكل العظمية المعاد تسليحها عند إعادة رسم تبديل اللغة لم تعد تنجو من إعادة جلب مكتملة. - انحراف التوثيق (CAR-139، وكيل قيد الطيران، يصل قبل الوسم): عدّادات README ×19، وHANDOFF ×19، وحقائق CONVENTIONS يعاد مزامنتها مع حالة السجل/الاختبارات الحية.
أُضيف
- مراجعة الإصدار + استكمال المواصفات (توثيق، #559/#558):
docs/reviews/REVIEW-2026-10-28-v1.261.1.md(موجة v1.261.0/v1.261.1 مراجَعة مقابل مواصفاتها) واستكمال مواصفات SDD للموجة نفسها — يسمّي ذيل BACKLOG الآن الفجوة المتبقية (اختبارات مخصصة لـsources/habr.mjs). - مسح RTL العميق (#571): يجوب حزام AR مسارات 39 × LTR مقابل RTL (انعكاس X، وفيض، وقصّ، وبصمات text-align) — 85 نتيجة مُصلحة: عناصر الواجهة الثابتة (toast، والشريط الجانبي، والدرج + زر إغلاقه ×، وdocs-FAB، وusage-HUD، وskip-link) نُقلت إلى
inset-inline-*/border-inline-*، والجداول إلىtext-align: start/endعبر 17 ملف عرض + مكتبتين، وأُزيلت[dir=rtl] text-align:rightالشاملة (كانت تحارب توسيط عمود نجمة المسح)، ونُقل عزل عمود النتيجة في CAR-58 إلى span باسمltrNum. - حزام إمكانية الوصول بلوحة المفاتيح (#570): يجوب
tests/playwright-a11y-keyboard.mjs11 مسارًا (ترتيب Tab/الفخاخ، ومؤشرات التركيز، والطبقات عبر Escape، وEnter/Space) — 0 عيب إنتاجي؛ تغطية الانحدار جديدة. - مسح غير المترجم في i18n (#565): تُرجمت 36 قيمة مطابقة للإنجليزية ×9 لغات (
*.rolePh، ومفاتيح الإعدادات، وبيان ta) + حارس مسح بقائمة سماحية مغلقة؛ وتدقيق i18n للموقع (cvstart.org) (#568): 20 مفتاحًا × 18 لغة مترجمة (كانت كتلةdemo.*/stats.t.*/showcase.tab*كلها إنجليزية في كل مكان)، وحُذف مفتاح ميت واحد ×19. - قابلية الملاحظة في remote-QA (CAR-175, #567): يسمّي الملخص مصادر المسح الفاشلة (
stderr samples, redact-before-truncate) ويطبعtok ~Nمن استهلاك المزوّد؛ ويعيش المنطق فيsummary-parts.mjsنقيًّا مع بوابة انحراف. - قوائم العلامات المتداخلة في
UI.md(مستوى واحد، #564): تُصيَّر نقاط-كـ<ul>متداخلة (آمنة على بديل السياج) — اختفت آخر مقطعين نثريين معلقين لكل لغة. - تكامل تصميم Lovable — المرحلة 1 (#566) / المرحلة 2 (فرع، يصل قبل الوسم): تنقل
public/css/tokens-v3.cssمفهوم Lovable حرفيًا (أسطح oklch من 0 إلى 3، وأزواج حبر موسومة AA، وعائلة التمييز، وsoft+ink لكل من ok/warn/danger/info/neutral، وشرائط النتيجة A–G × سمتين، والكثافة + التركيز + الظلال)؛ وتنشّط المرحلة 2ه على أسماء الرموز القائمة (انقسام التمييز أزرق/خطر، وشرائط النتيجة + callouts على رموز cv3) مع تحديث بوابات التباين/الدور/الداكن. - سقف رموز التقييم بحسب اللغة (CAR-174, #569):
evalMaxTokens(lang)— تطلب ta/hi 32768 (أعاد ثلاثة عملاء SDK الحصر عند 16384؛ أُصلحت الطبقتان)، مع ميزانية حجم تاميلية في التوجيه (≤5 جمل لكل كتلة، ≤900 كلمة) — فقد قُطع تقرير ta في remote-QA للإصدار v1.261.1 عند حد رموز الإخراج (بلا الكتل B–G + SCORE_SUMMARY). - استكمال الإصلاحات الحقيقية في CodeQL: استبدلت أدوات التصيير الجديدة في QA معالجة الكيانات اليدوية بمراحل تقسيم بنيوية +
htmlToText({cap: Infinity})؛ وتثبّت تأكيدات التنقيح الإخراج المقنَّع بدقة؛ وأُسقطت ثوابت حزام RTL غير المستخدمة. - سياسة إعفاء التغطية لتباين عقد CI (habr #558, states #561): تنضم
sources/habr.mjs(فروع node-matrix في CI 87.23 مقابل المحلي ≥89) وstates.mjs(CI 86.49 مقابل المحلي ≥89) إلى الإعفاءات فيscripts/coverage-baseline.json— الملفات التي تغطية فروعها المقاسة في CI تقل بنيويًا عن الحد المحلي بسبب تباين إصدار node تُعفى بدل خفض البوابة كلها.
ملاحظات
- عقد Ctrl+K (CAR-122): تفتح المقطوعة لوحة الأوامر — فهي لا تركّز صندوق البحث مباشرةً؛ بل يُركَّز البحث من اللوحة. يؤكد انحدار الإنتاج في remote-QA هذا حرفيًا الآن (#561).
- إغلاق النتائج الزائفة في CodeQL ×5: تنبيهات
js/missing-rate-limitingعلى main تنتظر رمزsecurity_events— إجراء مشغّل، لا تغيير كود. - وصل بعد قطع الفرع: #561/#562/#563/#564/#565/#566/#567/#569/#570/#571/#572 مدمجة كلها إلى main؛ ويتكامل وكيلان #534-skeleton وCAR-139 قبل الوسم. تبقى قوائم العلامات المتداخلة أبعد من مستوى واحد وهندسة العروض كثيفة الـ inline فجوتين موثَّقتين.
- الاختبارات 6609 على فرع الإصدار (+15 منذ v1.261.1؛ و~13 أخرى من #561 عند الدمج — ملفا بوابة جديدان)؛ الاختبارات الحمراء الوحيدة قبل الـ fan-out هي بوابات توازي CHANGELOG ×19 (fan-out اللغات هو خطوة المنسّق التالية)؛ لم تُمَس مصادر الماسح (السجل 121 = 116 EN + 5 RU · 116 محولًا).
[1.261.1] — 2026-10-28
رقعة العميل من ضمان الجودة الإنتاجي: إصلاح انهيار من فئة P1 في #/two-pager، وعمل Ctrl+K على التخطيطات غير QWERTY، وموجة الجوال 390px (فيض docs-assistant، وتداخل رقاقة الخريطة، ومنصة بـ 39 مسارًا)، واكتمال CAR-137 (أخطاء محددة، وv2empty ×5، وتلميحات ×13 + صفحات الأوضاع)، ووصول CAR-140 بلقطات شاشة v2 حقيقية في كل مكان.
أُصلح
- TDZ في two-pager (CAR-170, P1, #554):
Cannot access 'previewTimer' before initialization— كان محرر الوسوم المحفوظة يطلقonChangeأثناء البناء لكل رقاقة مستعادة بينما حلقة البناء تقع نحويًا فوقlet previewTimer، فانهار عرض#/two-pagerبأكمله (بلا h1، ×19 لغة). يعيش الجدوَل والربط الآن فوق الحلقة؛ ويجري اختبار سلوكي وحدةَ العرض الحقيقية — الخطأ الإنتاجي ذاته قبل الإصلاح، وصفحة مُصيَّرة بعده — إضافةً إلى بوابة انحراف للترتيب النحوي. - Ctrl+K على التخطيطات غير QWERTY (CAR-172, #554): كان كلا معالجَي المقطوعة يطابقان
e.keyوحده — على تخطيط روسي تصل المقطوعة بصيغةkey='л' code='KeyK'فلا تفعل شيئًا. أصبحت المطابقة بـe.code === 'KeyK'في nav-v2.js وapp.js؛ وأُعيد إنتاجها في متصفح حقيقي بمقطوعة اصطناعية «л»/KeyK. يُعاد التأكيد على عقد CAR-122 (انظر الملاحظات). - فيض docs-assistant عند 390px (CAR-172, #554): كانت رقاقات البدء في CAR-136 بصفة
.btn(بلا التفاف،flex-shrink: 0) — عنصر واحد غير قابل للكسر بعرض 418px دفع#/docs-assistantإلى 56px بعد إطار عرض 390px؛ ونمط الانكماش من CAR-146 (في v2-llm.css، وبوابات CSS ذات الـ 800 سطرًا بلا مساس) يعيده إلى الصفر. - تداخل رقاقة الخريطة عند 390 (#552): في إطار عرض 390px كانت رقاقات ميتا الخريطة تتداخل مع صف CTA (map.css).
- CAR-137 — أخطاء محددة + v2empty ×5 (#550): خمس حالات ارتداد أخطاء عامة (‘Error’ / ‘failed’) صارت مفاتيح محددة قابلة للتنفيذ — فشل POST للتقييم، وبث auto-pipeline بلا حدث ختامي، وإضافة المسح→خط المعالجة، وتحميل عناقيد إعادة النشر، وتراجع خط المعالجة؛ وتنضم آخر خمس حالات فارغة مسطحة (
#/reports,#/usage,#/portals,#/activity,#/dashboard) إلى نمط CAR-124 v2empty (شرح + مثال موسوم aria-hidden + إجراء مُوصَّل مسبقًا؛ 15 مفتاحv2empty.*جديد، وحُذفت أربعة مفاتيح ميتة من سطر واحد) — كلها ×19 قاموسًا، وأُعيد توليد اللقطة (snapshot). - CAR-137 — HelpHint ×13 + عدة صفحات الأوضاع (#550): يقع تلميح «؟» السياقي الآن على عنوان H1 لكل صفحة متبقية (خط المعالجة، والتقارير، ولوحة التحكم، وcv، والبورتالات، والاستخدام، والنشاط، والتقييمات، والخريطة، والصحة، وdocs-assistant، والإعدادات) وعلى صفحات الأوضاع الثمان عبر العدة (كل إعداد في MODES يحمل
hintKey، ويُصيَّر عبرHelpHint.title).
أُضيف
- منصة الجوال 390 (#552): مسح Playwright لكل مسارات SPA (31 مسارًا كانونيًا + 8 صفحات أوضاع = 39 مسارًا) عند 390×844 بمجموعة بذور — تحقق من التجاوز الأفقي لكل مسار (scrollWidth مقابل clientWidth، بهامش 1px، مع تسمية العنصر الأوسع) إضافةً إلى تحقق إصابة CTA (لا شريط ثابت ولا درج ولا FAB يغطي CTA أساسيًا)؛ اختياري، ويتجاوز بلطف دون ثنائي المتصفح، بلا شبكة.
- لقطات v2 حديثة ×48 (CAR-140 المرحلة A، #551): لقطات شاشة لواجهة v2 حقيقية من مُثبِت معزول في CI ببذور — لوحة تحكم ×19 + خريطة وظائف ×19 (أول ظهور لـ job-map-ta، وjob-map-vi جديدة) + مسح/خط معالجة/متتبع/تقارير × en/ru — تغذي README والمساعدة وصفحة الهبوط.
- لقطات شاشة حقيقية لـ cvstart.org (CAR-140 المرحلة B، #553): اختفت الفواصل النائبة من CAR-140 — تعرض صفحة الهبوط لقطات v2 الفعلية (عرض خريطة الوظائف + صفوف اللقطات، ×19 لغة هبوط).
- تلميحات CAR-137 (#550): 21 مفتاحًا مترجمًا جديدًا ×19 (
help.hint.*×20 + مفاتيحhintKeyلصفحات الأوضاع) — كل صفحة تشرح نفسها الآن في محلها.
ملاحظات
- عقد Ctrl+K (CAR-122): تفتح المقطوعة لوحة الأوامر — فهي لا تركّز صندوق البحث مباشرةً؛ بل يُركَّز البحث من اللوحة. يُستبدَل سطر قائمة التحقق في QA للإصدار v1.261.0 «Ctrl+K фокусит поиск»؛ ويحمل موجز QA للإصدار v1.261.1 الفحص المحدَّث.
- إصلاحات CodeQL الحقيقية (#547): أُغلقت 4 تنبيهات (تكرار المفاتيح الحرفية في content.mjs جُعل بنيويًا، ومسح lint) — وصلت بعد الإصدار على main للإصدار v1.261.0 قبل هذه الرقعة؛ وذُكرت هنا للاكتمال.
- الاختبارات 6582 (+51)؛ ومجموعة المتصفح 171–172 نجاح / 0 فشل / 1 تخطٍ اختياري؛ وتعمل منصة الجوال 390 مستقلة (
node tests/playwright-mobile-390.mjs). لم تُمَس مصادر الماسح (السجل 121 = 116 EN + 5 RU · 116 محولًا).
[1.261.0] — 2026-10-28
اكتمال موجة المراجعة الشاملة في v1.261.0 (وصلت كل ملاحظات HIGH وMEDIUM)، وإصلاح تبديل اللغة ببلاغٍ من المالك، وإصلاحات جودة التقييم، وانتشار المساعدة ×18، وصفحة الهبوط cvstart.org v2 — إضافةً إلى 4 مواصفات SDD/OpenSpec توثّق الموجة. ووصل كل إصلاح عبر إصلاحٍ فوري بأدلة أحمر→أخضر ومراجعة بسياقٍ جديد من GLM-5.3-Flash.
أمن
- FULL-R1 — بوابة CSRF على طلبات acting-GET وكتابات خط معالجة مقفولة وذرية (#519): بوابة
Sec-Fetch-Site/Origin/Referer على/api/stream/*و/api/run/*و/api/geocode(تصديرACTING_GETوبوابة تغطية ثابتة)؛ وكل قراءة-تعديل-كتابة علىdata/pipeline.mdوdata/last-scan.jsonتحتwithFileLockمعatomicWriteالجديد (ملف مؤقت في المجلد نفسه → rename → unlink عند الفشل). - FULL-R2 — عنقود SSRF في المصادر (#514):
rss.mjsبـ https إلزاميًا مع رفض العناوين الخاصة؛ ونحو 25 مصدرًا بـfetchImplخام انتقلت إلى نواقل محمية؛ والمرايا مثبَّتة؛ والتحقق من التحويلات لـ habr/hh/geekjob/getmatch؛ وdelay(ms, signal)مشتركة. - FULL-R4 — تلف النثر في
stripDangerousMarkdown(#513/#518): تُزال المخططات (schemes) في سياقات الروابط والخصائص فقط؛ وتُفكّ الكيانات في نسخة للكشف وحده («JavaScript: React, Node» و«R&D» تنجوان). - FULL-M2 — تحصين الناقل (#520):
safeGetتحترمtimeoutMsمع إشارة المتصل (متحكم الجسر)؛ وguardResolvedHostتفشل مغلقًا عند خطأ DNS. ويضيف #525 تجريد ترويسات بيانات الاعتماد عند التحويلات عبر الأصل، وفصل مستمع الناقل في كل مسار استقرار، وإصلاح انهيار إشارة مُجهضة مسبقًا. - FULL-M4 — الشعار/الدفعي (#523): يتحقق الشعار من البايتات السحرية (magic bytes) على كل المسارات (لا يمكن لـ
image/pngكاذبة أن تحمل SVG)، ويحصر content-type فيimage/*لحظة التخزين، وذاكرة مؤقتة خاصة + nosniff؛ والدفعي:--parallelمقيد بـ 1–8، و--min-scoreمتحقَّق منه، وBATCH_BUSY بطيران مفرد، وllmRateLimitعلى تعديلات config/batch.
أُضيف
- CAR-147 — سقف تقييم واعٍ باللغة (#524):
evalTimeoutMs(lang)— تحصل ta/hi على 480 ثانية بدل 300 (النصوص الهندية تُجزِّئ عدة رموز لكل مقطع؛ والحد الزمني القديم أنتج 502 + تقريرًا فارغًا)؛ وعميل remote-QA ينتظر 540 ثانية. - CAR-133 — صفحة الهبوط cvstart.org v2 (#532): مقدمة بارزة بتأثير parallax محكومة بـ reduced-motion، وعرض تجريبي SIMULATED موسوم بوضوح لتدفق المسح→التقييم→المتتبّع، وأقسام تنكشف عند التمرير بأعداد مُتحقَّق منها حيًّا، وفواصل نائبة لقطات شاشة CAR-140.
- CAR-135 — المساعدة معاد كتابتها لواجهة v2، واكتمال انتشارها ×18 (#533, #540, #541, #542): كل ملفات المساعدة الـ 19 تصف هيكل الواجهة v2 (شريط تنقّل قابل للطي، ولوحة أوامر Cmd/Ctrl+K، وهياكل عظمية، وحالات فارغة بمثال وإجراء، وهيكل المسح v2، وخط المعالجة مجمّعًا مع التراجع، والتقارير v2، ولوحة كانبان)؛ وتستشهد تسميات الواجهة بمفاتيح i18n الخاصة بها؛ وجملة الـ 121 مصدرًا تُشتق من السجل مباشرة.
- المواصفات (SDD/OpenSpec) (#535): استدراج الموجة الثانية من 27 أكتوبر + ثلاث مواصفات استشرافية (انتشار المساعدة، وتسليمات الكتابة، وثوابت تبديل اللغة).
أُصلح
- تبديل اللغة لم يعد يمحو #/scan (#534) — ببلاغٍ من المالك: حالة المسح الخاصة بالعرض (النتائج ورقاقات الأوجه) صارت على مستوى الوحدة؛ ومنصة Playwright سلوكية بإعادة جلب مؤخَّرة 4 ثوانٍ (كانت حمراء على الشكل القديم).
- CAR-148/149 — تقارير ru «الكتلة G مفقودة» (#530): كان الموجّه يعلّم ثلاث خرائط A–G متضاربة؛ والهيكل والقائمة والمثال متوافقة الآن مع oferta.md (G = شرعية الإعلان)؛ وبوابة انحراف سلوكية.
- CAR-150 — تراجع خط المعالجة يحفظ ميتاداتا الراتب (comp) (#537): تُجيب DELETE بـ
comp، ويقبل POST بـcompاختياريًا محكومًا، والعرض يحمل{token, comp}عبر كل فروع الارتداد. - FULL-M3 — المصادر الميتة تبلّغ عن لوحاتها بصدق (#522): ترمي getro/mycareersfuture/meituan/mokahr/glints استثناءً عند صفحة أولى مشوّهة (لم يعد API ميت يُقرأ «سليمًا، 0 وظائف»)؛ و
pinnedOverrideتثبّت تجاوزاتcompany.apiالخاصة بـ 18 محوّلًا. - FULL-M5 — سلسلة مزوّدين واحدة (#521): يمرّ routes/llm.mjs عبر
runActiveProvider(+cachePrefixوإشارة)؛ واعتراض الرديف الفرعي لـ Gemini؛ وعقود الاستجابة مطابقة بايتًا بايتًا. - FULL-M1 — كتابات الملفات المشتركة مقفولة (#526, #539):
runTrackedScriptوقائمةTRACKER_MUTATING؛ والعمليات المنبثقة لـ outcome/followup تحمل القفل؛ وكتابات tracker.mjs عبرatomicWrite؛ وحفظ PUT مقفول وذري. - FULL-M6 — توحيد على الخادم والعميل (#531, #536, #525): dotenv بلا نموذج أولي مع رفض
__proto__؛ وisPrivateOrLoopback تشمل NAT64/6to4/benchmark/reserved؛ وذاكرة مؤقتة بالـ mtime في env-config؛ وتجميع نفايات فعلي لمواضع file-lock؛ وsafeGet بـ timeout+signal؛ وحارس DNS بفشل مغلق؛ وأربعة مواضع SSE →API.postStream؛ ومكتبات التركيز والتسميات والحالة؛ ونسخ الحافظة بانتظار النتيجة؛ وتلوين Hired في لوحة التحكم. - R3 — انحراف رموز CSS (#527): أصبحت
--accentمحلولة (حلقات تركيز الخريطة كانت ميتة صامتةً)؛ و11 مدة خارج الرموز طُويت؛ وبوابة انحراف. - R4 — متأخرات التحميل (#538): تعرض معاينات assessments/mode-page/pipeline هياكل CAR-112 العظمية.
- دفعة CodeQL + CI (#517 وإصلاح #539): واردات غير مستخدمة، وبوابة ACTING_GET تستورد التعبير النمطي الحقيقي، وشريحة دورة الحياة أُعيد تثبيت مرساتها.
ملاحظات
- ما تُرِك عمدًا دون تنفيذ في v1.261.0: تثبيت DNS لحظة الاتصال (يتطلب undici — خارج التبعيات، ومتبقٍّ موثَّق)؛ وقطات شاشة CAR-140 (تحتاج واجهة v2 المنشورة)؛ وCAR-137/138/141 (المرحلة التوثيقية القادمة)؛ وفئة
js/missing-rate-limitingفي CodeQL إيجابية كاذبة موثَّقة (المحدِّد المخصص لا يُحتسب). - انتشار المساعدة ×18: موجة es/de الأولى أسقطت ملاحظة المقدمة وتغيّر بطاقة «الشركات النشطة» (أنزلت de مقدمتها الخاصة؛ وes تنال متابعة من سطر واحد).
[1.260.0] — 2026-10-26
قطار التحصين بالمراجعات، ثمانية دمجٍ (#491–#498) من جولات opus-5-5 ومراجعة الذكاء الاصطناعي فوق أسطول v1.259.0: تطبيع مقارنات الرواتب، وتحديد نطاق تواريخ التقارير، ومتانة الترميز الجغرافي، وإبطال التخزين المؤقت للحزمة r2+r3، وإصلاح فيض الصفحة العميقة — إضافةً إلى واجهتين بصيغة v2 (خط المعالجة، والتقارير). ووصل كل إصلاح عبر إصلاحٍ فوري بأدلة أحمر→أخضر.
أُصلح
- تطبيع مقارنة الرواتب (CAR-143 rev-2): لا تُعتَد مؤشرات المدة إلا قرب الرقم التابع لها — لم يعد الراتب في «6 month contract, $120k» يُحتسَب سنويًا بـ ×12، وصيغ المدة الملحقة حصريًا بالروسية/الإسبانية («за месяц» بجوار الرقم) تتقدم على الكلمات العابرة؛ وتُعرَف عائلة الرموز
$/¥لكنها تبقى بلا ربط بعملة ما لم يتقاسم السطرَ رمزُ ISO صريح (لم تعد دولارات AUD/CA/SG تُحتسَب USD، وشكل ¥ اليواني ينال تنبيهًا صريحًا بدل تحويل JPY منحرف بنحو ×20)؛ والأرقام المجرّدة 19xx/20xx سنوات دائمًا؛ وأرقام المدى ترث مدة الطرف المقابل؛ ولا تُدمَجminimumوtarget_rangeفي الملف الشخصي قط في مدى واحد. - تحديد نطاق
fixReportDate(CAR-144 rev-2): ينطبق تصحيح التاريخ المثبَّت من جهة الخادم على الديباجة قبل أول عنوان##فحسب (التقرير ذو العنوان H2 ينال no-op محافظًا — التاريخ المتقادم مقبول، أما الملفَّق فلا)؛ وداخل الديباجة: يُصحَّح المرشّح الوحيد، وإلا**Date:**العريض إن كان وحيدًا، وإلا لا شيء (مرشّحان عريضان أو مرشّحان عاديان لا يُعاد كتابة أيٍّ منهما). وتقرأ بوابة FIX-5 لتسميات PDF القاموسَ المجمَّع الحقيقي الآن — اللغة الغائبة تلقي استثناء بدل أن تنجح بصمت اعتمادًا على بديل إنجليزي. - رقاقة موقع Habr ومتانة الترميز الجغرافي (CAR-142 rev-2): لا تتحول رقاقة ميتا في صفوف Habr إلى مدينة إلا بدليل بنيوي (رابط مرشِّح مدينة أو أيقونة موقع) — إشعارات الانتقال («Возможна релокация») وأنواع التوظيف لا تنتحل صفة المواقع أبدًا؛ ونجت ذاكرة الترميز الجغرافي المؤقتة من إعادة التشغيل الآن (تُفرَّغ عند
beforeExit/exit/SIGTERM+SIGINT مع إعادة رفع الإشارة، وتُمسَح علامة الاتساخ بعد استقرار الكتابة فحسب)، والإطفاء محدود الأثر (قفل حلقة الإخراج، وعداد الأجيال، وLRU حسب الحداثة)، وميزانية الترميز الجغرافي المستنفدة تجيب بـ 503 + Retry-After بدل 502 عامة. - إبطال التخزين المؤقت للحزمة (CAR-145 r2+r3): تستشهد هيكلُ الصفحة
/js/bundle.js?v=<content-hash>— immutable عند التطابق وno-store عند الاختلاف — فأُقضيت على نافذة النشر ذات الـ 5 دقائق التي كان يزاوج فيها هيكلٌ جديد حزمةً قديمة مخزَّنة مؤقتًا. يتشارك وصفُ ملف واحد بين حساب التجزئة والدفق (لا قراءات ممزَّقة)؛ والقراءة القصيرة تجيب null بدل تجزئة احتياطية عبر stat قد تسمّم نشرًا كاملًا؛ وتكتبmake-bundleالهوية والرفيقين .br/.gz عبر ملف مؤقت يبدأ اسمه بنقطة + rename، فلا يمكن لبناءٍ مقتول أن يخدم بايتات نصف مكتوبة ولا أن يسرّب ملفه المؤقت. - فيض الصفحة العميقة (CAR-146): لم تعد موجزةُ بحث محفوظ يفوق اسمُ ملفه وحده نافذةَ الهاتف تستطيع دفع
#/deepإلى ما بعد 390px — البطاقة تُحصر في صفّها، والعنوان يلتف، والتاريخ يبقى في سطر واحد؛ ويمرّ مسح النافذة الضيقة الآن عبر#/deepبتركيبة اختبار مزروعة طويلة زائدًا (النتيجة الوحيدة لجولتي remote-QA، وقد أُغلقت). - تحصين Pipeline v2 (مراجعة CAR-116): الحذفات تطلب تأكيدًا وتتيح التراجع (بنص تراجع صادق)، ولا تلفيق لشركة المضيف في البطاقات، ومعرّفات صفوف FNV-1a، وعدّ حقيقي للعمليات الجماعية، وحارس ضد إعادة الدخول عليها.
أُضيف
- Pipeline v2 (CAR-116): بطاقات مُثراة، وعرض مجمّع، وإهمال جماعي مع تراجع؛ و17 مفتاح
pipe.*جديد شُحِن مترجمًا في القواميس الـ 19 كلها. - Reports v2 (CAR-118): بحث حي مع مرشّحات لنطاق الدرجة/الشرعية/الشركة/التاريخ، ورؤوس قابلة للفرز (
aria-sort)، وعرض بطاقات محفوظ بأزرار إجراء لكل نطاق، ومدرَّج درجات يفلتر بالنقر، والعرض الموحّد «Company — Role» / «x.x/5» (window.ReportOps)؛ و31 مفتاحrep2.*جديد شُحِن مترجمًا في القواميس الـ 19 كلها.
ملاحظات
- مرّ كل إصلاح بجولة مراجعة بأدلة أحمر→أخضر؛ ونتيجتا HIGH من مراجعة الذكاء الاصطناعي على r2 الأولى للحزمة (تجزئة القراءات القصيرة، وذرية الملفات الرفيقة) أُغلقتا في r3، وكل جولة من CAR-143/CAR-144/CAR-142 أعادت التحقق من النتائج المفتوحة لسابقتها.
- ما تُرِك عمدًا دون تنفيذ: عرض تجميع الخريطة يبقى CAR-125 (في الطابور)؛ واسترجاع ميتاداتا خط المعالجة من جهة الخادم تذكرة مستقلة؛ ولا إصلاحات رجعية للمحتوى المحفوظ تحت حالات v1.259.0 السابقة على rev-2.
- الاختبارات 5988 (+165). جناح المتصفح 152 ناجحة / 0 فاشلة / 1 تخطٍّ اختياري. لم تُمَسّ أي مصادر ماسح (السجل 121 = 116 EN + 5 RU · 116 محوّلاً)؛ والمفاتيح الـ 48 الجديدة لـ i18n هبطت بانتشارها ×19 داخل طلبات سحب الميزات ذاتها.
career-ops-ui v1.267.1 · page 1/11 · mirror of the project changelog for cvstart.org