चेंजलॉग

GitHub

हर उल्लेखनीय बदलाव, रिलीज़ दर रिलीज़। यही फ़ाइल रिपॉज़िटरी में मौजूद है और सभी 17 भाषाओं में अनूदित है।

परिवर्तन-सूची (हिन्दी)

यह परिवर्तन-सूची v1.122.0 से शुरू होती है — वह संस्करण जिसमें हिन्दी स्थानीयकरण जोड़ा गया। पिछले संस्करणों के लिए 🇬🇧 CHANGELOG.md देखें।

[1.236.0] — 2026-09-18

मूल परियोजना समानता — career-ops की main शाखा @ 6a9c84c (VERSION 1.33.0, 128 कमिट)। दो नए स्रोत, और तीन मिरर किए गए सुधार — इनमें से दो यहाँ चुपचाप पोस्टिंग खो रहे थे।

जोड़ा गया

दो स्कैनर स्रोत, 92 → 94 (89 EN + 5 RU)। Python.org Jobs (pythonorg) बोर्ड की सार्वजनिक फ़ीड पढ़ता है; नियोक्ता आरोपण अनिवार्य है, इसलिए जिस पंक्ति के शीर्षक में कोई नियोक्ता नाम नहीं होता उसे पोर्टल-प्रविष्टि के नाम से भरने के बजाय गिरा दिया जाता है। Generalist World (generalist-world) बोर्ड के कार्ड स्क्रैप करता है और जिस मार्कअप को पार्स नहीं कर पाता उस पर ज़ोर से विफल होता है — बदला हुआ कार्ड-आकार किसी ख़ाली बोर्ड जैसा पढ़े जाने के बजाय फेंकता (throw करता) है, और यही विफलता-प्रकार किसी स्क्रैप किए गए स्रोत को अविश्वसनीय बनाता है। दोनों #/scan के स्रोत फ़िल्टर में दिखते हैं, दोनों होस्ट-पिन्ड हैं (एंकर्ड रीजेक्स, केवल-HTTPS), और दोनों को अंत-से-अंत तक नकली-ट्रांसपोर्ट सुइटों से चलाया जाता है (43 और 36 केस)।

ठीक किया गया

कई शहरों में खुली एक Workday भूमिका को स्थान-फ़िल्टर गिरा देता था। Workday का लिस्ट एंडपॉइंट बहु-स्थान वाली पोस्टिंग का उत्तर एक गिनती से देता है, जहाँ बाक़ी हर पोस्टिंग एक जगह रखती है: "53 Locations"। यह कोई स्थान नहीं है, और buildLocationFilter केस-असंवेदनशील सबस्ट्रिंग से मिलान करता है — इसलिए ऑस्टिन और 52 अन्य शहरों में खुली भूमिका किसी allow: [austin] प्रविष्टि से मेल नहीं खाती थी और गिरा दी जाती थी, जबकि अकेले सूचीबद्ध वही भूमिका पास हो जाती थी। तीन टेनेंट में ऊपर की धारा में नापा गया: 53 of 291 पोस्टिंग प्लेसहोल्डर थीं, इसलिए यह अपवाद नहीं, सामान्य मामला है। पोस्टिंग की असली जगहें केवल CXS detail दस्तावेज़ में मौजूद होती हैं, इसलिए हर प्लेसहोल्डर पर अब एक अतिरिक्त GET का ख़र्च आता है, जो 200 प्रति प्रविष्टि पर सीमित है — सीमा के आगे प्लेसहोल्डर को गढ़ने के बजाय दृश्यमान छोड़ दिया जाता है, क्योंकि किसी अनसुलझी पोस्टिंग को कभी सुलझी हुई जैसा नहीं पढ़ा जाना चाहिए। विफल या जगह-रहित detail पोस्टिंग को बिल्कुल वैसा छोड़ देता है जैसा लिस्ट ने लौटाया था: एक दिखता हुआ "53 Locations" इस बारे में ईमानदार है कि क्या हल नहीं हो सका, जबकि ख़ाली किया गया स्थान हर फ़िल्टर को चुपचाप पार कर जाता। वही GET startDate भी साथ लाता है, इसलिए समृद्ध की गई पोस्टिंग की तारीख़ लिस्ट एंडपॉइंट के सापेक्ष गद्य ("Posted 30+ Days Ago"undefined) के बजाय ठीक-ठीक मिलती है; जो कुछ भी नंगा YYYY-MM-DD नहीं है उसे Date.parse से गुज़ारने के बजाय जस-का-तस छोड़ दिया जाता है, जिसका ग़ैर-ISO फ़ॉलबैक कार्यान्वयन-निर्भर है। बताया गया स्तर अब दो रिक्विज़िशन को एक ही रीपोस्ट में नहीं समेटता। "Insurance Specialist II" नियोक्ता का अपना यह कथन है कि यह रिक्विज़िशन अपने साथी का नहीं — एक ही आधार-शीर्षक के नीचे अलग वेतन-बैंड, दायरा और req नंबर। टोकनाइज़र इसे देख ही नहीं पाता था: w.length > 3 VIII तक हर रोमन अंक और हर एकल अंक गिरा देता है, इसलिए "Insurance Specialist" और "Insurance Specialist II" एक जैसे टोकनाइज़ होते, पूर्ण Jaccard अनुपात पाते, और रीपोस्ट डिटेक्टर दूसरे को पहले की पुनः-लिस्टिंग बता देता। web-ui के role-matcher.mjs में स्तर-हैंडलिंग बिल्कुल भी नहीं थी, इसलिए यह मूल परियोजना का पूरा तंत्र यहाँ ले आता है: स्तर निकाले जाते हैं जहाँ रोमन और अरबी अंक एक ही संख्या में मोड़ दिए जाते हैं ("Nurse II" और "Nurse 2" एक ही कथन हैं — और यही जोड़ी पहले ग़लती से अलग-अलग गिनी जाती थी), दो बताए गए स्तरों को सहमत होना ही चाहिए, और केवल एक तरफ़ का स्तर तब तक ढीला पुनर्लेखन माना जाता है जब तक हर शीर्षक में एक ऐसा शब्द भी न हो जो दूसरे में नहीं है — जो सजावट नहीं, बल्कि दो असहमतियाँ हैं। किसी फ़िल्टर पर पिन किया गया Avature बोर्ड फिर भी पूरा वैश्विक बोर्ड घूम रहा था। Avature का सर्च UI अपारदर्शी फ़ेसेट पैरामीटर बनाता है (?42386=[812132] एक देश-फ़िल्टर है), और जो ऑपरेटर portals.yml में संकुचित बोर्ड पिन करता है वह उम्मीद करता है कि स्कैन उसी को घूमे। resolveSearch URL को ${origin}${path} के रूप में फिर से बनाता था और क्वेरी-स्ट्रिंग को पूरी तरह गिरा देता था — इसलिए हर अनुरोध, पहला अनुरोध भी शामिल, टेनेंट के पूरे बोर्ड को घूमता था: ज़्यादा पेज, ज़्यादा अनुरोध, और वे पोस्टिंग भी जिन्हें ऑपरेटर ने जानबूझकर फ़िल्टर कर दिया था। अब फ़ेसेट हर पेजिनेटेड अनुरोध पर साथ चलते हैं, और हमारा अपना jobOffset सबसे बाद में लगाया जाता है ताकि कोई भटका हुआ समान-नाम वाला फ़ेसेट पेजिनेशन को कभी हाइजैक न कर सके।

सुरक्षा

devalue 5.8.1 → 5.9.2 (astro के ज़रिए संक्रमणीय रूप से), एकमात्र खुले Dependabot अलर्ट को बंद करते हुए — विकृत इनपुट पर एक सेवा-अवरोध (denial of service)। केवल-साइट निर्भरता; कोई रनटाइम कोड नहीं बदला।

टिप्पणियाँ

पोर्ट नहीं किया गया, हर एक कारण सहित। मूल परियोजना ने अपने साझा 10s डिफ़ॉल्ट के मुक़ाबले lever को 30s और manfred को 25s टाइमआउट दिया — यह पोर्ट करने लायक नहीं: web-ui का scan transport पहले से 60s (DEFAULT_SCAN_TIMEOUT_MS) अनुमति देता है, इसलिए दोनों बोर्डों के पास यहाँ उस सुधार से कहीं ज़्यादा गुंजाइश है। iCIMS का दोहरा careers- उपसर्ग भी यहाँ नहीं हो सकता: web-ui टेनेंट का origin सीधे api/careers_url से लेता है और कभी किसी टेनेंट-नाम से होस्ट नहीं बनाता; इसका नया fallback-host walk मूल परियोजना के ढीले कॉन्फ़िग के लिए एक फ़ीचर है, किसी दोष का सुधार नहीं। deutschebahn और manfred को क्षणिक-abort पर retry मिला, जिसे web-ui की 60s सीमा कहीं कम ज़रूरी बना देती है — पोर्ट करने के बजाय बस नोट किया गया, ताकि भविष्य के किसी लंबे-वॉक टाइमआउट के लिए आज़माने की पहली चीज़ पहले से मालूम रहे। 128-कमिट के बाक़ी सारे बदलाव CLI, verifier, dashboard या web/ (मूल परियोजना का अपना फ़्रंटएंड) के हैं: liveness-browser, check-jd-archive, verify-ats/verify-portals/verify-cv-facts, update-system, set-status, audit-portals, discover-ats, scaffolder, test-all, प्लगिन मैनिफ़ेस्ट। पुल के बाद फ़ोर्क के विचलन दोबारा जाँचे गए: providers/telegram-channel.mjs में सिरिलिक \p{L} सुधार, फ़ोर्क का अपना providers/telegram.mjs, web/src/lib/clis.ts में hermes। अपस्ट्रीम career-ops-hq/main पूरी तरह मर्ज है (0 कमिट अनुपलब्ध)। 3066 → 3164 परीक्षण; अब सहायता सभी 17 बंडलों में 94 अडैप्टर (89 EN + 5 RU) बताती है, और शीर्षक-संरचना 32 H2 / 122 H3 पर अपरिवर्तित है।

[1.235.0] — 2026-09-16

मूल परियोजना समानता — career-ops की main शाखा @ 68e6b94 (VERSION 1.33.0, 42 कमिट)। दो मिरर किए गए सुधार; इनमें से एक यहाँ चुपचाप MokaHR पोस्टिंग खो रहा था।

ठीक किया गया

एक ही MokaHR बोर्ड की दूसरी नौकरी जोड़े जाने के बजाय गायब हो जाती थी। url-key.mjs किसी पोस्टिंग URL को एक तुलना-कुंजी तक सीमित करता है, और यह फ़्रैगमेंट को बिना शर्त गिरा देता था — जो उचित था, क्योंकि लगभग हर फ़्रैगमेंट केवल प्रस्तुति के लिए होता है (#apply, #section-2)। हमारी अपनी रजिस्ट्री में MokaHR अपवाद है: इसकी पोस्टिंग्स …/social-recruitment/{tenant}/{id}#/job/{n} रूप की होती हैं, जहाँ किसी टेनेंट की हर नौकरी वही पथ साझा करती है और पोस्टिंग id केवल फ़्रैगमेंट में मौजूद होता है। इसलिए वे सभी एक ही कुंजी पर सामान्यीकृत हो जाती थीं। सुधार से पहले नापा गया: पाइपलाइन में दो अलग-अलग MokaHR नौकरियाँ चिपकाइए और आपके पास एक ही पंक्ति बचती है — न कोई त्रुटि, न चेतावनी, कुछ भी नज़र नहीं आता; स्कैनर का फ़्रेशनेस फ़िल्टर (en-scanner.mjs) वही कुंजी पढ़ता है, इसलिए एक बार उस टेनेंट की कोई भी नौकरी scan-history में आ जाए, तो बाक़ी सभी को “पहले से देखी गई” मानकर छोड़ दिया जाता था। normalizeUrl अब फ़्रैगमेंट गिराए जाने से पहले किसी पहचाने गए #/job/{id} या #/jobs/{id} रूट को एक तुलना-मात्र क्वेरी-कुंजी में बदल देता है — MokaHR अपना स्थापित mokahr_job_id नाम बनाए रखता है ताकि पहले से लिखी गई कुंजियाँ तुलना-योग्य बनी रहें, जबकि कोई भी अन्य होस्ट एक आंतरिक _career_ops_fragment_job_id पाता है। उठाई गई id जोड़ी जाती है, सेट नहीं की जाती: जिस URL में यह पैरामीटर पहले से मौजूद हो उसमें किसी दूसरी पोस्टिंग की id होती है, और उसे अधिलेखित करना ठीक उन्हीं दो चीज़ों को मिला देता जिन्हें अलग रखने के लिए यह कुंजी बनी है। हर अपरिचित फ़्रैगमेंट अब भी गिरा दिया जाता है, जो पहले से ही सही था। accept-encoding अब हर स्रोत-अनुरोध पर स्थिर कर दिया गया है। अनसेट छोड़ने पर Node अपने undici बिल्ड द्वारा प्रस्तावित जो भी विकल्प हो, उस पर बातचीत करता है; Node ≥ 23 से इसमें zstd भी शामिल है, और amazon.jobs की zstd प्रतिक्रिया ठीक 1024 बाइट पर कटी हुई और 200 स्टेटस के साथ वापस आती है — इसलिए विफलता Unterminated string in JSON at position 1024 जैसी दिखती है, मानो कोई ट्रांसपोर्ट बग नहीं बल्कि विकृत API हो। अब हर अनुरोध gzip, deflate, br भेजता है। हमारे रनटाइम्स पर यह निवारक है, मरम्मत नहीं: Node 18/20/22 — यानी CI मैट्रिक्स और सर्वर (22.22.1) — पहले से gzip, deflate भेजते हैं, यह मान न लेकर सीधे सत्यापित किया गया, इसलिए यहाँ कुछ भी कटा नहीं था; आज जो बदलता है वह यह है कि अब br भी प्रस्तावित होता है, जिसे ये संस्करण डिफ़ॉल्ट रूप से नहीं माँगते पर सही ढंग से डिकोड कर लेते हैं। यह डिफ़ॉल्ट केस-असंवेदनशील ढंग से लागू होता है, और यही वह हिस्सा है जिसकी समीक्षा ज़रूरी है: हेडर नाम केस-असंवेदनशील होते हैं और fetch एक ही नाम की दो प्रविष्टियों को एक अल्पविराम-सीमांकित मान में जोड़ देता है, इसलिए Accept-Encoding: identity भेजने वाला कॉलर अन्यथा gzip, deflate, br, identity भेजता पाया जाता।

टिप्पणियाँ

fetchImpl सीमा पर हेडर एक सादा ऑब्जेक्ट बने रहते हैं, जबकि मूल परियोजना वहाँ fetch को एक Headers इंस्टेंस थमाती है। यह जान-बूझकर किया गया विचलन है, चूक नहीं: web-ui के fetch हेल्पर एक इंजेक्ट-योग्य fetchImpl लेते हैं, और 45 स्रोत सूट जो कैप्चर करते हैं उससे opts.headers['User-Agent'] पढ़ते हैं — किसी Headers इंस्टेंस पर ब्रैकेट-पहुँच नहीं होती, इसलिए यहाँ जो निष्ठा से पोर्ट किया गया वह कार्यान्वयन नहीं बल्कि व्यवहार है (केस-असंवेदनशील ओवरराइड, कॉलर जीतता है)। कॉलर का ऑब्जेक्ट कॉपी किया जाता है, कभी बदला नहीं जाता, क्योंकि कई स्रोत एक ही हेडर-कॉन्स्टेंट साझा करते हैं। मूल परियोजना का साथी सुधार — एक डिफ़ॉल्ट user-agent को केस-असंवेदनशील ढंग से लागू करना — यहाँ पोर्ट नहीं किया गया: web-ui कोई डिफ़ॉल्ट UA इंजेक्ट करता ही नहीं, हर स्रोत वही सेट करता है जो उसका बोर्ड माँगता है, इसलिए किसी कॉलर के User-Agent से टकराने के लिए कोई डिफ़ॉल्ट है ही नहीं। दो नए सूट और तीन नए केस इस जोड़ी को स्थिर करते हैं: tests/http-accept-encoding.test.mjs (सटीक स्थिर मान, चारों fetch हेल्पर में से हर एक, और तीन अलग-अलग अक्षर-रूपों में एक कॉलर ओवरराइड — यह पुष्टि करते हुए कि केवल एक accept-encoding कुंजी बचती है, जबकि मर्ज-बग यहाँ दो पैदा करता था) और tests/parsers-pipeline-hash-route.test.mjs, जो कुंजी के बजाय उपयोगकर्ता को दिखने वाले जोड़ पर काम करता है: दो MokaHR नौकरियों को पाइपलाइन तक ज़रूर पहुँचना चाहिए, वही नौकरी चार अलग वर्तनी में दोबारा चिपकाने पर भी एक ही पंक्ति में सिमटनी चाहिए, और कोई कॉस्मेटिक फ़्रैगमेंट पहचान (identity) नहीं बन जाना चाहिए। पोर्ट करने से पहले सभी को विफल होते हुए सत्यापित किया गया था। यह पिन ट्रांसपोर्ट में रहता है, सिर्फ़ इन हेल्परों में नहीं: 92 में से 25 स्रोत इंजेक्ट किए गए fetchImpl को सीधे कॉल करते हैं और इनसे कभी नहीं गुज़रते, इसलिए इसे makeTimeoutFetch लागू करता है — वह रैपर जिसे दोनों स्कैनर वास्तव में इंजेक्ट करते हैं, और वही एकमात्र गुज़रने का बिंदु है जो सभी स्रोत साझा करते हैं। (पैरेंट को समकक्ष की ज़रूरत नहीं: providers/_http.mjs उसका इकलौता ट्रांसपोर्ट है।) अब एक संरचनात्मक गार्ड CI गिरा देता है अगर कोई नया स्रोत उसे सौंपे गए ट्रांसपोर्ट के बजाय सीधे fetch कॉल करे, और एक व्यवहारिक केस उन 25 में से एक greenhouse को रैपर से गुज़ारकर साबित करता है कि हेडर वाक़ई तार पर पहुँचता है। पोर्ट नहीं किया गया, कारण सहित: liveness-browser.mjs (headed-Playwright पुनः-उपयोग पहरा — web-ui कोई headed ब्राउज़र नहीं चलाता), check-jd-archive.mjs (कोई web-ui रिले नहीं), test-all.mjs (मूल परियोजना का हार्नेस; फ़ोर्क का vpFixtureEnv विचलन बरक़रार है), web/ (मूल परियोजना का अपना फ़्रंटएंड, मिरर नहीं किया जाता), प्लगिन मैनिफ़ेस्ट और SIGNATURES.md (केवल-रिपॉज़िटरी)। batch/batch-runner.sh (sed इंटरपोलेशन से पहले एम्परसैंड एस्केप किए गए) और jd-skill-gap.mjs (डेटा-रूट के सापेक्ष cv.md हल करता है) केवल-पठन रिले किए गए हैं — web-ui मूल परियोजना की प्रतियों में shell करता है, इसलिए दोनों बिना किसी कोड-बदलाव के यहाँ आ गए, और jd-skill-gap वाला /api/jds/:id/skill-gap रिले को अधिक सही बनाता है: cv.md अब उस डायरेक्टरी के बजाय जहाँ प्रोसेस स्पॉन हुई थी, डेटा-रूट से हल होता है। पुल के बाद फ़ोर्क के विचलन दोबारा जाँचे गए: providers/telegram-channel.mjs में सिरिलिक \p{L} सुधार, फ़ोर्क का अपना providers/telegram.mjs, web/src/lib/clis.ts में hermes। स्रोतों की गिनती 92 (87 EN + 5 RU) पर अपरिवर्तित है, इसलिए सहायता अछूती है। 3042 → 3066 परीक्षण।

[1.234.0] — 2026-09-15

मूल परियोजना के साथ समानता — career-ops की main शाखा @ 56cce8f (VERSION अभी भी 1.32.0, 1.32.0 से 58 कमिट आगे)। 15 स्रोतों में एक मिरर किया गया सुधार, साथ ही एक ऐसा पहरा ताकि यह दोबारा न लौटे।

ठीक किया गया

एक अकेला विकृत जॉब id अब पूरे पन्ने को खाली नहीं करता। encodeURIComponent एक अकेले UTF-16 सरोगेट पर URIError फेंकता है, और एक JSON पेलोड ऐसा एक ले जा सकता है — JSON.parse('"\\uD800"') उसे बनाए रखता है। पंद्रह स्रोत हर पोस्टिंग का URL किसी होस्ट-नियंत्रित id या slug से पार्स-लूप के भीतर बनाते थे, इसलिए एक ख़राब पोस्टिंग पूरे लूप को रोक देती और उस पन्ने की हर नौकरी खो जाती; कुछ भी स्रोत-विफलता के रूप में लॉग नहीं होता था, क्योंकि अपवाद प्रति-कंपनी catch तक कुछ रिपोर्ट करने से पहले ही ऊपर उठ जाता था। मूल परियोजना ने इसे providers/_safe-url.mjs में ठीक किया (safeEncodeURIComponentURIError पर null, बाक़ी सब कुछ फिर से फेंके) और हर लूप का id उसी से गुज़ारा, null मिलने पर सिर्फ़ वही एक पोस्टिंग छोड़ते हुए। वह हेल्पर अब server/lib/sources/_safe-url.mjs है, और वही बदलाव मिरर किए गए तेरह स्रोतों पर लागू है — alibaba, arbeitsagentur, bamboohr, feishu-jobs, garena, jibeapply, manfred, meituan, mokahr, phenom, thehub, tkms, vdab — और दो सिर्फ़-web-ui स्रोतों पर भी, jobstreet और trudvsem, जिन्हें नए पहरे ने अपने पहले ही चलने में उजागर किया, क्योंकि उनका लूप भी वैसी ही बनावट का था और वही छिपा हुआ अपवाद रखता था। दायरा जान-बूझकर सीमित है: केवल API से मिले id इस हेल्पर से गुज़रते हैं। कॉन्फ़िग से निकले मान अपना सख़्त एन्कोड बनाए रखते हैं और खुलकर विफल होते हैं — garena का office (एक portals.yml खंड) फेंकने वाले urlSegment पर ही रहता है, जबकि उसका API id null लौटाने वाला idUrlSegment पाता है; csod का corpName और 4dayweek का SLUG_RE-सत्यापित slug कारण सहित नाम से अनुमति-सूची में डाले गए हैं। rheinmetall का title फ़ॉलबैक एक विकृत href पर फेंक सकता था। जब किसी कार्ड पर कोई हेडलाइन नहीं होती, title को URL slug से decodeURIComponent द्वारा फिर से बनाया जाता है, जो स्क्रेप किए गए href में किसी ख़राब percent-अनुक्रम पर फेंकता है — वही एक-ख़राब-पंक्ति-पूरा-पन्ना-बिगाड़े वाली बनावट, बस decode की तरफ़ से। अब यह बचाव सहित decode करता है और कच्चे slug पर वापस गिर जाता है। sources रजिस्ट्री अब _-उपसर्ग वाली फ़ाइलें छोड़ देती है। ऑटो-डिस्कवरी server/lib/sources/ में हर .mjs फ़ाइल को (ख़ुद को छोड़कर) इम्पोर्ट करती और जिसमें export const meta न हो उस पर चेतावनी देती थी — इसलिए हेल्पर एक बूट-टाइम चेतावनी पैदा करता था। मूल परियोजना की परिपाटी अपनाई गई है: शुरुआती underscore का मतलब है स्रोत नहीं है; ऐसी फ़ाइलें न तो इम्पोर्ट होती हैं, न उन पर चेतावनी दी जाती है। बिना घोषित और बिना meta वाली फ़ाइल अब भी चेतावनी देती है, और डिस्कवरी टेस्ट अब दोनों हिस्सों की पुष्टि करता है (पुराने फ़िल्टर के विरुद्ध रेड होने की पुष्टि के साथ)। साइट बिल्ड की sync-assets.mjs भी डिस्क पर एडेप्टर फ़ाइलों को इसी नियम से गिनती है, इसलिए हेल्पर अब उसके साइलेंट-ड्रॉप गार्ड को ट्रिगर नहीं करता।

टिप्पणियाँ

tests/sources-url-encoding-surrogate.test.mjs मूल परियोजना के सूट को तीन हिस्सों में दोहराता है: हेल्पर का अनुबंध (एक जोड़ा हुआ सरोगेट — एक साधारण इमोजी — अब भी एन्कोड होता है; ख़ुद मान के toString से आया अपवाद कॉलर की ग़लती है और आगे बढ़ जाता है), सभी पंद्रह के लिए प्रति-स्रोत व्यवहार (एक ख़राब id + एक साफ़ id → कोई अपवाद नहीं, साफ़ रखा जाता है, ख़राब गिरा दिया जाता है, हर एक को स्रोत के निर्यातित pure parser से, या thehub के लिए उसके fetcher को एक नक़ली transport के साथ, चलाया गया), और एक स्रोत-स्तरीय पहरा: हर बदली गई फ़ाइल को हेल्पर इम्पोर्ट और कॉल करना ही होगा, कोई फ़ाइल उसे बिना इम्पोर्ट किए संदर्भित नहीं कर सकती, और कोई असमीक्षित फ़ाइल नंगे encodeURIComponent से जॉब URL नहीं बना सकती — पुरानी बनावट वाला कोई नया स्रोत आपत्तिजनक पंक्ति संख्या के साथ CI में विफल होता है। पोर्ट से पहले सभी पंद्रह प्रति-स्रोत मामले विफल होने की पुष्टि की गई थी। मूल परियोजना के डेल्टा में बाक़ी सब कुछ पोर्ट नहीं किया गया, कारण सहित: batch/batch-runner.sh --cli केवल-CLI फ़्लैग है (web-ui batch runner में shell नहीं करता); invite-match.mjs अब set-status.mjs को कोड-रूट से हल करता है — web-ui इसे रिले नहीं करता; company-funded.mjs को आंतरिक रूप से वही safe-url बदलाव मिला और इसका --json आउटपुट आकार, जिसे /api/company-funded पार्स करता है, अपरिवर्तित है; test-all.mjs ने केवल एक टाइमआउट बजट खिसकाया (फ़ोर्क का vpFixtureEnv विचलन बरक़रार है); web/ मूल परियोजना का अपना फ़्रंटएंड है और इसे मिरर नहीं किया जाता; AGENTS.md/SIGNATURES.md केवल-रिपॉज़िटरी हैं। पुल के बाद फ़ोर्क के विचलन दोबारा जाँचे गए: providers/telegram-channel.mjs में सिरिलिक \p{L} सुधार, फ़ोर्क का अपना providers/telegram.mjs, web/src/lib/clis.ts में hermes। स्रोतों की गिनती 92 (87 EN + 5 RU) पर अपरिवर्तित है, इसलिए सहायता अछूती है। 3022 → 3042 परीक्षण।

[1.233.2] — 2026-09-10

ठीक किया गया — उच्च गंभीरता की दो CodeQL js/remote-property-injection चेतावनियाँ।

ठीक किया गया

सहेजे गए मानों को process.env में ले जाने वाला लूप अनुरोध-निकाय से बने Object.entries(safe) पर चलता था, भीतर प्रोटोटाइप कुंजियों के विरुद्ध स्पष्ट पहरे के साथ। कोड सुरक्षित था, क्योंकि safe केवल KNOWN_KEYS से भरा जाता है, पर विश्लेषक इस बाध्यता को दो लूपों के पार नहीं ले जा सकता। अब लूप सीधे स्थिरांक सरणी पर चलता है, इसलिए गुण का नाम प्रमाणतः मॉड्यूल-स्तरीय लिटरल है। व्यवहार अपरिवर्तित।

टिप्पणियाँ

पुराने पहरे को जड़ने वाला परीक्षण स्रोत-पाठ का grep था। उसकी जगह संरचनात्मक और व्यवहारगत परीक्षण आए; दूसरा __proto__ को कच्चे JSON के रूप में भेजता है, क्योंकि ऑब्जेक्ट लिटरल प्रोटोटाइप सेट करता, गुण नहीं बनाता। 3021 → 3022 परीक्षण।

[1.233.1] — 2026-09-10

ठीक किया गया — मार्गदर्शिका में v1.233.0 द्वारा जोड़े गए नियंत्रण का कोई वर्णन नहीं था, और उसी अनुभाग में 200 रिलीज़ पहले असत्य हो चुके निर्देश बने हुए थे।

ठीक किया गया

DOC-1 — अब हर ड्रॉपडाउन «डिफ़ॉल्ट का उपयोग करें (…)» से शुरू होता है, जो वह स्थिति व्यक्त करता है जिसे इंटरफ़ेस पहले दिखा ही नहीं सकता था: कुंजी अनसेट है। नीचे की सूची से वही मान चुनने से इसका अंतर अदृश्य और महत्वपूर्ण है। मौजूदा ### Behavior सूची में तीन बिंदु ×17। DOC-2 — तालिका की एक पंक्ति किसी कुंजी का नाम ही नहीं लेती थी: कोष्ठक में (server uses default UA) था, जो v1.19.0 में हटाए गए HH_USER_AGENT का वर्णन करता और dev.hh.ru पर पंजीकरण की सलाह देता — v1.65.0 के बाद से निष्फल। तीनों पुरानी उल्लेख हटा दिए गए; समस्या-निवारण पंक्ति मिटाई नहीं, फिर से लिखी गई, क्योंकि आधी अब भी सही है: जुलाई 2026 से hh.ru ग़ैर-रूसी IP को HTTP 451 देता है। कुंजी-तालिका अब बताती है कि वह क्या है। वह 45 में से 6 सूचीबद्ध करती है जबकि शीर्षक पंजिका का वादा करता है। एक वाक्य ×17 उसे चयन घोषित करता है और #/config की ओर संकेत करता है।

टिप्पणियाँ

tests/help-recognized-keys.test.mjs वही अनुपस्थित गेट है: यह कुंजी-तालिकाओं के पहले स्तंभ को जीवित KNOWN_KEYS से मिलाता है। 3018 → 3021 परीक्षण; सहायता 32 H2 / 122 H3 पर बनी रहती है।

[1.233.0] — 2026-09-10

ठीक किया गया — #/config के सहेजने के रास्ते में तीन बातें; CONFIG-3 v1.232.1 के अपने ही सुधार से पैदा हुआ।

ठीक किया गया

CONFIG-3 — बोए गए मान से संयोगवश मेल खाता सोचा-समझा चुनाव «छुआ नहीं» मानकर छोड़ा जाता था। initial दो उद्गम मिला देता है: .env से बोया गया और defaultValue से बोया गया, और दूसरे में समानता अस्पष्ट है। initial के साथ seededFromFile दर्ज करके ठीक किया गया। कुंजी हटाना «· 0» दिखाता था, क्योंकि सर्वर केवल लिखा हुआ लौटाता था। अब removed भी लौटता है और सूचना दोनों गिनती है। सिलेक्ट सेट तो होता था, पर खाली नहीं: 18 में से किसी में खाली विकल्प नहीं था। अब हर एक «डिफ़ॉल्ट का उपयोग करें (…)» से शुरू होता है। एक नई i18n कुंजी ×17।

टिप्पणियाँ

इकाई आधार अपरिवर्तित (3018); ब्राउज़र 111 → 116

[1.232.1] — 2026-09-10

ठीक किया गया — #/config पर सहेजना उन फ़ील्ड को भी लिख देता था जिन्हें उपयोगकर्ता ने छुआ तक नहीं।

ठीक किया गया

CONFIG-2. v1.57.1 अनसेट कंट्रोल में उसका defaultValue बो देता है ताकि फ़ील्ड वही दिखाए जो सर्वर वास्तव में उपयोग करता है, जबकि save() dirty को केवल गुप्त फ़ील्ड के लिए पूछता और बाक़ी सब हमेशा भेज देता था। इस तरह दिखाने के लिए रखा गया मान उपयोगकर्ता के चुनाव जैसा सर्वर तक जाता था: एक ड्रॉपडाउन बदलने पर 28 कुंजियाँ भेजी जातीं और 18 जड़ दी जातीं, जिन्हें किसी ने खोला भी नहीं था। बदलती है हर सेटिंग की स्थिति — «अनसेट, परियोजना के डिफ़ॉल्ट का अनुसरण करो» से «.env में जड़ी हुई»।

टिप्पणियाँ

cfg.values से तुलना पर्याप्त नहीं: अनसेट select अपना defaultValue दिखाता है जबकि सहेजा मान '' है — अनुरोध 27 कुंजियों से घटकर 19 हुआ, एक नहीं। अब तुलना उससे होती है जिससे हर कंट्रोल को बोया गया था। लिखी गई कुंजियों की संख्या सूचना में लौट आई। 105 → 111 ब्राउज़र परीक्षण।

[1.232.0] — 2026-09-09

ठीक किया गया — ब्राउज़र QA में मिले दो दोष; दोनों में से कोई v1.231.5 से नहीं आया।

ठीक किया गया

PROFILE-1 — #/profile पूरी पृष्ठ को बग़ल में स्क्रॉल कराता था। मान एक अनाम <div> था जिसमें केवल इनलाइन फ़ॉन्ट शैलियाँ थीं, इसलिए उसका परिकलित overflow-wrap normal ही रहा। LinkedIn का URL CSS को कोई वैध विभाजन-बिंदु नहीं देता, अतः min-content चौड़ाई पूरी स्ट्रिंग बन जाती है; ग्रिड आइटम में डिफ़ॉल्ट min-width: auto उससे नीचे सिकुड़ने से इनकार करता है — कार्ड ने अपना ट्रैक, फिर पंक्ति, मुख्य स्तंभ और अंततः दस्तावेज़ फैला दिया (1280 px पर 23 px वास्तविक स्क्रॉल)। साझा वर्ग .card-value में overflow-wrap: anywhere तथा सहारे के लिए .card-row > * { min-width: 0 } से ठीक किया गया। break-word नहीं, anywhere — min-content की गणना में केवल anywhere गिना जाता है। CONFIG-1 — POST /api/config select फ़ील्ड के लिए कोई भी मान स्वीकार कर लेता था। {"LLM_PROVIDER":"not-a-provider"} 200 लौटाता और .env में लिख दिया जाता; उसके बाद कुछ भी विफल नहीं होता, क्योंकि रिज़ॉल्वर चुपचाप फ़ॉलबैक पर चला जाता। वही 19 मान रखने वाला LLM_PROVIDERS हमेशा से env-config.mjs से निर्यात होता रहा — सत्यापक बस उसे देखता ही नहीं था।

टिप्पणियाँ

केवल LLM_PROVIDER की जाँच होती है: मॉडल सूचियों का असली क्षेत्र विक्रेता का है और हमारी रिलीज़ों के बीच बदलता है। पहले से सहेजा गया मान छूट पाता है, क्योंकि फ़ॉर्म हर सहेजने पर सभी ग़ैर-गुप्त फ़ील्ड दोबारा भेजता है। OLLAMA_API_KEY का विवरणक भी जोड़ा गया। 3013 → 3018 परीक्षण।

[1.231.5] — 2026-09-09

सुरक्षा — सात परामर्श बंद किए गए, जिनमें एक गंभीर दूरस्थ कोड निष्पादन है। कोई स्रोत फ़ाइल नहीं बदली।

सुरक्षा

Dependabot से मर्ज किया गया: multer 2.2.0 → 2.3.0 (उच्च — बीच में रुकने पर फ़ाइल डिस्क्रिप्टर रिसाव से सेवा अवरोध) और साइट में svgo 4.0.2 → 4.1.0 (उच्च और मध्यम — removeScripts निष्पादन-योग्य लिंक जाने देता था)। फिर पाँच और, जिन्हें इन्हीं मर्ज से चली पुनः-स्कैनिंग ने उजागर किया। हर प्रभावित परिसर मौजूदा ^ से पहले ही पूरा होता था, इसलिए मैनिफ़ेस्ट बदलने की नहीं, अद्यतन की ज़रूरत थी: साइट में astro 7.1.0 → 7.3.2गंभीर, AVIF छवि-अनुकूलन के रास्ते दूरस्थ कोड निष्पादन (7.2.8 में ठीक), और साथ ही पथ-खंड सीमा जाँच के अभाव से प्राधिकरण बायपास (7.2.4); sharp 0.35.3 → 0.35.4उच्च, libheif की दो कमज़ोरियाँ; और दोनों मैनिफ़ेस्ट में js-yaml 4.3.1 → 4.3.2उच्च

टिप्पणियाँ

यहाँ «केवल निर्भरताएँ» का अर्थ «बिना जोखिम» नहीं है। js-yaml ऐप द्वारा पढ़ी जाने वाली हर कॉन्फ़िग पार्स करता है, multer हर अपलोड लेता है, और Astro एक माइनर संस्करण आगे बढ़ा। सत्यापित: npm run test:ci 3013/3013, ब्राउज़र सूट 4/4, और साइट का पूर्ण पुनर्निर्माण जिसने वही 86 पृष्ठ, सभी 17 दर्पण और सही facts.json दिए। npm audit: दोनों मैनिफ़ेस्ट में 0 कमज़ोरियाँ।

[1.231.4] — 2026-09-07

ठीक किया गया — v1.231.3 ने Doctor क्लिक के बाद का हाल सुधारा था, वह क्षण नहीं। मोबाइल और डेस्कटॉप दोनों से फिर रिपोर्ट हुआ।

ठीक किया गया

अनुरोध चलने के दौरान withSpinner अब भी बटन को फिर से लिख रहा था। v1.231.3 ने उसे बच्चों की नोड्स सहेजकर finally में लौटाना सिखाया, और वे लौटती भी थीं — पर व्यस्तता-संकेत अब भी '⏳ ' + original पाठ के साथ replaceChildren चलाता था। इसलिए doctor.mjs के पूरे चलने भर 36 px का वर्ग ⏳ 🩺Doctor पाठ धारण करता और पंक्ति तोड़ने वाली चौड़ी गोली बन जाता; डेस्कटॉप पर यह सटा हुआ ⏳🩺Doctor दिखता। जिस बटन के तत्व-बच्चे हैं, उसे अब बिलकुल नहीं लिखा जाता: उसका संकेत .is-loading वर्ग है, जो अब CSS में चिह्न की जगह बालू-घड़ी रखता है, सो ज्यामिति बदल ही नहीं सकती: विश्राम में 36 px, उड़ान में 36 px, बाद में 36 px

टिप्पणियाँ

सीख कोड की नहीं, अभिकथन की है। v1.231.3 का गेट aria-busy हटने की प्रतीक्षा करता और तभी मापता — रचना से ही वह केवल वही स्थिति देख सकता था जिसे finally पहले ही ठीक कर चुका था। नई ब्राउज़र जाँच स्वयं प्रॉमिस को खुला थामे रखती है और उड़ान के बीच में नमूना लेती है। 3012 → 3013 परीक्षण।

[1.231.3] — 2026-09-07

ठीक किया गया — Doctor पर क्लिक करने से मोबाइल का शीर्ष बार टूट जाता था। v1.231.2 आने के दिन ही फ़ोन से रिपोर्ट किया गया।

ठीक किया गया

UI.withSpinner उसी बटन के बच्चों को चपटा कर देता था जिसे वह सजा रहा था। उसका व्यस्तता-संकेत textContent से होकर जाता था: button.textContent सहेजो, '⏳ ' + original लिखो, फिर वापस लिखो। textContent में असाइन करने से हर बच्चा एक ही टेक्स्ट नोड से बदल जाता है — और v1.231.2 ने अभी-अभी शीर्ष बार की हर क्रिया को .btn-ico और .btn-label में बाँटा था, लेबल को max-width: 900px के नीचे छिपाकर। इसलिए Doctor पर पहला ही स्पर्श दोनों <span> को हमेशा के लिए मिटा देता था: मोबाइल नियमों के पास पकड़ने को कुछ न बचा, लेबल नंगे पाठ के रूप में लौट आया, और 36 px का वर्ग फैलकर 🩺Doctor की गोली बन गया जो थीम-स्विच पर चढ़ जाती थी। यह अपने आप ठीक नहीं होता था — केवल पेज रीलोड ही मार्कअप लौटाता था। सुधार बच्चों की नोड्स सहेजता है और replaceChildren से लौटाता है; केवल-पाठ वाले बटन, यानी 24 कॉल-स्थलों में से अधिकांश, बिलकुल पहले जैसे ही व्यवहार करते हैं।

  • FIND-3 — 320 px के फ़ोन पर खोज-फ़ील्ड सिमटकर 8 px रह गया था। शीर्ष बार को एक पंक्ति में लाने पर searchbar अकेला लचीला तत्व बचा, और पिछली रिलीज़ का चेंजलॉग यही कहता था — «कुछ न बचने तक सिकुड़ सकता है»। वह सचमुच कुछ न बचने तक सिकुड़ा: 320 px पर 8 px इनपुट, 340 px पर 28 px — 21 अक्षरों के प्लेसहोल्डर का एक अक्षर। क्लिक भी होता और टाइप भी, पर फ़ील्ड जैसा पढ़ा नहीं जाता। कोई min-width इसे नहीं सुधारता: 320 px पर बार में 32 px पैडिंग, 40 px मेन्यू और 162 px क्रियाएँ हैं, देने को 120 px बचता ही नहीं। इसलिए 420 px से नीचे — वह चौड़ाई जहाँ फ़ील्ड स्वयं 100 px पार करता है — यह एक आवर्धक लेंस के पीछे छिपता है और टैप पर पूरी बार में फैल जाता है: 320 px पर 182 px, 360 px पर 222 px, 390 px पर 252 px, किसी भी चौड़ाई पर ओवरफ़्लो नहीं। बटन एक ही सुलभ नाम रखता है और स्थिति aria-expanded से बताता है; 🔍/✕ की अदला-बदली शुद्ध CSS है। 420 px के ऊपर कुछ नहीं बदलता। लाइव बिल्ड पर ब्राउज़र रिग्रेशन में मिला।

टिप्पणियाँ

यह वही दोष-श्रेणी है जो v1.231.2 में applyI18n() की फंदे के रूप में दर्ज हुई थी — ऐसा कोड जो उस तत्व को textContent सौंपता है जिसके अब तत्व-बच्चे हैं — बस दूसरे कॉलर से पहुँची। सीख सामान्य है: किसी तत्व की सामग्री को बच्चों वाले <span> में बाँटते ही, उस तत्व पर मौजूद हर textContent लेखक एक छिपा हुआ बग बन जाता है, और वे लेखक हमेशा उसी फ़ाइल में नहीं होते जिसे आप संपादित कर रहे हैं। दो तालों से बंद: node:vm में असली withSpinner, और 320 px पर असली ब्राउज़र में Doctor पर क्लिक। दोनों पुराने कोड पर गिरते हुए सत्यापित। 3009 → 3012 परीक्षण

[1.231.2] — 2026-09-06

ठीक किया गया — मोबाइल का शीर्ष बार दो पंक्तियों में टूट रहा था, सर्वर पुराने मूल प्रोजेक्ट पर चल रहा था, और cvstart.ru का पुनर्निर्देशन हर उस पथ पर 404 दे रहा था जिसमें भाषा पहले से थी।

ठीक किया गया

  • मोबाइल का शीर्ष बार फिर एक ही पंक्ति में है, क्रियाएँ केवल चिह्न। क्रिया-बटन पूरी चौड़ाई की दूसरी पंक्ति में धकेल दिए जाते थे, इसलिए फ़ोन पर [☰ · खोज] के नीचे [🔔 🌙 Doctor Scan खोलें] — अपनी ही पंक्ति में दो चौड़ी गोलियाँ। अब ये घंटी और थीम-स्विच के बगल में 36 px के वर्ग (🩺 / ⚡) हैं, और 320 px पर भी सब कुछ एक पंक्ति में समा जाता है। अनुमान नहीं, माप: दस्तावेज़ की चौड़ाई 320, 360, 390 और 430 px पर तथा उस पूरी 560–760 px पट्टी में व्यूपोर्ट के बराबर है जहाँ पहले बटन खोज-पट्टी पर चढ़ जाते थे। भाषा अब मोबाइल लेआउट को बिलकुल प्रभावित नहीं करती, क्योंकि लेबल छिपा है और बटन एक निश्चित वर्ग है; 900 px से ऊपर लेबल ज्यों के त्यों लौट आते हैं।
  • रिलीज़ मूल 1.32.0 के विरुद्ध बनी थी, पर सर्वर मूल 1.31.0 पर चल रहा था। resumecraft.ru पर /api/health parentVersion: 1.31.0 बता रहा था। 95 रनटाइम फ़ाइलें समन्वित कीं और दो हटाईं। लाइव सतह पर ब्राउज़र QA ने पकड़ा।
  • cvstart.ru हर पथ के आगे /ru/ जोड़ देता था, यह देखे बिना कि वहाँ पहले से क्या है। /ru/help /ru/ru/help बन जाता और /en/help /ru/en/help; दोनों 404। पहला तब मिलता है जब कोई मुख्य साइट से पता कॉपी करे; दूसरा अधिक गंभीर था — अंग्रेज़ीभाषी आगंतुक अंग्रेज़ी संस्करण तक पहुँच ही नहीं सकता था। अब 16 भाषा-उपसर्गों में से किसी एक को पहले से रखने वाला पथ ज्यों का त्यों गुज़रता है, en हटा दिया जाता है (अंग्रेज़ी मूल में है), और बाकी को पहले की तरह /ru/ मिलता है।

बदला गया

  • 98 अप्रचलित QA प्रॉम्प्ट qa/archive/superseded-prompts/ में स्थानांतरित। qa/README.md v1.137.0 से लिखता आया है कि शीर्ष स्तर पर केवल वर्तमान रिलीज़ का प्रॉम्प्ट रहता है — पर यह नियम 95 रिलीज़ तक लागू नहीं हुआ।
  • पाँच और प्रॉम्प्ट शीर्ष स्तर से हटे — वे स्वयं को वर्तमान कहते थे, थे नहीं। REGRESSION-FINAL.md स्वयं को «एकमात्र आधिकारिक, संस्करण-निरपेक्ष रिग्रेशन प्रॉम्प्ट» कहता था, पर उसके §§11–15 पाँच बंद चक्रों के रजिस्टर हैं (v1.55.x → v1.59.7), और घोषित सहायता-आधार था 16 भाषाओं में 28 H2 / 103 H3, जबकि आज 32 / 122 और 17 हैं: उसका अनुसरण करने वाला QA एजेंट §9 पर पहले ही कदम में गिर जाता। QA-REGRESSION-PROMPT.md का नाम बिना संस्करण था और सामग्री v1.226.0 की। QA-REGRESSION-PROMPT-v1.76.0-FULL.md 155 रिलीज़ पीछे जड़ा था, REGRESSION-PROMPT-FINAL.md v1.58.52 → v1.59.10 चक्र समेटता है, और QA-FULL-REGRESSION.md उन सबकी v1.131.1 आधार पर पुनरावृत्ति था। इनके साथ PARENT-SYNC-WORKLIST-v1.26.0.md भी गया (मूल अब 1.32.0 पर है), और तिथि-अंकित UX-AUDIT-2026-07-06.md reports/ में चला गया। चार ड्राइवर बचे, जिनके अपने आधार v1.231.2 के वास्तविक मानों पर अद्यतन हैं। qa/README.md को उसी फ़ोल्डर का वर्णन करने के लिए फिर से लिखा गया जो वास्तव में है।

टिप्पणियाँ

  • शीर्ष बार ठीक करते समय जिन दो विशिष्टता-जालों में फँसा, वे अब app.css में टिप्पणीबद्ध हैं: डेस्कटॉप नियम max-width: 900px खंड से नीचे घोषित हैं, इसलिए समान विशिष्टता पर वही जीतते हैं।
  • applyI18n() el.textContent निर्दिष्ट करता है, इसलिए i18n कुंजी भीतरी <span> पर चली गई; बटन पर रहती तो हर भाषा-परिवर्तन पर चिह्न मिटा देती।
  • मूल का पहला rsync एक ऐसी फ़ाइल पर बीच में ही टूट गया जो स्थानीय रूप से अब नहीं है, और फिर भी सफलता बताई। मूल की तैनाती अब चेकसम से जाँची जाती है, निकास-कोड से कभी नहीं।

[1.231.1] — 2026-09-06

ठीक किया — v1.231.0 के गणना-स्वीप ने हर लिंक में खाते का नाम बदल दिया था।

ठीक किया गया

  • हर Fighter90 लिंक Fighter92 बन गया था। v1.231.0 के स्रोत-गणना स्वीप ने अंक-सीमा की सुरक्षा में 90 को 92 से बदला; वह सुरक्षा 290 और 901 को सही ढंग से छोड़ती है, पर Fighter90 के भीतर के 90 से मेल खाती है — उससे पहले अक्षर है और बाद में टोकन बस समाप्त हो जाता है। सभी 17 README, सभी 17 सहायता बंडल और साइट के सहायता दर्पणों में 562 लिंक, तथा विकी में 138, एक ऐसे खाते की ओर इशारा कर रहे थे जो है ही नहीं; providers.png बैनर और «GitHub पर संपादित करें» के सभी लिंक 404 दे रहे थे। एक उपयोगकर्ता ने ग़ायब चित्र से इसे पकड़ा।
  • पाँच ऐतिहासिक रिलीज़ संदर्भ खिसक गए। उसी रिलीज़ के 85 → 87 स्वीप ने v1.85.0 को v1.87.0 बना दिया और एक ऐसी रिलीज़ गढ़ दी जो कभी निकली ही नहीं।

टिप्पणियाँ

  • अंक-सीमा पर्याप्त नहीं है: वह किसी संख्या को पड़ोसी अंकों से बचाती है, इस बात से नहीं कि वह किसी पहचानकर्ता या संस्करण-स्ट्रिंग का हिस्सा है। गणनाएँ स्वयं सही हैं और बदली नहीं: 92 स्रोत, 87 EN अडैप्टर, 3009 परीक्षण।
  • मूल रिपॉज़िटरी अप्रभावित रही।

[1.231.0] — 2026-09-05

जोड़ा गया — मूल career-ops v1.32.0 से दो स्कैन स्रोत (Collage, Telegram कठोर), Gem की REST विधा, और एक दोष जो पोर्ट ने मूल की अपनी संहिता में खोज निकाला।

जोड़ा गया

  • दो नए स्रोत, 90 → 92 (87 EN + 5 RU), ALL_ADAPTERS 85 → 87। दोनों बिना टोकन।
    • Collage (provider: collage) — Collage HR का सार्वजनिक जॉब-साइट API। पथ खंड वह साइट पता है जो टेनेंट ने स्वयं चुना, कंपनी के नाम से बना slug नहीं; इसलिए इसे api: से या secure.collage.co/jobs/<पता> careers URL से पढ़ा जाता है और कभी अनुमान नहीं लगाया जाता: अनुमानित पता किसी और का बोर्ड स्कैन करेगा।
    • Telegram (कठोर) (provider: telegram-channel) — वही t.me/s/<चैनल> पूर्वावलोकन पढ़ता है जो मौजूदा telegram स्रोत पढ़ता है, पर उलटा सौदा करता है: कोई पोस्ट पंक्ति तभी बनती है जब वह नियोक्ता का नाम ले और साथ ही किसी रिक्ति पृष्ठ से जुड़े। संग्रह-पोस्ट, छिपे नियोक्ता वाली पोस्ट और केवल संपर्क वाली पोस्ट हटा दी जाती हैं। कम कवरेज जानबूझकर है — ऊपर की धारा में मापा गया कि HR-संचालित चैनलों की 32–77% पोस्ट पास होती हैं — पर हर पंक्ति असली नियोक्ता और असली लिंक रखती है। मूल की तरह दोनों उपलब्ध हैं।
  • Gem को वैकल्पिक REST विधा मिली, GraphQL पथ के साथ-साथ (api: https://api.gem.com/job_board/v0/<board>/job_posts)। यह कभी बोर्ड id से व्युत्पन्न नहीं होती, और GraphQL पथ ही डिफ़ॉल्ट रहता है। मूल #3783 से पोर्ट किया गया।

ठीक किया गया

  • telegram-channel का स्थान फ़िल्टर सिरिलिक नहीं देख पाता था और शहरों को नियोक्ता बता देता था। मूल का LOCATIONISH_RE केवल ASCII वाली \b सीमा प्रयोग करता था, जो सिरिलिक के बगल में कभी सक्रिय नहीं होती; इसलिए उसमें मौजूद सभी रूसी विकल्प (москва, спб, офис, удалёнк*) अगम्य थे और Senior Engineer | Москва “Москва” को नियोक्ता के रूप में लौटाता था। यह ठीक वही ग़लत-क्षेत्र-को-तथ्य बनाना है जिसे रोकने के लिए पूरी आरोपण नीति बनी है, और यह इस प्रदाता के मुख्य दर्शकों पर ही पड़ता था: रूसी भाषी चैनल स्थान सिरिलिक में लिखता है। web-ui का पोर्ट यूनिकोड जाँच (\p{L} / \p{N}) प्रयोग करता है — वही जो मूल एक स्थिरांक नीचे ROLE_WORD_RE में पहले से करता है। ASCII रूप पर विफल होने वाले परीक्षण से स्थिर किया गया। ऊपर की धारा में अभी ठीक नहीं हुआ।

टिप्पणियाँ

  • मूल का Workday फ़ेसेट पुनर्प्राप्ति कार्य (#3851, #3874) पोर्ट नहीं माँगता था। web-ui Workday को न पेजिंग करता है न फ़ेसेट में बाँटता है — offset: 0 पर एक ही POST। v1.229.0 जैसा ही निष्कर्ष, मान लेने के बजाय दोबारा जाँचा गया।
  • providers/_types.js में केवल दस्तावेज़ बदला।
  • परीक्षण: 2962 → 3009 (+47)।

[1.230.0] — 2026-09-05

बदला — मूल career-ops v1.32.0 से तीन प्रदाता सुधार, और एक दोष जो पोर्ट ने स्वयं उजागर किया।

जोड़ा गया

  • Welcome to the Jungle सर्वर-साइड Algolia filters अभिव्यक्ति स्वीकार करता है (wttj: { filters: "offices.country_code:FR AND contract_type:full_time" })। अकेला कीवर्ड किसी वैश्विक बोर्ड को संकीर्ण नहीं करता: कौन-से max_hits परिणाम लौटेंगे यह स्कैनर के फ़िल्टर नहीं, बल्कि Algolia की प्रासंगिकता-रैंकिंग तय करती है — हमारे फ़िल्टर उसके बाद, जो आ चुका है उसी पर चलते हैं, इसलिए सीमा से परे सब कुछ अदृश्य रहता है चाहे वह कितना ही सटीक क्यों न हो। फ़िल्टर परिणामों को पुनः क्रमित करने के बजाय परिणाम-समुच्चय को ही छोटा करता है, इसलिए प्रति-प्रश्न सीमा 200 से बढ़कर 1000 हो जाती है। फ़िल्टर होने पर queries वैकल्पिक हो जाता है: रिक्त प्रश्न का अर्थ है «वह सब जो फ़िल्टर से गुज़रे»। मूल #3757 से पोर्ट किया गया।

ठीक किया गया

  • जब कोई टेनेंट अपने ही बैनर के दावे से बस कम पद परोसता है, तो Radancy अब “truncated” चेतावनी नहीं देता। मूल परियोजना ने data-total-results को नौ वास्तविक टेनेंट के विरुद्ध जाँचा: पाँच मेल खाए, पर चार ने — एक छोटा और एक विशाल, दोनों — बिना किसी दोहराई गई पंक्ति के, घोषित संख्या से 10–56% कम अद्वितीय पद दिए। बैनर उससे अधिक बताता है जितना टेनेंट का अपना खोज-सूचकांक वास्तव में परोसता है, इसलिए संचित गणना की उससे तुलना अधिकांश बोर्डों पर मिथ्या चेतावनी थी। चेतावनी अब केवल तभी उठती है जब हमारी अपनी max_jobs/max_pages ने भ्रमण रोका हो — वही एकमात्र स्थिति है जिस पर कॉल करने वाला कुछ कर सकता है; totalResults संदेश में संदर्भ के रूप में रहता है और कभी निर्णय नहीं करता। #3839 से पोर्ट किया गया।
  • Radancy हर JSON खंड अनुरोध पर कैश को दरकिनार करता है। उस मार्ग के आगे की कैश परत कुछ टेनेंट पर पुरानी प्रतिक्रियाएँ दोहराती है: वही पद कई पृष्ठ बाद फिर दिखता है जबकि दूसरा कभी परोसा ही नहीं जाता — ऊपरी धारा में नौ में से नौ बार पुनरुत्पादित। Cache-Control/Pragma शीर्षकों से कुछ नहीं बदला; प्रति अनुरोध एक यादृच्छिक पैरामीटर ने इसे ठीक किया। वह प्रत्येक कॉल पर अद्वितीय होना चाहिए, कभी पृष्ठ संख्या से व्युत्पन्न नहीं: निर्धारक पैरामीटर कैश को फिर भी स्थिर कुंजी देगा, और उसके साथ वही स्थिर, ग़लत मानचित्रण। #3839 से पोर्ट किया गया।
  • Greenhouse की कार्यालय सूचियाँ निर्धारित क्रम में हैं। Greenhouse दो प्रतिक्रियाओं के बीच offices[] के क्रम का वचन नहीं देता, और /offices वृक्ष से पुनर्प्राप्त समुच्चय अपने भ्रमण-क्रम का अनुसरण करता है। दोनों पद के location क्षेत्र तक पहुँचते हैं, इसलिए अपने कार्यालयों का क्रम बदलने वाला बोर्ड उस स्ट्रिंग को फिर से लिख देता था — और जिसमें कुछ नहीं बदला वह पद नया पढ़ा जाता था। मूल ने समुच्चय ठीक किया (#3839); web-ui में उसी दोष का एक दूसरा उदाहरण था जो मूल में नहीं हैoffices[0] का विकल्प, जो तब काम आता है जब पद के पास अपना स्थान न हो — और अब दोनों क्रमित हैं।

टिप्पणियाँ

  • मूल के iCIMS सुधार (#3728) को पोर्ट की आवश्यकता नहीं थी। वह विवरण पृष्ठ के JSON-LD से हर jobLocation प्रविष्टि पढ़ता है, क्योंकि कुछ टेनेंट असली पते से पहले पूरी तरह UNAVAILABLE प्रविष्टि भेजते हैं। web-ui का iCIMS स्थान सूची पृष्ठ के HTML से लेता है और विवरण पृष्ठ कभी नहीं खोलता।
  • _http.mjs के बदलाव को पोर्ट की आवश्यकता नहीं थी। वह isRefusedRedirectError को एक दूसरे उपभोक्ता के लिए अलग करता है जो web-ui में है ही नहीं; isRetryableError का व्यवहार अपरिवर्तित है।
  • स्थान-सचेत डुप्लिकेट-निवारण (#3751) प्रतिबिंबित नहीं है — वह मूल CLI की scan.mjs पाइपलाइन में रहता है।
  • रजिस्ट्री अपरिवर्तित: 90 स्रोत (85 EN + 5 RU)। परीक्षण: 2956 → 2962 (+6)।

[1.229.0] — 2026-09-03

जोड़ा गया — पैरेंट career-ops v1.31.0 से चार स्कैन स्रोत: Built In, Feishu Jobs, Garena और MokaHR।

जोड़ा गया

  • चार नए स्रोत, 86 → 90 (85 EN + 5 RU), ALL_ADAPTERS 81 → 85, सभी बिना टोकन। Built In अमेरिकी टेक बोर्ड के नौ बाज़ारों को कवर करता है और कोई डिफ़ॉल्ट क्वेरी नहीं लाता: queries: और categories: के बिना प्रविष्टि कुछ भी स्कैन नहीं करती और यह बताती है, क्योंकि साझा स्रोत किसी एक व्यक्ति के खोज शब्द नहीं ढो सकता; सूची से बाहर का बाज़ार अस्वीकार होता है, चुपचाप राष्ट्रीय बोर्ड से नहीं बदला जाता। Feishu Jobs केवल दो होस्ट रूप स्वीकारता है, और वे वैकेंसी पृष्ठ के लिए अलग पथ उपयोग करते हैं। Garena एकल कंपनी है: office लिंक को आकार देता है, सूची को नहीं। MokaHR एन्क्रिप्टेड उत्तर लौटाता है (AES-128-CBC लिफ़ाफ़ा, कुंजी साथ ही) — यह अस्पष्टीकरण है, सुरक्षा नहीं, पर बिना डिक्रिप्ट किए कुछ नहीं पढ़ा जाता।

ठीक किया गया

  • htmlToText अधूरे टैग ओपनर को टेक्स्ट में जाने दे सकता था। safe &lt;img src=x onerror=1 इस तरह निकलता था: safe <img src=x onerror=1। अब हर डिकोड के बाद सफ़ाई होती है और अंतिम ओपनर अपना कोण-कोष्ठक खो देता है। पैरेंट से पोर्ट किया (#3491)।

टिप्पणियाँ

  • पैरेंट के Workday सुधार से कुछ भी पोर्ट नहीं हुआ। वह उन टेनेंट्स को बचाता है जिनका बैकएंड पेजिनेशन को ऑफ़सेट 2000 पर रोक देता है — web-ui Workday को पेजिनेट करता ही नहीं (offset: 0 पर एक POST, 100 पंक्तियाँ)।
  • verify-cv-facts और merge-tracker के सुधारों को पोर्ट की ज़रूरत नहीं पड़ी: web-ui उन स्क्रिप्ट्स को पैरेंट चेकआउट से चलाता है।
  • परीक्षण: 2909 → 2956 (+47)।

[1.228.5] — 2026-08-30

ठीक किया गया — बताई गई संस्करण संख्या डिस्क पर पड़ी फ़ाइल का वर्णन करती थी, चल रहे कोड का नहीं।

ठीक किया गया

  • /api/health हर अनुरोध पर package.json दोबारा पढ़ता था, इसलिए पुरानी प्रक्रिया ऐसा संस्करण बताती थी जिसे वह चला ही नहीं रही थी। QA को एक स्थानीय इंस्टेंस मिला जो version: 1.228.4 उत्तर देता था और साथ ही 1.228.3 में जोड़े गए /api/ping पर 404 लौटाता था: वह परिनियोजन से पहले शुरू हुआ था, पुराना कोड परोस रहा था और नई फ़ाइल का संस्करण बता रहा था। फ़ाइलें कॉपी करके कभी पुनरारंभ न करने वाला परिनियोजन ठीक ऐसा ही सफल दिखता है: ऑपरेटर जिस एकमात्र स्ट्रिंग को देखता है, वही समस्या नहीं देख सकती। यह v1.228.1 वाले सिमलिंक जैसा ही वर्ग है, जहाँ rsync बीच ट्रांसफ़र में रुककर भी सफलता बताता था।

    संस्करण अब मॉड्यूल लोड होते समय दर्ज होता है, इसलिए वह चल रहे कोड का वर्णन करता है। पुरानी प्रक्रिया पुराना संस्करण बताएगी — यही सच है, और पहले ही अनुरोध पर दिखता है। parentVersion प्रति-अनुरोध ही रहता है: वह पैरेंट चेकआउट का वर्णन करता है, जिसे यह प्रक्रिया लोड नहीं करती और जो चालू सर्वर के नीचे वैध रूप से बदल सकता है।

[1.228.4] — 2026-08-30

ठीक किया गया — बिना प्रमाणीकरण वाली जीवंतता जाँच हर अनुरोध पर डिस्क का काम करती थी।

ठीक किया गया

  • GET /api/ping हर बार package.json पढ़कर पार्स करता था। यह बिना क्रेडेंशियल पहुँच योग्य एकमात्र एंडपॉइंट है, इसलिए प्रति अनुरोध एक डिस्क पठन और JSON पार्स किसी को भी थमाया गया सेवा-अवरोध का लीवर है — CodeQL ने इसे दर-सीमा की कमी बताया। संस्करण अब रूट पंजीकरण के समय एक ही बार पढ़ा जाता है; पुनरारंभ के बिना वह बदल भी नहीं सकता, इसलिए हैंडलर कोई I/O नहीं करता। दर-सीमा नुकसान को सीमित करती; काम हटाना लीवर ही हटा देता है।
  • लूपबैक के बाहर प्रोफ़ाइल स्वामी के असली नाम का मास्किंग अब परीक्षण से बँधा है। /api/health उसे पहले ही hidden से बदलता था — पर केवल इसलिए कि वह पंक्ति hidden ?? value रक्षक को प्रोजेक्ट रूट के साथ साझा करती है। इसकी कोई जाँच नहीं थी, तो पंक्ति को अपना मान देने वाला संपादन किसी वास्तविक व्यक्ति का नाम बिना किसी के ध्यान दिए लोकल नेटवर्क में लीक कर देता।

[1.228.3] — 2026-08-30

Fixed — the docs assistant could not answer in English, Telegram company names arrived truncated, and a monitor had no way to see the service was up.

Fixed

  • The docs assistant answered “no matching help sections were found” in English while the same question worked in Russian. Retrieval was fine; the context builder was not. buildAskPrompt did if (ctx.length + sec.body.length > MAX_CONTEXT) break — a break, so one oversized section ended the loop and left the context empty, and the assistant truthfully reported it had nothing. The English §5 had grown to 16 081 bytes against a 14 336-byte budget (partly because v1.228.0 added telegram_channels to it); the Russian §5 was 13 009 and fit. Same ranking in both languages — §5 was first — only the size differed.

    Two changes: a section past 6 KB is now split at its ### boundaries, so telegram_channels is its own retrievable chunk (1 340 bytes) that ranks first in both languages; and an oversized section is skipped or truncated rather than ending the loop. The guide went from 32 chunks to 75.

  • A Telegram company label yielded the sentence after it, not the name. Компания: FinCore Technology (продуктовая разработка, высоконагруженные системы) became FinCore Technology (продуктовая разработка, высоконагруженны — capped at 60 characters, cut mid-word. Three of 141 rows. The name now ends at the first separator that introduces a description — a spaced dash (so Coca-Cola survives), a comma, semicolon, pipe or opening parenthesis — and any remaining cap falls on a word boundary. This source attributes a company as fact; a truncated sentence is as wrong as a guessed name, only less obviously so.

Added

  • GET /api/ping — a liveness probe that leaks nothing. { ok, version } and no more. /api/health reports absolute paths, the profile owner’s real name and which API keys are set: legitimate for an authenticated operator, never for the public internet. A monitor behind a Basic-auth gate previously had no way to see the service was up at all.

[1.228.2] — 2026-08-30

Fixed — a two-word search in /api/scan-results matched the phrase, not the words, and under-reported badly.

Fixed

  • ?q= now matches every term independently instead of the literal phrase. The query was a single includes(q) over title + company + location, so продакт менеджер found only rows carrying those two words in that exact adjacency — 32 of the 162 that carry both. Менеджер продукта and Менеджер по развитию продукта were invisible to it: the same words, reordered or with filler between them.

    This is how a narrow match becomes a wrong answer. The Telegram assistant asked for all Продуктовый менеджер reported 9 — faithfully, because 9 was what the endpoint said. The count it quoted was honest; the endpoint’s was not. Word order and the words between are not something a person typing two words intended to pin.

    Matching is AND across terms, so widening precision costs nothing: a row must still carry every term. менеджер разработчик returns zero rather than the union.

[1.228.1] — 2026-08-29

Fixed — a dangling symlink in the repo that silently truncated deploys.

Fixed

  • .claude/skills/refero-design was a tracked symlink to a path that has never existed here. It pointed at ../../.agents/skills/refero-design, which resolves to .agents/ at the repo root; there is no such directory, and the link arrived in the v1.118.0 parity pack from a machine where the surrounding folders nested differently. Anyone cloning the repo has been getting a broken link ever since.

    It was not inert. rsync aborts on it mid-transfer — a deploy today reported success while the server kept running the previous version, and the mismatch only surfaced because the version was checked afterwards. The parent project’s node test-all.mjs also crashes outright when a web-ui checkout sits inside its tree, because its fixture copy walks the working directory and cannot stat the link. Nothing referenced it: the only refero matches in the repo are the Polish word preferowany.

[1.228.0] — 2026-08-29

जोड़ा गया — स्कैन स्रोत के रूप में Telegram चैनल, और /api/scan-results में पृष्ठ-दर-पृष्ठ क्वेरी मोड।

जोड़ा गया

  • Telegram चैनल अब स्कैन योग्य स्रोत हैं। portals.yml में telegram_channels: ब्लॉक उन्हें सूचीबद्ध करता है; हर चैनल सार्वजनिक वेब पूर्वावलोकन https://t.me/s/<चैनल> से पढ़ा जाता है। रजिस्ट्री: 85 → 86 स्रोत (81 EN + 5 RU), ALL_ADAPTERS 80 → 81। Telegram RSS प्रकाशित नहीं करता, और Bot API उस चैनल को नहीं पढ़ सकता जिसका बॉट प्रशासक नहीं है — दोनों स्पष्ट रास्ते बंद हैं। /s/ पूर्वावलोकन सर्वर-रेंडर किया सादा HTML है: बिना लॉगिन, बिना JS, बिना कुकी। 16 चैनलों पर सत्यापित: 15 ने सादे GET पर 20-20 पोस्ट लौटाईं।
  • GET /api/scan-results को पृष्ठ-दर-पृष्ठ क्वेरी मोड मिला। ?q=<पाठ>&limit=50[&region=ru|en][&set=filtered|fresh][&offset=N] { total, returned, offset, limit, set, rows } लौटाता है, जहाँ total पेजिनेशन से पहले की गिनती है। बिना पैरामीटर रूट अब भी पूरा स्नैपशॉट लौटाता है — #/scan तालिका उसी आकार पर निर्भर है।

ठीक किया गया

  • Telegram सहायक आँकड़ों के एक अंश से उत्तर दे रहा था। उसका स्किल पहले से ही /api/scan-results की ओर इशारा करता था, पर रूट केवल पूरा स्नैपशॉट लौटा सकता था — असली मशीन पर लगभग 2 MB — जो एजेंट के संदर्भ में नहीं समाता। «सभी Product Manager खोजो» पर उसने 9 मिलान बताए जबकि स्नैपशॉट में सैकड़ों थे, और कहा कि वह «सीमित स्थानीय इंडेक्स से काम कर रहा है»। यह सच था: एंडपॉइंट दिखता था पर पचता नहीं था। पृष्ठ-दर-पृष्ठ मोड से वही प्रश्न 2 KB में निपटता है और ईमानदार total देता है। स्किल भी दोबारा लिखा गया: वह नई पोस्ट सारांशित करने को कहता था, यानी filtered के बजाय fresh की ओर इशारा करता था।

टिप्पणियाँ

  • चैनल की पोस्ट गद्य है, नौकरी का रिकॉर्ड नहीं। कोई संरचित फ़ील्ड नहीं: शीर्षक पहली सारवान पंक्ति से, कंपनी/स्थान/वेतन स्पष्ट लेबल से। असली रिक्तियों को विज्ञापन और डाइजेस्ट से अलग करना मौजूदा title_filter पर छोड़ा गया है — वही, जो अन्य स्रोतों के लिए पहले से समायोजित है। ये सुराग़ हैं, सूची नहीं।
  • कंपनी का अनुमान कभी नहीं लगाया जाता। लेबल न हो तो पंक्ति चैनल (@rabotaphp) को दी जाती है: ग़लत नियोक्ता ट्रैकर में तथ्य बनकर घुस जाता है।
  • खाली पार्सिंग त्रुटि है, «कोई रिक्ति नहीं» नहीं। निजी या अनुपस्थित चैनल पर t.me पुनर्निर्देशन देता है; वहाँ शून्य पंक्तियाँ लौटाना शांत दिन जैसा पढ़ा जाता और कॉन्फ़िग की टाइपो को हमेशा के लिए छिपा देता। jobGeeks ठीक यही करता है (HTTP 302) और जानबूझकर कॉन्फ़िगर नहीं किया गया।
  • रिमोट पहचान \b के बजाय Unicode शब्द-सीमा उपयोग करती है; \b केवल ASCII जानता है — वही जाल जिसमें v1.227.3 में शीर्षक फ़िल्टर फँसा था, यहाँ रिलीज़ से पहले परीक्षण ने पकड़ लिया।
  • 15 चैनल कॉन्फ़िगर और लाइव सत्यापित: 299 पोस्ट, 15/15 चैनल। 30 नए परीक्षण। परीक्षण: 2865 → 2895
  • The README test counts jumped by hundreds, and no, this release did not add them. The localized READMEs carried unit-test totals frozen at 1856 / 1945 / 1955 / 549 / 419 / 284 / 2527 depending on the file — each stale since a different release, and several contradicting the badge at the top of the same page. They now all read 2895, verified by running the suite rather than by copying a badge. Playwright (70 / 90 / 12 → 101), e2e smoke (20 → 21), route modules (12 / 32 → 37), smoke flows (12 → 22) and the test-file count (218 → 329) were stale in the same way. The Total row also repeated the unit count, so it under-summed the three suites below it; it now reads the real sum (3040).

[1.227.5] — 2026-08-29

ठीक किया गया — क्षेत्रीय स्कैन सर्वर की मेमोरी खा जाता था, और एक Playwright सूट अपने ही teardown पर अस्थिर रूप से गिरता था।

ठीक किया गया

  • क्षेत्रीय स्कैन OOM से सर्वर को मार रहा था। ru-scanner सभी क्वेरी के सारे कच्चे परिणाम जमा करता था और डुप्लिकेट हटाना व फ़िल्टर करना केवल अंत में करता था। क्वेरी सूची जानबूझकर लगभग-पर्यायवाची शब्दों से भरी है (Golang, Go разработчик, Golang разработчик, Senior Go…), इसलिए वही वैकेंसी हर क्वेरी में लौटती है और सरणी अद्वितीय संख्या से कई गुना वस्तुएँ रखती थी — साथ में विवरण भी, जो वस्तु का अधिकांश भार हैं और जिन्हें फ़िल्टर लगभग पूरी तरह हटा देते हैं। मापा गया: 21 क्वेरी के वास्तविक प्रयोग में 742 MB हीप। सर्वर Node की हीप 490 MB पर सीमित करता है (V8 इसे मशीन की 956 MB RAM से निकालता है), इसलिए स्कैन FATAL ERROR: Reached heap limit के साथ सेवा गिरा देता था — एक दिन में चार बार। अब डुप्लिकेट हटाना और फ़िल्टर करना हर क्वेरी पर होता है, जिससे वही प्रयोग 177 MB पर आ गया, 76% कम। रिपोर्ट किए गए आँकड़े अपरिवर्तित हैं: अद्वितीय कुल को URL स्ट्रिंग्स का Set सँभालता है।
  • net::ERR_SOCKET_NOT_CONNECTED CI को बेतरतीब ढंग से गिरा रहा था। तीन Playwright सूट कंसोल त्रुटि न होने की पुष्टि से पहले चल रहे अनुरोध रोकने को window.stop() बुलाते हैं। Chromium इस एक जानबूझकर की गई क्रिया को सॉकेट की स्थिति के अनुसार तीन नामों से बताता है: रद्द करने पर ERR_ABORTED, बीच रास्ते ERR_EMPTY_RESPONSE, और सॉकेट पहले ही जा चुका हो तो ERR_SOCKET_NOT_CONNECTED। साझा फ़िल्टर केवल पहले दो जानता था। यह tr लोकेल स्वीप में सामने आया, जबकि playwright-forms और playwright-smoke भी एक अभागे प्रयोग भर दूर थे।

टिप्पणियाँ

  • अब जाकर क्यों टूटा। प्रोडक्ट मैनेजर की खोजें जोड़ने पर सूची 14 से बढ़कर 21 क्वेरी हो गई। पुराने कार्यान्वयन की मेमोरी कुल परिणामों के साथ बढ़ती थी, इसलिए +50% क्वेरी ने मशीन की छत तोड़ दी।
  • डुप्लिकेट-हटाने का बदलाव व्यवहार बनाए रखता है, और यह परखा गया है, दावा नहीं। tests/ru-scanner-dedup-order.test.mjs उस असुविधाजनक दिशा को पकड़ता है — बाद में आया डुप्लिकेट यदि फ़िल्टर में विफल हो, तो उसे पहले पास हुए को हटाना ही होगा — और पुराने कार्यान्वयन के विरुद्ध 200 यादृच्छिक तुल्यता जाँचें चलाता है।
  • कंसोल फ़िल्टर संकीर्ण ही रहता है। केवल रद्द अनुरोधों का कुल निर्दोष है; अस्वीकृत कनेक्शन, DNS विफलता, रीसेट, कोई भी 5xx और अनकैप्चर्ड JS अपवाद अब भी दावे को गिराते हैं।
  • दो परिकल्पनाएँ भेजने के बजाय परखी और खारिज की गईं: Caddy टाइमआउट (कॉन्फ़िग साफ़, SSE हेतु flush_interval -1 सही) और Node का डिफ़ॉल्ट 5-मिनट requestTimeout (छोटे पैमाने की पुनरुत्पत्ति ने दिखाया कि वह लंबी स्ट्रीमिंग प्रतिक्रिया नहीं काटता)। असली सबूत जर्नल में Reached heap limit था। परीक्षण: 2860 → 2865

[1.227.4] — 2026-08-29

ठीक किया गया — content_filter अब भी word: / stem: को अनदेखा कर रहा था; v1.227.3 ने केवल शीर्षक फ़िल्टर ठीक किया था।

ठीक किया गया

  • content_filter उपसर्गों का पालन नहीं करता था। v1.227.3 ने title_filter को मूल प्रोजेक्ट के word: / stem: उपसर्ग सिखाए, पर content_filter को उसके अपने कच्चे lower.includes(k) पर छोड़ दिया — इसलिए वहाँ उपसर्ग वाली प्रविष्टि अब भी अक्षरशः पाठ "word:java" के रूप में मिलाई जा रही थी — वही मौन no-op, बस एक फ़िल्टर आगे। content_filter नौकरी का विवरण पढ़ता है और उसका डिफ़ॉल्ट सदैव सादा सबस्ट्रिंग रहा है: इसीलिए सादा नकारात्मक java उन सभी पदों को हटा देता है जो केवल «JavaScript» का उल्लेख करते हैं; उपसर्ग ही वह तरीका है जिससे एक प्रविष्टि को उस डिफ़ॉल्ट से बाहर रखा जाता है। मूल का compileContentKeyword पोर्ट किया गया: वह उपसर्ग तंत्र साझा करता है, पर छोटे कीवर्ड को जानबूझकर एंकर नहीं करता — शीर्षक फ़िल्टर 2–3 अक्षर के संक्षिप्ताक्षर एंकर करता है क्योंकि «Coordinator» के भीतर «COO» हमेशा ग़लत होता है, जबकि गद्य के अनुच्छेद में छोटा अनुक्रम प्रायः अभीष्ट होता है (aws, gcp, sql, go)।

टिप्पणियाँ

  • v1.227.3 के PR की AI समीक्षा में पकड़ा गया, जिसने देखा कि कोड वह नहीं करता जो उसकी अपनी टिप्पणी दावा करती है — टिप्पणी में «title_filter / content_filter» लिखा था जबकि जुड़ा केवल शीर्षक पथ था। अब टिप्पणी स्पष्ट रूप से अलग करती है: उपसर्ग दोनों फ़िल्टरों में काम करते हैं, संक्षिप्ताक्षर एंकरिंग केवल शीर्षक में।
  • उसी समीक्षा से सत्यापित और अपरिवर्तित: 2–3 अक्षर के संक्षिप्ताक्षर नियम को \b से Unicode सीमा पर ले जाना ASCII के लिए व्यवहार में समान है और केवल वहीं सख़्त है जहाँ होना चाहिए — COO_lead और coo1 अब भी बने रहते हैं (अंडरस्कोर और अंक दोनों में शब्द-वर्ण हैं), Coordinator बना रहता है, «Директор COO» और «VP «Продукт»» सही ढंग से हटते हैं। 14 सीमांत मामले जाँचे गए।
  • बिना उपसर्ग वाली content_filter प्रविष्टियाँ अपना पूर्व मिलान बाइट-दर-बाइट बनाए रखती हैं, खाली या अनुपस्थित विवरण अब भी पास होता है, और खाली word: / stem: सब कुछ के बजाय कुछ भी मेल नहीं खाता। tests/content-filter.test.mjs में 6 नए केस। परीक्षण: 2852 → 2858

[1.227.3] — 2026-08-29

ठीक किया गया — शीर्षक फ़िल्टर के word: / stem: उपसर्ग चुपचाप अनदेखे हो रहे थे, जिससे वे फ़िल्टर पंक्तियाँ निष्क्रिय हो गई थीं।

ठीक किया गया

  • web-ui मूल प्रोजेक्ट के word: / stem: उपसर्ग लागू नहीं करता था। title_filter (और content_filter) डिफ़ॉल्ट रूप से केस-असंवेदनशील सबस्ट्रिंग मिलान करते हैं — इसीलिए एक सादा नकारात्मक intern «International Product Manager» और «Internal Tools Engineer» को भी हटा देता है। उस डिफ़ॉल्ट को पलटना हर कॉन्फ़िगर किए गए इंस्टॉल को तोड़ देता, इसलिए मूल प्रोजेक्ट ने सटीकता को प्रति-प्रविष्टि वैकल्पिक बनाया: word:intern केवल पूरे शब्द से मेल खाता है, और stem:agent को शब्द की शुरुआत में होना चाहिए, आगे बढ़ सकता है («Agentforce» को «Reagents» से अलग करते हुए)। web-ui में दोनों में से कुछ नहीं था, इसलिए वह प्रविष्टि को अक्षरशः पाठ "word:intern" के रूप में मिलाता था — ऐसा पाठ किसी नौकरी शीर्षक में नहीं होता। वह पंक्ति मौन no-op बन गई: वही portals.yml CLI में सही फ़िल्टर करता था और यहाँ बिल्कुल नहीं, इसलिए बाहर की गई हर इंटर्न वैकेंसी फिर भी #/scan तालिका तक पहुँच रही थी। मूल के title-keywords.mjs से पोर्ट किया गया, जिसमें \b (जो केवल ASCII जानता है और उच्चारण-चिह्न या सिरिलिक शीर्षकों में शब्द के बीच मेल खाता था) के बजाय Unicode-सजग शब्द-सीमा (\p{L}\p{M}\p{N}_) शामिल है।

टिप्पणियाँ

  • एक वास्तविक portals.yml की जाँच के दौरान मिला, जिसमें word:intern अभी-अभी ठीक इसीलिए जोड़ा गया था ताकि सादा intern «International Product Manager» को न हटाए। CLI में उपसर्ग काम कर रहा था; web-ui चुपचाप सभी इंटर्न वैकेंसी रख रहा था। अब व्यवहार समान है।
  • डिफ़ॉल्ट अपरिवर्तित हैं। बिना उपसर्ग वाला कीवर्ड अपना पूर्व मिलान बनाए रखता है: वाक्यांशों और गैर-अक्षर वाले सभी प्रविष्टियों (.NET, SAP , L&D) के लिए सबस्ट्रिंग, और 2–3 अक्षर के संक्षिप्ताक्षरों के लिए शब्द-सीमा। खाली word: / stem: को टाइपो माना जाता है और वह कुछ भी मेल नहीं खाता — नकारात्मक के रूप में खाली पैटर्न हर शीर्षक से मेल खाता और एक भटके हुए कोलन के कारण पूरा स्कैन रद्द कर देता।
  • 2–3 अक्षर के संक्षिप्ताक्षर नियम अब वही Unicode सीमा उपयोग करता है: पहले \b था, जिससे गैर-ASCII शीर्षकों पर coo और word:coo अलग व्यवहार करते थे — एक नियम की दो वर्तनियाँ।
  • tests/title-filter.test.mjs में 6 नए केस। परीक्षण: 2846 → 2852

[1.227.2] — 2026-08-29

ठीक किया गया — सँकरे फ़ोनों पर #/config बगल में खिसक जाता था।

ठीक किया गया

  • MOBILE-1: ≤ 352 px व्यूपोर्ट पर #/config क्षैतिज रूप से बाहर निकल जाता था। हर select फ़ील्ड पर इनलाइन min-width: 300px लगा था। इनलाइन स्टाइल स्टाइलशीट को हरा देता है, इसलिए कंट्रोल अपने कंटेनर के साथ सिकुड़ नहीं पाता था: 320 px व्यूपोर्ट पर select का दायाँ किनारा 353 px पर पड़ता, पेज पर क्षैतिज स्क्रॉलबार आ जाता और कंट्रोल दाएँ किनारे से बाहर धकेल दिए जाते। सभी 18 प्रोवाइडर/मॉडल select प्रभावित थे (cfg-llm-provider और हर cfg-*-model)। अब min-width: min(300px, 100%) + max-width: 100%, ताकि आरामदायक 300 px तभी लगे जब जगह हो। सीमा पर या नीचे के डिवाइस: iPhone SE (पहली पीढ़ी, 320 px), पुराने Android, Galaxy Fold की बाहरी स्क्रीन।

टिप्पणियाँ

  • पिछले सभी मोबाइल पास इसे क्यों चूक गए। 360 px और 375 px पर ओवरफ़्लो छिपाने भर की गुंजाइश ठीक-ठीक है, और Playwright सूट 1280 px चौड़ी विंडो में चलते हैं। CI में कभी किसी टेस्ट ने 375 px से सँकरा व्यूपोर्ट नापा ही नहीं था। नया tests/playwright-narrow-viewport.mjs फ़ॉर्म वाले रूट 320 px पर जाँचता है और किसी भी क्षैतिज ओवरफ़्लो पर फेल होता है, संदेश में सबसे चौड़े तत्व का नाम देते हुए; दूसरा केस तय करता है कि #/config का कोई select व्यूपोर्ट से बाहर न जाए। पहले सत्यापित किया गया कि यह बग को दोहराता है (scrollWidth 353 > clientWidth 320, दायाँ किनारा 353 वाले 18 select)। Playwright: 99 → 101
  • ज्ञात, और जानबूझकर अभी गेट में नहीं: 280 px (Galaxy Fold की बाहरी स्क्रीन) अब भी लगभग 5 px बाहर निकलता है, पर कारण अलग है — कॉन्फ़िग कार्ड के <details> ब्लॉक के भीतर लंबा कंटेंट और 280 px व्यूपोर्ट के सामने 256 px का साइडबार; वह इनलाइन min-width नहीं जिसे यह रिलीज़ ठीक करती है। जिस चौड़ाई की घोषणा कोई मुख्यधारा फ़ोन नहीं करता, उसके लिए पुनःप्रवाह अलग काम है; सूट की WIDTHS सूची उसके लिए तैयार है।
  • v1.227.1 का QA प्रॉम्प्ट भी सुधारा गया, जिसमें फ़ॉलो-अप रूट को #/modes/followup कहा गया था। mode पेज नंगे slug से पंजीकृत होते हैं (Router.register(cfg.slug)), इसलिए रूट #/followup है और #/modes/followup सही ढंग से 404 देता है। केवल दस्तावेज़।
  • यूनिट सूट 2846 पर अपरिवर्तित (नया कवरेज ब्राउज़र स्तर का है)।

[1.227.1] — 2026-08-29

ठीक किया गया — सहायता में स्रोतों का विभाजन स्वयं से मेल नहीं खाता था, और GitHub बैनर ऐप में कच्चे मार्कअप के रूप में छप रहा था।

ठीक किया गया

  • §17 ऐसा कुल और विभाजन देता था जो जुड़ता नहीं था। हर सहायता बंडल कहता था «server/lib/sources/ रजिस्ट्री 85 adapters शिप करती है — 78 अंग्रेज़ी + 5 रूसी»। 78 + 5 = 83 है, 85 नहीं; ja/ko में यह और खिसककर 77 (= 82) था। हर नया स्रोत कुल बढ़ाता और जोड़ को अछूता छोड़ देता, इसलिए दोनों संख्याएँ कई रिलीज़ से अलग होती जा रही थीं। अब विभाजन सभी 17 लोकेल में 80 EN + 5 RU है। यह सजावट से बढ़कर है: docs/help/<lang>.md ही «Ask the docs» का एकमात्र आधार-संग्रह है, इसलिए कितने स्रोत समर्थित हैं यह पूछने वाले को एक ही वाक्य से दो परस्पर विरोधी संख्याएँ मिलती थीं।
  • उसी वाक्य में एक पुराना संस्करण-लंगर टँगा था। «v1.213.0 तक रजिस्ट्री …» 16 लोकेल में बचा रहा जबकि गिनती दो बार बदली (v1.219.0 में 83, v1.226.0 में 85)। यह लंगर v1.210.1 में एक बार हाथ से ठीक किया जा चुका था और फिर से खिसक गया। अब इसे संस्करण-रहित शब्दों के पक्ष में हटा दिया गया — गिनती स्वयं जीवित रजिस्ट्री के विरुद्ध जाँची जाती है, जो पुरानी हो ही नहीं सकती।
  • प्रदाता बैनर #/help के शीर्ष पर escape किए गए मार्कअप के रूप में छपता था। v1.225.0/v1.225.1 में दर्ज था कि इसे «UI.md() ऐप में हटा देता है (कोई छवि समर्थन नहीं)»। यह दो अलग बातों को गड्डमड्ड करता है: UI.md() पहले escape करता है — किसी भी markdown रूपांतरण से पहले स्रोत का हर बाइट escape करता है, जो सही XSS सीमा है पर हटाने के विपरीत है। किसी ने बैनर हटाया नहीं क्योंकि किसी ने कोशिश ही नहीं की, और सभी 17 लोकेल #/help को 268 अक्षरों के शाब्दिक <p align="center"><img src="https://… से खोलते थे। एक नया साझा प्रवेश-बिंदु (server/lib/help-markdown.mjs::stripGithubOnlyBlocks) पढ़ते समय अकेले खड़े HTML छवि-ब्लॉक हटा देता है — GET /api/help/:lang और docs-assistant संग्रह दोनों के लिए। फ़ाइलों में बैनर बना रहता है, इसलिए GitHub पर प्रदर्शन पहले जैसा ही रहता है।
  • कैडेंस बोर्ड का «#» कॉलम v1.117.0 से खाली था। वह entry.appNum पढ़ता था, जबकि followup-cadence.mjs num देता है — appNum कभी payload में था ही नहीं। अब दोनों पढ़े जाते हैं। v1.227.0 की «Next up» पंक्ति को भी यही ग़लती विरासत में मिली थी और वह साथ ही ठीक हुई।

टिप्पणियाँ

  • चारों इसलिए छिपे रहे क्योंकि इन पर कोई पहरा नहीं था। सहायता के गेट (canonical-docs-coverage, help-ui, help-ru-config-section) शीर्षक गिनते हैं — 32 H2 / 121 H3 — और किसी टेस्ट ने कभी अनुच्छेद के भीतर की संख्या नहीं पढ़ी, न ही यह देखा कि सहायता प्रवेश वास्तव में क्या परोसता है। दो नए सूट इसे बंद करते हैं: tests/help-source-counts.test.mjs (घोषित कुल SOURCES.length के बराबर; जोड़ जीवित EN/RU विभाजन के बराबर और कुल बनाते हैं; अनुच्छेद कोई संस्करण नहीं टाँगता) और tests/help-banner-strip.test.mjs (बैनर GitHub के लिए डिस्क पर रहता है, strip के बाद कभी नहीं बचता, हर बंडल की पहली रेंडर पंक्ति उसका शीर्षक है, strip संकीर्ण रहता है, और दोनों उपभोक्ता उसी से गुज़रते हैं)। कमिट से पहले दोनों को इन्हीं बग्स के विरुद्ध लाल होते सत्यापित किया गया। टेस्ट सूट: 2837 → 2846
  • रजिस्ट्री, स्कैनर या रूट अनुबंधों में कोई बदलाव नहीं; स्रोत 85 (80 EN + 5 RU) और ALL_ADAPTERS 80 ही हैं।

[1.227.0] — 2026-08-28

जोड़ा गया — SEEK हांगकांग (JobsDB), फ़ॉलो-अप के लिए केवल-देय फ़िल्टर, और गोपनीय नियोक्ता अब उस एजेंसी को दिखाते हैं जिसने उन्हें प्रस्तुत किया।

जोड़ा गया

  • मौजूदा Jobstreet/SEEK स्रोत के ज़रिए JobsDB हांगकांग। हांगकांग JobsDB ब्रांड के तहत चलता है, पर उसी v5 एंडपॉइंट के पीछे उसी SEEK प्लेटफ़ॉर्म पर टिका है, इसलिए अलग स्रोत की ज़रूरत नहीं — होस्ट अनुमति-सूची में hk.jobsdb.com और siteKey: HK-Main ही काफ़ी हैं। रजिस्ट्री अपरिवर्तित है: 85 स्रोत (80 EN + 5 RU) और ALL_ADAPTERS 80 — यह मौजूदा अडैप्टर पर एक नया बाज़ार है, नया अडैप्टर नहीं।
  • कैडेंस बोर्ड पर केवल-देय फ़िल्टर (#/modes/followup)। एक नया चेकबॉक्स बोर्ड को उसी तक सीमित करता है जिस पर अभी कार्रवाई बनती है। देय होना मूल प्रोजेक्ट के followup-cadence.mjs द्वारा पहले से गणना की गई urgency (urgent / overdue) से पढ़ा जाता है — ट्रैकर के status से कभी नहीं, जो applied/responded/interview होता है और किसी से मेल नहीं खाता। जब कुछ भी देय न हो, बोर्ड खाली स्थिति दिखाने के बजाय निकटतम निर्धारित फ़ॉलो-अप का नाम बताता है। तर्क शुद्ध मॉड्यूल public/js/lib/followup-view.js में रहता है, जो मूल के followup-view.mjs का दर्पण है।
  • गोपनीय नियोक्ताओं का श्रेय उस एजेंसी को जाता है जिसने उन्हें प्रस्तुत किया। जिस पद में नियोक्ता छिपाया गया हो, वह ट्रैकर में ? के रूप में दर्ज होता है और भर्तीकर्ता Via कॉलम में जाता है। #/tracker सिर्फ़ एक नंगा ? दिखाता था, इसलिए कई गोपनीय पंक्तियाँ अप्रभेद्य थीं और लोगो रिज़ॉल्वर के पास मिलान करने को कुछ नहीं था। अब ऐसी पंक्ति “गोपनीय · <एजेंसी> के माध्यम से” पढ़ी जाती है, अपना लोगो एजेंसी के नाम से हल करती है, और खोज बॉक्स में उसी नाम से मिल जाती है। यह केवल प्रस्तुति है — प्रामाणिक company फ़ील्ड पर कभी भर्तीकर्ता नहीं लिखा जाता। नया शुद्ध मॉड्यूल public/js/lib/company-presentation.js, जो मूल के company-presentation.mjs का दर्पण है।

ठीक किया गया

  • Jobstreet/SEEK एक अप्रचलित एंडपॉइंट को कॉल कर रहा था। स्रोत अब भी chalice-search v4 (/api/chalice-search/v4/search) की ओर इशारा कर रहा था, जिसे SEEK ने बंद कर दिया; मूल प्रोजेक्ट /api/jobsearch/v5/search पर चला गया और web-ui ने कभी पीछा नहीं किया। अब हर Jobstreet/SEEK प्रविष्टि v5 से पूछती है। v5 आइटम की संरचना मूल रूप से पढ़ी जाती है (id से जॉब URL बनता है, locations[0].label, advertiser.description, salaryLabel), v4-विशिष्ट प्रोजेक्शन पैरामीटर solrFields हट गया, और जिस प्रविष्टि का portals.yml अब भी मृत v4 पथ पर टिका है, वह अपना बाज़ार होस्टनाम बनाए रखती है जबकि पथ v5 पर पुनर्निर्मित होता है — उपयोगकर्ता को कुछ बदलने की ज़रूरत नहीं।

टिप्पणियाँ

  • career-ops 1.30.0 समतुल्यता (मूल HEAD 8d64f656cc46a4; उसकी VERSION अब भी 1.30.0 पढ़ती है — release-please अपनी main से पीछे है)। पोर्ट नहीं किया गया, कारण सहित: iCIMS JSON-LD स्थान भराई — web-ui के iCIMS स्रोत में enrichDate() हुक है ही नहीं (केवल सूची पृष्ठ), इसलिए ठीक करने को कोई कोड-पथ नहीं; गैर-घातक CLI stderr (#1974) — web-ui का रनर विफलता केवल एग्ज़िट कोड से तय करता है और उसके पास वह अनुमान-विधि कभी थी ही नहीं; Turbopack पथ ट्रेसिंग — web-ui में कोई बंडलर नहीं; cv-sync-check सुधार — केवल-पठन और fail-soft रूप में रिले होते हैं; scan.mjs में Playwright क्रमबद्धता, Block H उत्तर, updater/doctor/update-system सुरक्षाएँ, पुनरावर्ती सिंटैक्स जाँच, Go डैशबोर्ड, तथा jd-skill-gap/verify-cv-facts में जोड़े गए स्व-परीक्षण — केवल-CLI सतहें जिन्हें web-ui नहीं बुलाता, या बिना व्यवहार-परिवर्तन के स्व-परीक्षण। परीक्षण सूट: 2818 → 2837

[1.226.0] — 2026-08-27

जोड़ा गया — दो वियतनामी नौकरी स्रोत: ITviec और CareerViet।

जोड़ा गया

  • ITviec + CareerViet (वियतनाम)। होस्ट-पिन किए गए दो वियतनामी बोर्ड provider: itviec / provider: careerviet प्रविष्टियों से स्कैनर में जुड़ते हैं: ITviec (itviec.com, तकनीक) और CareerViet (careerviet.vn, व्यापक कवरेज)। दोनों टोकन-रहित HTML स्क्रैपर हैं, SSRF होस्ट-पिन, केवल-HTTPS, प्रति-कंपनी fail-soft और पेज सीमाओं के साथ। रजिस्ट्री अब 85 स्रोत (80 EN + 5 RU), ALL_ADAPTERS 80 रखती है — दोनों #/scan स्रोत फ़िल्टर में दिखते हैं।

टिप्पणियाँ

  • career-ops 1.30.0 समता (parentVersion 1.29.0 → 1.30.0)। पोर्ट नहीं (केवल CLI/समुदाय या पहले से कवर): Hired Wall, /calibrate, clean-markers, टेम्पलेट पैक, doctor, pdf/LaTeX, और eval/tracker/scan CLI जिन्हें web-ui कॉल नहीं करता; _html-to-text फ़िक्स और roleFuzzyMatch पहले से थे; title-filter stem: प्रीफ़िक्स स्थगित। परीक्षण सूट: 2818

[1.225.1] — 2026-08-27

ठीक किया गया — प्रदाता-लोगो बैनर अब README और हेल्प में दिखता है।

ठीक किया गया

  • v1.225.0 का बैनर GitHub पर नहीं दिख रहा था: स्वतंत्र images/providers.svg में अमान्य font-family (नेस्टेड दोहरे उद्धरण) था जिसे GitHub अस्वीकार करता है, <img> ने रिपॉज़िटरी-सापेक्ष src इस्तेमाल किया (raw HTML <img> GitHub पर सापेक्ष पथ हल नहीं करता), और <p> ब्लॉक में अंतिम खाली पंक्ति नहीं थी। अब यह एक निरपेक्ष raw URL के ज़रिए रेंडर किए गए images/providers.png की ओर इशारा करता है, खाली पंक्तियों से अलग; SVG को भी मान्य XML में ठीक किया गया।

टिप्पणियाँ

  • केवल दस्तावेज़; कोई कोड/परीक्षण बदलाव नहीं। cvstart.org शोकेस और ऐप की टाइलें पहले से सही थीं (इनलाइन SVG, यह फ़ाइल नहीं)। 2784

[1.225.0] — 2026-08-27

जोड़ा गया — README और हेल्प गाइड में प्रदाता-लोगो बैनर।

जोड़ा गया

  • प्रदाता-लोगो बैनर। एक स्व-निहित images/providers.svg18 LLM प्रदाता, आइकन प्रकाशित करने वाले 11 के लिए असली ब्रांड लोगो (simple-icons, CC0) और शेष 7 के लिए ब्रांड-रंग मोनोग्राम के साथ — अब README (×17) और इन-ऐप हेल्प गाइड के शीर्ष पर है। (ऐप स्वयं असली लोगो टाइलें रेंडर करता है; बैनर GitHub पर रेंडर होता है और ऐप में XSS-सुरक्षित रेंडरर उसे हटा देता है।)

टिप्पणियाँ

  • केवल दस्तावेज़ — कोई कोड/परीक्षण बदलाव नहीं; SVG इनलाइन है (कोई रिमोट संसाधन नहीं)। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण सूट: 2784

[1.224.0] — 2026-08-26

बदला गया — LLM प्रदाता टाइलें अब असली ब्रांड लोगो दिखाती हैं।

बदला गया

  • असली प्रदाता लोगो। प्रदाता टाइलें — सेटिंग्स में API कुंजी फ़ील्ड, उपयोग पंक्तियाँ, डैशबोर्ड चिप, सेटिंग्स का “सक्रिय” सारांश, ⚡ इवैल परिणाम और ऑनबोर्डिंग बैनर — अब उन 11 प्रदाताओं के लिए असली ब्रांड लोगो दिखाती हैं जो ओपन-सोर्स आइकन प्रकाशित करते हैं (Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub · DeepSeek · Kimi · MiniMax · Mistral · Ollama; simple-icons से सिंगल-पाथ SVG, CC0)। बिना प्रकाशित आइकन वाले 7 (Hermes · GLM/Z.ai · Grok · Together · Fireworks · BytePlus Ark · Volcengine Ark) ब्रांड-रंग मोनोग्राम रखते हैं। अब भी निर्माण से CSP-सुरक्षित: लोगो पथ एक इनलाइन स्थिर स्थिरांक है — कोई रिमोट संसाधन नहीं, कोई innerHTML नहीं।

टिप्पणियाँ

  • कोई रूट या व्यवहार परिवर्तन नहीं; वही ProviderLogo.el(slug) API। provider-logo.js बड़ा हुआ (इनलाइन लोगो पथ)। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण सूट: 2784

[1.223.0] — 2026-08-26

ठीक किया — एक सफल ⚡ लाइव इवैल त्रुटि के रूप में रंगी जा रही थी; साथ ही OpenWorker coworker को उसके GitHub URL या .zip से सीधे इंस्टॉल करें।

ठीक किया

  • ⚡ इवैल परिणाम बैज का रंग। एक सफल लाइव इवैल अब विफलता के रूप में नहीं रंगी जाती। इन-प्रोसेस प्रदाता (OpenRouter, DeepSeek, …) सबप्रोसेस एग्ज़िट code नहीं लौटाते, इसलिए सख्त code === 0 झूठ था और हर सफलता लाल दिखती थी (“exit 0” दिखाते हुए भी)। रंग अब परिणाम का अनुसरण करता है — केवल गैर-शून्य कोड से बाहर निकलने वाला सबप्रोसेस ही लाल रंगता है; कोड-रहित लाइव परिणाम badge-ok है, और “· exit N” प्रत्यय केवल असली एग्ज़िट कोड होने पर दिखता है।

बदला गया

  • OpenWorker coworker को उसके GitHub URL / .zip से इंस्टॉल करें। coworker के दस्तावेज़ अब docs/integrations/openworker.md, इन-ऐप हेल्प §32 (×17) और README में एक-कमांड इंस्टॉलर (curl … | bash, idempotent — मौजूदा career-ops / web-ui को फिर से उपयोग करता है) और OpenWorker के तीन इंस्टॉल पथ (GitHub URL · .zip · सिंगल-फ़ाइल इम्पोर्ट) का वर्णन करते हैं।

टिप्पणियाँ

  • एक पुराना कवरेज गैप बंद किया: Recruitee स्रोत में अब v1.214.2 के उद्धृत-कोण फ़िक्स के लिए एंड-टू-एंड टेस्ट है (टैग विशेषता के भीतर > विवरण में नहीं रिसना चाहिए)। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण सूट: 2783

[1.222.0] — 2026-08-26

बदला गया — विस्तारित प्रदाताओं (DeepSeek … Volcengine Ark) के फ़ील्ड संकेत अब सभी 17 भाषाओं में स्थानीयकृत हैं।

बदला गया

  • प्रदाता फ़ील्ड संकेत स्थानीयकृत। v1.216.0–v1.217.0 में जोड़े गए 11 OpenAI-संगत प्रदाताओं (DeepSeek · GLM/Z.ai · Kimi · MiniMax · Mistral · Grok · Together · Fireworks · Ollama · BytePlus Ark · Volcengine Ark) का प्रत्येक config.<slug>Hint —— सेटिंग्स → API कुंजियाँ के अंतर्गत API कुंजी, मॉडल और बेस URL संकेत —— अब अंग्रेज़ी पर वापस गिरने के बजाय सभी 17 भाषाओं में अनुवादित है। साइनअप URL, मॉडल id और ⚡ लाइव इवैल मार्कर ज्यों के त्यों रखे जाते हैं।

टिप्पणियाँ

  • व्यवहार में कोई बदलाव नहीं —— field-specs.js में अंग्रेज़ी hintFallback अब भी अनुपस्थित कुंजी की रक्षा करता है, और एक नया अनुबंध परीक्षण पुष्टि करता है कि प्रत्येक फ़ील्ड-वर्णक hintKey सभी 17 भाषाओं में हल होती है। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण सूट: 2779

[1.221.0] — 2026-08-26

सुरक्षा — स्कैनर fetch पथ पर DNS-rebinding के विरुद्ध गहन-रक्षा।

सुरक्षा

  • स्कैनर का HTTP कोर (server/lib/http-json.mjs में fetchJson/fetchText) अब प्रत्येक स्रोत के होस्ट को वास्तविक नेटवर्क पथ पर हल करता है और यदि वह निजी, लूपबैक, link-local, CGNAT या क्लाउड-मेटाडेटा पते पर हल होता है तो कनेक्ट करने से मना करता है — एक DNS-rebinding वेक्टर बंद करते हुए। स्कैनर होस्ट पहले से सार्वजनिक डोमेन पर पिन हैं, इसलिए यह गहन-रक्षा है; उपयोगकर्ता-URL पथ में पहले से मजबूत कनेक्शन-पिनिंग (safe-fetch.mjs) थी। गार्ड केवल वास्तविक fetch ट्रांसपोर्ट पर चलता है — इंजेक्ट किया गया टेस्ट fetchImpl कभी हल नहीं होता।

टिप्पणियाँ

  • स्वस्थ स्कैन के लिए व्यवहार अपरिवर्तित। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण: 2775

[1.220.0] — 2026-08-26

जोड़ा गया — एक ही प्रविष्टि से कई Get on Board श्रेणियाँ स्कैन करें।

जोड़ा गया

  • एक getonbrd प्रविष्टि अब केवल programming फ़ीड के बजाय categories: [programming, operations-management, machine-learning-ai] (या एकल category:) सेट कर सकती है; पोस्टिंग श्रेणियों में URL से डिडुप होती हैं, अधिकतम 12। मौजूदा प्रविष्टियाँ समान रहती हैं (डिफ़ॉल्ट अब भी programming)।

टिप्पणियाँ

  • केवल सर्वर; SSRF होस्ट-पिन (www.getonbrd.com) और redirect:'error' अपरिवर्तित हैं, और अमान्य श्रेणी slug किसी भी अनुरोध से पहले अस्वीकृत होता है। स्कैन स्रोत अपरिवर्तित: 83। परीक्षण: 2771

[1.219.0] — 2026-08-26

जोड़ा गया — Torre स्कैनर में शामिल, और अब हर प्रदाता लेबल सही है।

जोड़ा गया

  • Torre (provider: torre) — torre.ai का पैन-लैटिन अमेरिकी टैलेंट मार्केटप्लेस, एक बिना-प्रमाणीकरण सार्वजनिक खोज जिसमें Greenhouse/Lever/Ashby तक न पहुँचने वाली रिमोट भूमिकाएँ हैं; प्रति प्रविष्टि एक सीमित अनुरोध। रजिस्ट्री में अब 83 स्रोत हैं (78 अंग्रेज़ी + 5 रूसी)। साथ ही ऑनबोर्डिंग बैनर पर सक्रिय प्रदाता का मोनोग्राम।

ठीक किया

  • a16z Speedrun स्कैन घूमने वाले बोर्ड पर जल्दी रुक जाता था (स्वीप के बीच में एक छोटे पेज को आखिरी मान लिया जाता, ~300 में से 149 पर काट दिया जाता); अब यह फ़ीड के अपने total_pages पर भरोसा करता है। और ऑनबोर्डिंग बैनर प्रदाता को 4-प्रविष्टि मैप से हल करता था (बाकी 14 के लिए कच्चा slug दिखाते हुए) — अब 18 के लेबल+मोनोग्राम का उपयोग करता है; सेटिंग्स का प्रदाता नोट 7 से 18 हो जाता है।

टिप्पणियाँ

  • Get on Board का प्रति-प्रविष्टि बहु-श्रेणी विकल्प यहाँ अभी नहीं जुड़ा है (स्रोत-स्तर रीफैक्टर चाहिए)। परीक्षण: 2768

[1.218.0] — 2026-08-26

जोड़ा गया — जहाँ भी प्रदाता दिखता है, वहाँ प्रदाता बैज (और सही नाम)।

जोड़ा गया

  • डैशबोर्ड चिप, सेटिंग्स “सक्रिय” सारांश और ⚡ मूल्यांकन परिणाम शीर्षक में प्रदाता मोनोग्राम।

ठीक किया

  • पुराने लेबल: तीन स्क्रीन नाम को 5-प्रविष्टि मैप से हल करती थीं (मूल्यांकन परिणाम हर गैर-Anthropic प्रदाता को “Gemini” बताता था); अब साझा ProviderStatus.label (18) का उपयोग करती हैं। कुंजी गणना “/ 7” दिखाती थी → 18। LLM_PROVIDER हिंट की slug सूची में सभी 17 भाषाओं में ark / arkcn जुड़े।

टिप्पणियाँ

  • केवल क्लाइंट, CSP-सुरक्षित। कोई सर्वर बदलाव नहीं। स्कैन स्रोत: 82। परीक्षण: 2758

[1.217.1] — 2026-08-26

परीक्षण सुदृढ़ीकरण — पूरे प्रदाता सूची के लिए एंडपॉइंट कवरेज।

जोड़ा गया

  • Kimi, MiniMax, Mistral और Fireworks के एंडपॉइंट, डिफ़ॉल्ट मॉडल और Bearer प्रमाणीकरण की जाँच करने वाला एक पैरामीटरयुक्त run<Provider> परीक्षण।

[1.217.0] — 2026-08-26

जोड़ा गया — Ark, LLM सूची में शामिल (18 प्रदाता)। ByteDance के Doubao मॉडल BytePlus Ark और Volcengine Ark अब ⚡ लाइव प्रदाता हैं — उसी OpenAI-संगत कोर और क्षेत्र-अनुसार बेस URL के साथ।

जोड़ा गया

  • BytePlus Ark (ARK_API_KEY, अंतरराष्ट्रीय) और Volcengine Ark (ARK_CN_API_KEY, चीन) — runOpenAICompatible() के ज़रिए OpenAI-संगत Chat Completions। ARK_MODEL / ARK_CN_MODEL (Doubao मॉडल नाम या आपका ep-… एंडपॉइंट id) सेट करें; ARK_BASE_URL / ARK_CN_BASE_URL क्षेत्र बदलते हैं। दोनों auto क्रम में (अंत में) जुड़ते हैं, सेटिंग्स और उपयोग में मोनोग्राम के साथ। वेब UI अब 18 प्रदाताओं को लाइव कवर करता है।

टिप्पणियाँ

  • बाकी की तरह वही विश्वसनीय कॉन्फ़िगरेशन + http(s) स्कीम जाँच पथ (कभी भी जॉब-URL का SSRF वैलिडेटर नहीं)। स्कैन स्रोत अपरिवर्तित: 82। परीक्षण: 2755

[1.216.0] — 2026-08-26

जोड़ा गया — नौ और LLM प्रदाता, हर एक के अपने ब्रांड टाइल के साथ। आपके ⚡ लाइव मूल्यांकन अब DeepSeek, GLM (Z.ai), Kimi (Moonshot), MiniMax, Mistral, Grok (xAI), Together, Fireworks या पूर्णतः स्थानीय Ollama के ज़रिए चल सकते हैं — बस एक कुंजी दूर, सेटिंग्स में हर एक के फ़ील्ड के पास मोनोग्राम के साथ।

जोड़ा गया

  • नौ OpenAI-संगत प्रदाता. DeepSeek, GLM (Z.ai), Kimi (Moonshot), MiniMax, Mistral, Grok (xAI), Together AI, Fireworks AI और Ollama (पूर्णतः स्थानीय, बिना कुंजी)। सेटिंग्स में एक कुंजी — या Ollama के लिए OLLAMA_BASE_URL — सेट करें और यह Hermes के बाद auto क्रम में जुड़ जाता है; किसी को भी LLM_PROVIDER से पिन करें। Together, Thinking Machines का Inkling (thinkingmachines/Inkling) भी होस्ट करता है। वेब UI अब 16 प्रदाताओं को लाइव कवर करता है।
  • प्रदाता मोनोग्राम. एक CSP-सुरक्षित, ब्रांड-रंग वाली आद्याक्षर टाइल सेटिंग्स में हर प्रदाता के कुंजी फ़ील्ड के पास और उपयोग पृष्ठ की उसकी पंक्ति में उसे चिह्नित करती है — इनलाइन SVG, कोई बाहरी लोगो नहीं, कुछ भी आपके डिवाइस से बाहर नहीं जाता।

टिप्पणियाँ

  • प्रदाताओं के बेस URL विश्वसनीय कॉन्फ़िगरेशन हैं जो runOpenAICompatible() से http(s) स्कीम जाँच (Ollama का लूपबैक अनुमत) के साथ गुज़रते हैं, कभी भी जॉब-URL के SSRF वैलिडेटर से नहीं। स्कैन स्रोत अपरिवर्तित: 82। परीक्षण: 2752

[1.215.0] — 2026-08-26

जोड़ा गया — अपनी पूरी नौकरी खोज OpenWorker से चलाएँ। एक नया coworker इस पाइपलाइन को Andrew Ng के ओपन-सोर्स AI coworker ऐप से चलाता है, और इन-ऐप हेल्प अब इसे कवर करती है ताकि “डॉक्स से पूछें” सहायक आपको मार्गदर्शन दे सके।

जोड़ा गया

  • OpenWorker coworker। एक कोड-रहित OpenWorker coworker — Fighter90/career-ops-coworker — पूरी नौकरी खोज (स्कैन, स्कोर, टेलर, ट्रैक, फॉलो-अप) चलाता है और इस डैशबोर्ड को लॉन्च कर सकता है, सब आपके डेस्कटॉप पर। यह 17 भाषाओं में उपलब्ध एक-फ़ाइल persona है, जिसे OpenWorker के अपने लोडर से इंस्टॉल-योग्य सत्यापित किया गया है।
  • हेल्प §32 “Run it from OpenWorker” (सभी 17 भाषाएँ) इसे प्रलेखित करती है, ताकि इन-ऐप डॉक्स से पूछें सहायक और तैरता हुआ हेल्प बटन इसके बारे में उत्तर दे सकें। लैंडिंग फ़ुटर, README, विकी और docs/integrations/openworker.md से भी लिंक किया गया है।

टिप्पणियाँ

  • केवल दस्तावेज़ + साइट — ऐप कोड में कोई बदलाव नहीं। स्कैन स्रोत 82 पर अपरिवर्तित। परीक्षण सूट: 2742

[1.214.2] — 2026-08-25

ठीक — साझा HTML→टेक्स्ट पाइपलाइन (Greenhouse / Recruitee विवरण) अब किसी विशेषता मान में > वर्ण होने पर टैग विशेषताओं को विवरण में नहीं रिसाती।

ठीक

  • किसी विशेषता के भीतर > वाले HTML विवरण साफ़-सुथरे हटाए जाते हैं। Greenhouse और Recruitee विवरणों के पीछे का टैग-हटानेवाला पहले > पर रुकने वाला सरल मिलान इस्तेमाल करता था, इसलिए <a title="salary > 100k"> जैसा टैग अंतिम विशेषता पाठ (100k">) को विवरण में छोड़ देता था। अब यह उद्धृत विशेषता मानों (एकल या दोहरे) का सम्मान करता है, एंटिटी डिकोड करने से पहले मार्कअप हटाता है (ताकि किसी विशेषता के भीतर एन्कोडेड उद्धरण झूठा सीमांकक न बने), और सादे पाठ में शाब्दिक <> अब भी सुरक्षित रखता है।

टिप्पणियाँ

  • परीक्षण सूट: 2742। स्कैन स्रोत 82 पर अपरिवर्तित। इस दौर में पैरेंट से और कुछ नया नहीं: शेष परिवर्तन केवल-पठन रूप में रिले होते हैं (follow-up / weekly-digest / rejection-latency / salary-gap फ़िक्स को web-ui बदलाव की ज़रूरत नहीं) या web-ui सतह नहीं हैं (एक बाहरी X/Xquik BYO-key प्लगइन, CLI/verify फ़िक्स)। वैकल्पिक आइटम — SmartRecruiters विवरण, detect-reposts एग्रीगेटर स्किप, stem: / word: शीर्षक उपसर्ग, DNS-रीबाइंडिंग हार्डनिंग — कतार में बने हुए हैं।

[1.214.1] — 2026-08-25

ठीक — Ashby के जॉब विवरण अब Greenhouse और Recruitee के समान लंबाई पर सीमित होते हैं, इसलिए कंटेंट फ़िल्टर तीनों बोर्डों पर एक जैसा व्यवहार करता है और एक बोर्ड स्कैन कैश को फुला नहीं सकता।

ठीक

  • Ashby के विवरण अब अन्य बोर्डों के समान लंबाई सीमा का पालन करते हैं। v1.214.0 Ashby के पोस्टिंग मुख्य भाग को कंटेंट फ़िल्टर में देती थी, पर — 4000 अक्षरों पर सीमित करने वाले Greenhouse और Recruitee के विपरीत — Ashby का सीधे बिना सीमा के मैप होता था (कुछ 4 गुना लंबे)। इसलिए वही content_filter कीवर्ड केवल इस आधार पर कि वह पाठ में कहाँ पड़ता है, Ashby पर मेल खा सकता था पर Greenhouse पर नहीं, और एक बोर्ड #/scan द्वारा लोड किए जाने वाले स्कैन कैश में सैकड़ों KB जोड़ सकता था। अब Ashby भी उन्हीं 4000 अक्षरों पर सीमित है (इसका पाठ पहले से सादा है, इसलिए यह छोटा किया जाता है, टैग कभी नहीं हटाए जाते)।

टिप्पणियाँ

  • परीक्षण सूट: 2738। स्कैन स्रोत 82 पर अपरिवर्तित।

[1.214.0] — 2026-08-25

ठीक — Greenhouse, Ashby और Recruitee के जॉब विवरण अब कंटेंट फ़िल्टर में जाते हैं, इसलिए कीवर्ड / देश / वीज़ा फ़िल्टर वास्तव में इन बोर्डों से मेल खाते हैं; और “Associate <सीनियर पदनाम>” (शैक्षणिक रैंक सहित) अब एंट्री-लेवल में गलत वर्गीकृत नहीं होता।

ठीक

  • कंटेंट फ़िल्टर अब Greenhouse, Ashby और Recruitee पर काम करते हैं। ये बोर्ड अब प्रत्येक पोस्टिंग का पूरा टेक्स्ट उसके विवरण के रूप में रखते हैं, इसलिए विवरण पढ़ने वाला content_filter (या देश / वीज़ा कीवर्ड फ़िल्टर) बोर्ड को आँख मूँदकर पास करने के बजाय जॉब मुख्य भाग से मेल खाता है। Ashby और Recruitee सूची पेलोड में मुख्य भाग मुफ़्त देते हैं; Greenhouse पहले से देता था। तीनों एक ही साझा HTML→टेक्स्ट पाइपलाइन से गुज़रते हैं।
  • “Associate Director” / “Associate Professor” सीनियर है, एंट्री-लेवल नहीं। सीनियरिटी वर्गीकारक (skip_tiers: द्वारा प्रयुक्त) “associate” शब्द को एंट्री-लेवल चिह्न मानता था, भले वह किसी सीनियर पदनाम से पहले आता हो। अब यह “Associate <सीनियर संज्ञा>”—शैक्षणिक रैंक सहित (Associate Professor, Associate Dean)—को सीनियर पढ़ता है, वास्तविक जूनियर रूपों (Associate Attorney, Associate Editor) को एंट्री-लेवल रखता है, और अग्रणी “Intern, Associate Dean” को अब भी इंटर्नशिप वर्गीकृत करता है।

टिप्पणियाँ

  • परीक्षण सूट: 2736। स्कैन स्रोत 82 पर अपरिवर्तित। बाद के लिए कतारबद्ध: वैकल्पिक SmartRecruiters विवरण संवर्धन (प्रति-पोस्टिंग विवरण अनुरोध), detect-reposts का aggregator: true बोर्ड स्किप, और एंकर-कीवर्ड stem: / word: शीर्षक उपसर्ग — प्रत्येक एक वैकल्पिक कॉन्फ़िग है, डिफ़ॉल्ट व्यवहार परिवर्तन नहीं। DNS-रीबाइंडिंग हार्डनिंग अपनी समर्पित सुरक्षा रिलीज़ के लिए अब भी कतार में है।

[1.213.0] — 2026-08-22

जोड़ा गया — सिंगापुर का राष्ट्रीय जॉब बैंक MyCareersFuture एक स्कैन स्रोत के रूप में। ठीक — Greenhouse पोस्टिंग अब अपना पूरा टेक्स्ट रखती हैं ताकि कंटेंट फ़िल्टर काम करें, और रिमोट Ashby भूमिकाएँ अब केवल-शहर वाले स्थान के पीछे नहीं छिपतीं।

जोड़ा गया

  • MyCareersFuture (सिंगापुर) (mycareersfuture.gov.sg) — Workforce Singapore द्वारा संचालित सिंगापुर के राष्ट्रीय सार्वजनिक जॉब बैंक के लिए एक नया बिना-टोकन स्कैन स्रोत। इसे #/scan के स्रोत फ़िल्टर में चुनें, या एक वैकल्पिक keywords सूची के साथ provider: mycareersfuture वाली कंपनी जोड़ें (Job Bank की तरह, न होने पर यह आपके प्रोफ़ाइल की लक्ष्य भूमिकाओं पर लौटता है)। सार्वजनिक खोज API पढ़ता है, होस्ट-पिन किया, बिना कुंजी।

ठीक

  • Greenhouse पोस्टिंग अब कंटेंट से फ़िल्टर हो सकती हैं। Greenhouse बोर्ड पोस्टिंग के पूरे मुख्य भाग के साथ लाए जाते हैं, जिसे पोस्टिंग के विवरण के रूप में सादे टेक्स्ट में डिकोड किया जाता है — इसलिए विवरण पढ़ने वाला content_filter (या देश/वीज़ा कीवर्ड फ़िल्टर) अब Greenhouse भूमिकाओं को आँख मूँदकर पास करने के बजाय वास्तव में मैच करता है।
  • रिमोट Ashby भूमिकाएँ अब किसी शहर फ़िल्टर से नहीं हटतीं। Ashby कार्य-मॉडल (Remote/Hybrid/Onsite) को ऑफ़िस शहर से अलग रखता है, इसलिए पूरी तरह रिमोट भूमिका फिर भी जैसे “San Francisco” पढ़ी जाती थी — और उस शहर को रोकने वाला स्थान फ़िल्टर एक स्वीकार्य भूमिका छिपा देता था। अब भूमिका रिमोट होने पर स्थान में “Remote” जोड़ा जाता है, और workplaceType पुराने isRemote फ़्लैग पर भारी पड़ता है ताकि ऑफ़िस-आधारित हाइब्रिड भूमिका गलत लेबल न हो।

टिप्पणियाँ

  • स्कैन स्रोत: 82 (77 अंग्रेज़ी + 5 रूसी)। परीक्षण सूट: 2724। एक DNS-रीबाइंडिंग हार्डनिंग (कनेक्ट करने से पहले होस्ट के हल किए गए पते को मान्य करना) एक समर्पित रिलीज़ के लिए कतार में है — इसे सीधे पोर्ट के बजाय web-ui-विशिष्ट डिज़ाइन चाहिए।

[1.212.1] — 2026-08-21

ठीक — cvstart.org लैंडिंग स्कैनर के जॉब स्रोतों को कम गिन रही थी (80 दिखाती और Job Bank (कनाडा) छोड़ देती); अब यह फिर से ऐप के 81 से मेल खाती है, और यदि दोनों कभी असहमत हों तो साइट बिल्ड ज़ोर से विफल होता है।

ठीक

  • लैंडिंग का “जॉब स्रोत” गिनती फिर से ऐप के साथ समकालिक है। v1.212.0 के बाद cvstart.org 80 बोर्ड दिखा रहा था और नया Job Bank (कनाडा) चिप गायब था, जबकि ऐप, स्कैन ड्रॉपडाउन और सहायता गाइड सभी 81 सूचीबद्ध कर रहे थे। लैंडिंग अपनी सूची लाइव स्कैनर रजिस्ट्री लोड करके बनाती है, और एक स्रोत उस बिल्ड में लोड होने में विफल रहा क्योंकि वह एक YAML निर्भरता कैसे लाता था — इसलिए वह चुपचाप हटा दिया गया। अब Job Bank उस निर्भरता को आलसी रूप से लोड करता है, ठीक वैसे ही जैसे बाकी ऐप स्कैन समय पर करता है, इसलिए वह हमेशा दिखता है।
  • साइट बिल्ड अब असंगत स्रोत गिनती प्रकाशित करने से इनकार करता है। यदि रजिस्ट्री डिस्क पर मौजूद से कम स्रोत गिनती है (लोड होने में विफल स्रोत का चिह्न), तो बिल्ड गलत संख्या चुपचाप प्रकाशित करने के बजाय स्पष्ट संदेश के साथ विफल होता है।

टिप्पणियाँ

  • ऐप का व्यवहार अपरिवर्तित है — स्कैनर में हमेशा सभी 81 स्रोत थे; केवल लैंडिंग पेज प्रभावित हुआ। स्कैन स्रोत: 81 (76 अंग्रेज़ी + 5 रूसी) — अपरिवर्तित। परीक्षण सूट: 2687

[1.212.0] — 2026-08-21

जोड़ा गया — Job Bank (कनाडा), संघीय राष्ट्रीय जॉब बोर्ड। हटाया गया — EchoJobs (इसकी फ़ीड अब बॉट-अवरुद्ध है)। ठीक — Consider-आधारित बोर्ड फिर से परिणाम देते हैं, और बहु-स्थान वाली Lever भूमिकाएँ अब अपने आधे स्थान नहीं छिपातीं।

जोड़ा गया

  • Job Bank (कनाडा) (jobbank.gc.ca) — कनाडा की संघीय राष्ट्रीय रोज़गार सेवा के लिए एक नया बिना-टोकन स्कैन स्रोत, एक उच्च-मात्रा बोर्ड जिसे कोई एग्रीगेटर अच्छी तरह कवर नहीं करता। इसे #/scan के स्रोत फ़िल्टर में चुनें, या एक वैकल्पिक keywords सूची के साथ provider: jobbankca वाली कंपनी जोड़ें (न होने पर यह आपके प्रोफ़ाइल की लक्ष्य भूमिकाओं पर लौटता है)। सार्वजनिक ATOM फ़ीड पढ़ता है, होस्ट-पिन किया, बिना कुंजी।

हटाया गया

  • EchoJobs — सेवानिवृत्त। इसकी सार्वजनिक फ़ीड अब बॉट-सुरक्षा के पीछे है और कुछ नहीं लौटाती, इसलिए इसे रखना केवल एक स्कैन स्लॉट बर्बाद करता था।

ठीक

  • Consider-आधारित बोर्ड फिर से परिणाम देते हैं। Consider अब खोज अनुरोध स्वीकारने से पहले एक अनाम हैंडशेक (एक GET जो सत्र कुकी + CSRF टोकन बोता है) माँगता है; इसके बिना अनुरोध चुपचाप अस्वीकृत हो जाता और बोर्ड खाली दिखता।
  • बहु-स्थान वाली Lever भूमिकाएँ अब अपने आधे स्थान नहीं छिपातीं। Lever एक प्राथमिक शहर location में और बाकी allLocations में रखता है; केवल प्राथमिक पढ़ने से बार्सिलोना और मोंटेवीडियो दोनों में खुली भूमिका केवल-बार्सिलोना दिखती (और स्थान फ़िल्टर द्वारा गलती से हटा दी जाती)। अब दोनों विलीन हो जाते हैं।

टिप्पणियाँ

  • पृष्ठांकित बोर्डों पर पृष्ठों के बीच सौम्य गति (150 के बजाय 250 ms), एकल-होस्ट करियर साइटों के प्रति शिष्टता हेतु। स्कैन स्रोत: 81 (76 अंग्रेज़ी + 5 रूसी) — अपरिवर्तित (Job Bank अंदर, EchoJobs बाहर)। परीक्षण सूट: 2685

[1.211.0] — 2026-08-19

जोड़ा गया — Yourator, ताइवान का टेक जॉब बोर्ड। ठीक — शीर्षक/कंपनी नाम की एक्सेंट वाली एंटिटी अब हर जगह डिकोड होती हैं, और नाम में एक्सेंट वाली कंपनी अब गलती से फ़्लैग नहीं होती।

जोड़ा गया

  • Yourator (yourator.co) — ताइवान के टेक व डिजिटल जॉब बाज़ार के लिए एक नया बिना-टोकन स्कैन स्रोत। इसे #/scan के स्रोत फ़िल्टर में चुनें, या provider: yourator वाली कंपनी जोड़ें। यह सार्वजनिक JSON API पढ़ता है (कोई कुंजी नहीं, कोई ब्राउज़र नहीं), बोर्ड के हर पेज पर चलता है, और हर पोस्टिंग का असली नियोक्ता लिंक (उसका अपना ATS) ट्रैकिंग पैरामीटर हटाकर देता है।

ठीक

  • एक्सेंट वाली नामित एंटिटी अब हर जगह डिकोड होती हैं। साझा HTML डिकोडर को Latin-1 अक्षर मिले (&eacute; → é, &ccedil; → ç, …), इसलिए D&eacute;veloppeur या Fran&ccedil;ais लिखने वाला यूरोपीय बोर्ड अब वह लिटरल किसी शीर्षक, ट्रैकर या जनरेटेड दस्तावेज़ में नहीं छोड़ता। (बड़े अक्षर बड़े रहते हैं — &Eacute; É है, é नहीं — और &constructor; जैसा लुकअप अब स्वयं में हल होता है।)
  • नाम में एक्सेंट वाली कंपनी अपने ही डोमेन पर होने के कारण अब गलती से फ़्लैग नहीं होती। “Işık” अब “isik” में मुड़ता है और isik.com.tr से मेल खाता है; “Société Générale” societegenerale.com से मेल खाता है। पुरानी जाँच एक्सेंट अक्षरों को ASCII आधार में मोड़ने के बजाय हटा देती थी।

टिप्पणियाँ

  • स्कैन स्रोत: 81 (76 अंग्रेज़ी + 5 रूसी)। परीक्षण सूट: 2667

[1.210.1] — 2026-08-19

ठीक — “&” या उद्धरण-चिह्न वाले Habr Career के वैकेंसी शीर्षक और कंपनी नाम अब गड़बड़ होकर नहीं आते।

ठीक

  • Habr Career स्रोत अब शीर्षक और कंपनी नाम में HTML एंटिटी को आगे बढ़ने से पहले डिकोड करता है। सर्वर-रेंडर्ड कार्ड एस्केप्ड रूप में आते हैं (“Changellenge >>”, “Demand Forecasting & Inventory Optimization”, “ООО "М-ТЕХ"”), इसलिए बिना-डिकोड किया “&” चुपचाप आपके अपने “&” शीर्षक फ़िल्टर से चूक जाता था — ठीक वही लक्षण जो पिछली रिलीज़ ने अन्य पाँच बोर्डों पर बंद किया — और कंपनी नाम ट्रैकर व रिपोर्ट तक गड़बड़ पहुँचते थे। एंटिटी-डिकोडिंग अब सभी छह प्रभावित स्रोतों पर पूरी हो गई है।

टिप्पणियाँ

  • परीक्षण सूट: 2644

[1.210.0] — 2026-08-19

जोड़ा गया — Senjob, स्कैनर का पहला अफ़्रीकी जॉब बोर्ड (सेनेगल); पाँच और बोर्डों पर शीर्षक-मिलान बेहतर।

जोड़ा गया

  • Senjob (senjob.com) — सेनेगल के लिए एक नया बिना-टोकन स्कैन स्रोत, और स्कैनर का पहला अफ़्रीकी बोर्ड। इसे #/scan के स्रोत फ़िल्टर में चुनें, या provider: senjob वाली कंपनी जोड़ें। यह सार्वजनिक सूची को सादे HTTP से पढ़ता है (कोई कुंजी नहीं, कोई ब्राउज़र नहीं), हर अनुरोध को senjob.com पर पिन करता है, और — चूँकि यह HTML पार्स करता है — अचानक कुछ न देने वाली सूची को “बिना नौकरियों वाला देश” नहीं, बल्कि टूटा बोर्ड (एक दिखने वाली त्रुटि) मानता है।

ठीक

  • “&” वाले शीर्षक अब पाँच बोर्डों पर नौकरियाँ नहीं गिराते — beesite, Cornerstone (csod), Hacker News “Who is hiring”, Phenom और TKMS पर शीर्षक HTML-एस्केप्ड आते हैं, इसलिए “R&D Engineer” जैसी भूमिका में एस्केप हुआ “&” आपके अपने “r&d” कीवर्ड से चूक जाता और पोस्टिंग चुपचाप गायब हो जाती (“sales & marketing” वीटो भी कभी नहीं चलता)। अब शीर्षक — और Phenom के स्थान — फ़िल्टर से पहले डिकोड होते हैं।

टिप्पणियाँ

  • स्कैन स्रोत: 80 (75 अंग्रेज़ी + 5 रूसी)। परीक्षण सूट: 2643

[1.209.0] — 2026-08-17

जोड़ा गया — इन-ऐप सहायता अब किसी आवेदन का परिणाम दर्ज करना कवर करती है, और “डॉक्स से पूछें” आपको वहाँ पहुँचा सकता है।

जोड़ा गया

  • ट्रैकर सहायता (§11) को सभी 17 भाषाओं में एक “परिणाम दर्ज करें” अनुभाग मिला, जो परिणाम बटन के बारे में बताता है: चुनें कि क्या हुआ (अस्वीकृत / ऑफ़र / नियुक्त / ठुकराया / घोस्ट / साक्षात्कार तक पहुँचा), पूर्वावलोकन देखें कि वह क्या करेगा, फिर दर्ज करें — जो परिणाम नोट करता है, आपके भेजे गए CV और कवर लेटर को संग्रहित करता है, और पंक्ति की स्थिति आपके लिए सिंक करता है। तैरता हुआ “डॉक्स से पूछें” सहायक इस गाइड को पढ़ता है, इसलिए अब यह केवल स्थिति को हाथ से संपादित करने का सुझाव देने के बजाय आपको उस बटन तक ले जाता है।

टिप्पणियाँ

  • हर सहायता बंडल अब 31 H2 / 119 H3 है (पहले 118); पैरिटी गार्ड बढ़ा दिए गए। केवल दस्तावेज़ — कोई कोड या व्यवहार परिवर्तन नहीं। सूट: 2625

[1.208.2] — 2026-08-16

ठीक — फ़ोन पर सूचना और थीम बटन अब सर्च बॉक्स के ऊपर नहीं बैठते।

ठीक

  • v1.208.1 ने टॉप-बार के बटनों को पेज शीर्षक पर चढ़ने से रोका, पर संकरी — हालाँकि सबसे संकरी नहीं — स्क्रीन पर, खासकर लंबे बटन-लेबल वाली भाषाओं में, पूरी बार फिर भी एक ही पंक्ति में सिमट जाती थी, जिससे 🔔 और 🌙 बटन सर्च बॉक्स के ऊपर आ सकते थे। अब एक्शन बटन (सूचनाएँ, थीम, डायग्नोस्टिक्स, Scan खोलें) फ़ोन पर हमेशा अपनी पूरी-चौड़ाई वाली दूसरी पंक्ति में उतर जाते हैं, इसलिए सर्च बॉक्स पूरा दिखता है और कुछ भी नहीं चढ़ता।

टिप्पणियाँ

  • फ़ोन पर टॉप-बार के एक्शन बटन पूरी-चौड़ाई वाली दूसरी पंक्ति में चले जाते हैं, जिससे वह नाज़ुक “लगभग भरी पंक्ति” पट्टी हट जाती है जहाँ लेआउट बची ऋणात्मक जगह को ओवरलैप के रूप में बाँट देता था। एक Playwright गार्ड अब सटीक ट्रिगर — लंबे-लेबल वाली लोकेल × 565–640px पट्टी — को दोहराता है और जाँचता है कि टॉप-बार के कंट्रोल कभी पिक्सेल साझा न करें। सूट: 2621

[1.208.1] — 2026-08-16

ठीक — फ़ोन पर टॉप-बार के बटन अब पेज पर नहीं चढ़ते।

ठीक

  • v1.208.0 संकरी स्क्रीन पर टॉप-बार के एक्शन बटन (डायग्नोस्टिक्स, Scan खोलें, सूचनाएँ, थीम) दूसरी पंक्ति में लपेटता था, पर बार की ऊँचाई स्थिर रहती थी, इसलिए लपेटी पंक्ति बाहर निकलकर पेज शीर्षक के ऊपर बैठ जाती थी। अब बार अपनी पंक्तियों के अनुसार बढ़ता है और सामग्री उसके नीचे बहती है।

टिप्पणियाँ

  • बार की स्थिर height को min-height किया गया, ताकि यह किसी भी चौड़ाई पर सामग्री के साथ बढ़े (डेस्कटॉप अपरिवर्तित)। एक Playwright गार्ड अब यह भी जाँचता है कि बार पेज पर बाहर न निकले। सूट: 2621

[1.208.0] — 2026-08-16

ठीक — ऐप अब फ़ोन स्क्रीन में समाता है: बगल में स्क्रॉल खत्म।

ठीक

  • संकरी स्क्रीन पर पूरा ऐप बगल में खिसक जाता था — टॉप बार, टेबल, हेल्प लेख और सेटिंग्स टैब सभी दाईं किनारी से बाहर निकल जाते थे। अब हर पेज किसी भी चौड़ाई में समाता है: टॉप बार के बटन दूसरी पंक्ति में आ जाते हैं, चौड़ी टेबल और कोड ब्लॉक अपने ही बॉक्स में स्क्रॉल होते हैं, हेल्प अपनी विषय-सूची को लेख के ऊपर रखती है, बटन/टैब पंक्तियाँ रैप होती हैं, और लंबे पथ या URL पेज को खींचने के बजाय टूटकर रैप होते हैं।

टिप्पणियाँ

  • मूल कारण classic flex/grid min-width: auto जाल और कुछ बिना-रैप किए चौड़े तत्व थे; grid आइटम पर min-width: 0, markdown/शीर्षकों पर overflow-wrap, एक स्क्रॉल-योग्य markdown टेबल, और मोबाइल ब्रेकपॉइंट पर हेल्प ग्रिड को खड़ा करके ठीक किया। एक Playwright गार्ड मुख्य रूट पर 375px पर 0 क्षैतिज ओवरफ़्लो जाँचता है। tests/playwright-smoke.mjs। सूट: 2621

[1.207.2] — 2026-08-16

ठीक — AI योजनाएँ और करियर-ओरिएंटेशन प्रोफ़ाइल अब कच्चे कोड-डंप के रूप में नहीं दिखतीं।

ठीक

  • कुछ मॉडल अपना पूरा उत्तर markdown … कोड-फ़ेंस में लपेट देते हैं। ऐसा होने पर विकास योजना और ओरिएंटेशन प्रोफ़ाइल शीर्षकों और सूचियों वाले दस्तावेज़ के बजाय मोनोस्पेस कोड-ब्लॉक के रूप में दिखती थीं। अब लपेटने वाली फ़ेंस हटा दी जाती है — केवल तब जब वह पूरे उत्तर को लपेटती हो और भाषा स्पष्ट रूप से markdown/md हो, ताकि असली python/js/बिना-भाषा ``` कोड उत्तर अछूता रहे।

टिप्पणियाँ

  • साझा LLM-सफ़ाई चरण (cleanLlmMarkdown) में एक ही बार संभाला गया, इसलिए सभी AI रूट को लाभ मिलता है, और लपेटे उत्तर के भीतर के कोड-ब्लॉक बचे रहते हैं। tests/llm-output.test.mjs (+3)। सूट: 2621

[1.207.1] — 2026-08-16

ठीक — छोटे फ़ोन पर लैंडिंग पेज अब बगल में बाहर नहीं निकलता।

ठीक

  • संकरे फ़ोन पर हीरो हिस्सा — शीर्षक, परिचय पंक्ति और इंस्टॉल टर्मिनल — दाईं किनारी पर कट सकता था, क्योंकि लंबा इंस्टॉल कमांड और लेआउट कॉलम स्क्रीन के अनुसार सिकुड़ते नहीं थे। अब वे किसी भी चौड़ाई में समा जाते हैं; इंस्टॉल कमांड अपने टर्मिनल बॉक्स के भीतर स्क्रॉल होता है।

टिप्पणियाँ

  • साथ ही एक अस्थिर E2E स्मोक जाँच को मज़बूत किया गया जो किसी संसाधन के क्षणिक 404 पर विफल हो सकती थी: अब यह पड़ोसी जाँचों की तरह हानिरहित नेटवर्क शोर (favicon / कनेक्शन / विफल संसाधन) को अनदेखा करती है, फिर भी असली स्क्रिप्ट त्रुटियाँ पकड़ती है। ऐप्लिकेशन के व्यवहार में कोई बदलाव नहीं। सूट: 2618

[1.207.0] — 2026-08-15

जोड़ा गया — ट्रैकर से ही किसी आवेदन का परिणाम दर्ज करें।

जोड़ा गया

  • हर ट्रैकर पंक्ति को एक परिणाम क्रिया मिलती है: चुनें कि क्या हुआ (अस्वीकृत, ऑफ़र मिला, नियुक्त, ऑफ़र अस्वीकार, कोई जवाब नहीं, साक्षात्कार तक पहुँचा), एक वैकल्पिक नोट जोड़ें, परिणामी स्थिति का पूर्वावलोकन करें, फिर दर्ज करें। दर्ज करने पर भेजे गए CV व कवर-लेटर आर्टिफ़ैक्ट संग्रहीत होते हैं और ट्रैकर मानक स्थिति में सिंक होता है — हाथ से संपादन के बजाय एक नियतात्मक क्रिया।

टिप्पणियाँ

  • नया POST /api/outcome परिणाम CLI को रिले करता है: dryRun:true केवल-पढ़ने का पूर्वावलोकन है (पंक्ति मिलाता है, परिणामी स्थिति बताता है, कुछ नहीं लिखता); वास्तविक कॉल इसे दर्ज करती है। लेखन-सुरक्षा: परिणाम प्रकार ज्ञात समुच्चय तक सीमित है और हर टेक्स्ट फ़ील्ड को कॉल से पहले नियंत्रण-वर्ण होने पर अस्वीकार किया जाता है (ऐरे आर्ग्युमेंट, spawn — कोई शेल नहीं)। tests/outcome-route.test.mjs. सूट: 2618

[1.206.0] — 2026-08-15

दस्तावेज़ीकरण — इन-ऐप हेल्प गाइड अब पाँच नवीनतम सुविधाओं को सभी 17 भाषाओं में कवर करती है।

जोड़ा गया

  • अंतर्निहित हेल्प गाइड — और उसी के आधार पर उत्तर देने वाला «हेल्प से पूछें» सहायक — अब हाल में जोड़ी गई पाँच सुविधाओं का दस्तावेज़ देता है: सेटअप डॉक्टर (सेटिंग्स — आपके CV और प्रोफ़ाइल में कमियों और बची हुई उदाहरण-डेटा की जाँच), ATS बोर्ड खोजें (पोर्टल — किसी कंपनी का करियर बोर्ड स्वतः ढूँढता है), «अब भी खुली है?» जाँच (ट्रैकर — क्या पद अब भी खुला है), «पुराना CV दोबारा उपयोग करें?» संकेत (CV स्टूडियो — जब पहले से अनुकूलित CV किसी नए पद के लिए उपयुक्त हो तो सूचित करता है) और स्किल लॉग (एनालिटिक्स — स्व-मूल्यांकन स्कोर दर्ज करें)। पाँच नए उपखंड, सभी 17 भाषाओं में अनूदित।

टिप्पणियाँ

  • गाइड की संरचना बढ़कर 31 H2 / 118 H3 हो गई, हर भाषा में समता सुनिश्चित। संदर्भ दस्तावेज़ अद्यतन: docs/architecture/API.md इन सुविधाओं के पाँच रूट का दस्तावेज़ देता है, और CLAUDE.md तथा docs/sdd/CONVENTIONS.md में रूट/संस्करण गणना अद्यतन है (36 रूट मॉड्यूल)। सूट: 2610

[1.205.0] — 2026-08-15

जोड़ा गया — परीक्षण/मूल्यांकन परिणाम दर्ज करने के लिए स्किल लॉग।

जोड़ा गया

  • एक नया स्किल लॉग (एनालिटिक्स → स्किल लॉग) आपको एक स्व-मूल्यांकन दर्ज करने देता है — कंपनी, प्लेटफ़ॉर्म, स्किल, स्कोर % और एक वैकल्पिक नोट — जो data/assessments.tsv में जुड़ता है, पिछली प्रविष्टियों की सूची (नवीनतम पहले) के साथ। शून्य टोकन, निर्धारक; फ़ाइल प्रारूप मूल परियोजना की CLI संभालती है।

टिप्पणियाँ

  • नया GET /api/assessments (assessment-log.mjs की डिफ़ॉल्ट JSON सूची रिले करता है; नरम विफलता {available:false}) + POST /api/assessments (स्पष्ट लेखन: फ़ील्ड ऐरे आर्ग्युमेंट के रूप में assessment-log.mjs add को भेजे जाते हैं)। लेखन सुरक्षा: नियंत्रण वर्ण वाला कोई भी टेक्स्ट फ़ील्ड अस्वीकृत होता है (TAB स्तंभ तोड़ता, नई पंक्ति पंक्ति इंजेक्ट करती) → लेखन से पहले 400; स्कोर/थ्रेशोल्ड 0–100 तक सीमित, लंबाई सीमित। tests/assessments-route.test.mjs। सूट: 2610

[1.204.0] — 2026-08-15

जोड़ा गया — सेटिंग्स में “सेटअप डॉक्टर” पैनल, जो अधूरे या उदाहरण-डेटा वाले CV/प्रोफ़ाइल को चिह्नित करता है।

जोड़ा गया

  • सेटिंग्स → सेटअप डॉक्टर अब आपकी cv.md और config/profile.yml की शून्य-टोकन जाँच करता है और अवरोधक समस्याएँ (गायब फ़ाइलें/फ़ील्ड) व चेतावनियाँ (बची हुई उदाहरण/प्लेसहोल्डर डेटा, हार्डकोडेड मीट्रिक) सूचीबद्ध करता है — ताकि अधूरा सेटअप आपके स्कैन और अनुकूलन को कमज़ोर करने से पहले पकड़ लिया जाए। केवल-पढ़ने; एक क्लिक में फिर से चलाएँ।

टिप्पणियाँ

  • नया केवल-पढ़ने वाला GET /api/cv-sync-check मूल परियोजना के cv-sync-check.mjs को रिले करता है, जो मानव-पठनीय टेक्स्ट + एक एग्ज़िट कोड छापता है (कोई --json नहीं); रूट उसकी स्थिर ERROR: / WARN: पंक्तियों को हल्के ढंग से {ok, errors[], warnings[]} में पार्स करता है — सफलता एग्ज़िट कोड नहीं, बैनर तय करता है। स्वतंत्र इंस्टॉल पर {available:false} के साथ नरम विफलता। tests/cv-sync-check-route.test.mjs। सूट: 2602

[1.203.0] — 2026-08-15

जोड़ा गया — CV Studio में “पिछला CV दोबारा इस्तेमाल करें?” संकेत।

जोड़ा गया

  • CV Studio में कोई सहेजी गई नौकरी खोलने पर, ऐप अब उसे आपकी अन्य सहेजी नौकरियों से तुलना करता है (निर्धारक शब्द-ओवरलैप, शून्य टोकन) और बताता है कि सबसे नज़दीकी इतनी मिलती-जुलती है कि उस अनुकूलित CV को दोबारा इस्तेमाल करें, थोड़े बदलाव के साथ दोबारा इस्तेमाल करें, या नया अनुकूलित करें — ताकि पहले से लक्षित भूमिका के लिए शून्य से न बनाना पड़े।

टिप्पणियाँ

  • नया केवल-पढ़ने वाला GET /api/jds/:name/reuse मूल परियोजना के jd-similarity.mjs (Jaccard ओवरलैप + सीनियरिटी गार्ड; JSON {decision, score, reason}) को हर पिछली नौकरी के लिए एक बार रिले करता है (fan-out 25 तक सीमित, सर्वश्रेष्ठ मिलान जीतता है); स्क्रिप्ट या पिछली नौकरियाँ न होने पर {available:false} के साथ नरम विफलता। tests/jd-similarity-reuse-route.test.mjs। सूट: 2594

[1.202.0] — 2026-08-15

जोड़ा गया — #/portals से किसी कंपनी का ATS जॉब बोर्ड खोजें और उसे ट्रैक करना शुरू करें।

जोड़ा गया

  • #/portals पर कंपनी का नाम टाइप करें और ऐप Greenhouse, Ashby और Lever पर उसके सार्वजनिक बोर्ड की जाँच करता है — शून्य LLM, कोई ब्राउज़र नहीं — और वे बोर्ड दिखाता है जो मौजूद हैं और अभी ≥1 नौकरी सूचीबद्ध करते हैं। एक क्लिक चुने गए बोर्ड को उन कंपनियों में जोड़ देता है जिन्हें आपका स्कैनर देखता है। जाँच केवल-पढ़ने के लिए है; portals.yml में लेखन केवल जोड़ें क्लिक करने पर होता है।

टिप्पणियाँ

  • नया server/lib/discover-ats.mjs (निश्चित होस्ट, charset-सत्यापित slug को DNS-पिन किए safeGet से जाँचता है, प्रति अनुरोध ≤12 जाँच) + POST /api/portals/discover (केवल-पढ़ने) और POST /api/portals/track (स्पष्ट लेखन: withFileLock + टेक्स्ट स्प्लाइस + री-पार्स गार्ड + परमाणु पुनर्नामकरण; केवल ज्ञात ATS होस्ट, idempotent)। बोर्ड की पुष्टि और नौकरी गिनती के लिए स्कैनर की अडैप्टर रजिस्ट्री का पुनः उपयोग करता है। i18n ×17। tests/discover-ats-resolver.test.mjs + tests/discover-ats-route.test.mjs। सूट: 2588

[1.201.0] — 2026-08-15

ठीक किया गया — स्थानीयकृत या भिन्न कॉलम हेडर वाला ट्रैकर अब खाली नहीं दिखता।

ठीक किया गया

  • यदि आपकी data/applications.md गैर-अंग्रेज़ी या भिन्न हेडर उपयोग करती है — स्पैनिश empresa / puesto / estado / fecha / enlace, या position / stage / link — तो ट्रैकर उन्हें गलत कुंजियों से पढ़कर कंपनी / भूमिका / स्थिति / तिथि / लिंक कॉलम खाली दिखाता था। अब ये हेडर कैनोनिकल फ़ील्ड नामों में मैप हो जाते हैं और ट्रैकर सही दिखता है। पूरी तरह अंग्रेज़ी ट्रैकर पहले जैसा ही पार्स होता है।

टिप्पणियाँ

  • parseApplications (server/lib/parsers.mjs) में नया HEADER_ALIASES मैप और एक सामान्यीकरण फ़ोल्ड; अज्ञात या पहले से कैनोनिकल हेडर बिना बदलाव के गुज़रते हैं। tests/tracker-header-aliases.test.mjs। सूट: 2563

[1.200.0] — 2026-08-15

जोड़ा गया — आपके ट्रैकर में ATS-होस्टेड नौकरियों के लिए एक-क्लिक “अब भी खुली है?” जाँच।

जोड़ा गया

  • #/tracker पर, जिस आवेदन का URL Greenhouse / Lever / Ashby / Workday / SmartRecruiters की पोस्टिंग है, उस पर अब “अब भी खुली है?” बटन दिखता है। एक क्लिक ATS के अपने सार्वजनिक JSON से पूछता है — शून्य टोकन, कोई ब्राउज़र नहीं — और खुली / समाप्त / अज्ञात दिखाता है, ताकि हर एक खोले बिना मृत पोस्टिंग पहचानी जा सके। डिज़ाइन से रूढ़िवादी: केवल निश्चित 404/410 ही समाप्त माना जाता है; कोई भी अस्पष्ट स्थिति अज्ञात रहती है (कभी झूठी समाप्त नहीं)।

टिप्पणियाँ

  • नए server/lib/liveness-core.mjs + liveness-api.mjs और केवल-पढ़ने वाला GET /api/liveness?url= (कोई लेखन नहीं, कोई LLM नहीं)। SSRF-सुरक्षित: URL isValidJobUrl से गुज़रता है, फिर ATS API तक केवल DNS-पिन किए safeGet के ज़रिए, निश्चित होस्ट + charset-सत्यापित पथ खंडों के साथ पहुँचा जाता है। tests/liveness-core.test.mjs + tests/liveness-route.test.mjs। सूट: 2557

[1.199.0] — 2026-08-15

ठीक किया गया — चौड़ी तालिकाएँ अब कटने के बजाय क्षैतिज रूप से स्क्रॉल होती हैं।

ठीक किया गया

  • Scan पेज पर (और हर दूसरी तालिका में — ट्रैकर, आँकड़े, उपयोग, डैशबोर्ड) विंडो से चौड़ी तालिका बिना स्क्रॉलबार के कट जाती थी, जिससे दाहिनी ओर के कॉलम तक पहुँच नहीं होती थी। अब चौड़ी तालिकाएँ ज़रूरत पड़ने पर क्षैतिज स्क्रॉलबार दिखाती हैं, ताकि किसी भी चौड़ाई पर हर कॉलम तक पहुँचा जा सके।

टिप्पणियाँ

  • public/css/components.css में .table-wrap को overflow: hidden से overflow-x: auto किया गया (मौजूदा .reports-scroll कंटेनर की तरह); गोल बॉर्डर बरकरार है। tests/table-wrap-scroll.test.mjs। सूट: 2540

[1.198.0] — 2026-08-15

जोड़ा गया — स्कैन री-ट्राई अब एक्सपोनेंशियल बैकऑफ़, जिटर का उपयोग करते हैं और रेट-लिमिटर के Retry-After का सम्मान करते हैं।

जोड़ा गया

  • जब कोई जॉब बोर्ड स्कैन के बीच में थोड़ी देर के लिए रेट-लिमिट करता है या त्रुटि (HTTP 429 / 5xx) देता है, तो री-ट्राई अब निश्चित छोटी देरी के बजाय एक्सपोनेंशियल बैकऑफ़ + जिटर के साथ प्रतीक्षा करता है — इससे व्यस्त बोर्ड को एक ही लय में बार-बार नहीं ठोका जाता, और समवर्ती री-ट्राई फिर से एक साथ नहीं टकराते। बोर्ड द्वारा भेजा गया Retry-After माना जाता है (पर सीमित, ताकि कोई शत्रुतापूर्ण Retry-After: 86400 पूरे स्कैन को रोक न सके)। स्थायी त्रुटियाँ (404, अस्वीकृत रीडायरेक्ट) अब भी तुरंत विफल होती हैं — अपरिवर्तित।

टिप्पणियाँ

  • server/lib/http-json.mjs में नए parseRetryAfterMs() और शुद्ध computeRetryDelayMs(); fetchJson अब non-ok प्रतिक्रिया पर .retryAfter कैप्चर करता है और fetchJsonWithRetry एक वैकल्पिक maxDelayMs (डिफ़ॉल्ट 8000) लेता है। tests/http-json.test.mjs (+9)। सूट: 2536

[1.197.0] — 2026-08-14

जोड़ा गया — किसी Getro VC जॉब बोर्ड को केवल उसके careers_url से ट्रैक करें; कलेक्शन id अपने-आप हल हो जाता है।

जोड़ा गया

  • ट्रैक किए जा रहे Getro बोर्ड (b2venture, Earlybird, Point Nine, …) को अब हाथ से खोजे गए संख्यात्मक getro_collection की ज़रूरत नहीं। बोर्ड का अपना careers_url दें और पहली स्कैन पर id उस पेज से अपने-आप हल हो जाता है — एक SSRF-सुरक्षित GET पेज के एम्बेडेड डेटा से संख्यात्मक network.id सीधे पढ़ लेता है। स्पष्ट getro_collection अब भी प्राथमिकता रखता है और फ़ेच को पूरी तरह छोड़ देता है।

टिप्पणियाँ

  • server/lib/sources/getro.mjs में नए httpsCareersUrl(), extractCollectionId() और अतुल्यकालिक resolveCollectionId(); बोर्ड पेज को DNS-पिन किए हुए, आकार-सीमित safeGet से फ़ेच किया जाता है, और हल किया गया id अब भी assertGetroUrl द्वारा होस्ट api.getro.com पर पिन रहता है। अडैप्टर अब बिना id के भी https careers_url वाले provider: getro एंट्री से मैच करता है। tests/sources-getro.test.mjs (+8)। सूट: 2527

[1.196.0] — 2026-08-14

ठीक किया (सुरक्षा) — Workday अडैप्टर api एंडपॉइंट को सबस्ट्रिंग नहीं, बल्कि होस्टनेम से सत्यापित करता है।

ठीक किया

  • portals.yml में एक Workday api: मान अब केवल तभी स्वीकार होता है जब उसका होस्टनेम myworkdayjobs.com (या .myworkdayjobs.com सबडोमेन) हो। पुरानी जाँच एक सबस्ट्रिंग मिलान थी, इसलिए कोई भी URL जो केवल स्ट्रिंग रखता हो — जैसे https://example.com/?x=myworkdayjobs.com — पास हो जाता और एंडपॉइंट के रूप में इस्तेमाल हो सकता था। असली Workday एंडपॉइंट अप्रभावित। (CodeQL द्वारा रिपोर्ट, #443।)

टिप्पणियाँ

  • नया isWorkdayApi() URL पार्स कर होस्ट जाँचता है (server/lib/portals/adapters/workday.mjs)। tests/workday-adapter-endpoint.test.mjs (+1)। सुइट: 2522

[1.195.0] — 2026-08-14

प्रदर्शन (स्कैनर) — बड़े स्कैन इतिहास पर भी रिपोस्ट पहचान तेज़ रहती है।

प्रदर्शन

  • बड़े scan-history.tsv पर डुप्लिकेट पोस्टिंग पहचान अब O(N²) में नहीं गिरती। प्रति-कंपनी शीर्षक समूहन एक नेस्टेड लूप था जो हर जोड़ी पर पूरा roleFuzzyMatch चुकाता था; अब यह एक उलटा सूचकांक है — एक पास में सटीक शीर्षक से पंक्तियों को बकेट करें, फिर केवल उन अलग-अलग बकेटों के बीच फ़ज़ी मिलान करें जो एक विभेदक (गैर-आधारभूत) टोकन साझा करते हैं। आउटपुट समान है — वही रिपोस्ट क्लस्टर — पुराने एल्गोरिथ्म के विरुद्ध 200+ यादृच्छिक इतिहासों पर एक अंतर परीक्षण से सिद्ध।

टिप्पणियाँ

  • server/lib/detect-reposts.mjs में groupRowsByTitle (अंतर परीक्षण के लिए export)। tests/detect-reposts-grouping.test.mjs (+2)। सुइट: 2521

[1.194.0] — 2026-08-14

ठीक किया (स्कैनर) — एकल-सेगमेंट URL वाले Workday करियर पेज अब सही से स्कैन होते हैं।

ठीक किया

  • Workday अडैप्टर अब उन करियर URL को पार्स करता है जिनका पथ एकल सेगमेंट है — जैसे https://parsons.wd5.myworkdayjobs.com/Search, .../KBR_Careers, .../Careers। पहले साइट External पर गिर जाती थी, अडैप्टर गलत CXS एंडपॉइंट पर जाता था, और प्रोब स्वस्थ दिखकर भी कुछ नहीं लौटाता था। अब पथ का पहला गैर-रिक्त सेगमेंट साइट के रूप में लिया जाता है (en-US जैसे भाषा उपसर्ग को छोड़कर); प्रलेखित /en-US/External मामला अपरिवर्तित है। (#255 में रिपोर्ट किया गया।)

टिप्पणियाँ

  • server/lib/portals/adapters/workday.mjs में संरचनात्मक पथ पार्सिंग। tests/workday-adapter-endpoint.test.mjs (+7)। सुइट: 2519

[1.193.0] — 2026-08-14

जोड़ा (आँकड़े) — एक “साक्षात्कार के बाद चुप्पी” टैब जो अनुस्मारक योग्य साक्षात्कार सामने लाता है।

जोड़ा

  • #/stats में एक साक्षात्कार के बाद चुप्पी टैब: एक शिष्टाचार अवधि (डिफ़ॉल्ट 30 दिन) के बाद चुप हुए साक्षात्कार, आपके सक्रिय साक्षात्कारों और ट्रैकर को जोड़ते हुए — प्रत्येक कितने समय से चुप है, अंतिम साक्षात्कार की तिथि और कारण के साथ। एक सौम्य अनुस्मारक/समापन सूची; केवल सुझाव, कभी अस्वीकृति का दावा नहीं। शून्य टोकन।

टिप्पणियाँ

  • नया GET /api/stats/rejection-latency रिले (स्क्रिप्ट अनुपस्थित होने पर {available:false})। tests/stats-rejection-latency-route.test.mjs (+2)। +10 i18n कुंजियाँ ×17; #/stats help-hint 7→8 टैब। सुइट: 2510

[1.192.0] — 2026-08-14

जोड़ा (cv-studio) — एक “अपने CV के तथ्य जाँचें” गेट जो उन संख्याओं को पकड़ता है जो कभी आपकी थीं ही नहीं।

जोड़ा

  • #/cv-studio में एक अपने CV के तथ्य जाँचें कार्ड: एक अनुकूलित CV या कवर लेटर पेस्ट करें और हर दावा किए गए मीट्रिक और तथ्य को अपने असली CV, प्रोफ़ाइल और two-pager से मिलाएँ। आपको pass / warn / block फ़ैसला मिलता है, साथ ही ठीक-ठीक गढ़े गए मीट्रिक, असमर्थित तथ्य और निषिद्ध / सलाहकारी वाक्यांश। शून्य LLM; कुछ भी नहीं लिखा जाता।

टिप्पणियाँ

  • नया POST /api/cv-studio/verify-facts रिले: पाठ को एक बार-उपयोग अस्थायी फ़ाइल में लिखता है और verify-cv-facts.mjs चलाता है, स्क्रिप्ट के block पर 1 से बाहर निकलने पर भी JSON फ़ैसले पर भरोसा करता है। tests/cv-studio-verify-facts-route.test.mjs (+4)। +15 i18n कुंजियाँ ×17। सुइट: 2508

[1.191.0] — 2026-08-14

जोड़ा (आँकड़े) — “आगे क्या सीखें” टैब जो पहले सीखने योग्य कौशल को क्रम देता है।

जोड़ा

  • #/stats में एक आगे क्या सीखें टैब: पूरे ट्रैकर का कौशल-अंतर सारांश — वे लुप्त कौशल जिन्होंने सबसे अधिक बार कम-फ़िट को डुबोया, भारित (हर मूल्यांकित रिपोर्ट में 5−फ़िट-स्कोर से) और Critical / High / Medium स्तरों में — साथ ही वे जो आपके CV/प्रोफ़ाइल में पहले से हैं। केवल-पढ़ने योग्य, केवल सुझाव, शून्य टोकन।

टिप्पणियाँ

  • नया GET /api/stats/upskill रिले (कम डेटा पर { error } फ़ील्ड; स्क्रिप्ट अनुपस्थित होने पर {available:false})। tests/stats-upskill-route.test.mjs (+3)। +15 i18n कुंजियाँ ×17। सुइट: 2504

[1.190.0] — 2026-08-14

जोड़ा (ट्रैकर) — एक “कंपनी इतिहास” पैनल जो बताता है कि कौन-सी कंपनियाँ वास्तव में आपको उत्तर देती हैं।

जोड़ा

  • #/tracker पर एक कंपनी इतिहास कार्ड: कोई कंपनी चुनें और केवल-पढ़ने योग्य साक्ष्य पाएँ — उसने आपके प्रति कितना उत्तर दिया (आपके प्रति मौन / मिश्रित / पहले उत्तर दिया) और क्या वही भूमिका बार-बार दोबारा पोस्ट होती है — आपके ट्रैकर, फ़ॉलो-अप और स्कैन इतिहास को जोड़कर। शून्य टोकन; स्कैनर कभी नहीं बुलाया जाता।

टिप्पणियाँ

  • नया GET /api/stats/company-history[?company=] रिले (स्क्रिप्ट अनुपस्थित होने पर {available:false})। tests/stats-company-history-route.test.mjs (+3)। +18 i18n कुंजियाँ ×17। सुइट: 2501

[1.189.0] — 2026-08-14

ठीक किया (स्कैनर) — रोमन अंकों में लिखे वरिष्ठता स्तर अब गैर-लैटिन शीर्षकों में भी गिने जाते हैं।

ठीक किया

  • skip_tiers के पीछे का टियर वर्गीकरणकर्ता अब किसी भी लिपि में भूमिका शब्द के बाद रोमन अंक स्तर प्रत्यय (I / II / III / IV / V) पढ़ता है — “Инженер III”, “エンジニア I”, “Ingénieur IV” — केवल ASCII शब्दों के बाद नहीं। पहले, गैर-लैटिन शब्द के बाद का स्तर अंक अनदेखा हो जाता था और पोस्टिंग mid पर गिर जाती थी, इसलिए skip_tiers: [senior] या [entry] उन्हें छोड़ देता था।

टिप्पणियाँ

  • server/lib/classify-tier.mjs में लिपि-निरपेक्ष lookbehind; एक मृत डुप्लिकेट Sr. मैचर हटाया। tests/classify-tier.test.mjs (+1)। सुइट: 2498

[1.188.0] — 2026-08-14

ठीक किया (UI) — मुख्य एक्शन बटन अब पेज उपशीर्षक से सटे हुए नहीं रहते।

ठीक किया

  • साप्ताहिक साक्षात्कार डाइजेस्ट, वित्तपोषित कंपनियाँ, पोर्टल, करियर योजना और करियर मार्गदर्शन पर मुख्य एक्शन/कंट्रोल पंक्ति में अब उचित शीर्ष मार्जिन है, जिससे बटन उपशीर्षक से टकराने के बजाय उसके नीचे साँस लेता है।

टिप्पणियाँ

  • रिग्रेशन गार्ड tests/lead-row-top-margin.test.mjs (+5)। सुइट: 2497

[1.187.0] — 2026-08-14

ठीक किया गया (स्कैनर) — skip_tiers सेटिंग फिर से काम करती है: जिन्हें आपने वरिष्ठता से छोड़ने को कहा वे पोस्टिंग हटा दी जाती हैं।

ठीक किया गया

  • portals.yml में skip_tiers: सूची (जैसे skip_tiers: [intern, entry]) अब स्कैन में मानी जाती है। हर पोस्टिंग का शीर्षक एक वरिष्ठता स्तर (intern / entry / mid / senior) में वर्गीकृत होता है और यदि उसका स्तर आपकी सूची में है तो हटा दिया जाता है। पहले स्कैन शीर्षक / स्थान / सामग्री / विश्वास फ़िल्टर चलाता था पर कोई स्तर फ़िल्टर नहीं था, इसलिए skip_tiers चुपचाप अनदेखा हो जाता था। बिना स्तर-शब्द वाले शीर्षक mid में आते हैं (इसलिए skip_tiers: [mid] अधिकांश सामान्य पोस्टिंग भी हटा देता है), और वर्गीकारक सबसे बाएँ स्तर-शब्द को पढ़ता है।

टिप्पणियाँ

  • नया शुद्ध मॉड्यूल server/lib/classify-tier.mjs (classifyTier + buildTierFilter), EN और RU स्कैनर की फ़िल्टर श्रृंखलाओं से जुड़ा। tests/classify-tier.test.mjs (+7)। सूट: 2492

[1.186.0] — 2026-08-14

जोड़ा गया (CV स्टूडियो) — एक “कौशल अंतर” पैनल: किसी नौकरी की आवश्यक कौशलों में से आपका CV कौन-सी नाम लेता है, संकेत करता है या अनुपस्थित है।

जोड़ा गया

  • CV स्टूडियो में नया कौशल अंतर पैनल। एक सहेजी गई नौकरी विवरण चुनें और यह हर आवश्यक कौशल को आपके CV में उल्लिखित, आपके CV में निहित, या अनुपस्थित में बाँटता है — बिना LLM के शब्द तुलना, कुछ भी लिखा नहीं जाता। जब नौकरी में स्पष्ट आवश्यकताएँ अनुभाग न हो तो कम-विश्वास नोट दिखता है।

टिप्पणियाँ

  • नया GET /api/jds/:name/skill-gap (नौकरी का नाम पहले पथ-स्वच्छ किया जाता है और jds/ के अंतर्गत होने की पुष्टि होती है, फिर तर्क बनता है; स्क्रिप्ट के बिना {available:false} पर सॉफ़्ट फ़ॉलबैक)। +13 i18n कुंजियाँ ×17। टेस्ट: tests/jds-skill-gap-route.test.mjs (+4, पथ-ट्रैवर्सल अस्वीकृति सहित)। सूट: 2485

[1.185.0] — 2026-08-14

जोड़ा गया (आँकड़े) — एक “फ़नल और गति” टैब: आपका फ़नल बाज़ार से कैसे तुलना करता है और आप चरणों के बीच कितनी तेज़ी से बढ़ते हैं।

जोड़ा गया

  • आँकड़े में नया फ़नल और गति टैब बाज़ार बेंचमार्क श्रेणियों के साथ आपकी उत्तर और साक्षात्कार दरें (छोटे नमूने और चयन पूर्वाग्रह की चेतावनियों सहित), सामान्य पहले-उत्तर विंडो से आगे चल रहे आवेदनों की एक प्रतीक्षा सूची, और प्रति चरण मध्यिका दिन (आवेदित → उत्तर → साक्षात्कार → ऑफ़र) दिखाता है — धीमी पंक्तियाँ दाएँ-सेंसर की जाती हैं ताकि मध्यिका न बिगड़े। केवल-पठन और शून्य टोकन; केवल आपका ट्रैकर पढ़ता है।

टिप्पणियाँ

  • नया GET /api/stats/funnel (स्क्रिप्ट के बिना {available:false} पर सॉफ़्ट फ़ॉलबैक)। +18 i18n कुंजियाँ ×17। टेस्ट: tests/stats-funnel-route.test.mjs (+2)। सूट: 2481

[1.184.0] — 2026-08-14

ठीक किया गया (UI) — डैशबोर्ड की त्वरित-क्रिया टाइलें अब एक समान ग्रिड में पंक्तिबद्ध होती हैं।

ठीक किया गया

  • डैशबोर्ड (कमांड सेंटर) पर 3 टाइलों का समूह 4 के समूह से चौड़ा दिखता था, जिससे अनुभागों का दायाँ किनारा असमान रहता था। अब हर समूह समान-चौड़ाई वाले कॉलम उपयोग करता है (चौड़ी स्क्रीन पर 4, विंडो संकरी होने पर 3 / 2 / 1 तक), इसलिए सभी टाइलें एक ही आकार की हैं और उनके दाएँ किनारे संरेखित हैं।

टिप्पणियाँ

  • केवल CSS (.qa-grid: auto-fill के बजाय स्थिर repeat(N, minmax(0,1fr)))। tests/dashboard-grid-align.test.mjs द्वारा सुरक्षित (+2)। सूट: 2479

[1.183.0] — 2026-08-14

जोड़ा गया (स्कैनर) — बेहतर डुप्लिकेट पहचान: ट्रैकिंग लिंक के साथ फिर से पोस्ट की गई वही नौकरी अब दो बार नहीं दिखती।

जोड़ा गया

  • स्कैनर अब किसी पोस्टिंग को कैनोनिकल URL कुंजी से पहचानता है, इसलिए ट्रैकिंग पैरामीटर (?utm_…, gclid, …) के साथ, http बनाम https, या अंत में स्लैश / #फ़्रैगमेंट के साथ फिर से पोस्ट की गई वही नौकरी उसी एक पोस्टिंग के रूप में मानी जाती है — आपके स्कैन परिणामों या पाइपलाइन में कोई डुप्लिकेट पंक्ति नहीं, और पहले से देखी नौकरी पर कोई व्यर्थ मूल्यांकन नहीं। वास्तव में भिन्न पोस्टिंग (gh_jid जैसा रखा गया कार्यात्मक id) अब भी अलग गिनी जाती हैं।

टिप्पणियाँ

  • नया server/lib/url-key.mjs, दोनों स्कैनर के dedup और पाइपलाइन राइटर से जुड़ा। जानबूझकर कम-सामान्यीकरण करता है — दो भिन्न पोस्टिंग को कभी नहीं मिलाता। टेस्ट: tests/url-key.test.mjs (+5), tests/parsers.test.mjs (+1)। सूट: 2477 (+6)।

[1.182.0] — 2026-08-14

ठीक किया गया (स्कैनर) — वेतन श्रेणियाँ अब हर भाषा में एक जैसी दिखती हैं।

ठीक किया गया

  • स्कैन और ट्रैकर पंक्तियों में वेतन के आँकड़े अब अंग्रेज़ी शब्द “from” / “up to” (जो बिना अनुवाद के गैर-अंग्रेज़ी UI में दिखते थे) के बजाय लोकेल-तटस्थ चिह्न और का उपयोग करते हैं (जैसे ≥ 120000 EUR, ≤ 90000)। यह एकतरफ़ा श्रेणी बताने वाले हर बोर्ड (Getro, Remotli, Manfred, Agentic Jobs, JustJoin, Jobicy) पर लागू होता है; दोतरफ़ा श्रेणियाँ (100000–150000 USD) पहले से तटस्थ थीं।

टिप्पणियाँ

  • केवल प्रदर्शन — क्लाइंट वेतन फ़िल्टर उपसर्ग की परवाह किए बिना संख्याएँ पार्स करता है, इसलिए फ़िल्टरिंग अपरिवर्तित है। सूट: 2471

[1.181.0] — 2026-08-14

जोड़ा गया (स्कैनर) — Getro जॉब बोर्ड अब वेतन, सभी स्थान और रिमोट भूमिकाएँ दिखाते हैं।

जोड़ा गया

  • Getro स्कैनर (फंड टैलेंट-नेटवर्क बोर्ड) अब हर भूमिका पर एक वेतन (वार्षिक सीमा + मुद्रा) दिखाता है, केवल पहले के बजाय सभी स्थान सूचीबद्ध करता है, और रिमोट भूमिकाओं को टैग करता है। आपके स्कैन और ट्रैकर में एक Getro पोस्टिंग अब बाकी बोर्ड जैसा ही वेतन + स्थान विवरण रखती है।

टिप्पणियाँ

  • केवल स्कैनर; कोई नई निर्भरता नहीं, रूट / CSP / SSRF में कोई बदलाव नहीं। टेस्ट: tests/sources-getro.test.mjs (+5)। सूट: 2470 (+5)।

[1.180.0] — 2026-08-14

ठीक किया गया (मध्यम, रिपोर्ट) — #/reports सूची अब एक तालिका है, और एक असली स्कोर जिसे Machine Summary प्लेसहोल्डर छिपा रहा था, पुनः प्राप्त हो गया है।

ठीक किया गया

  • #/reports सूची 4-कार्ड ग्रिड नहीं, बल्कि एक तालिका है (रिपोर्ट · तिथि · वैधता · स्कोर)। एक लंबा “स्कोर नहीं मिला” चिप शीर्षक कॉलम को लगभग शून्य तक दबा देता था, और कार्ड शीर्षक का overflow-wrap: anywhere रिपोर्ट नाम को प्रति-वर्ण तोड़ देता था। अब हर फ़ील्ड का अपना कॉलम है, नाम सेल शब्दों पर लपेटता है, और संकरी स्क्रीन पर तालिका क्षैतिज रूप से स्क्रॉल होती है (नया .reports-scroll कंटेनर)। नई i18n कुंजी rep.colReport ×17।
  • मुख्य पाठ में एक असली स्कोर (**Итоговый балл:** 1.8 / 5) अब Machine Summary प्लेसहोल्डर (score: —) द्वारा नहीं छिपता। जब ## Machine Summary ब्लॉक में गैर-संख्यात्मक या सीमा-से-बाहर स्कोर होता, तो वह पार्स किए गए स्कोर की जगह घेर लेता और बोल्ड मान-रूप फ़ॉलबैक को रोक देता, जिससे मुख्य पाठ में असली X / 5 होने के बावजूद रिपोर्ट “स्कोर नहीं मिला” दिखाती। अब parseReportHeader तब मुख्य पाठ के मान-रूप को पुनः प्राप्त करता है जब कोई उपयोगी संख्या नहीं बचती (चरण 4.5)।

टिप्पणियाँ

  • केवल क्लाइंट + पार्सर; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/reports-table.test.mjs (+5), tests/report-header-locale.test.mjs (+2)। सूट: 2465 (+7)।

[1.179.0] — 2026-08-13

बदला गया (LOW, स्कैनर) — 20 डुप्लिकेट HTML एंटिटी डिकोडर साझा मॉड्यूल पर समेकित (पैरिटी फ़ॉलो-अप, worklist बंद)।

बदला गया

  • 20 स्क्रैपिंग स्कैन स्रोतों में से हर एक का अपना decodeEntities/decodeXmlEntities (+ fromCodePoint हेल्पर) था — प्रतियाँ जो भटक चुकी थीं (तीन RangeError फेंक सकती थीं, v1.172.0 में ठीक; बाकी NUL/C0 स्वीकार करती थीं या &#1a2; गलत पार्स करती थीं)। अब सभी एकल server/lib/html-entities.mjs (XML 1.0 Char-सुरक्षित डिकोडर) से गुज़रती हैं, ~237 पंक्तियों का दोहराव हटाते हुए। 8 RSS-शैली स्रोतों को &nbsp; डिकोडिंग मिली (पहले केवल 5 एंटिटी); cryptocurrencyjobs की जानबूझकर दोहरी डिकोडिंग एक अलियास से संरक्षित। hh अपना डिकोडर रखता है (&mdash;/&ndash; संभालता है, साझा 6 के बाहर)। एक नया गार्ड टेस्ट तब विफल होता है जब कोई स्रोत फिर से लोकल डिकोडर बनाए।

टिप्पणियाँ

  • व्यवहार-संरक्षी रीफैक्टर; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/decoder-consolidation.test.mjs (+2)। सूट: 2458 (+2)।

[1.178.0] — 2026-08-13

सुधारा गया (LOW, पैरेंट पैरिटी) — दो पुराने कॉन्स्टेंट पैरेंट से मिलाने के लिए अपडेट किए (PARENT-SYNC GAP #4 + #5)।

सुधारा गया

  • ब्राउज़र User-Agent (GAP #4)BROWSER_LIKE_USER_AGENT (workable/workday/oraclecloud/a16z/eightfold इसे WAF/बॉट गेट पार करने के लिए भेजते हैं) को Chrome 131 से 151 किया, पैरेंट के user-agent.mjs से मिलाते हुए; पुराना बिल्ड अधिक बार ब्लॉक होता है। Chrome major ≥ 151 टेस्ट से सुरक्षित।
  • ट्रैकर स्टेट्स FALLBACK (GAP #5)states.mjs का अंतिम-उपाय FALLBACK (केवल तब उपयोग जब लाइव templates/states.yml अपठनीय हो — ताज़ा क्लोन / CI-आइसोलेटेड रूट) को पैरेंट के तुर्की स्टेटस उपनाम (#2615) मिले: değerlendirildi, başvuruldu, yanıt verildi, mülakat, teklif, reddedildi, iptal edildi, uygun değil, kabul edildi/işe alındı। प्रोडक्शन में लाइव फ़ाइल पहले से ये देती थी।

टिप्पणियाँ

  • केवल दो कॉन्स्टेंट; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/http-json.test.mjs (+1) + tests/states.test.mjs (+1)। सूट: 2456 (+2)।

[1.177.0] — 2026-08-13

सुधारा गया (MEDIUM, स्कैनर) — जो टेनेंट सर्च API को सेशन कुकीज़ से सुरक्षित रखते हैं, वहाँ csod (Cornerstone) 0 नौकरियाँ लौटा रहा था (parent #2769, PARENT-SYNC GAP #1)।

सुधारा गया

  • कुछ Cornerstone टेनेंट बूटस्ट्रैप करियर-साइट होम पर सेशन कुकीज़ सेट करते हैं और जब तक वे कुकीज़ अनाम bearer टोकन के साथ वापस न आएँ, सर्च API 401 CSOD Unauthorized लौटाता है। sources/csod.mjs अब बूटस्ट्रैप को नए fetchResponse हेल्पर से पढ़ता है, उसके Set-Cookie मानों से एक Cookie हेडर बनाता है (cookieHeaderFrom — केवल name=value, jar सिमैंटिक्स) और सर्च POST पर दोबारा भेजता है। केवल समान-मूल (होस्ट पिन + redirect:'error'), इसलिए सेशन कुकीज़ कभी किसी तीसरे पक्ष तक नहीं पहुँच सकतीं; बिना कुकी वाला टेनेंट पहले जैसा ही व्यवहार करता है।

टिप्पणियाँ

  • नया server/lib/http-json.mjs::fetchResponse (योगात्मक; मौजूदा स्रोत अप्रभावित)। रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/sources-parity-v1118a.test.mjs (+1)। सूट: 2454 (+1)।

[1.176.0] — 2026-08-13

सुधारा गया (MEDIUM, रिपोर्ट) — RU तालिका में न सूचीबद्ध बोल्ड लेबल के नीचे का स्कोर अब भी “Score not detected” दिखा रहा था (FIND-5)।

सुधारा गया

  • दो RU रिपोर्ट स्कोर को **Итоговый балл:** 1.8 / 5 / **Скор:** 1.8 / 5 के रूप में लिखती थीं — ये बोल्ड लेबल REPORT_LABELS.ru में सूचीबद्ध नहीं (केवल “Оценка”/“Балл” जानता है), इसलिए स्कोर पार्स नहीं होता था। पर्यायवाची सूची बढ़ाने के बजाय, parseReportHeader अब मान-रूप पर लौटता है: किसी भी बोल्ड लेबल के नीचे /5 रूब्रिक पर एक भिन्न। यह भाषा-स्वतंत्र है, शीर्षक से प्रतिरक्षित है (न **, न /5 मान), और 5/5/2026 जैसी तारीख को अस्वीकार करता है (हर पर नकारात्मक लुकअहेड)।

टिप्पणियाँ

  • केवल सर्वर पार्सर; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/report-header-locale.test.mjs (+2)। सूट: 2453 (+2)।

[1.175.0] — 2026-08-13

सुधारा गया (LOW, सुदृढ़ीकरण) — FIND-3 SEO विवरण के लिए एक रिग्रेशन गार्ड + null-सुरक्षित वैधता स्ट्रिप (AI-रिव्यू फ़ॉलो-अप)।

सुधारा गया

  • SEO विवरण पैरिटी गार्ड — v1.174.0 का फिक्स, जिसने हर भाषा के meta.desc में हार्ड-कोडेड “~55” को रजिस्ट्री-आधारित {adapters} प्लेसहोल्डर से बदला, उसका कोई टेस्ट नहीं था, इसलिए अगली लोकेल एडिट पर चुपचाप रिग्रेस हो सकता था। नया CI-आइसोलेटेड tests/site-meta-desc-parity.test.mjs तब विफल होता है जब 17 में से कोई site/src/i18n/*.json प्लेसहोल्डर खो दे या गिनती फिर हार्ड-कोड कर दे, या Landing.astro उसे तीनों विवरण मेटा में इंटरपोलेट करना बंद कर दे।
  • Null-सुरक्षित वैधता स्ट्रिपstripEmphasis nullish इनपुट के लिए स्ट्रिंग “undefined” के बजाय '' लौटाता है (फ़ील्ड स्ट्रिंग से इनिशियलाइज़ होते हैं, इसलिए यह गहराई-में-रक्षा है)।

टिप्पणियाँ

  • टेस्ट + पार्सर में एक-पंक्ति गार्ड; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/site-meta-desc-parity.test.mjs (+3)। सूट: 2451 (+3)।

[1.174.0] — 2026-08-13

सुधारा गया (HIGH, रिपोर्ट) — स्थानीयकृत रिपोर्ट “Score not detected” दिखा रही थीं; SEO विवरण पुराना था।

सुधारा गया

  • स्कोर पार्सिंग (FIND-1) — जिस गैर-अंग्रेज़ी रिपोर्ट के H1 में स्कोर-लेबल शब्द हो (# Оценка вакансии: <शीर्षक>), वह अब उस शीर्षक को स्कोर नहीं समझती। parseReportHeader अब स्थानीयकृत बोल्ड लेबल (**Оценка:** 1.5 / 5) पर एंकर करता है, शीर्षक पंक्तियाँ छोड़ता है, और लेबल को कोलन से सटा हुआ माँगता है — इसलिए जो RU रिपोर्ट “Score not detected” दिखाती थीं, वे असली स्कोर दिखाती हैं।
  • वैधता चिप (FIND-2) — मान से Markdown ज़ोर हटा दिया जाता है, इसलिए चिप “** High Confidence” के बजाय “High Confidence” दिखाती है।
  • स्कोर ओवरफ़्लो — पीछे स्थिति-पाठ वाली स्कोर पंक्ति (“1.8, Status: Evaluated, …”) सिर्फ़ स्कोर तक सिकुड़ जाती है; .score-pill को no-wrap/overflow सीमा मिलती है और शीर्षक कॉलम सिकुड़ सकता है, इसलिए रंगीन चिप कभी कार्ड किनारे से बाहर नहीं जाती।
  • SEO विवरण (FIND-3) — cvstart.org के meta / OG / Twitter विवरण (सभी 17 भाषाएँ) “Scan ~55 job boards” हार्ड-कोड करते थे जबकि मुख्य पाठ असली रजिस्ट्री गिनता था (“~75”)। अब विवरण रजिस्ट्री-आधारित गिनती डालता है, इसलिए फिर से भटकता नहीं।

टिप्पणियाँ

  • सर्वर पार्सर + क्लाइंट रेंडर/CSS + साइट i18n; रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। टेस्ट: tests/report-header-locale.test.mjs (+4)। सूट: 2448 (+4)।

[1.173.0] — 2026-08-13

जोड़ा गया (LOW, कॉन्फ़िग) — Hermes का पता लगाए जाने वाले AI CLI रोस्टर में शामिल होना (career-ops समानता)।

जोड़ा गया

  • #/config → “AI CLI टूल्स” टैब अब Hermes (Nous Research) का पता लगाता है, जो पैरेंट प्रोजेक्ट द्वारा नया समर्थित एजेंट रनटाइम है (बाइनरी hermes)। server/lib/routes/cli-detect.mjs की स्थिर अनुमति-सूची 10 से बढ़कर 11 टूल्स हो जाती है; पहचान केवल-पढ़ने वाली PATH स्कैन बनी रहती है (कोई बाइनरी कभी नहीं चलाई जाती)।

टिप्पणियाँ

  • i18n / रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं; सूची स्थिर है, कभी इनपुट नहीं। सूट: 2444 (cli-detect कैनरी 10 → 11 अपडेट)।

[1.172.0] — 2026-08-13

सुधारा गया (MEDIUM, स्कैनर) — एक विकृत HTML एंटिटी किसी स्कैन स्रोत को क्रैश कर सकती थी (career-ops #2150 समानता)।

सुधारा गया

  • oraclecloud, gem और dassault स्रोत संख्यात्मक HTML एंटिटी को String.fromCodePoint से पहले केवल कमजोर Number.isFinite जाँच से डिकोड करते थे — 0x10FFFF से ऊपर का कोई संदर्भ (जैसे किसी विकृत या दुर्भावनापूर्ण फ़ीड में &#99999999;) एक अनकैप्चर्ड RangeError फेंककर उस स्रोत की पूरी पार्सिंग रोक देता था। एक साझा मॉड्यूल server/lib/html-entities.mjs (पैरेंट प्रोजेक्ट के _html-entities.mjs की नकल) अब संख्यात्मक संदर्भों को XML 1.0 §2.2 Char सेट तक सीमित करता है ताकि String.fromCodePoint कभी न फेंके, और हेक्स व दशमलव को अलग-अलग मैच करता है ताकि &#1a2; अब गलत पार्स न हो। तीनों स्रोत इसे इम्पोर्ट करते हैं।

टिप्पणियाँ

  • वैध फ़ीड के लिए कोई बदलाव नहीं; JS / i18n / रूट / CSP / SSRF / पैरेंट-राइट में कोई बदलाव नहीं। स्रोतों में शेष ~20 डिकोडर प्रतियों के समेकन को qa/PARENT-SYNC-WORKLIST-v1.26.0.md में ट्रैक किया गया है।
  • टेस्ट: tests/html-entities.test.mjs (+7)। सूट: 2444 (+7)।

[1.171.0] — 2026-08-13

बदला गया (LOW, डिज़ाइन सिस्टम) — टाइप-स्केल + z-index लेयर टोकन (D-4, पहला चरण)। आकार और स्टैकिंग प्रति-कंपोनेंट लिटरल थे।

बदला गया

  • z-index लेयर--z-* टोकन (--z-topbar--z-skiplink) पेश किए और हर z-index लिटरल को माइग्रेट किया। मान सुरक्षित, स्टैकिंग समान; एक नया कैनरी नए मैजिक नंबर रोकता है।
  • टाइप-स्केल--font-size-* रैम्प (xs 112xl 28, base = Inter 15px); कंपोनेंट पहले से उपयोग कर रहे मुख्य आकार माइग्रेट (कोई दृश्य बदलाव नहीं)। रैम्प-बाहर मान क्रमशः माइग्रेट (docs/UX-ROADMAP.md)।

टिप्पणियाँ

  • केवल CSS टोकन; व्यवहार/JS/i18n/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। कोई पिक्सेल बदलाव नहीं। tests/design-tokens-scale.test.mjs (+3)। सूट: 2437 (+3)।

[1.170.0] — 2026-08-13

जोड़ा गया (LOW) — लंबी AI जनन पर ईमानदार ETA संकेत (P4-ETA)। भारी जनन (करियर प्लान ~40 से, ओरिएंटेशन / मार्केट / नेटवर्किंग ~30 से, two-pager ~20 से) केवल “जनरेट हो रहा…” दिखाते थे, अवधि का कोई अंदाज़ा नहीं।

जोड़ा गया

  • हर लंबे जनन बटन के बगल में अब एक धीमा ⏱ ~Nसे संकेत दिखता है (#/auto ETA की तरह)। साझा .eta-hint शैली + दो सामान्य कुंजियाँ (common.eta ~{n}s, common.etaTitle)।

टिप्पणियाँ

  • केवल क्लाइंट; रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। +2 i18n कुंजियाँ ×17 (स्नैपशॉट 1219 → 1221)। tests/generation-eta-hint.test.mjs (+2)। सूट: 2434 (+2)।

[1.169.0] — 2026-08-13

जोड़ा गया (LOW) — इनलाइन PDF पूर्वावलोकन (D-5)। GET /api/output/pdfs/:name Content-Disposition: attachment थोपता था, इसलिए #/cv का “खोलें” लिंक भी दिखाने के बजाय डाउनलोड करता था।

जोड़ा गया

  • ?inline=1 उसी सत्यापित फ़ाइल को Content-Disposition: inline के साथ देता है, ताकि ब्राउज़र नई टैब में 👁 पूर्वावलोकन दिखाए। डिफ़ॉल्ट (बिना पैरामीटर) अब भी डाउनलोड है। कोई नया रूट नहीं; वही नाम-गार्ड।
  • #/cv PDF सूची का पहला बटन अब 👁 पूर्वावलोकन है (डाउनलोड के बगल में)। cv.openPdf “खोलें” → “पूर्वावलोकन” ×17।

टिप्पणियाँ

  • CSP/SSRF में कोई बदलाव नहीं — वही sanitizePathName। एक मौजूदा i18n कुंजी ×17 पुनर्लिखित (स्नैपशॉट 1219)। tests/output-pdfs.test.mjs (+3)। सूट: 2432 (+3)।

[1.168.0] — 2026-08-13

ठीक किया गया (LOW, a11y) — चेकबॉक्स पंक्तियाँ अब WCAG 2.5.8 के 24×24 न्यूनतम लक्ष्य आकार को पूरा करती हैं (D-2)। #/scan, #/config, #/evaluate और #/cv-studio पर चेकबॉक्स/रेडियो लेबल ~22 px बैंड में थे।

ठीक किया गया

  • सीमित नियम label:has(> input[type="checkbox"/"radio"]) { min-height: 24px } ≥24 px बैंड की गारंटी देता है। केवल min-height — लेबल पहले से flex हैं, कुछ नहीं खिसकता; .apply-checklist (32 px) पहले से अनुरूप था।

टिप्पणियाँ

  • केवल CSS; व्यवहार/JS/i18n/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। tests/checkbox-target-size.test.mjs (+1)। सूट: 2429 (+1)।

[1.167.0] — 2026-08-13

ठीक किया गया (LOW, डिज़ाइन सिस्टम) — उठी हुई सतहें अब हेयरलाइन से अलग दिखती हैं (D-3)। --panel-2 / --surface-elev1 टोकन --slate में हल होते थे — वही मान जो हेयरलाइन --line / --border का है — बिना दृश्य पृथक्करण के।

ठीक किया गया

  • एक समर्पित थीम-सजग टोकन --elev (लाइट #eef1f6 / डार्क #1e232e, दोनों थीम में --slate से भिन्न) अब उठी सतहों को सहारा देता है; हेयरलाइन --slate पर रहती हैं। शेष निष्कर्ष (D-2, D-4, D-5, P4-ETA) docs/UX-ROADMAP.md में बैकलॉग।

टिप्पणियाँ

  • केवल CSS टोकन; व्यवहार/JS/i18n/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। tests/elevation-token.test.mjs (+2)। सूट: 2428 (+2)।

[1.166.0] — 2026-08-13

ठीक किया गया (LOW) — रूब्रिक शब्दावली अब कैनोनिकल डॉक्स से मेल खाती है। career-ops.org/docs “पाँच आयाम और एक समग्र वैश्विक स्कोर” बताता है, पर वेब UI, cvstart.org और विकी सभी “छह-आयामी रूब्रिक” कहते थे (5 + 1 = 6, पर शब्दावली भिन्न थी)।

ठीक किया गया

  • डॉक्स की शब्दावली — “पाँच आयाम और एक समग्र वैश्विक स्कोर” — README ×17, cvstart.org साइट ×17, हेल्प गाइड ×17, docs/career-ops-canonical.md और विकी (Home ×17 + Features) में एकसमान अपनाई गई।

टिप्पणियाँ

  • केवल docs/मार्केटिंग; कोड/i18n कुंजी/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। tests/rubric-terminology.test.mjs (+2)। सूट: 2426 (+2)।

[1.165.0] — 2026-08-13

ठीक किया गया (LOW) — “Two-pager” शब्द अब हर लोकेल के भीतर संगत है। अरबी में साइडबार लैटिन “Two-pager” दिखाता था जबकि <h1> पूरी तरह स्थानीयकृत था — अन्यथा मिरर की गई RTL नेविगेशन में एकमात्र लैटिन स्ट्रिंग।

ठीक किया गया

  • निर्णय लागू: प्रति लोकेल, nav.twoPager और twoPager.title शब्द पर सहमत हैं (दोनों लैटिन या दोनों स्थानीयकृत)। केवल अरबी बँटी थी; उसका नेव लेबल अब स्थानीयकृत (“الصفحتان”) है। कोई लोकेल दोबारा उन्हें बाँटे तो नया कैनरी विफल होता है।

टिप्पणियाँ

  • केवल पाठ; रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। 1 i18n मान बदला (ar); कोई नई कुंजी नहीं (स्नैपशॉट 1219)। tests/two-pager-term-consistency.test.mjs (+2)। सूट: 2424 (+2)।

[1.164.0] — 2026-08-13

ठीक किया गया (LOW) — शीर्ष-बार खोज प्लेसहोल्डर अब किसी भी लोकेल में ओवरफ़्लो नहीं होता। सर्चबार सिकुड़ने पर “Find a company, role or URL…” कट जाता था; “…or URL” वाला हिस्सा कभी नहीं दिखता था।

ठीक किया गया

  • top.search (×17) अब छोटा “खोजें या URL चिपकाएँ” (हर लोकेल में ≤24 अक्षर) है, संकरी बार में भी समाता है और URL संकेत बनाए रखता है। index.html फ़ॉलबैक मेल खाता है; aria-label पूरा विवरण रखता है।

टिप्पणियाँ

  • केवल पाठ; रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। एक मौजूदा i18n कुंजी ×17 पुनर्लिखित (कोई नई नहीं; स्नैपशॉट 1219)। tests/search-placeholder-fit.test.mjs (+2)। सूट: 2422 (+2)।

[1.163.0] — 2026-08-13

ठीक किया गया (LOW) — इन-ऐप “डॉक्स से पूछें” सहायक अब रिपोर्ट को PDF में निर्यात करना कवर करता है। #/reports/:slug पर काम करने वाला 📄 Generate PDF नियंत्रण होने के बावजूद यह उत्तर देता था कि गाइड इसे कवर नहीं करता।

ठीक किया गया

  • सभी 17 हेल्प बंडलों में §10 Reports के अंतर्गत “रिपोर्ट को PDF में निर्यात करें” H3 जोड़ा गया (बटन कहाँ है, फ़ाइल output/*.pdf में जाती है, Playwright चाहिए, भेजने से पहले समीक्षा)। सहायक की पुनर्प्राप्ति अब Reports अनुभाग दिखाती है।

टिप्पणियाँ

  • केवल docs/हेल्प; कोड/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। हेल्प गेट 112 → 113 H3 (31 H2 अपरिवर्तित)। tests/help-reports-pdf-section.test.mjs (+2)। सूट: 2420 (+2)।

[1.162.0] — 2026-08-13

ठीक किया गया (MEDIUM) — मदद “?” अब ≥24×24 पॉइंटर लक्ष्य है (WCAG 2.5.8)। .help-hint हर शीर्षक पर padding:0 के साथ 18×18 px था, न्यूनतम से कम।

ठीक किया गया

  • .help-hint बॉक्स अब 24×24 (मापने योग्य लक्ष्य) है जबकि दृश्य वलय 18px बना रहता है — केंद्रित ::before से खींचा जाता है, इसलिए ग्लिफ़ और <h1> बेसलाइन अपरिवर्तित। hover/सक्रिय/फोकस स्थितियाँ वलय के साथ चलती हैं; मार्जिन 6→3px अंतर बनाए रखता है।

टिप्पणियाँ

  • केवल CSS; JS/i18n/रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। tests/help-hint-target-size.test.mjs (+2)। सूट: 2418 (+2)।

[1.161.0] — 2026-08-13

ठीक किया गया (MEDIUM) — #/reports खाली जगह के बजाय “स्कोर नहीं मिला” चिप दिखाता है। v1.159.0 के लोकेल-सजग पार्सर के बाद भी जिस रिपोर्ट का स्कोर पार्स नहीं होता, वह खाली क्षेत्र दिखाती थी — विफलता से अप्रभेद्य।

ठीक किया गया

  • स्कोर सेल अब शाखा करता है: स्कोर हो → टोन पिल; न हो → धीमा .score-muted चिप (“स्कोर नहीं मिला”, ×17) और “रिपोर्ट खोलें…” संकेत। कार्ड कीबोर्ड-संचालित role="link" बना रहता है और तिथि दिखती है।
  • मौजूदा तटस्थ टोकन पुनः उपयोग; कोई नया रंग नहीं।

टिप्पणियाँ

  • केवल क्लाइंट; रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। +2 i18n कुंजियाँ ×17 (स्नैपशॉट 1217 → 1219)। सूट: 2416 (+3)।

[1.160.0] — 2026-08-13

ठीक किया गया (HIGH) — प्रदाता संबंधी पाठ अब 7-प्रदाता वादे का खंडन नहीं करता। #/config कहता था कि लाइव मूल्यांकन “आपकी Anthropic या Gemini कुंजी का उपयोग करता है” और OpenAI कुंजी “वेब UI द्वारा उपयोग नहीं होती”; डैशबोर्ड “Anthropic-first scoring” दिखाता था — 7-प्रदाता कैस्केड (v1.157.0) के बाद से गलत।

ठीक किया गया

  • config.providerModelNote (×17): अब बताता है कि ⚡ लाइव मूल्यांकन आपकी सात कुंजियों (Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub Models · Hermes) में से किसी एक के साथ हेडलेस चलता है, स्वतः क्रमबद्ध और फ़ॉलबैक सहित। गलत OpenAI वाक्य हटाया गया।
  • dash.quick.evaluateSub (×17): प्रदाता-तटस्थ (“0–5 फ़िट स्कोर”)। Keys: N / 5N / 7

टिप्पणियाँ

  • केवल पाठ; रूट/CSP/SSRF/लेखन में कोई बदलाव नहीं। कोई नई i18n कुंजी नहीं (स्नैपशॉट 1217)। सूट: 2413 (+3)।

[1.159.0] — 2026-08-13

ठीक किया गया (HIGH) — रिपोर्ट मेटाडेटा अब भाषा से बंधा नहीं है। अंग्रेज़ी के अलावा किसी लोकेल में बनी रिपोर्टें #/reports पर खाली मेटाडेटा पट्टी दिखाती थीं, क्योंकि parseReportHeader केवल अंग्रेज़ी बोल्ड लेबल पहचानता था।

ठीक किया गया

  • parseReportHeader अब भाषा-अपरिवर्तनीय ## Machine Summary YAML ब्लॉक (score: / legitimacy: / date: — वही स्रोत जिसे auto-pipeline पहले से पढ़ता है) पार्स करता है। प्राथमिकता: अंग्रेज़ी लेबल → Machine Summary → स्थानीय लेबल (REPORT_LABELS, 17 लोकेल)। अंग्रेज़ी रिपोर्टें बाइट-दर-बाइट समान रहती हैं।
  • सहनशील संख्या पार्सिंग (1.5/5, 1,5/5, 1.5 из 5, 4.5 out of 5); मुख्य भाग में तिथि न हो तो फ़ाइल mtime पर लौटता है।

टिप्पणियाँ

  • केवल पठन/पार्सिंग; रूट, CSP, SSRF या पैरेंट-लेखन में कोई बदलाव नहीं। कोई नई i18n कुंजी नहीं। सूट: 2410 (+8)।

[1.158.0] — 2026-08-12

ठीक किया गया — दो कॉस्मेटिक प्रदर्शन बग (टैब शीर्षक में लीक हुआ «?» और लैंडिंग पर गलत प्रदाता संख्या)। केवल प्रदर्शन; व्यवहार, सुरक्षा या डेटा-प्रवाह में कोई बदलाव नहीं।

ठीक किया गया

  • HelpHint का «?» अब document.title में लीक नहीं होता। राउटर कच्चे h1.textContent से टैब शीर्षक बनाता था, इसलिए टैब «Vacancy search» के बजाय «Vacancy search?» दिखाता था। अब router.js::focusNewView शीर्षक को क्लोन करता है, .help-hint हटाता है, फिर टेक्स्ट पढ़ता है; दृश्यमान «?» अछूता रहता है।
  • cvstart.org «7» के बजाय «17 AI providers» दिखा रहा था। Features.astro का sub() हेल्पर प्रति-कार्ड प्रतिस्थापन से पहले हर {n} को भाषा-संख्या (17) से बदल देता था; अब {n} प्रति-कार्ड हल होता है (प्रदाता → 7, भाषाएँ → 17)।

टिप्पणियाँ

  • सर्वर, रूट, CSP, SSRF या i18n कुंजी में कोई बदलाव नहीं; facts.json की संरचना अपरिवर्तित। सूट: 2402 परीक्षण (+1)।

[1.157.0] — 2026-08-12

ठीक किया गया — लाइव इवैल्स अब केवल Anthropic/Gemini नहीं, बल्कि किसी भी कॉन्फ़िगर किए प्रदाता पर चलते हैं। केवल OPENROUTER_API_KEY सेट करने वाला उपयोगकर्ता गलती से मैनुअल मोड में बाध्य हो जाता था।

ठीक किया गया

  • मूल कारण: बिना कुंजी वाला LLM_PROVIDER पिन (जैसे init से LLM_PROVIDER=claude) मृत-अंत तक पहुँचता था; अब यह कॉन्फ़िगर किए प्रदाताओं के बीच auto क्रम पर वापस चला जाता है (selectActiveProvider + दोनों डिस्पैच कैस्केड में)।
  • क्लाइंट गेटिंग (#/deep + mode-page व्यू) अब पुराने Anthropic/Gemini प्रोब के बजाय window.ProviderStatus (/api/status/providers, सभी 7) उपयोग करता है; पुनर्लिखित टेक्स्ट (deep/eval × 17) + डैशबोर्ड «लाइव इवैल्स» बैज + config.llmProviderHint

टिप्पणियाँ

  • कोई सुरक्षा बदलाव नहीं। सूट: 2401 परीक्षण (+5)।

[1.156.0] — 2026-08-12

रिफैक्टर — scan.js को आकार सीमा के नीचे विभाजित करें (P-16) + एक CodeQL फ़िक्स। scan.js 906 पंक्तियों का था; व्यवहार-संरक्षी दो फ़ैक्टरियाँ निकालकर 648 पर लाया गया। P-15/P-16 व्यू-विभाजन जोड़ी पूर्ण।

बदला गया

  • नए scan/runner.js (स्कैन निष्पादन इंजन) और scan/filters.js (फ़िल्टर स्टेट मशीन) ctx/refs बैग के माध्यम से; scan.js दोनों को जोड़ता है।

ठीक किया गया

  • CodeQL js/useless-assignment-to-local (#428) config/tab-controller.js में: let n = i;let n;

टिप्पणियाँ

  • शुद्ध रिफैक्टर, व्यवहार में बदलाव नहीं; स्रोत पढ़ने वाले 4 परीक्षण पुनः-निर्देशित। दोनों बड़े व्यू अब 800 से नीचे (P-15/P-16 पूर्ण)। सूट: 2396 परीक्षण।

[1.155.0] — 2026-08-12

रिफैक्टर — config.js को आकार सीमा के नीचे विभाजित करें (P-15). config.js 1030 पंक्तियों का था (800 सीमा से ऊपर); व्यवहार-संरक्षी दो मॉड्यूल निकाले गए, इसे 783 पर लाया गया।

बदला गया

  • नए config/field-specs.js (फ़ील्ड डेटा + मॉडल सूचियाँ) और config/tab-controller.js (टैब-बार फ़ैक्टरी); config.js इन्हें संदर्भित करता है, रेंडर लॉजिक अपरिवर्तित।

टिप्पणियाँ

  • शुद्ध रिफैक्टर, व्यवहार में बदलाव नहीं; स्रोत पढ़ने वाले 6 परीक्षण पुनः-निर्देशित किए गए। scan.js (906) यथावत (पहले ही आंशिक रूप से विभाजित; कोर बहुत युग्मित, स्वच्छ यांत्रिक विभाजन कठिन)। सूट: 2396 परीक्षण।

[1.154.0] — 2026-08-12

नई गाइड — “पूरे स्टैक को क्लाउड में चलाएँ।” career-ops के पास अपनी क्लाउड/सर्वर कहानी नहीं है, इसलिए एक जोड़ी गई: पैरेंट career-ops पाइपलाइन, इस career-ops-ui व्यूअर और AI इंजन (Claude Code के माध्यम से Claude सदस्यता, स्थानीय Hermes, या API कुंजियाँ) को एक छोटे हमेशा-चालू सर्वर पर रखने की चरण-दर-चरण विधि। 17 भाषाओं में सहायता §31, एक README अनुभाग और एक wiki पृष्ठ के रूप में।

जोड़ा गया

  • सहायता §31 “पूरे स्टैक को क्लाउड में चलाएँ” (× 17) — तीन भाग, प्रावधान + इंस्टॉल, इंजन चुनें, सुरक्षित रूप से प्रकट करें (HTTPS रिवर्स प्रॉक्सी + प्रमाणीकरण + CSP/SSRF/XSS/कोई-रहस्य-नहीं अपरिवर्तनीयताएँ)। सहायता बंडल 31 H2 / 112 H3 तक बढ़ता है।
  • README — “पूरे स्टैक को क्लाउड में चलाएँ” अनुभाग (× 17) + wiki में Cloud-Deployment पृष्ठ।

टिप्पणियाँ

  • केवल दस्तावेज़ — कोई रूट, सर्वर या क्लाइंट बदलाव नहीं; कोई नई i18n कुंजी नहीं। 4 सहायता परीक्षण 31 H2 / 112 H3 अनुबंध पर जाते हैं। सूट: 2396 परीक्षण (अपरिवर्तित)।

[1.153.0] — 2026-08-12

Jobvite स्कैनर सार्वजनिक XML फ़ीड पर स्थानांतरित (पैरेंट-सिंक). पैरेंट ने Jobvite JSON API सेवानिवृत्त कर दी (अब शून्य नौकरियाँ लौटाती है); web-ui का source उसी मृत एंडपॉइंट का उपयोग करता था, इसलिए कोई भी ट्रैक की गई Jobvite कंपनी चुपचाप खाली स्कैन होती थी। पैरेंट फ़िक्स (#2623) को पोर्ट किया: source अब companyEId से कुंजीबद्ध सार्वजनिक प्रति-टेनेंट XML फ़ीड पढ़ता है।

ठीक किया गया

  • source सेवानिवृत्त JSON API कॉल करके शून्य नौकरियाँ लौटाता था; अब यह https://app.jobvite.com/CompanyJobs/Xml.aspx?c={companyEId} कॉल करता है और XML <result><job>… पार्स करता है (CDATA + एंटिटी, apply-url से पहले detail-url)।

बदला गया

  • companyEId समाधान: (1) पोर्टल पर company_eid:, (2) स्पष्ट api: का c= पैरामीटर, (3) बोर्ड-पेज डिस्कवरी। fetchText (http-json.mjs) non-ok त्रुटि पर .location/.retryAfter संलग्न करता है (केवल-पढ़ने, पश्च-संगत)।

टिप्पणियाँ

  • सुरक्षा — दो होस्ट (jobs.jobvite.com, app.jobvite.com) प्रत्येक अनुरोध से पहले assertJobviteUrl द्वारा पिन: केवल https, सख्त allowlist, कोई रीडायरेक्ट नहीं अनुसरण किया जाताcompanyEId केवल एक ?c= मान है; source संख्या अपरिवर्तित।
  • सूट: 2396 परीक्षण (+4)।

[1.152.0] — 2026-08-12

Hermes प्रदाता — वायरिंग पूर्ण + दस्तावेज़ अद्यतन. v1.151.0 के Hermes एकीकरण की कोड समीक्षा में दो वास्तविक कमियाँ और चार पूर्णता-आइटम मिले; सभी यहाँ ठीक किए गए, और पूरे ऐप की LLM प्रदाता सूची सभी दस्तावेज़-सतहों और 17 भाषाओं में पूरे सात तक लाई गई।

ठीक किया गया

  • #/config Hermes को बाध्य नहीं कर सकाLLM_PROVIDER ड्रॉपडाउन केवल छह प्रदाता दिखाता था, इसलिए HERMES_API_KEY सेट तो हो सकती थी पर UI से Hermes बाध्य नहीं। अब hermes 8वाँ विकल्प है, और एक नया समानता-परीक्षण ड्रॉपडाउन को LLM_PROVIDERS से फिर भटकने नहीं देता।
  • छोटी सेल्फ-होस्टेड कुंजियाँ चुपचाप अस्वीकृत होती थींisUsableKey की 20-अक्षर सीमा क्लाउड कुंजियों के लिए थी; hasHermesKey अब शिथिल 8-अक्षर सीमा उपयोग करता है (Hermes दस्तावेज़ का उदाहरण 19 अक्षर का है)।

बदला गया

  • प्रदाता सूची को README (× 17), इन-ऐप सहायता (× 17), config.llmProviderHint शब्दकोश (× 17) और docs/sdd में पूरे सात तक सामान्यीकृत किया गया; hermesChatUrl बिना पथ वाले होस्ट को पूरा करता है; मैनुअल फ़ॉलबैक टेक्स्ट Hermes का नाम लेता है।

टिप्पणियाँ

  • सुरक्षा अपरिवर्तित — कोई नया रूट या SSRF/CSP बदलाव नहीं; health/doctor को एक HERMES_API_KEY पंक्ति मिलती है।
  • सूट: 2392 परीक्षण (+2)।

[1.151.0] — 2026-08-12

Hermes अब एक जुड़ा हुआ LLM प्रोवाइडर है (Phase 5) — Phase 5 स्कोपिंग ने पुष्टि की कि Nous Research का Hermes एक OpenAI-संगत API Server (hermes gatewayPOST /v1/chat/completions) देता है, इसलिए career-ops-ui अब OpenAI/Qwen की तरह ही स्थानीय Hermes के माध्यम से लाइव मूल्यांकन चलाता है। App settings में HERMES_API_KEY सेट करें और यह auto क्रम में शामिल हो जाता है (अंतिम)। रोडमैप का अंतिम खुला बिंदु — Phase 5, Shape A — पूरा करता है।

जोड़ा गया

  • Hermes LLM प्रोवाइडर (Shape A) — साझा runOpenAICompatible क्लाइंट पर runHermes (server/lib/openai.mjs), दोनों कैस्केड (llm-dispatch.mjs + routes/llm.mjs) में, auto क्रम की पूँछ में + LLM_PROVIDER=hermes पिन, /api/status/providers, और llm-pricing.mjs। यह Bearer auth के साथ एक कॉन्फ़िगर-योग्य स्थानीय base URL (डिफ़ॉल्ट http://127.0.0.1:8642/v1) तक पहुँचता है — यह एक कॉन्फ़िगर किया गया प्रोवाइडर endpoint है (OpenRouter/Qwen की तरह), उपयोगकर्ता द्वारा दिया गया जॉब URL नहीं, इसलिए यह SSRF गार्ड से नहीं गुज़रता।
  • #/config फ़ील्डHERMES_API_KEY (गुप्त) + HERMES_BASE_URL + HERMES_MODEL (डिफ़ॉल्ट hermes-agent), 6 नई i18n कुंजियाँ × 17 भाषाएँ (स्नैपशॉट 1208 → 1214)।

बदला गया

  • स्कोपिंग स्पाइक हल हुआ: docs/integrations/HERMES.md, इन-ऐप सहायता §30 (× 17), README टीज़र (× 14), hermes-bridge स्किल, और रोडमैप “योजनाबद्ध / अभी तक न जुड़ा” से जुड़ा हुआ (Shape A) में बदलते हैं। Shape B (एक कस्टम एजेंट-रनटाइम relay) की ज़रूरत नहीं पड़ी।

टिप्पणियाँ

  • सुरक्षा: प्रोवाइडर fetch एक कॉन्फ़िगर किया गया endpoint है, अन्य OpenAI-संगत प्रोवाइडरों की तरह ही श्रेणी — कोई नई SSRF सतह नहीं, कोई CSP/सैनिटाइज़र बदलाव नहीं। HERMES_API_KEY एक SECRET_KEY है (कभी प्रदर्शित नहीं)।
  • परीक्षण (CI-पृथक, स्टब ट्रांसपोर्ट): tests/hermes-provider.test.mjs (+5); v1.146.0 का “कोई Hermes शाखा नहीं” कैनरी इसे जुड़ा हुआ बताने के लिए उलटा किया गया; प्रोवाइडर-सतह परीक्षण 7-प्रोवाइडर क्रम में अपडेट।
  • सूट: 2390 परीक्षण (+5)।

[1.150.0] — 2026-08-12

एकसमान खाली अवस्थाएँ (Phase 4 निखार) — हर “अभी कुछ नहीं” पैनल अब एकमात्र साझा .empty स्टाइल से रेंडर होता है, बजाय इसके कि कुछ व्यू जादुई 40px के साथ इनलाइन रूप-रंग दोबारा घोषित करें। एक छोटा दृश्य-संगति सुधार; #/activity, #/cv-studio, #/stats और #/usage की खाली अवस्थाएँ अब बाकी सबसे मेल खाती हैं (टोकनयुक्त 48px पैडिंग + धराशायी बॉर्डर)।

बदला गया

  • #/activity, #/cv-studio, #/stats, #/usage ने खाली पैनलों पर अपना इनलाइन style: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' } हटाया — तीनों गुण पहले से ही साझा .empty क्लास देती है (--space-7 = 48px, केंद्रित, धुँधला, धराशायी बॉर्डर)। इसलिए ये चारों बाकी ~25 .empty पैनलों के समान रेंडर होते हैं।
  • प्रति-व्यू वैध ओवरराइड (#/dashboard width:100%, #/pipeline border:none) अछूते हैं — केवल विशुद्ध अनावश्यक पुनर्घोषणाएँ हटाई गईं।

टिप्पणियाँ

  • केवल क्लाइंट CSS-उपयोग की सफ़ाई — कोई रूट, सर्वर, i18n कुंजी या CSS नियम बदलाव नहीं (.empty क्लास स्वयं अपरिवर्तित); डिक्शनरी स्नैपशॉट 1208। ब्राउज़र में सत्यापित (#/usage का खाली पैनल 48px पैडिंग + धराशायी बॉर्डर गणना करता है, 0 कंसोल त्रुटियाँ)।
  • नया कैनरी tests/empty-state-consistency.test.mjs .empty को एकमात्र सत्य-स्रोत बनाए रखता है। Phase 5 (Hermes प्रोवाइडर) अवरुद्ध बनी हुई है।
  • सूट: 2385 परीक्षण (+2: tests/empty-state-consistency.test.mjs)।

[1.149.0] — 2026-08-12

पोर्टल्स सेटिंग्स में ले जाए गए (Phase 4)#/portals अब Sourcing के नीचे नहीं, बल्कि ऐप सेटिंग्स के पास Setup नेविगेशन समूह में है। v1.144.0 से यह एक सेटिंग सतह है (ट्रैक की गई कंपनियाँ सक्षम/अक्षम करना + ATS हेल्थ जाँच), sourcing क्रिया नहीं — इसलिए इसका सही स्थान यही है। केवल नेविगेशन बदलाव; पेज और उसका रूट अपरिवर्तित।

बदला गया

  • #/portals नेविगेशन आइटम → Setup समूह (public/index.html में), ऐप सेटिंग्स के ठीक बाद रखा गया। Sourcing समूह से हटाया गया (जो Scan / Pipeline / Auto-pipeline / वित्त-पोषित कंपनियाँ रखता है)। #/portals रूट, व्यू और nav.portals लेबल अपरिवर्तित — केवल साइडबार स्थिति बदली।

टिप्पणियाँ

  • केवल नेविगेशन मार्कअप — कोई रूट, व्यू, i18n कुंजी या सर्वर बदलाव नहीं। ब्राउज़र में सत्यापित (0 कंसोल त्रुटियाँ); tests/portals-nav-placement.test.mjs द्वारा सुरक्षित।
  • सूट: 2383 परीक्षण (+2: tests/portals-nav-placement.test.mjs)।

[1.148.0] — 2026-08-12

साफ़-सुथरे स्कैन फ़िल्टर (Phase 4) — फ़िल्टर पैनल अब एक व्यवस्थित ग्रिड है#/scan का फ़िल्टर पैनल परिवर्ती-चौड़ाई वाले कठोर बॉक्सों के असमान flex-wrap से एक रिस्पॉन्सिव ग्रिड में बदल गया, और लागू करें / रीसेट क्रियाएँ अब अपनी अलग, दाईं ओर संरेखित पंक्ति में हैं। वही फ़िल्टर, वही व्यवहार — बस पढ़ने में आसान। एक डिज़ाइन निखार (parent-sync नहीं)।

बदला गया

  • #/scan फ़िल्टर पैनल → रिस्पॉन्सिव ग्रिड.scan-filters अब repeat(auto-fill, minmax(180px, 1fr)) कॉलम और समान अंतराल के साथ display: grid है, ताकि 11 लेबल वाले फ़िल्टर किसी भी चौड़ाई पर असमान पंक्ति में लिपटने के बजाय व्यवस्थित कॉलमों में संरेखित हों।
  • लागू करें / रीसेट क्रियाएँ अपनी पंक्ति में पूरे ग्रिड में फैलती हैं, एक पतली रेखा से अलग और दाईं ओर संरेखित। scan.js में पुराना छिपा-लेबल तरीका + आंतरिक flex रैपर हटाया गया।

टिप्पणियाँ

  • केवल CSS + थोड़ी DOM सफ़ाई — हर फ़िल्टर id (#scan-filter-*, #scan-apply) और SR.render() की वायरिंग अपरिवर्तित है, इसलिए Playwright प्रवाह अछूता रहता है। कोई नई i18n कुंजी नहीं।
  • ब्राउज़र में सत्यापित (0 कंसोल त्रुटियाँ); tests/scan-filters-grid.test.mjs द्वारा सुरक्षित।
  • सूट: 2381 परीक्षण (+3: tests/scan-filters-grid.test.mjs)।

[1.147.0] — 2026-08-12

Hermes & Telegram — इन-ऐप सहायता अनुभाग + cvstart.org सतह (Phase 5b, भाग 2) — Hermes दस्तावेज़ीकरण कार्य का दूसरा और अंतिम हिस्सा: तरीका अब सभी 17 भाषाओं में ऐप की अपनी सहायता गाइड के भीतर रहता है, और इन-ऐप डॉक्स सहायक इसी से Hermes संबंधी सवालों के जवाब देता है। यह अभी भी केवल दस्तावेज़ीकरण है — Hermes LLM-प्रोवाइडर पथ योजनाबद्ध / अभी तक न जोड़ा गया बना हुआ है (Phase 5)।

जोड़ा गया

  • इन-ऐप सहायता §30 “Hermes & Telegram” × 17 भाषाएँ — एक नया गाइड अनुभाग (Hermes क्या है + दो इंटीग्रेशन रूप; क्लाउड सर्वर पर चलाना; Hermes के ज़रिए Telegram + “क्या उजागर न करें” नियम), #/help से पहुँच योग्य। docs-assistant / DocsFab का grounding इसे स्वतः उठा लेता है, क्योंकि दोनों docs/help/<lang>.md पढ़ते हैं।
  • cvstart.org — Hermes गाइड का एक लिंक जो GitHub दस्तावेज़ की ओर इशारा करता है।

बदला गया

  • सहायता बंडल गेट 29 → 30 H2 / 105 → 108 H3 तक बढ़ाया गया (canonical-docs-coverage, help-ui, help-ru-config-section); §30 तीन H3 जोड़ता है।

टिप्पणियाँ

  • अभी भी कुछ भी Hermes को कॉल नहीं करता। नया कैनरी tests/help-hermes-section.test.mjs पुष्टि करता है कि हर भाषा में §30 अपने भाषा-निरपेक्ष एंकर (docs/integrations/HERMES.md, hermes-bridge, #/help, 127.0.0.1, Telegram) के साथ मौजूद है। प्रोवाइडर Phase 5 API-कॉन्ट्रैक्ट तक अवरुद्ध रहता है।
  • यह Phase 5b का दस्तावेज़ + skill डिलीवरेबल पूरा करता है; प्रोवाइडर इंटीग्रेशन (Phase 5) एक अलग, अवरुद्ध मद बना रहता है।
  • सूट: 2378 परीक्षण (+2: tests/help-hermes-section.test.mjs)।

[1.146.0] — 2026-08-12

Hermes एजेंट + Telegram — इंटीग्रेशन गाइड + एक skill (Phase 5b, भाग 1) — आप career-ops-ui को किसी क्लाउड सर्वर पर चला सकते हैं और इसके इवेंट्स (एक पूरा हुआ स्कैन, एक नई रिपोर्ट, एक अत्यावश्यक फॉलो-अप) को Nous Research के Hermes एजेंट के माध्यम से Telegram से जोड़ सकते हैं। यह रिलीज़ डिज़ाइन + डिप्लॉयमेंट दस्तावेज़ और एक hermes-bridge skill लाता है; Hermes LLM-प्रोवाइडर पथ अभी भी योजनाबद्ध / अभी-तक-न-जुड़ा हुआ है (Phase 5 के API-कॉन्ट्रैक्ट स्पाइक पर अटका हुआ)। जानबूझकर कोड से पहले दस्तावेज़।

जोड़ा गया

  • docs/integrations/HERMES.md — गहन विवरण: दो इंटीग्रेशन रूप (OpenAI-संगत endpoint बनाम एजेंट रनटाइम), क्लाउड-सर्वर डिप्लॉयमेंट (reverse proxy + HTTPS + systemd, हेडलेस मशीन पर read-only parent अनुबंध), Hermes-के-माध्यम-से Telegram, और एक थ्रेट-मॉडल «क्या उजागर न करें» सूची (चैनल को कोई CV / वेतन / रिपोर्ट सामग्री / कीज़ नहीं)।
  • README में ## Hermes agent + Telegram टीज़र — अंग्रेज़ी README में एक संक्षिप्त संकेत + लिंक, जो हर भाषा के पूरी तरह अनुवादित README में भी दिखाया गया है।
  • गाइड को व्यावहारिक बनाने वाला एक hermes-bridge skill (.claude/skills/hermes-bridge/) — पूर्वापेक्षा + दायरा-जाँच (Node ≥ 18, कीज़ मौजूद हैं, SSRF-सुरक्षित पथ से endpoint की पहुँच), कभी भी सीक्रेट्स को डिस्क/लॉग में नहीं लिखता, और Hermes endpoint बनाने या प्रोवाइडर के जुड़े होने का दावा करने से इनकार करता है।
  • docs/architecture/OVERVIEW.md में एक Integrations सेक्शन गाइड को लिंक करता है।

टिप्पणियाँ

  • अभी तक कुछ भी Hermes को कॉल नहीं करता। एक कैनरी टेस्ट (tests/hermes-docs.test.mjs) «योजनाबद्ध / अभी-तक-न-जुड़ा» ईमानदारी मार्करों की पुष्टि करता है और यह कि llm-dispatch.mjs में कोई Hermes/Nous शाखा नहीं है — इसलिए बाद में प्रोवाइडर जोड़ने पर उसी बदलाव में दस्तावेज़ + रोडमैप भी अपडेट करना होगा।
  • v1.147.0 तक टाला गया (Phase 5b, भाग 2): इन-ऐप सहायता में «Hermes & Telegram» H2 × 17 भाषाएँ, और cvstart.org मार्केटिंग सतह।
  • सूट: 2376 परीक्षण (+4: tests/hermes-docs.test.mjs)।

[1.145.0] — 2026-08-12

अंतर्दृष्टिपूर्ण आँकड़े (जारी): पुनर्निर्माण-योग्य चार्ट#/stats के “लक्षित-भूमिका रुझान” टैब में अब एक चार्ट बनाएँ विजेट है: एक मीट्रिक × आयाम चुनें और यह लाइव फिर से बनता है। उपयोगकर्ता का UX अनुरोध (parent-sync के बिना)।

जोड़ा गया

  • मीट्रिक × आयाम पुनर्निर्माण-योग्य चार्ट — एक मीट्रिक (रिक्तियाँ / माध्यिका वेतन / औसत वेतन) और एक आयाम (देश अनुसार / भूमिका अनुसार) चुनें, और बार चार्ट तुरंत फिर से बन जाता है। वेतन मीट्रिक मुद्रा + प्रति वर्ष ⇄ प्रति माह टॉगल का पालन करते हैं; रिक्तियाँ एक साधारण गणना हैं।
  • 8 नई i18n कुंजियाँ × 17 भाषाएँ; स्नैपशॉट 1200 → 1208।

टिप्पणियाँ

  • ब्राउज़र में सत्यापित (0 कंसोल त्रुटियाँ)। सूट: 2372 परीक्षण (+2)।

[1.144.0] — 2026-08-12

सेटिंग्स और फ़िल्टर (चरण 4, भाग 1): ट्रैक किए गए पोर्टल सक्षम/अक्षम करें — अब आप #/portals से किसी निगरानी वाली कंपनी को चालू या बंद कर सकते हैं, और स्कैनर इसका पालन करता है। उपयोगकर्ता का UX अनुरोध (parent-sync के बिना)।

जोड़ा गया

  • #/portals पर प्रति-कंपनी सक्षम/अक्षम टॉगल — एक क्लिक से पोर्टल बंद हो जाता है (EN स्कैनर पहले से enabled: false कंपनियों को छोड़ देता है, इसलिए अक्षम पोर्टल आगे के सभी स्कैन से हट जाता है) या फिर से चालू हो जाता है, एक आशावादी टोस्ट के साथ।
  • POST /api/portals/toggle — एक स्पष्ट उपयोगकर्ता लेखन जो portals.yml में किसी कंपनी के enabled फ़्लैग को शल्यचिकित्सकीय रूप से और पार्स-सत्यापन के साथ बदलता है (टिप्पणियाँ, क्रम और बाकी फ़ील्ड सुरक्षित)। 5 नई i18n कुंजियाँ × 17 भाषाएँ; स्नैपशॉट 1195 → 1200।

टिप्पणियाँ

  • स्कैनर में बदलाव शून्य रहा — en-scanner.mjs पहले से enabled !== false फ़िल्टर करता है। सूट: 2370 परीक्षण (+3)।

[1.143.0] — 2026-08-12

समझने में आसान (जारी): मुख्य वर्कफ़्लो व्यू पर ? संकेत — सहायता ? अब सभी भाषाओं में नौ प्रमुख कार्य पृष्ठों को कवर करता है। उपयोगकर्ता-रिपोर्टेड UX सुधार (parent-sync के बिना)।

जोड़ा गया

  • 9 और व्यू शीर्षकों पर ? सहायता संकेत#/scan, #/evaluate, #/cv-studio, #/tracker, #/config, #/deep, #/batch, #/auto, #/apply को इनलाइन ? (HelpHint.title के माध्यम से) मिलता है जो स्थानीयकृत «यह क्या करता है / कैसे उपयोग करें / क्या अपेक्षा करें» पॉपओवर खोलता है — v1.139.0 वाला वही CSP-सुरक्षित घटक।
  • 9 नई i18n कुंजियाँ × 17 भाषाएँ (help.hint.scan/…/apply); स्नैपशॉट 1186 → 1195।

टिप्पणियाँ

  • ब्राउज़र में सत्यापित (0 कंसोल त्रुटियाँ)। सूट: 2365 परीक्षण (+1)।

[1.142.0] — 2026-08-12

सुधार: अब कोई “Unknown” करियर आर्किटाइप नहीं#/orientation अब कभी-कभी “Unknown” उत्तर देकर उस पर “दांव बढ़ाने” की सलाह देने के बजाय, हमेशा आठ नामित करियर वेक्टरों में से रैंक करता है। उपयोगकर्ता-रिपोर्टेड सुधार (parent-sync के बिना)।

ठीक किया गया

  • #/orientation — AI प्रॉम्प्ट अब सेट-से-बाहर आर्किटाइप को मना करता है। मॉडल को शीर्ष तीन को ठीक आठ नामित वेक्टरों में से रैंक करना ही होगा और वह कभी “Unknown”/“N/A”/“अपर्याप्त डेटा” उत्तर नहीं दे सकता या नया लेबल नहीं गढ़ सकता। सीवी पतला हो तो भी वह निकटतम तीन को कम विश्वास के साथ नामित करता है और बताता है कि कौन-से प्रमाण अनुपस्थित हैं।

टिप्पणियाँ

  • केवल सर्वर प्रॉम्प्ट परिवर्तन (buildOrientationPrompt); कोई i18n/स्कीमा परिवर्तन नहीं। सूट: 2364 परीक्षण (+1)।

[1.141.0] — 2026-08-12

अंतर्दृष्टिपूर्ण आँकड़े (जारी): फंडिंग पाई कंपनियों का संवर्धन#/funded अब अधिक दृश्यात्मक है: कंपनी लोगो, फंडिंग राशि के अनुसार चार्ट, और राउंड / राशि / डिस्कवरी स्कोर / सुझाई गई कार्रवाई वाले कार्ड। उपयोगकर्ता-रिपोर्टेड UX सुधार (parent-sync के बिना)।

बदला गया

  • #/funded — सपाट तालिका → कार्ड ग्रिड। हाल में फंडिंग पाई प्रत्येक कंपनी अब एक कार्ड है जिसमें लोगो (नाम से CompanyLogo द्वारा व्युत्पन्न, विफल होने पर अक्षर अवतार), राउंड + राशि चिप्स, पैरेंट प्रोजेक्ट का डिस्कवरी स्कोर और सुझाई गई कार्रवाई, साथ ही फंडिंग समाचार लिंक व तारीख होती है।
  • फंडिंग राशि का विज़ुअलाइज़ेशन — प्रकट राशि के अनुसार शीर्ष कंपनियों का क्षैतिज बार चार्ट; “$120M”/“€1.5B” जैसी मुक्त-पाठ राशियाँ नए parseAmount द्वारा परिमाण में पार्स होती हैं। 3 नई i18n कुंजियाँ × 17 भाषाएँ

टिप्पणियाँ

  • अब भी GET /api/company-funded पर केवल पढ़ने योग्य; विवरण और वेतन सीमा फंडिंग स्रोत में नहीं हैं। सूट: 2363 परीक्षण (+2)।

[1.140.0] — 2026-08-12

अंतर्दृष्टिपूर्ण आँकड़े: समृद्ध वेतन संख्याएँ#/stats में “मेरा पाइपलाइन” वेतन विश्लेषण अब (केवल माध्यिका ही नहीं) औसत, प्रति वर्ष ⇄ प्रति माह टॉगल, और देश-वार न्यूनतम · औसत · माध्यिका · अधिकतम तालिका दिखाता है। Phase 3 का पहला हिस्सा। उपयोगकर्ता-रिपोर्टेड UX सुधार (parent-sync के बिना)।

जोड़ा गया

  • औसत वेतनRoleStats.salaryStats अब minUsd/medianUsd/maxUsd के साथ avgUsd लौटाता है। माध्यिका बाह्य मानों का प्रतिरोध करती है, औसत झुकाव दिखाता है — दोनों मिलकर एक वितरण की तरह पढ़े जाते हैं।
  • वेतन अनुभाग में प्रति वर्ष ⇄ प्रति माह टॉगल और देश-वार न्यूनतम · औसत · माध्यिका · अधिकतम तालिका (मुद्रा व अवधि चयनकर्ताओं से संचालित)। 8 नई i18n कुंजियाँ × 17 भाषाएँ

टिप्पणियाँ

  • संख्याएँ अब भी केवल पठनीय वेतन वाले विज्ञापनों से ली जाती हैं और USD में सामान्यीकृत होती हैं (संकेतात्मक)। सूट: 2361 परीक्षण (+1)।

[1.139.0] — 2026-08-12

समझने में आसान: ? सहायता संकेत — एक पुन: प्रयोज्य, CSP-सुरक्षित ? बटन जो क्लिक करने पर «यह क्या करता है / कैसे काम करता है / क्या अपेक्षा करें» आपकी भाषा में समझाता है। उपयोगकर्ता-रिपोर्टेड UX सुधार (parent-sync के बिना)।

जोड़ा गया

  • ? सहायता संकेत पॉपओवर (window.HelpHint) — शीर्षक के बगल में एक गोल ? एक हल्का, थीम-अनुरूप और RTL में प्रतिबिंबित पॉपओवर खोलता है जो UI.md() के माध्यम से स्थानीयकृत व्याख्या दिखाता है; सुलभ (role="tooltip", aria-expanded, Escape/बाहर क्लिक से बंद, फोकस पुनर्स्थापित) और CSP-सुरक्षित।
  • #/stats के 5 टैब और 8 AI/एनालिटिक्स व्यू शीर्षकों (career-plan, ओरिएंटेशन, two-pager, नेटवर्किंग, मॉक इंटरव्यू, मेमोरी, funded, साप्ताहिक सारांश) पर ? जोड़ा गया — 14 नई i18n कुंजियाँ × 17 भाषाएँ

टिप्पणियाँ

  • सभी व्यू में पहले से एक-पंक्ति उपशीर्षक था; ? माँग पर गहरी व्याख्या जोड़ता है और खाली अवस्थाओं को स्वयं-व्याख्यात्मक बनाता है। सूट: 2360 परीक्षण (+4)।

[1.138.0] — 2026-08-12

आपकी इंटरफ़ेस भाषा में जनरेशन — हर AI जनरेशन अब UI में चुनी गई भाषा में उत्तर देता है, साथ ही समीक्षा-प्रेरित परीक्षण सुदृढ़ीकरण। उपयोगकर्ता-रिपोर्टेड UX सुधार (parent-sync के बिना)।

बदला गया

  • AI जनरेशन अब UI भाषा का सम्मान करते हैं। इंटरफ़ेस रूसी, स्पेनिश, जापानी … पर सेट होने पर जनरेट किया गया टेक्स्ट हमेशा अंग्रेज़ी के बजाय उसी भाषा में लौटता है। आउटपुट-भाषा निर्देश अब सभी जनरेशन एंडपॉइंट्स से होकर गुज़रता है — करियर प्लान, ओरिएंटेशन, मार्केट रिपोर्ट, मॉक इंटरव्यू, नेटवर्किंग प्लान, «डॉक्स से पूछें», मेमोरी-नोट सुझाव और two-pager ड्राफ़्ट। कोड और आइडेंटिफ़ायर अंग्रेज़ी में ही रहते हैं (जैसे two-pager के YAML की-कीज़); केवल गद्य, शीर्षक और बुलेट स्थानीयकृत होते हैं।

ठीक किया गया

  • CSS रंग-भूमिका गार्ड (tests/css-role-tokens.test.mjs) — एक स्थिर कैनरी जो पुष्टि करता है कि v1.137.0 डार्क-मोड एलियास टोकन कभी भूमिका नहीं पलटते: टेक्स्ट-भूमिका टोकन (--fg/--danger/--ok/…) कभी background के रूप में नहीं, और सतह टोकन (--card/--panel/--line/…) कभी टेक्स्ट color के रूप में नहीं — समस्त CSS और SPA इनलाइन शैलियों में।
  • UI.md() XSS लोडर स्व-जाँचapi.js से md() लोड करने वाला परीक्षण अब निष्कर्षण के तुरंत बाद md('<script>…') की जाँच करता है और एस्केप गायब होने पर त्रुटि फेंकता है, ताकि भविष्य का कोई ग़लत स्लाइस सुरक्षा सूट को कटे-फटे फ़ंक्शन पर हरा करने के बजाय ज़ोर से विफल हो।
  • #/career-plan स्क्रॉल गार्ड — जनरेशन के बाद scrollIntoView तभी चलता है जब प्रीव्यू अभी भी दस्तावेज़ से जुड़ा हो।

टिप्पणियाँ

  • docs/UX-ROADMAP.md अपडेट: ? सहायता संकेत + पेज विवरण + खाली अवस्थाएँ अब v1.139.0; एक Nous Research / Hermes प्रोवाइडर — क्लाउड सर्वर + Telegram डिप्लॉयमेंट गाइड और एक Hermes स्किल सहित — चरण 5 / 5b के रूप में ट्रैक किया गया।
  • सूट: 2356 परीक्षण (+5)।

[1.137.0] — 2026-08-11

पढ़नीयता और रेंडरिंग सुधार — डार्क-मोड कंट्रास्ट, चार्ट लेबल्स, और करियर प्लान। एक यूज़र-रिपोर्टेड UX पास (कोई parent-sync नहीं)।

सुधारा गया

  • डार्क-मोड में कई स्क्रीन्स पर व्हाइट-ऑन-व्हाइट / ब्लैक-ऑन-ब्लैक — पंद्रह CSS कस्टम प्रॉपर्टीज़ जिन्हें कई व्यूज़ रेफ़रेंस करते थे (--fg, --panel, --panel-2, --ok, --danger, --card, …) कभी डिक्लेयर नहीं की गई थीं, इसलिए वे हार्डकोडेड लाइट/ब्लैक वैल्यूज़ पर फ़ॉलबैक करती थीं: लाइट मोड में ठीक, डार्क में अपठनीय (#/pipeline ओवरव्यू चिप्स, #/stats एक्टिव टैब, #/config “Active / Keys” + “✓ set”, #/two-pager सेक्शन्स, #/mock-interview प्रश्न बबल, एरर टेक्स्ट)। अब उन्हें असली थीम-अवेयर टोकन्स से alias किया गया है, इसलिए वे थीम को स्वचालित रूप से फ़ॉलो करते हैं — एक ऑटोमेटेड ऑडिटर द्वारा सत्यापित, सभी 29 व्यूज़ में 0 WCAG-AA कंट्रास्ट विफलताएँ; #/config एक्टिव टैब एक पठनीय टिन्टेड स्टाइल में बदल दिया गया। एक रिग्रेशन गार्ड (tests/dark-theme-tokens.test.mjs) उन्हें alias बनाए रखता है।
  • #/stats चार्ट लेबल्स बीच शब्द में कट जाते थे (“Senior Backend Engineer” → “…Enginee”) — अब वे “…” से संक्षिप्त होते हैं और पूरा लेबल एक hover टूलटिप के रूप में बना रहता है।
  • #/career-plan जनरेट किए गए प्लान को raw Markdown के रूप में दिखाता था — अब यह स्वचालित रूप से फ़ॉर्मैटेड, पठनीय टेक्स्ट के रूप में रेंडर होता है (एडिटेबल Markdown textarea में बना रहता है; Preview इसे टॉगल करता है)।

टिप्पणियाँ

  • #/career-plan, #/two-pager, #/stats, और साप्ताहिक इंटरव्यू डाइजेस्ट ख़राब नहीं हैं — जब तक आप कोई प्लान जनरेट नहीं करते / डेटा नहीं होता, वे ख़ाली स्टेट दिखाते हैं। स्पष्ट ऑन-पेज गाइडेंस और ? हेल्प हिंट्स आगे प्लान किए गए हैं (docs/UX-ROADMAP.md)।

[1.136.0] — 2026-08-11

पैरेंट career-ops v1.26.x पैरिटी (v1.26.0 मेननलाइन के बाद) — एक नया ज़ीरो-ऑथ स्रोत, साथ ही web-ui के मिरर कोड में क्वालिटी व रोबस्टनेस पोर्ट्स की एक लहर। रजिस्ट्री अब 79 स्रोत = 74 EN + 5 RU (ALL_ADAPTERS 74)।

जोड़ा गया

  • eightfold (Eightfold AI, #2684) — ज़ीरो-ऑथ https://<tenant>.eightfold.ai/api/apply/v2/jobs API के ज़रिए टैलेंट-एक्विज़िशन बोर्ड्स, *.eightfold.ai पर होस्ट-पिन्ड (ब्रांडेड careers.<company>.com CNAME को जानबूझकर रिजेक्ट किया गया है); एक सेफ़्टी कैप, dead-board-throw, url-dedup के साथ पेजिनेटेड। स्रोत + अडैप्टर + CI-आइसोलेटेड सुइट; #/scan सोर्स फ़िल्टर में और लैंडिंग पर दिखता है।

सुधारा गया

  • Unicode-अवेयर डीडुप और role कीज़ (#2569 / #2587 / #2667) — एक नई साझा normalizeTextKey (NFKC, किसी भी स्क्रिप्ट के letters/marks/digits बनाए रखती है) ASCII-ओनली कीज़ की जगह लेती है: detect-reposts अब width/punctuation कंपनी वेरिएंट्स को क्लस्टर करता है (“Acme, Inc.” ≡ “Acme Inc”) और अलग-अलग non-Latin नियोक्ताओं को कभी नहीं समेटता, जबकि role-matcher फ़ुल-विड्थ टाइटल्स को फ़ोल्ड करता है और non-Latin role टोकन्स को मिटाने के बजाय बनाए रखता है।
  • fetchJsonWithRetry अब एक रिजेक्टेड रीडायरेक्ट पर रीट्राई नहीं करता (#2657) — एक 3xx से मिलने वाला redirect:'error' गार्ड डेटर्मिनिस्टिक है, इसलिए यह अब नॉन-रीट्राएबल है और रीट्राई बजट जलाने के बजाय तेज़ी से विफल होता है।
  • title_filter.positive AND-groups (#2552) — एक positive एंट्री के भीतर एक व्हाइटस्पेस-डिलिमिटेड + अब हर टर्म को टाइटल में मौजूद होने की माँग करता है, किसी भी क्रम में।
  • oraclecloud नंबरयुक्त tenant apexes स्वीकार करता है oraclecloud1.com … oraclecloud99.com (#2683) — एक बाउंडेड फ़ैमिली (कोई लीडिंग ज़ीरो नहीं, ≤ 2 अंक), कभी वाइल्डकार्ड apex नहीं।
  • workable हार्डन किया गया (#2675) — Cloudflare-फ़्रंटेड होस्ट के मुक़ाबले रीट्राई, ब्राउज़र-जैसे हेडर्स, और रिक्वेस्ट सीरियलाइज़ेशन।
  • personio XML फ़ीड डिसेबल होने पर एक HTML स्क्रेप पर फ़ॉलबैक करता है, कुछ भी न लौटाने के बजाय।
  • states FALLBACK उपनाम पैरेंट के साथ फिर से सिंक किए गए (#2615)।

टिप्पणियाँ

  • पोर्ट नहीं किया गया (web-ui द्वारा मिरर्ड नहीं, या केवल CLI-विशिष्ट): reply-matcher (#2672), jd-similarity (#2661), jd-skill-gap (#2686), scan env-path (#2568) / --flag=value (#2589) पार्सिंग, और cover-letter / CV-template / doctor / ollama / generate-pdf परिवर्तन। वेब js-yaml/nanoid HIGH एडवाइज़रीज़ web-ui v1.135.0 में पहले ही पैच की जा चुकी थीं।

[1.135.0] — 2026-08-11

पैरेंट career-ops v1.26.0 पैरिटी — पाँच नए ज़ीरो-ऑथ स्कैन स्रोत, साथ ही चार बोर्ड्स में सुधार जो web-ui पहले से रखता है। रजिस्ट्री अब 78 स्रोत = 73 EN + 5 RU (ALL_ADAPTERS 73)।

जोड़ा गया

  • पाँच नए स्कैन स्रोत (हर एक एक स्रोत + अडैप्टर + एक CI-आइसोलेटेड सुइट; ये #/scan सोर्स फ़िल्टर में और cvstart.org लैंडिंग पर दिखते हैं):
    • join (JOIN) — join.com/companies/<slug> में Next.js __NEXT_DATA__ से किसी कंपनी का JOIN बोर्ड (होस्ट-पिन्ड, पेज-कैप्ड)।
    • getro (Getro) — सार्वजनिक api.getro.com POST API के ज़रिए VC “टैलेंट-नेटवर्क” पोर्टफ़ोलियो बोर्ड, नवीनतम-पहले पेजिनेटेड; हर जॉब पोर्टफ़ोलियो नियोक्ता को अट्रिब्यूटेड होती है, न कि फ़ंड को।
    • consider (Consider) — getconsider.com VC पोर्टफ़ोलियो बोर्ड, एक सेम-ओरिजिन POST के ज़रिए; कॉन्फ़िग-ड्रिवन होस्ट को एक स्ट्रक्चरल SSRF गार्ड द्वारा पिन किया गया है (केवल सार्वजनिक HTTPS होस्ट)।
    • joinup (JOINUP) — स्विस बोर्ड joinup.ch, SSR किए गए नवीनतम पेज को पढ़ते हुए; स्क्रेपर टूटने पर fail-closed।
    • remotli (Remotli) — remotli.ch, स्विस कंपनियों में रिमोट भूमिकाएँ (CHF सैलरी); नियोक्ता का अपना ATS apply URL देता है ताकि क्रॉस-लिस्टिंग्स डीडुप हो सकें।

सुधारा गया

  • a16z Speedrun अब एक क्षणिक ब्लिप पर पूरे बोर्ड को अबॉर्ट नहीं करता — पेज fetches अब एक साझा fetchJsonWithRetry से गुज़रते हैं (क्षणिक 429/5xx/timeout पर सीमित रीट्राई, कभी स्थायी 4xx पर नहीं), और पेज बजट को 50-जॉब पेज के लिए फिर से आकार दिया गया है।
  • arbeitsagentur v6 Jobsuche API (/pc/v6/jobs) पर स्थानांतरित — पुराना v4 एंडपॉइंट 404 देता है; प्रतिक्रिया शेप का नाम बदला गया और रिमोट फ़िल्टरिंग अब सर्वर-साइड पर संकुचित होती है।
  • thehub v2 jobsandfeatured API पर स्थानांतरित; पंक्तियों में कोई पोस्टेड डेट नहीं होती और वे एज फ़िल्टर से मुक्त हैं।
  • hackernews मासिक “Who is hiring?” थ्रेड को अब भरोसेमंद तरीक़े से खोजता है, फ़्री-टेक्स्ट क्वेरी के बजाय Algolia लुकअप को author_whoishiring अकाउंट टैग तक सीमित करके।

टिप्पणियाँ

  • पोर्ट नहीं किया गया (web-ui पहले से सुरक्षित, रिले-अब्ज़ॉर्ब्ड, या केवल CLI-विशिष्ट है): Unicode role-dedup / company-matching कुंजियाँ (web-ui का रीपोस्ट ग्रुपिंग पहले से ही कंपनी को एक सादे lowercase पर की करता है, इसलिए अलग-अलग non-Latin नियोक्ता कभी नहीं मिलते); followup rejection-latency सिग्नल + company-funded टच-अप्स (रिले किया गया, रीड-ओनली, fail-soft); scan env-overridable पाथ्स और --flag=value पार्सिंग (web-ui स्कैनर्स को इन-प्रोसेस चलाता है); User-Agent consolidation रीफ़ैक्टर (web-ui पहले से इसे केंद्रीकृत करता है); और केवल-CLI आइटम्स (untrusted-content रोस्टर, oferta/offer-prep, doctor, cover/CV टेम्पलेट परिवर्तन)।

[1.134.1] — 2026-08-05

वैलिडेशन-हार्डनिंग — एक पूर्ण-प्रोजेक्ट ऑडिट से सामने आए सुधार।

सुधारा गया

  • successfactors अब मिड-स्कैन विफलता पर स्क्रैप किए गए जॉब्स को नहीं छोड़ता (v1.134.0 के dead-board-throw पोर्ट में एक रिग्रेशन) — इसके पेजिनेशन लूप में कोई try/catch नहीं था, इसलिए पेज 2+ पर विफलता (पेज 1 सफल होने के बाद) थ्रो कर देती थी और पहले से इकट्ठा किया गया सब कुछ छोड़ देती थी; और यदि वह विफलता एक 404 (एक रेंज-से-बाहर startrow) थी, तो en-scanner एक लाइव टेनेंट को दिनों तक मृत मानकर क्वारंटीन कर देता था। अब यह phenom/radancy जैसा व्यवहार करता है: पेज-0 विफलता अब भी थ्रो करती है (मृत बोर्ड), लेकिन बाद के पेज की विफलता आंशिक परिणाम बनाए रखती है।
  • #/scan फ़िल्टर चिप्स अब कीबोर्ड-ऑपरेबल हैं (WCAG 2.1.1) — फ़ेसेट चिप्स (और “clear” चिप) क्लिक हैंडलर वाले स्पैन थे, लेकिन उनमें कोई tabindex/role नहीं था, इसलिए कीबोर्ड और स्क्रीन-रीडर उपयोगकर्ता उन तक न तो पहुँच सकते थे, न ही उन्हें टॉगल कर सकते थे। अब वे role="button", tabindex="0", aria-pressed, और Enter/Space एक्टिवेशन के साथ आते हैं।
  • तीन हार्डकोडेड अंग्रेज़ी स्ट्रिंग्स अब स्थानीयकृत हैं#/scan ट्रस्ट-बैज टूलटिप, #/scan रीलोकेशन कॉलम हेडर, और #/dashboard स्कोर हेडर बेयर लिटरल थे जिन्हें i18n पैरिटी गेट नहीं देख सकता था (वे कभी कुंजियाँ नहीं थीं), इसलिए वे हर ग़ैर-अंग्रेज़ी लोकेल में अंग्रेज़ी में ही रह गए। अब scan.trustTip + scan.col.reloc (2 नई कुंजियाँ) + track.col.score का पुनःप्रयोग, एक सोर्स-स्टैटिक गार्ड के साथ।

[1.134.0] — 2026-08-05

पैरेंट career-ops v1.25.0 पैरिटी।

जोड़ा गया

  • नया स्कैन स्रोत: getManfred (manfred) — प्रकाशित सैलरी के साथ स्पेनिश/EU टेक भूमिकाओं का एक बोर्ड-वाइड फ़ीड, www.getmanfred.com/api/v2/public/offers से (ज़ीरो-ऑथ, होस्ट-पिन्ड + HTTPS-ओनली, सिंगल-रिक्वेस्ट पूरा कैटलॉग)। स्रोत + अडैप्टर + एक CI-आइसोलेटेड सुइट (tests/sources-manfred.test.mjs); रजिस्ट्री अब 73 स्रोत = 68 EN + 5 RU (ALL_ADAPTERS 68)। #/scan सोर्स फ़िल्टर में और cvstart.org लैंडिंग पर दिखता है।

सुधारा गया

  • a16z Speedrun फ़ीड चुपचाप 50 जॉब्स तक सीमित हो रही थी (#2404) — फ़ीड एक पेज को 50 पर सीमित करती है, लेकिन स्रोत PER_PAGE = 100 का अनुरोध करता था, इसलिए पेजिनेशन पेज 1 के बाद रुक जाता था। इसे 50 पर सही किया गया।
  • मृत बोर्ड्स अब “लाइव लेकिन खाली” के रूप में पढ़े जाने के बजाय एरर थ्रो करते हैं (#2379) — cryptocurrencyjobs, phenom, radancy, successfactors: एक फ़ेच विफलता जहाँ कोई भी अनुरोध कभी रिज़ॉल्व नहीं होता, अब थ्रो करती है (ताकि #/portals हेल्थ और स्कैन एक वास्तविक विफलता दर्ज करें), उसे ख़ाली सूची में समेटने के बजाय; कम-से-कम एक सफलता के बाद स्कैन के बीच में हुई विफलता आंशिक परिणाम बनाए रखती है।
  • workable अब सार्वजनिक विजेट API का उपयोग करता है (#5ab8425) — apply.workable.com/api/v1/widget/accounts/<slug> पर स्विच किया गया, जो एक बड़े अकाउंट की पूरी पोस्टिंग सूची एक ही अनुरोध में लौटाता है, इसलिए बड़े अकाउंट अब सीमित नहीं होते।

टिप्पणियाँ

  • पोर्ट नहीं किया गया (केवल CLI-विशिष्ट या web-ui द्वारा मिरर नहीं किया गया): detect-reposts #2389 टाइटल-बकेटिंग परफ़ॉर्मेंस रीराइट; Unicode कंपनी-कुंजी फ़िक्स (web-ui का अपना ट्रैकर डीडुप पहले से ही non-Latin-सुरक्षित है); scan --since; cv-facts; CV टेम्पलेट / PDF ऑडिट पास; doctor; modes untrusted-content निर्देश।

[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 को एक ही नोड या एक ऐरे के रूप में लेता है, इसलिए केवल पहला कॉलम (Company) रेंडर होता था — अब सेल्स को एक ऐरे के रूप में भेजा जाता है। एक वास्तविक ब्राउज़र में सत्यापित: चारों फ़ीड्स में 11 कंपनियां Company / Funding signal / Source / Date कॉलम्स के साथ और काम करने वाले एविडेंस लिंक्स के साथ रेंडर होती हैं, ज़ीरो कंसोल एरर्स। एक ख़ाली पास अब प्रति-स्रोत डायग्नोस्टिक्स भी दिखाता है, ताकि एक शांत न्यूज़ डे को ब्लॉक्ड फ़ीड से अलग पहचाना जा सके।
  • tests/parity-routes-v1133.test.mjs में रिग्रेशन गार्ड्स: फ़ेक पैरेंट स्क्रिप्ट अब असली companies आउटपुट शेप भेजती है (मूल फ़िक्स्चर ग़लत candidates शेप को दर्शाता था — यही वजह है कि यह बग ग्रीन शिप हो गया था), साथ ही सोर्स-स्टैटिक कैनरीज़ जो पुष्टि करती हैं कि funded.js res.companies पढ़ता है (कभी res.candidates नहीं) और तालिका पंक्तियों को ऐरे चिल्ड्रन के साथ बनाता है (+1 → 2144)।

[1.133.0] — 2026-08-01

जोड़ा गया

  • फ़ंडेड-कंपनी खोज (#/funded, पैरेंट पैरिटी #2117) — एक नया रीड-ओनली व्यू जो पैरेंट career-ops की company-funded.mjs को GET /api/company-funded के ज़रिए रिले करता है: सार्वजनिक, होस्ट-पिन्ड फ़ंडिंग फ़ीड्स (TechCrunch, PR Newswire, The Guardian, Hacker News) से खोजी गई हाल ही में फ़ंडेड कंपनियों की एक समीक्षा-पहले सूची। यह रिले स्क्रिप्ट को --json --dry-run के साथ चलाता है (stdout पर JSON, कोई फ़ाइल राइट नहीं), उपयोगकर्ता इनपुट को कभी --sources में थ्रेड नहीं करता, रेट लिमिटिंग रखता है, और उपयोगकर्ता-ट्रिगर्ड है (एक Discover बटन, माउंट पर कभी नहीं)। नया रूट मॉड्यूल server/lib/routes/funded.mjs + public/js/views/funded.js, Sourcing के अंतर्गत।
  • साप्ताहिक इंटरव्यू डाइजेस्ट (#/interview-digest, पैरेंट पैरिटी #2129/#2130) — एक नया रीड-ओनली व्यू जो पैरेंट के ज़ीरो-LLM weekly-digest.mjs को GET /api/interview/weekly-digest के ज़रिए रिले करता है: इंटरव्यू सेशन नोट्स का एक यांत्रिक रोल-अप — इस हफ़्ते आपने किन कंपनियों और राउंड्स के साथ इंटरव्यू दिया, बार-बार आने वाली दक्षताएँ, और सर्वश्रेष्ठ-प्रयास खुले गैप्स। वैकल्पिक ?from=&to= रेंज तभी थ्रेड की जाती है जब दोनों वैध YYYY-MM-DD हों; एक खाली रेंज एक वैध available:true डाइजेस्ट है। server/lib/routes/interview.mjs + public/js/views/interview-digest.js में जोड़ा गया, Analytics के अंतर्गत।
  • दोनों रिले पैरेंट स्क्रिप्ट के अनुपलब्ध होने पर (CI, स्टैंडअलोन इंस्टॉल) स्थापित fail-soft available:false अनुबंध का पालन करते हैं। 26 नई i18n कुंजियाँ ×17 लोकेल्स; CI-आइसोलेटेड सुइट tests/parity-routes-v1133.test.mjs (+5 → 2143)।

टिप्पणियाँ

  • पैरेंट career-ops v1.24.0 से आगे बढ़ गया है, Next.js web/ ऐप के Follow-up Tracker पेज (#1422) और बैकएंड PDF रेंडर (#2182) के साथ — पोर्ट नहीं किया गया: web-ui के पास पहले से अपना फ़ॉलो-अप रिले और PDF रनर हैं, और अंतर्निहित followup-cadence.mjs हार्डनिंग शेल-आउट रिले के ज़रिए मुफ़्त में मिल जाती है। 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 LOC हो गई थी)। उपप्रणाली (renderResults, buildChipRow, getRows, पंक्ति/facet बिल्डर्स, विकल्प पेंटर्स, और FALLBACK_SOURCES रजिस्ट्री मिरर) एक window.ScanResults.create(ctx) फ़ैक्ट्री में स्थानांतरित हो गई, जो व्यू द्वारा दिए गए संदर्भ ऑब्जेक्ट पर क्लोज़ करती है। कोई व्यवहार परिवर्तन नहीं — फ़ंक्शन ज्यों-के-त्यों स्थानांतरित किए गए, क्लोज़र वेरिएबल्स को ctx.* में यांत्रिक रूप से पुनः-वायर किया गया; scan.js अब लगभग 906 LOC है (800-LOC लक्ष्य की ओर दूसरा निष्कर्षण पास योजनाबद्ध है)।
  • स्रोत-स्टैटिक परीक्षण अब दोनों फ़ाइलों को tests/helpers/scan-src.mjs::loadScanSrc() के माध्यम से पढ़ते हैं; 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 का “नवीनतम रिलीज़” बैनर एक-पंक्ति सारांश + पूर्ण परिवर्तन-सूची के लिंक तक सीमित कर दिया गया है (लंबी बहु-संस्करण कथा-दीवार को हटा दिया गया है)। सभी 17 लोकेल्स पर लागू।

[1.131.2] — 2026-07-31

बदला गया

  • app.css को तीन क्रमबद्ध स्टाइलशीट्स में विभाजित किया गया (फ़ाइल-आकार-अनुबंध ऋण — एकल फ़ाइल बढ़कर लगभग 1990 LOC हो गई थी, जो 800-LOC कठोर सीमा से काफ़ी आगे थी)। अब यह app.css (~672 — a11y, डिज़ाइन टोकन/थीम, sidebar, main, buttons, content-shell), components.css (~595 — cards, grids, paginator, badges, tables, forms, log/console, markdown, भाषा स्विचर, chip filter, connection banner), और overlays.css (~737 — toast, notifications drawer, modal, misc/responsive, [dir="rtl"] मिरर, docs-fab, usage-hud) है, प्रत्येक कठोर सीमा के भीतर।
    • यह विभाजन सतत और क्रमबद्ध है, इसलिए कैस्केड विभाजन-पूर्व फ़ाइल के समान बाइट-फ़ॉर-बाइट समान है; index.html तीनों को क्रमबद्ध <link> के रूप में लोड करता है। कोई व्यवहार, मार्कअप, या i18n परिवर्तन नहीं।
    • CSS-जाँचने वाले परीक्षण अब साझा tests/helpers/css.mjs::loadAppCss() हेल्पर के माध्यम से संयोजन पढ़ते हैं। नया tests/css-modularization.test.mjs विभाजन को लॉक करता है (फ़ाइलें मौजूद हैं · प्रत्येक ≤ 800 LOC · index.html लिंक क्रम) → सुइट 2138। ब्राउज़र में सत्यापित: तीनों स्टाइलशीट्स पार्स होती हैं और उनके नियम लागू होते हैं।

[1.131.1] — 2026-07-31

सुधारा गया

  • दो v1.130.0 स्रोतों पर अडैप्टर होस्ट-पिनिंग स्थिरता (कोड-समीक्षा फ़ॉलो-अप, डिफ़ेंस-इन-डेप्थ; वैध इनपुट के लिए कोई व्यवहार परिवर्तन नहीं):
    • a16z-speedrun-talent अडैप्टर अब buildEndpoint पर api: / a16z-speedrun-talent: ओवरराइड को पुनः-सत्यापित करता है (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

जोड़ा गया

  • #/tracker CRM स्टेज-टैब बोर्ड (पैरेंट वेब ऐप के /pipeline व्यू से पोर्ट किया गया)। ट्रैकर की फ़नल-चिप बार + स्टेटस ड्रॉपडाउन को एक स्टेज-टैब स्ट्रिप से बदला गया है: एक All टैब प्लस हर कैननिकल स्टेटस के लिए एक टैब — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — हर एक लाइव संपूर्ण-इतिहास गिनती दिखाता है, शून्य-गिनती वाले स्टेज सहित ताकि पूरा फ़नल हमेशा दृश्यमान रहे (CRM लुक)। सक्रिय टैब फ़िल्टर चलाता है; उसे फिर से क्लिक करने पर All पर वापस साफ़ हो जाता है। पंक्तियाँ अपना स्कोर-टोन, वैधता, PDF और रिपोर्ट सुविधाएँ बनाए रखती हैं, और कंपनी सेल अब लोगो सक्षम होने पर एक ब्रांड लोगो दिखाती है (डिफ़ॉल्ट रूप से बंद → कोई अतिरिक्त रिक्वेस्ट नहीं)।
    • नया रीड-ओनली रूट GET /api/tracker/stages कैननिकल फ़नल (क्रम में लेबल) + एक उपनाम-फ़ोल्ड मैप लौटाता है, जो server/lib/states.mjs (templates/states.yml, बिल्ट-इन fallback सहित) से लिया गया है — ताकि क्लाइंट कभी भी स्टेटस व्हाइटलिस्ट हार्डकोड न करे। लेगेसी बिना-पैरामीटर GET /api/tracker प्रतिक्रिया अपरिवर्तित है (केवल { rows })।
    • नई शुद्ध, यूनिट-टेस्टेड क्लाइंट लाइब्रेरी public/js/lib/tracker-stages.js पंक्तियों को सर्वर के स्टेजेज़ के अनुसार बकेट करती है, आवारा मार्कडाउन बोल्ड और स्थानीयकृत उपनामों (जैसे aplicadoApplied) को सहन करते हुए। टैब्स सुलभ हैं (role tablist/tab, aria-selected, ≥44 px हिट एरिया, हर टैब के accessible नाम में गिनती)। कोई नई i18n कुंजियाँ नहीं। सुइट 2133

[1.130.0] — 2026-07-31

जोड़ा गया

  • पैरेंट career-ops v1.24.0 से पोर्ट किए गए दो नए स्कैन स्रोत (इन-प्रोसेस, कोई नई निर्भरता नहीं; दोनों #/scan स्रोत फ़िल्टर और cvstart.org लैंडिंग पर दिखते हैं):
    • a16z Speedrun (a16z-speedrun-talent, #2231) — a16z Speedrun की टैलेंट-नेटवर्क बोर्ड-वाइड JSON फ़ीड। speedrun-talent-network.com पर होस्ट-पिन्ड, केवल-HTTPS, 0-इंडेक्स्ड पेजिनेशन पेज कैप के साथ, प्रति-कंपनी q/config थ्रेडिंग, fail-soft।
    • Cryptocurrency Jobs (cryptocurrencyjobs) — Web3 जॉब बोर्ड 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 पैरेंट फ़ीचर्स। career-ops v1.24.0 की बड़ी CLI/मोड सतह web-ui से बाहर रहती है, जो एक व्यूअर + थिन राइट-थ्रू है, मोड होस्ट नहीं: अनुपालन/क्षेत्राधिकार तालिकाएँ, संपर्क फ़ोनबुक + vCard, इंटरव्यू ट्रांसक्रिप्ट-डीब्रीफ़ / कॉल-प्लेटफ़ॉर्म पहचान, लेजर सेट-स्टेटस, आउटकम रिकॉर्डिंग, टू-पास ट्राएज, jd-समानता, वर्ज़न्ड एप्लिकेशन-CV आर्टिफ़ैक्ट स्कीमा, डॉक्टर Playwright-MCP पहचान, और portals/fix-slugs.mjs। पैरेंट के scan.mjs में रहने वाले स्कैन-ऑर्केस्ट्रेशन बदलाव — Interamt.de Playwright स्कैनर, iCIMS रिवर्स-ATS फुल स्वीप, देश-पात्रता रिमोट फ़िल्टर, DNS-लुकअप पेसिंग, StepStone rltr डिडुप, और स्कैन-हिस्ट्री नॉर्मलाइज़्ड-कंपनी कॉलम — लागू नहीं होते: web-ui EN/RU स्कैनर इन-प्रोसेस चलाता है और scan.mjs में शेल नहीं करता।
  • पहले से कवर। role-matcher accent-folding फ़िक्स (#2209) v1.127.0 में पोर्ट किया गया था, इसलिए यहाँ यह no-op है।

[1.129.1] — 2026-07-29

सुधारा गया

  • v1.128/v1.129 web पोर्ट पर AI समीक्षा फ़ॉलो-अप (सभी सलाहकारी, स्रोत पर ठीक): job-facets.js में स्तर वरीयता (स्पष्ट संशोधक अब प्रबंधन शब्द को हराता है — Senior Engineering Managersenior, पहले lead); states.mjs का fallback अब पिन नहीं होता (सफल पठन मेमोइज़, fallback बिना कैश लौटता — बूट पर क्षणिक रूप से अनुपलब्ध पैरेंट अगली कॉल पर पुनः पढ़ा जाता) + मौजूद पर विकृत फ़ाइल पर console.warn; score-tone.js — बिना स्कोर वाली पंक्ति तटस्थ (muted), लाल नहीं; domainFromName() /api/logo से पहले गैर-ASCII slug छोड़ता है; +tests/states.test.mjs में आइसोलेशन गार्ड। +4 परीक्षण → 2073

[1.129.0] — 2026-07-29

जोड़ा गया

  • #/scan स्तर फ़ैसेट + आयु कॉलम — v1.128.0 में आई job-facets.js लाइब्रेरी अब स्कैन UI से जुड़ी है (पहले केवल लॉजिक)। नया स्तर ड्रॉपडाउन हर पोस्टिंग के शीर्षक को lead/staff/senior/mid/junior/intern में बाँटता है (JobFacets.seniorityFromTitle) और परिणामों में जो वास्तव में है उससे स्वतः भरता है (देश फ़ैसेट की तरह); बिना स्तर-शब्द वाले शीर्षक हमेशा पास होते हैं। सहेजे गए खोज, रीसेट और लागू में बना रहता है। तालिका में स्तर बैज कॉलम और शून्य-टोकन आयु कॉलम (आज / Nदि, JobFacets.daysSince से) जुड़ते हैं। 12 i18n कुंजियाँ ×17, +3 परीक्षण → 2069

[1.128.0] — 2026-07-29

जोड़ा गया

  • पैरेंट के अपने वेब ऐप (../web/, Next.js) से चार समाधान पोर्ट किए गए — वैनिला JS/ESM में पुनः-लागू, कोई नई निर्भरता नहीं: (1) server/lib/states.mjs ट्रैकर की स्टेटस शब्दावली हेतु templates/states.yml को लाइव पढ़ता है (CI फ़ॉलबैक) — हर रिलीज़ में मैनुअल व्हाइटलिस्ट री-सिंक हटाता है; POST उपनामों (स्पैनिश/लेगेसी) को कैननिकल लेबल में मोड़ता है, GET फ़नल कैननिकल स्टेटस के अनुसार बकेट करता है; (2) ATS-होस्टेड पंक्तियों में कंपनी लोगो — domainFromName() (~90 ब्रांड→डोमेन); (3) score-tone.js — 4-स्तरीय स्कोर टोन (≥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 (फ़्लेमिश लोक रोज़गार सेवा का कीवर्ड API), और iCIMS (careers-<tenant>.icims.com पोर्टल, jibeapply से अलग)। साथ ही Cursor CLI रोस्टर में लौटा (parent #2115): cli-detect अब cursor का पता लगाता है (10 टूल्स), रोस्टर help/README/config ×17 में बहाल।

सुधारा गया

  • agenticjobs HTML स्क्रैपिंग से REST API पर गया (#2167); जब location.name केवल कार्य-मॉडल हो तो Greenhouse शहर को /offices से पुनःप्राप्त करता है (#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

सुधारा गया

  • v1.126.0 रीसिंक द्वारा छूटे CLI रोस्टर ड्रिफ्ट के दो स्थान — (1) #/config के API keys टैब का इंट्रो (config.providerModelNote, i18n ×17) केवल 7 CLI सूचीबद्ध करता था — अब Antigravity और Grok Build OpenCode के बाद जोड़े गए; (2) हेल्प गाइड (×17) की दूसरी तुलना-तालिका पंक्ति और CI-निर्मित साइट help अब भी Inside Claude Code / Codex / Cursor / Gemini CLI (पुराने Cursor वाला सेट) दिखाते थे — अब पूरा रोस्टर। दोनों स्लैश/मध्य-बिंदु विभाजक इस्तेमाल करते थे जिन्हें v1.126.0 स्वीप के पैटर्न कवर नहीं करते थे। i18n स्नैपशॉट पुनः-जनरेट; सुइट 1969 पर बनी रहती है।

[1.126.0] — 2026-07-25

जोड़ा गया

  • AI CLI टूल्स टैब अब career-ops की सभी 8 प्रथम-श्रेणी CLI का पता लगाता है#/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 पढ़े) से मिलाया गया। कैननिकल AI सहायक रोस्टर (help ×17 + README ×17) अब 8 प्रथम-श्रेणी CLI — 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) — site/ में sharp 0.34.5→0.35.3, svgo 4.0.1→4.0.2, fast-uri (dev) 3.1.3→3.1.4; Astro बिल्ड हरा, SPA/सर्वर पर कोई असर नहीं।

टिप्पणियाँ

  • पैरेंट पैरिटी स्वीप (career-ops 37d17ec..254764a, v1.22.0 के बाद) — पोर्ट करने को कुछ नहीं: set-status का गलत-पंक्ति गार्ड (#2108) केवल CLI है (web-ui में ट्रैकर पंक्तियाँ UI में स्पष्ट रूप से चुनी जाती हैं और कोई रूट set-status.mjs नहीं चलाता), स्थानीयकृत मोड का Risk Summary (#2109) उन modes/<lang>/ फ़ाइलों को छूता है जिन्हें web-ui कभी नहीं पढ़ता (केवल शीर्ष-स्तरीय modes/*.md), update-system की मैनिफ़ेस्ट जाँच (#2111) केवल अपडेटर की है, और बाक़ी पैरेंट के दस्तावेज़ हैं (तुर्की README, SIGNATURES ×4, SCRIPTS.md, es उच्चारण)। पैरेंट का VERSION 1.22.0 ही है — parentVersion अपरिवर्तित।

[1.125.3] — 2026-07-23

सुधारा गया

  • डेनिश और हिन्दी LLM प्रॉम्प्ट अंग्रेज़ी में जवाब देते थे (उपयोगकर्ता द्वारा रिपोर्ट किया गया) — server/lib/prompts.mjs में LOCALE_NAMES और पाँचों SCAFFOLD_STRINGS ब्लॉक da और hi के लिए कभी विस्तारित नहीं हुए, इसलिए resolveLocale() en पर लौट जाता था और हर AI प्रॉम्प्ट — डीप रिसर्च (लाइव और मैनुअल), मोड, मूल्यांकन, इंटरव्यू, नेटवर्किंग, CV Studio — इन दोनों भाषाओं में अपना # Output language निर्देश खो देता था। अब दोनों प्रथम श्रेणी की हैं: भाषा निर्देश + स्थानीयकृत ढाँचा। tests/locale-scaffold.test.mjs का रिग्रेशन गेट अब हार्डकोडेड 12 की जगह कैननिकल 17-लोकेल सूची पर चलता है, और नया संरचनात्मक गेट अंग्रेज़ी पर लौटने वाली किसी भी ढाँचा-कुंजी को विफल कर देता है — भविष्य में 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 टेक्स्ट की जगह फ़ंक्शन कॉल से जवाब देता था, जो खाली HTTP 502 के रूप में दिखता था। buildDeepPrompt और bundleProjectContext अब headless फ़्लैग लेते हैं: लाइव रन (Anthropic/Gemini/फ़ॉलबैक कैस्केड) को बिना टूल वाला प्रॉम्प्ट मिलता है जो इनलाइन संदर्भ से ब्रीफ़ लिखता है, जबकि Claude Code के लिए कॉपी-पेस्ट प्रॉम्प्ट में टूल निर्देश बरकरार रहते हैं। tests/critical-fixes.test.mjs में +1 टेस्ट।

बदला गया

  • बंद हो चुके gemini-2.0-flash से आगे Gemini डिफ़ॉल्ट मॉडल अपडेट (#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/); पहले यह adapter कॉन्फ़िगर किए गए URL को उसके origin तक सिकोड़ देता था, और चुपचाप केवल मुख्य ब्रांड की पोस्टिंग्स स्कैन करता था। अब यह endpoint ब्रांड-प्रीफ़िक्स को बनाए रखता है, और केवल आख़िरी /search/ या /tile-search-results/ सेगमेंट हटाता है, ताकि कुछ भी कभी अपने ऊपर दोगुना न हो; सिंगल-डोमेन टेनेंट्स byte-for-byte अपरिवर्तित रहते हैं। नया एक्सपोर्ट किया गया resolveTenantBase हेल्पर + tests/sources-successfactors.test.mjs में 1 पोर्ट किया गया टेस्ट ब्लॉक।

[1.125.0] — 2026-07-21

जोड़ा गया

  • cvstart.org: लैंडिंग पर “जॉब स्रोत” सेक्शन — स्क्रीनशॉट्स और तुलना लिस्ट के बीच जोड़ा गया एक नया सेक्शन सभी 67 स्कैनर स्रोतों को क्लिक-योग्य चिप्स के रूप में सूचीबद्ध करता है (62 EN बोर्ड/ATS + अपनी अलग सब-हेडिंग के तहत 5 रूसी बोर्ड), और हर एक स्रोत की पब्लिक साइट से लिंक करता है। यह लिस्ट बिल्ड के समय लाइव अडैप्टर रजिस्ट्री से सिंक होती है (sync-assets.mjsfacts.sources), इसलिए यह ऐप से कभी ड्रिफ़्ट नहीं कर सकती; Sources.astro में एक क्यूरेटेड लिंक-मैप नए tests/site-sources.test.mjs से गेटेड है। हेडर नैव को एक नया स्रोत एंकर मिला; 4 नए साइट i18n keys ×17। साथ ही लैंडिंग JSON-LD की inLanguage लिस्ट भी ठीक की गई, जिसमें अभी तक hi छूट रहा था।

[1.124.0] — 2026-07-21

जोड़ा गया

  • पाँच स्कैन स्रोत (पैरेंट v1.22.0 समता, #1808/#1572/#2024/#2055) — Welcome to the Jungle (बोर्ड-वाइड JSON API), Agentic Engineering Jobs (agentic/AI-इंजीनियरिंग बोर्ड), Jobvite (ज़ीरो-ऑथ per-tenant ATS), Gem (per-tenant ATS), और Alibaba Group (careers JSON API, Meituan/Tencent पैटर्न)। हर एक होस्ट-पिन किया गया, CI-आइसोलेटेड स्रोत + adapter जोड़ा है; रजिस्ट्री अब 67 अडैप्टर (62 EN + 5 RU) शिप करती है; #/scan Source-dropdown फ़ॉलबैक और उसका ड्रिफ़्ट-गेट अपडेट किए गए; पाँच नए सुइट tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs

सुधारा गया

  • Arbeitsagentur: nationwide-remote केवल तब जब homeofficetyp VOLLSTAENDIG हो (पैरेंट #1981) — homeoffice=nv_true क्वेरी हाइब्रिड भूमिकाएँ भी लौटाती है, इसलिए रिमोट पास अब हर हिट को job-details endpoint के ख़िलाफ़ छोटे बैचों में पुष्टि करता है और fail-closed रहता है (लुकअप एरर होने पर जॉब का असली शहर बना रहता है ताकि लोकेशन फ़िल्टर लागू रहें)।
  • SmartRecruiters: पब्लिक जॉब URL /postings/ के बिना बनते थे (पैरेंट #2047) — लिंक अब उन टेनेंट्स के लिए भी सही पब्लिक पोस्टिंग पेज पर पहुँचते हैं जिनकी पब्लिक साइट यह सेगमेंट ड्रॉप करती है, न कि 404 पर।

टिप्पणियाँ

  • पैरेंट v1.22.0 ने CLI-साइड बदलाव भी शिप किए जिनमें वेब UI शेल-आउट नहीं करता या जिन्हें यह पहले से कवर करता है: zh-CN CV टेम्पलेट + PDF टाइपोग्राफ़ी, /expand मोड, प्रोवाइडर prompt-cache ट्वीक्स (Gemini/OpenAI/Ollama), प्रति-स्टेप टोकन ब्रेकडाउन (वेब UI का अपना usage मीटर है), tracker writer-lock सीरियलाइज़ेशन (वेब UI v1.21 से withFileLock के ज़रिए राइट्स रूट करता है), scan visa_filter + absolute posted-date CLI फ़्लैग्स (वेब UI का अपना “Posted within” एज फ़िल्टर है), और seen-sources डीड्यूप सीडिंग (वेब UI स्कैनर अपना ख़ुद का scan-history डीड्यूप रखता है)।

[1.123.0] — 2026-07-17

जोड़ा गया

  • Oracle Recruiting Cloud स्कैन स्रोत (पैरेंट v1.21.0 समता, #1929) — Oracle Fusion/ORC करियर साइट्स (JPMorgan Chase, Oracle, BNY Mellon, American Express, Honeywell, …) का ज़ीरो-ऑथ recruitingCEJobRequisitions REST API: *.fa[.<region>][.ocs].oraclecloud.com पर होस्ट-पिन किया गया, साइट नंबर हर ट्रैक की गई कंपनी के careers_url से निकाला जाता है, हार्ड पेज-कैप वाला ऑफ़सेट पैजिनेशन, और WAF-जागरूक ब्राउज़र-जैसे हेडर। रजिस्ट्री अब 62 अडैप्टर (57 EN + 5 RU) शिप करती है; #/scan Source-dropdown फ़ॉलबैक और उसका ड्रिफ़्ट-गेट अपडेट किए गए; नया CI-आइसोलेटेड सुइट tests/sources-oraclecloud.test.mjs

सुधारा गया

  • Repost डिटेक्टर: बेस टाइटल विशेष-सफ़िक्स वाले सिबलिंग्स से अलग बने रहते हैं (पैरेंट #1922) — “Senior Analytics Engineer” अब “Senior Analytics Engineer, People Analytics” के साथ क्लस्टर नहीं होता: जब एक टाइटल के टोकन दूसरे टाइटल के टोकन का एक सख़्त सबसेट होते हैं और अतिरिक्त टोकन एक वास्तविक विशेषज्ञता (बेसलाइन शब्द नहीं) होता है, तो दोनों को अलग-अलग पोस्ट होने योग्य ओपनिंग माना जाता है। Reposting एनोटेशन्स (“(Repost)”, “relisted”) अब मेटा-नॉइज़ के रूप में स्टॉपवर्ड किए जाते हैं। tests/detect-reposts.test.mjs में +2 assertions।

टिप्पणियाँ

  • पैरेंट v1.21.0 ने CLI-साइड बदलाव भी शिप किए जिनमें वेब UI शेल-आउट नहीं करता या जिन्हें यह पहले से कवर करता है: रिपीट-कंपनी रीअप्लाई चेतावनी (वेब UI में v1.84.0 से री-अप्लाई कूलडाउन पहले से मौजूद है), cover-letter के --format/--report फ़्लैग्स, इंटरव्यू red-flag / panel-intel / no-show ईमेल प्रॉम्प्ट मोड्स, scan trust-signal व portal-health पर्सिस्टेंस (वेब UI अपना ख़ुद का इन-प्रोसेस स्कैनर trust-validator और Portals health पेज के साथ चलाता है), और stats/salary-gap एक्सटेंशन (रीड-ओनली और fail-soft तरीक़े से रिले किए गए)।

[1.122.0] — 2026-07-16

जोड़ा गया

  • हिन्दी (हिन्दी) — 17वीं भाषा — पूरा UI शब्दकोश (~1,110 कुंजियाँ), सम्पूर्ण इन-ऐप सहायता गाइड (29 H2 / 105 H3 समता), README.hi.md, नई CHANGELOG.hi.md (v1.122.0 से शुरू, de/it/tr की मिसाल पर), cvstart.org लैंडिंग + Methodology/License/Changelog/Help पेज, भाषा स्विचर (🇮🇳), ब्राउज़र-भाषा की स्वतः पहचान, और स्थानीयकृत डैशबोर्ड स्क्रीनशॉट। हर ×16 समता-गेट अब ×17 चलता है: i18n शब्दकोश समता + स्नैपशॉट, सहायता H2/H3 गेट, CHANGELOG समता, साइट check-i18n, और Playwright लोकेल स्वीप।