Değişiklik günlüğü
GitHubHer önemli değişiklik, sürüm sürüm. Aynı dosya depoda yer alır ve 17 dilin tümüne çevrilmiştir.
Changelog (Türkçe)
Bu changelog v1.85.0’dan başlar — Türkçe yerelleştirmenin eklendiği sürüm. Önceki sürümler için bkz. 🇬🇧 CHANGELOG.md.
[1.236.0] — 2026-09-18
Üst proje eşdeğerliği — career-ops main @ 6a9c84c (VERSION 1.33.0, 128 commit). İki yeni kaynak ve üç yansıtılmış düzeltme — bunlardan ikisi burada ilanları sessizce kaybediyordu.
Eklendi
İki tarayıcı kaynağı, 92 → 94 (89 EN + 5 RU). Python.org Jobs (pythonorg) panonun herkese açık akışını (feed) okur; işveren atfı zorunludur, bu yüzden başlığında hiçbir işveren adı geçmeyen bir satır, portal girdisinin adıyla doldurulmak yerine düşürülür. Generalist World (generalist-world) panonun kartlarını kazır ve ayrıştıramadığı biçimlendirmede gürültülü biçimde başarısız olur — değişen bir kart biçimi, boş bir pano gibi okunmak yerine fırlatır; kazınan bir kaynağı güvenilmez kılan başarısızlık biçimi tam olarak budur. İkisi de #/scan Kaynak filtresinde görünür, ikisi de ana bilgisayara sabitlenmiştir (çıpalı regex, yalnızca HTTPS) ve ikisi de uçtan uca sahte aktarım (fake-transport) takımlarıyla yönlendirilir (43 ve 36 durum).
Düzeltildi
Birkaç şehirde açık bir Workday pozisyonu, bir konum filtresi tarafından düşürülüyordu. Workday’in liste uç noktası, diğer her ilanın bir yer taşıdığı yerde çok konumlu bir ilanı bir sayı ile yanıtlıyor: "53 Locations". Bu bir konum değildir ve buildLocationFilter, büyük/küçük harfe duyarsız alt dize ile eşleşir — bu yüzden Austin’de ve diğer 52 şehirde açık bir pozisyon hiçbir allow: [austin] girdisiyle eşleşmiyor ve eleniyordu, oysa aynı pozisyon tek başına listelendiğinde geçiyordu. Üst projede üç kiracı genelinde ölçüldü: 291 ilandan 53’ü yer tutucuydu, dolayısıyla bu sıra dışı değil, olağan durumdur. İlanın gerçek yerleri yalnızca CXS detay belgesinde bulunur, bu yüzden her yer tutucu artık ona karşı bir ek GET’e mal oluyor, girdi başına 200 ile sınırlı — sınırın ötesinde yer tutucu, sahtelenmek yerine görünür bırakılıyor, çünkü çözülmemiş bir ilan asla çözülmüş gibi okunmamalıdır. Başarısız veya yersiz bir detay, ilanı listenin döndürdüğü haliyle bırakır: görünür bir "53 Locations", neyin çözülemediği konusunda dürüsttür, oysa boşaltılmış bir konum her filtreden sessizce geçerdi. Aynı GET ayrıca startDate taşır, bu yüzden zenginleştirilmiş bir ilan, liste uç noktasının göreli düzyazısı ("Posted 30+ Days Ago" → undefined) yerine tam olarak tarihlendirilir; çıplak bir YYYY-MM-DD olmayan her şey, ISO olmayan geri dönüşü uygulamaya özgü olan Date.parse’tan geçirilmek yerine olduğu gibi bırakılır.
Belirtilen bir seviye artık iki ilanı tek bir yeniden gönderiye çökertmiyor. "Insurance Specialist II", işverenin bu ilanın kardeşi olmadığına dair kendi ifadesidir — tek bir taban başlık altında farklı bir ücret bandı, kapsam ve ilan numarası. Belirteçleyici (tokenizer) bunu göremiyordu: w.length > 3, VIII’e kadar her Romen rakamını ve her tek haneli rakamı düşürür, bu yüzden "Insurance Specialist" ve "Insurance Specialist II" özdeş biçimde belirteçleniyor, kusursuz bir Jaccard oranı alıyor ve yeniden gönderi dedektörü ikinciyi birincinin yeniden listelenmesi olarak işaretliyordu. web-ui’nin role-matcher.mjs’inde seviye işleme hiç yoktu, bu yüzden bu değişiklik üst projenin mekanizmasının tamamını taşıyor: seviyeler, Romen ve Arap rakamları tek bir sayıya katlanarak çıkarılıyor ("Nurse II" ve "Nurse 2" aynı ifadedir — ve bu çift daha önce yanlışlıkla farklı sonuç veriyordu), belirtilen iki seviye uyuşmalıdır ve yalnızca bir tarafta bulunan bir seviye, her başlık da diğerinde bulunmayan bir sözcük taşımadıkça gevşek bir yeniden yazım olarak ele alınır — ki bu bir süsleme değil, iki uyuşmazlıktır.
Bir filtreye sabitlenmiş bir Avature panosu yine de tüm küresel panoyu geziyordu. Avature’ın arama arayüzü opak facet parametreleri üretir (?42386=[812132] bir ülke filtresidir) ve portals.yml içinde daraltılmış bir panoyu sabitleyen bir operatör, taramanın onu gezmesini bekler. resolveSearch, URL’yi ${origin}${path} olarak yeniden kuruyor ve sorgu dizesini tamamen düşürüyordu — bu yüzden ilki dahil her istek, kiracının tüm panosunu geziyordu: daha fazla sayfa, daha fazla istek ve operatörün kasıtlı olarak filtrelediği ilanlar. Facet’ler artık sayfalanan her istekte taşınıyor; kendi jobOffset’imiz en son uygulanıyor, böylece başıboş, aynı adlı bir facet sayfalamayı asla ele geçiremez.
Güvenlik
devalue 5.8.1 → 5.9.2 (astro üzerinden dolaylı olarak), tek açık Dependabot uyarısını kapatıyor — hatalı biçimli girdide bir hizmet reddi. Yalnızca site bağımlılığı; hiçbir çalışma zamanı kodu değişmedi.
Notlar
Taşınmayanlar, her biri gerekçesiyle birlikte. Üst proje, paylaşılan 10 saniyelik varsayılana karşı lever’a 30 saniye ve manfred‘e 25 saniye zaman aşımı verdi — bir taşınmayan (no-port): web-ui’nin tarama aktarımı burada zaten 60 saniyeye izin veriyor (DEFAULT_SCAN_TIMEOUT_MS), bu yüzden her iki pano da orada düzeltmenin verdiğinden daha fazla paya buradan sahip. **iCIMS’**in ikiye katlanmış careers- ön eki de burada oluşamaz: web-ui kiracı kökenini doğrudan api/careers_url’den alır ve bir ana bilgisayarı hiçbir zaman bir kiracı adından kurmaz; onun yeni yedek-ana-bilgisayar gezintisi, üst projenin daha gevşek yapılandırması için bir özelliktir, bir kusur düzeltmesi değil. deutschebahn ve manfred, geçici iptalde yeniden deneme kazandı; web-ui’nin 60 saniyelik tavanı bunu çok daha az acil kılıyor — taşınmak yerine not edildi, böylece gelecekte uzun bir gezinti zaman aşımı yaşandığında denenecek bilinen bir ilk şey olsun. 128 commit’lik farkın geri kalanının tamamı CLI, doğrulayıcı, dashboard veya web/ (üst projenin kendi ön ucu): liveness-browser, check-jd-archive, verify-ats/verify-portals/verify-cv-facts, update-system, set-status, audit-portals, discover-ats, scaffolder, test-all, eklenti manifestoları.
Çekme sonrası fork ayrışmaları yeniden doğrulandı: providers/telegram-channel.mjs’deki Kiril \p{L} düzeltmesi, fork’un kendi providers/telegram.mjs’i, web/src/lib/clis.ts içindeki hermes. Üst kaynak career-ops-hq/main tamamen birleştirilmiş durumda (0 commit eksik). 3066 → 3164 test; yardım artık 17 paketin tümünde 94 bağdaştırıcı (89 EN + 5 RU) belirtiyor ve başlık yapısı 32 H2 / 122 H3’te değişmeden kalıyor.
[1.235.0] — 2026-09-16
Üst proje eşdeğerliği — career-ops main @ 68e6b94 (VERSION 1.33.0, 42 commit). İki yansıtılmış düzeltme; bunlardan biri burada MokaHR ilanlarını sessizce kaybediyordu.
Düzeltildi
Aynı MokaHR panosundan ikinci bir iş ilanı eklenmek yerine yok oluyordu. url-key.mjs, bir ilan URL’sini bir karşılaştırma anahtarına indirger ve fragment’i koşulsuz olarak düşürüyordu — mantıklıydı, çünkü neredeyse her fragment yalnızca sunuma yöneliktir (#apply, #section-2). MokaHR, kendi kayıt defterimizdeki istisnadır: ilanları …/social-recruitment/{tenant}/{id}#/job/{n} biçimindedir; burada bir tenant’taki her iş aynı yolu paylaşır ve ilan kimliği yalnızca fragment içinde bulunur. Böylece hepsi tek bir anahtara normalize ediliyordu. Düzeltmeden önce ölçüldü: hatta (pipeline) iki farklı MokaHR ilanı yapıştırın, sonunda tek bir satır kalıyor — ne hata, ne uyarı, fark edilecek hiçbir şey yok; tarayıcının tazelik filtresi (en-scanner.mjs) aynı anahtarı okuyor, dolayısıyla o tenant’tan herhangi bir iş tarama geçmişine girdiğinde, diğer tüm işler “zaten görüldü” olarak eleniyordu. normalizeUrl artık tanınan bir #/job/{id} veya #/jobs/{id} rotasını, fragment düşürülmeden önce yalnızca karşılaştırma amaçlı bir sorgu anahtarına yükseltiyor — MokaHR, önceden yazılmış anahtarların karşılaştırılabilir kalması için yerleşik mokahr_job_id adını koruyor, diğer her ana bilgisayar ise dahili bir _career_ops_fragment_job_id alıyor. Yükseltilen kimlik eklenir, ayarlanmaz: bu parametreyi zaten taşıyan bir URL farklı bir ilanın kimliğini tutar ve onun üzerine yazmak, anahtarın tam olarak ayrı tutmak için var olduğu iki şeyi birleştirir. Tanınmayan her fragment hâlâ çöküyor — zaten doğru olan yarı budur.
accept-encoding artık her kaynak isteğinde sabitleniyor. Ayarlanmadan bırakıldığında Node, kendi undici derlemesinin sunduğu her şeyi müzakere eder; Node ≥ 23’ten itibaren buna zstd de dahildir ve amazon.jobs’un zstd yanıtı tam olarak 1024 bayt’ta, 200 durum koduyla kesilmiş olarak geri dönüyor — bu yüzden hata, bir aktarım hatası değil de bozuk bir API gibi okunan Unterminated string in JSON at position 1024 şeklinde görünüyor. Artık her istek gzip, deflate, br gönderiyor. Bizim çalışma zamanlarımızda bu bir onarım değil, önleyici bir tedbirdir: Node 18/20/22 — CI matrisi ve sunucu (22.22.1) — varsayılmak yerine doğrudan doğrulanarak gzip, deflate gönderiyor, dolayısıyla burada hiçbir şey kesilmedi; bugün değişen şey, bu sürümlerin varsayılan olarak istemediği ama doğru şekilde çözebildiği br’nin artık sunulmasıdır. Varsayılan, incelemeye değer olan kısım olan büyük/küçük harfe duyarsız biçimde uygulanıyor: başlık (header) adları büyük/küçük harfe duyarsızdır ve fetch, aynı ada sahip iki girdiyi tek bir virgülle ayrılmış değerde birleştirir; bu yüzden Accept-Encoding: identity geçiren bir çağıran, aksi takdirde gzip, deflate, br, identity gönderilmiş olurdu.
Notlar
Başlıklar (headers), fetchImpl sınırında düz bir nesne (plain object) olarak kalıyor; oysa üst proje fetch’e bir Headers örneği veriyor. Bu, bir gözden kaçırma değil, bilinçli bir ayrışmadır: web-ui’nin fetch yardımcıları enjekte edilebilir bir fetchImpl alır ve 45 kaynak test takımı, yakaladıkları şeyden opts.headers['User-Agent']’ı okur — bir Headers örneğinin köşeli parantezle erişimi yoktur, bu yüzden sadık taşıma, uygulamanın değil davranışın (büyük/küçük harfe duyarsız geçersiz kılma, çağıran kazanır) taşınmasıdır. Çağıranın nesnesi kopyalanır, asla mutasyona uğratılmaz, çünkü birkaç kaynak tek bir başlık sabitini paylaşır. Üst projenin eşlik eden düzeltmesi — varsayılan user-agent’ı büyük/küçük harfe duyarsız biçimde uygulamak — bir taşınmayan (no-port) değişikliktir: web-ui zaten hiçbir varsayılan UA enjekte etmez, her kaynak kendi panosunun gerektirdiğini ayarlar, dolayısıyla bir çağıranın User-Agent’ının çakışacağı bir varsayılan yoktur.
İki yeni test takımı ve üç yeni durum bu çifti sabitliyor: tests/http-accept-encoding.test.mjs (tam olarak sabitlenen değer, dört fetch yardımcısının her biri ve üç farklı büyük/küçük harf biçimi altında bir çağıran geçersiz kılması — birleştirme hatasının ürettiği ikinin aksine, tek bir accept-encoding anahtarının hayatta kaldığını doğrular) ve anahtar yerine kullanıcıya görünen dikişi (seam) sınayan tests/parsers-pipeline-hash-route.test.mjs: iki MokaHR ilanının ikisi de hatta ulaşmalı, aynı ilanın dört farklı yazımla yeniden yapıştırılması yine tek bir satıra çökmeli ve kozmetik bir fragment bir kimliğe dönüşmemelidir. Hepsinin önce başarısız olduğu doğrulandı. Sabitlemenin kendisi taşıma katmanında yaşıyor, yalnızca bu yardımcılarda değil: 92 kaynaktan 25’i enjekte edilen fetchImpl’i doğrudan çağırıyor ve onlardan hiç geçmiyor; bu yüzden onu her iki tarayıcının gerçekten enjekte ettiği sarmalayıcı olan makeTimeoutFetch uyguluyor — tüm kaynakların paylaştığı tek geçiş noktası. (Üst projenin bir eşdeğere ihtiyacı yok: providers/_http.mjs onun tek taşıma katmanı.) Yapısal bir bekçi artık yeni bir kaynak kendisine verilen taşıma yerine doğrudan fetch çağırırsa CI’yı düşürüyor; bir davranış senaryosu da 25’ten biri olan greenhouse’u sarmalayıcıdan geçirerek başlığın gerçekten hatta çıktığını kanıtlıyor.
Taşınmayanlar, gerekçesiyle birlikte: liveness-browser.mjs (kafalı-Playwright (headed) yeniden kullanım koruması — web-ui kafalı bir tarayıcı çalıştırmıyor), check-jd-archive.mjs (web-ui aktarımı yok), test-all.mjs (üst projenin test koşucusu; fork’un vpFixtureEnv ayrışması bozulmadan duruyor), web/ (üst projenin kendi ön ucu, yansıtılmıyor), eklenti manifestoları ve SIGNATURES.md (yalnızca depoya özgü). batch/batch-runner.sh (sed ilişkilendirmesinden önce kaçışlı & işaretleri) ve jd-skill-gap.mjs (cv.md’yi veri kökünden çözümler) salt okunur olarak aktarılıyor — web-ui, üst projenin kopyalarına shell ile bağlanıyor, bu yüzden ikisi de burada kod değişikliği olmadan geliyor; jd-skill-gap olanı ise /api/jds/:id/skill-gap aktarımını daha doğru hale getiriyor: cv.md artık sürecin başlatıldığı dizin yerine veri kökünden çözümleniyor. Çekme sonrası fork ayrışmaları yeniden doğrulandı: providers/telegram-channel.mjs’deki Kiril \p{L} düzeltmesi, fork’un kendi providers/telegram.mjs’i, web/src/lib/clis.ts içindeki hermes. Kaynak sayısı 92’de (87 EN + 5 RU) değişmedi, dolayısıyla yardım dokunulmadan kaldı. 3042 → 3066 test.
[1.234.0] — 2026-09-15
Üst proje eşdeğerliği — career-ops main @ 56cce8f (VERSION hâlâ 1.32.0, 1.32.0’dan 58 commit ileride). 15 kaynak genelinde tek bir yansıtılmış düzeltme, üstüne bir daha geri gelmemesini sağlayan bir koruma.
Düzeltildi
Tek bir hatalı biçimli iş ilanı kimliği artık tüm sayfayı boşaltmıyor. encodeURIComponent, tek başına kalan bir UTF-16 vekil karakterinde (surrogate) URIError fırlatır ve bir JSON yükü böyle bir karakter taşıyabilir — JSON.parse('"\\uD800"') bunu korur. On beş kaynak, her ilanın URL’sini ana bilgisayarın denetlediği bir kimlik veya slug’dan, ayrıştırma döngüsünün içinde oluşturuyordu; bu yüzden tek bir bozuk ilan döngüyü iptal ediyor ve o sayfadaki tüm işleri kaybettiriyordu; hiçbir şey kaynak hatası olarak günlüğe yazılmıyordu, çünkü istisna, şirket başına yakalama bloğunun raporlayacak bir şeyi olmadan önce yığını çözüyordu. Üst proje bunu providers/_safe-url.mjs içinde düzeltti (safeEncodeURIComponent → URIError’da null, başka her şeyi yeniden fırlat) ve her döngünün kimliğini bu yardımcıdan geçirdi; null durumunda yalnızca o tek ilan düşürülüyor. Bu yardımcı artık server/lib/sources/_safe-url.mjs konumunda ve aynı değişiklik yansıtılan on üç kaynağa uygulandı — alibaba, arbeitsagentur, bamboohr, feishu-jobs, garena, jibeapply, manfred, meituan, mokahr, phenom, thehub, tkms, vdab — ve aynı döngü biçimine ve aynı gizli fırlatmaya sahip, yeni korumanın ilk çalıştırmasında ortaya çıkardığı yalnızca web-ui’ye özgü iki kaynağa, jobstreet ve trudvsem’e. Kapsam bilinçli olarak sınırlı: yalnızca API kaynaklı kimlikler bu yardımcıdan geçiyor. Yapılandırmadan türetilen değerler sıkı kodlamayı koruyor ve gürültülü biçimde başarısız oluyor — garena’nın office’i (bir portals.yml segmenti) fırlatan urlSegment’te kalıyor, API id’si ise null döndüren idUrlSegment’i alıyor; csod’un corpName’i ve 4dayweek’in SLUG_RE ile doğrulanan slug’ı, gerekçesiyle birlikte ada göre izin listesine alındı.
rheinmetall’in başlık yedeği, hatalı biçimli bir href’te fırlatabiliyordu. Bir kartın başlığı yoksa, başlık decodeURIComponent aracılığıyla URL slug’ından yeniden oluşturuluyor; bu fonksiyon, kazınan href içindeki bozuk bir yüzde dizisinde fırlatıyor — decode tarafında aynı “tek bozuk satır sayfayı öldürür” biçimi. Artık savunmacı biçimde decode ediyor ve ham slug’a geri dönüyor.
Kaynak kayıt defteri, _ ön ekli dosyaları atlıyor. Otomatik keşif, kendisi hariç server/lib/sources/ içindeki her .mjs dosyasını içe aktarıyor ve export const meta içermeyen her şey için uyarı veriyordu — bu yüzden yardımcı, açılışta bir uyarı üretiyordu. Üst projenin kuralı benimsendi: baştaki alt çizgi kaynak değildir anlamına gelir; bu tür dosyalar ne içe aktarılır ne de uyarılır. meta’sı olmayan, bildirilmemiş bir dosya yine de uyarı verir ve keşif testi artık her iki yarıyı da doğruluyor (eski filtreye karşı kırmızı olduğu doğrulandı). Sitenin derleme betiği sync-assets.mjs de diskteki bağdaştırıcı dosyalarını aynı kuralla saydığından, yardımcı artık sessiz düşme korumasını tetiklemiyor.
Notlar
tests/sources-url-encoding-surrogate.test.mjs, üst projenin test takımını üç bölümde yansıtıyor: yardımcının sözleşmesi (eşleşmiş bir vekil çift — sıradan bir emoji — yine de encode edilir; değerin kendi toString’inden gelen bir fırlatma çağıranın hatasıdır ve yayılır), on beş kaynağın tümü için kaynak bazlı davranış (bir bozuk kimlik + bir temiz kimlik → fırlatma yok, temiz olan tutulur, bozuk olan düşürülür; her biri kaynağın dışa aktardığı saf ayrıştırıcı üzerinden, thehub için ise sahte bir aktarım ile onun getiricisi üzerinden yürütülür) ve bir kaynak düzeyinde koruma: dönüştürülen her dosya yardımcıyı hem içe aktarmalı hem de çağırmalı, hiçbir dosya onu içe aktarmadan referans veremez ve incelenmemiş hiçbir dosya çıplak bir encodeURIComponent ile iş ilanı URL’si oluşturamaz — eski biçimdeki yeni bir kaynak, suçlu satır numarasıyla CI’da başarısız olur. On beş kaynak bazlı durumun tümünün, taşımadan önce başarısız olduğu doğrulandı.
Üst projedeki değişikliklerin geri kalanı, gerekçesiyle birlikte taşınmadı: batch/batch-runner.sh --cli yalnızca CLI’ye özgü bir bayrak (web-ui, toplu çalıştırıcıya shell ile bağlanmıyor); invite-match.mjs artık set-status.mjs’yi kod kökünden çözümlüyor — web-ui bunu iletmiyor; company-funded.mjs aynı safe-url değişikliğini iç yapısında aldı ve /api/company-funded’ın ayrıştırdığı --json çıktı biçimi değişmedi; test-all.mjs yalnızca bir zaman aşımı bütçesini taşıdı (fork’un vpFixtureEnv ayrışması bozulmadan duruyor); web/, üst projenin kendi ön ucudur ve yansıtılmıyor; AGENTS.md/SIGNATURES.md yalnızca depoya özgüdür. Çekme sonrası fork ayrışmaları yeniden doğrulandı: providers/telegram-channel.mjs’deki Kiril \p{L} düzeltmesi, fork’un kendi providers/telegram.mjs’i, web/src/lib/clis.ts içindeki hermes. Kaynak sayısı 92’de (87 EN + 5 RU) değişmedi, dolayısıyla yardım dokunulmadan kaldı. 3022 → 3042 test.
[1.233.2] — 2026-09-10
Düzeltildi — yüksek önem dereceli iki CodeQL js/remote-property-injection uyarısı.
Düzeltildi
Kaydedilen değerleri process.env’e taşıyan döngü, istek gövdesinden kurulan Object.entries(safe) üzerinde dönüyor ve içinde prototip anahtarlarına karşı açık bir koruma taşıyordu. Kod güvenliydi, çünkü safe yalnızca KNOWN_KEYS’ten doldurulur; ama çözümleyici bu kısıtı iki döngü boyunca izleyemez. Artık doğrudan sabit dizi üzerinde dönüyor, dolayısıyla özellik adı kanıtlanabilir biçimde bir modül sabiti. Davranış aynı.
Notlar
Eski korumayı sabitleyen test, kaynak metninde bir grep’ti. Yerine yapısal bir test ve __proto__’yu ham JSON olarak gönderen davranışsal bir test geldi. 3021 → 3022 test.
[1.233.1] — 2026-09-10
Düzeltildi — kılavuz v1.233.0’ın eklediği denetimi hiç anlatmıyordu ve aynı bölüm 200 sürümdür doğru olmayan yönergeler taşıyordu.
Düzeltildi
DOC-1 — «Varsayılanı kullan (…)» girdisi «anahtar ayarlanmadı» durumunu ifade eder; aynı değeri listeden açıkça seçmekle farkı görünmez ve önemlidir. Mevcut ### Behavior listesine üç madde ×17.
DOC-2 — bir tablo satırı hiçbir anahtarı adlandırmıyordu: hücrede (server uses default UA) yazıyordu ve v1.19.0’da kaldırılan HH_USER_AGENT’ı anlatıyor, dev.hh.ru’ya kayıt öneriyordu — v1.65.0’dan beri yararsız. Üç eskimiş anma da gitti; sorun giderme satırı silinmedi, yeniden yazıldı: Temmuz 2026’dan beri hh.ru Rus olmayan IP’lere HTTP 451 dönüyor.
Anahtar tablosu 45’ten 6’sını listeliyor, oysa başlık bir kayıt defteri vaat ediyor. Bir cümle ×17 onu seçki ilan edip #/config’e yönlendiriyor.
Notlar
Yeni help-recognized-keys.test.mjs, anahtar tablolarının ilk sütununu canlı KNOWN_KEYS ile karşılaştırır. 3018 → 3021 test; yardım 32 H2 / 122 H3 olarak kalıyor.
[1.233.0] — 2026-09-10
Düzeltildi — #/config kaydetme yolunda üç bulgu; CONFIG-3’e v1.232.1’in kendi düzeltmesi yol açtı.
Düzeltildi
CONFIG-3 — tohumlanan değerle çakışan bilinçli bir seçim «dokunulmamış» sayılıp atılıyordu. initial iki kökeni karıştırır: .env’den tohumlama ve defaultValue’dan tohumlama; ikincisinde eşitlik belirsizdir. initial yanına seededFromFile yazılarak düzeltildi.
Bir anahtarı kaldırmak «· 0» bildiriyordu, çünkü sunucu yalnızca yazılanı döndürüyordu. Artık removed da dönüyor ve bildirim ikisini birden sayıyor.
Açılır liste ayarlanabiliyor ama temizlenemiyordu: 18’inin hiçbirinde boş seçenek yoktu. Artık her biri «Varsayılanı kullan (…)» ile başlıyor. Bir yeni i18n anahtarı ×17.
Notlar
Birim taban çizgisi değişmedi (3018); tarayıcı 111 → 116.
[1.232.1] — 2026-09-10
Düzeltildi — #/config üzerinde Kaydet, kullanıcının hiç dokunmadığı alanları yazıyordu.
Düzeltildi
CONFIG-2. v1.57.1, ayarlanmamış bir denetimi defaultValue ile tohumlar ki alan sunucunun gerçekten kullandığı değeri göstersin; save() ise dirty’yi yalnızca gizli alanlar için sorup diğer tüm alanları her defasında gönderiyordu. Böylece GÖSTERİM için konan değer, kullanıcının seçimiymiş gibi sunucuya gidiyordu: tek bir açılır listeyi değiştirmek 28 anahtar gönderiyor ve kimsenin açmadığı 18 tanesini sabitliyordu. Değişen şey her ayarın durumu: «ayarlanmamış, projenin varsayılanını izle»den «.env’e sabitlenmiş»e.
Notlar
cfg.values ile karşılaştırmak yetmez: ayarlanmamış bir select kendi defaultValue’sunu gösterirken saklanan değer ''’dir. Artık her denetimin tohumlandığı değerle karşılaştırılıyor. Yazılan anahtar sayısı bildirime geri döndü. 105 → 111 tarayıcı testi.
[1.232.0] — 2026-09-09
Düzeltildi — tarayıcı QA geçişinden iki kusur; ikisi de v1.231.5’ten gelmiyor.
Düzeltildi
PROFILE-1 — #/profile tüm sayfayı yana kaydırıyordu. Değer, yalnızca satır içi yazı tipi stilleri taşıyan adsız bir <div>’di; dolayısıyla hesaplanan overflow-wrap normal kalıyordu. Bir LinkedIn URL’si CSS’e geçerli bir kırılma noktası sunmaz, bu yüzden min-content genişliği tüm dizedir; ızgara öğeleri min-width: auto ile bunun altına inmeyi reddeder — kart kendi izini, sonra satırı ve belgeyi patlattı (1280 px’te 23 px gerçek kaydırma). Ortak .card-value sınıfı ve overflow-wrap: anywhere, artı .card-row > * { min-width: 0 } ile düzeltildi. break-word değil anywhere: min-content hesabına yalnızca anywhere katılır.
CONFIG-1 — POST /api/config select alanı için her değeri kabul ediyordu. {"LLM_PROVIDER":"not-a-provider"} 200 döndürüp .env’e yazılıyordu; sonrasında hiçbir şey hata vermiyordu, çünkü çözücü sessizce yedeğe düşüyordu. LLM_PROVIDERS zaten env-config.mjs’ten dışa aktarılıyordu — doğrulayıcı ona hiç bakmıyordu.
Notlar
Yalnızca LLM_PROVIDER doğrulanır: modellerin gerçek alanı sağlayıcıya aittir ve sürümlerimiz arasında değişir. Zaten kayıtlı bir değere müsamaha gösterilir; form her kaydetmede tüm gizli olmayan alanları yeniden gönderir. Ayrıca OLLAMA_API_KEY tanımlayıcısı eklendi. 3013 → 3018 test.
[1.231.5] — 2026-09-09
Güvenlik — yedi danışma kapatıldı; biri kritik uzaktan kod çalıştırma. Hiçbir kaynak dosyası değişmedi.
Güvenlik
Dependabot’tan birleştirildi: multer 2.2.0 → 2.3.0 (yüksek — iptal sırasında dosya tanımlayıcı sızıntısıyla hizmet reddi) ve sitede svgo 4.0.2 → 4.1.0 (yüksek ve orta — removeScripts çalıştırılabilir bağlantıları geçiriyordu).
Ardından, bu birleştirmelerin tetiklediği yeniden tarama beş tane daha ortaya çıkardı. Etkilenen her aralık mevcut ^ ile zaten karşılanıyordu; dolayısıyla manifest düzenlemesi değil güncelleme gerekti: astro 7.1.0 → 7.3.2 — kritik, AVIF görüntü optimizasyonu üzerinden uzaktan kod çalıştırma (7.2.8’de düzeltildi) ve bir yetkilendirme atlatma (7.2.4); sharp 0.35.3 → 0.35.4 — yüksek, libheif açıkları; ve her iki manifestte js-yaml 4.3.1 → 4.3.2 — yüksek.
Notlar
Burada “yalnızca bağımlılıklar”, “risksiz” demek değil. js-yaml uygulamanın okuduğu her yapılandırmayı ayrıştırır, multer her yüklemeyi kabul eder ve Astro bir minör sürüm ilerledi. Doğrulandı: test:ci 3013/3013, tarayıcı takımı 4/4 ve aynı 86 sayfayı, 17 aynayı üreten tam bir site yeniden yapımı. npm audit: her iki manifestte 0 açık.
[1.231.4] — 2026-09-07
Düzeltildi — v1.231.3 Doctor tıklamasının sonucunu düzeltti, anını değil. Mobilden ve masaüstünden yeniden bildirildi.
Düzeltildi
withSpinner istek uçuştayken düğmeyi hâlâ yeniden yazıyordu. v1.231.3 ona çocuk düğümleri saklayıp finally içinde geri koymayı öğretti ve gerçekten geri geliyorlardı — ama meşguliyet göstergesi yine '⏳ ' + original metniyle replaceChildren çalıştırıyordu. Böylece doctor.mjs çalıştığı sürece 36 px’lik kare ⏳ 🩺Doctor metnini taşıyor ve satırı bozan geniş bir hapa dönüşüyordu; masaüstünde sıkışık bir ⏳🩺Doctor görünüyordu. Öğe çocukları olan bir düğme artık hiç yeniden yazılmıyor: göstergesi .is-loading sınıfı; bu sınıf simgeyi CSS’te kum saatiyle değiştiriyor, dolayısıyla geometri değişemiyor: boşta 36 px, uçuşta 36 px, sonrasında 36 px.
Notlar
Ders koda değil, doğrulamaya dair. v1.231.3’ün kapısı aria-busy temizlenene kadar bekleyip sonra ölçüyordu — yapısı gereği yalnızca finally bloğunun onardığı durumu görebiliyordu. Yeni denetim sözü kendisi açık tutuyor ve uçuşun ortasında örnek alıyor. 3012 → 3013 test.
[1.231.3] — 2026-09-07
Düzeltildi — Doctor’a tıklamak mobilde üst çubuğu bozuyordu. v1.231.2’nin çıktığı gün bir telefondan bildirildi.
Düzeltildi
UI.withSpinner, süslediği düğmenin çocuklarını düzleştiriyordu. Meşguliyet göstergesi textContent üzerinden işliyordu: button.textContent’i sakla, '⏳ ' + original yaz, geri yaz. textContent’e atama bütün çocukları tek bir metin düğümüyle değiştirir — ve v1.231.2 üst çubuktaki her eylemi henüz .btn-ico + .btn-label olarak ayırmış, etiketi max-width: 900px altında gizlemişti. Böylece Doctor’a ilk dokunuş her iki <span>’i kalıcı olarak yok ediyordu: mobil kurallarının eşleşecek bir şeyi kalmıyor, etiket çıplak metin olarak geri geliyor ve 36 px’lik kare, tema anahtarının üstüne binen bir 🩺Doctor hapına dönüşüyordu. Kendiliğinden düzelmiyordu — işaretlemeyi yalnızca sayfa yeniden yüklemesi geri getiriyordu. Düzeltme çocuk düğümlerini saklayıp replaceChildren ile geri koyuyor; yalnızca metin taşıyan düğmeler, yani 24 çağrı yerinin çoğu, tıpatıp eskisi gibi davranıyor.
- FIND-3 — arama alanı 320 px’lik bir telefonda 8 px’e çökmüştü. Çubuğu tek satıra almak searchbar’ı tek esnek öğe olarak bıraktı; geçen sürümün changelog’u bunu açıkça yazmıştı: «hiçliğe kadar küçülebilir». Küçüldü de: 320 px’te 8 px alan, 340 px’te 28 px — 21 karakterlik bir yer tutucunun tek karakteri. Tıklanabilir ve yazılabilir, ama artık bir alan olarak okunmuyor. Hiçbir
min-widthbunu çözmez: 320 px’te çubuk 32 px dolgu, 40 px menü ve 162 px eylem taşır; verecek 120 px yoktur. Bu yüzden 420 px altında alan bir büyütecin arkasına gizlenir ve dokununca tüm çubuğa açılır: 320 px’te 182 px, 360 px’te 222 px, 390 px’te 252 px, hiçbir genişlikte taşma olmadan. Düğme tek bir erişilebilir ad korur ve durumuaria-expandedile bildirir; 🔍/✕ değişimi saf CSS’tir. 420 px üstünde hiçbir şey değişmez. Canlı yapıya karşı yapılan tarayıcı regresyon geçişinde bulundu.
Notlar
Bu, v1.231.2’de not edilen applyI18n() tuzağıyla aynı kusur sınıfı — artık öğe çocukları olan bir öğeye textContent atayan kod — yalnızca başka bir çağırandan geliniyor. Ders genelleşiyor: bir öğenin içeriğini çocuk <span>’lere bölmek, o öğe üzerindeki mevcut her textContent yazıcısını gizli bir hataya dönüştürür.
İki kez kilitlendi: gerçek withSpinner üzerinde node:vm ve 320 px’te gerçek bir tarayıcıda tıklama. İkisinin de eski kodda düştüğü doğrulandı. 3009 → 3012 test.
[1.231.2] — 2026-09-06
Düzeltildi — mobil üst çubuk iki satıra bölünüyordu, sunucu daha eski bir üst projeyle çalışıyordu ve cvstart.ru yönlendirmesi zaten bir dil adı taşıyan her yolda 404 veriyordu.
Düzeltildi
- Mobil üst çubuk yeniden tek satır, eylemler yalnızca simge. Eylem düğmeleri tam genişlikte ikinci bir satıra zorlanıyordu: telefonda
[☰ · arama]üstte,[🔔 🌙 Doctor Scan'i aç]altta — kendi satırında iki geniş hap. Artık zil ve tema düğmesinin yanında 36 px kare (🩺 / ⚡) ve 320 px’te her şey tek satıra sığıyor. Göz kararı değil, ölçüldü: belge genişliği 320, 360, 390 ve 430 px’te ve düğmelerin eskiden arama alanının üstüne bindiği 560–760 px bandının tamamında görüntü alanına eşit. Dil artık mobil yerleşimi hiç etkilemiyor, çünkü etiket gizli ve düğme sabit bir kare; 900 px üstünde etiketler değişmeden geri geliyor. - Sunucu, sürüm 1.32.0’a göre derlenmiş olmasına rağmen üst proje 1.31.0 ile çalışıyordu. resumecraft.ru üzerinde
/api/healthparentVersion: 1.31.0bildiriyordu. 95 çalışma dosyası eşitlendi, iki tanesi kaldırıldı. Canlı yüzeyde tarayıcı QA’sıyla bulundu. cvstart.ruher yolun başına/ru/ekliyordu, orada ne olduğuna bakmadan./ru/help/ru/ru/helpoluyordu,/en/helpise/ru/en/help; ikisi de 404. Birincisi ana siteden bir adresi kopyalayınca oluşuyor; ikincisi İngilizce konuşan ziyaretçiyi İngilizce sürümden tamamen dışarıda bırakıyordu. Artık 16 dil önekinden birini zaten taşıyan yol olduğu gibi geçiyor,enkaldırılıyor (İngilizce kökte duruyor), gerisi yine/ru/alıyor.
Değiştirildi
- 98 geçersiz kalmış QA istemi
qa/archive/superseded-prompts/altına taşındı.qa/README.md, v1.137.0’dan beri üst düzeyde yalnızca güncel sürümün isteminin kaldığını belgeliyor — kural 95 sürüm boyunca uygulanmadı. - Beş prompt daha üst seviyeden ayrıldı — kendilerini güncel ilan ediyorlardı, değillerdi.
REGRESSION-FINAL.mdkendini «tek yetkili, sürümden bağımsız regresyon promptu» diye adlandırıyordu; oysa §§11–15’i kapanmış beş döngü defteri (v1.55.x → v1.59.7) ve beyan ettiği yardım temeli 16 dilde 28 H2 / 103 H3 iken bugün 32 / 122 ve 17: onu izleyen bir QA aracı §9’da daha ilk adımda düşerdi.QA-REGRESSION-PROMPT.mdsürümsüz bir ada ve v1.226.0 içeriğine sahipti.QA-REGRESSION-PROMPT-v1.76.0-FULL.md155 sürüm geriye sabitlenmişti,REGRESSION-PROMPT-FINAL.mdv1.58.52 → v1.59.10 döngüsünü kapatır veQA-FULL-REGRESSION.mdhepsini v1.131.1 temelinde yineliyordu. Onlarla birliktePARENT-SYNC-WORKLIST-v1.26.0.mdde gitti (üst proje artık 1.32.0) ve tarihliUX-AUDIT-2026-07-06.mdreports/altına taşındı. Geriye, kendi temelleri v1.231.2 gerçek değerlerine güncellenmiş dört sürücü kaldı.qa/README.mdvar olan klasörü anlatacak biçimde yeniden yazıldı.
Notlar
- İki özgüllük tuzağı artık
app.cssiçinde açıklanıyor: masaüstü kurallarımax-width: 900pxbloğundan daha aşağıda tanımlı, bu yüzden eşit özgüllükte onlar kazanıyordu — mobilgapsessizce 24 px kaldı (320 px’i taşıran buydu) ve simge gizli kaldı (boş kare düğmeler). applyI18n()el.textContentatadığı için i18n anahtarı iç<span>’e taşındı; düğmede kalsaydı her dil değişiminde simgeyi silerdi.- Üst projenin ilk rsync’i yerelde artık bulunmayan bir dosyada yarıda kesildi ve yine de başarı bildirdi. Üst proje dağıtımları artık çıkış koduyla değil, sağlama toplamıyla doğrulanıyor.
[1.231.1] — 2026-09-06
Düzeltildi — v1.231.0’ın sayaç taraması tüm bağlantılardaki hesap adını değiştirdi.
Düzeltildi
- Her
Fighter90bağlantısıFighter92oldu. v1.231.0’daki kaynak sayacı taraması,290ve901’i doğru şekilde atlayan amaFighter90içindeki90ile eşleşen bir rakam sınırı koruması altında90’ı92ile değiştirdi. 17 README’nin tamamında, 17 yardım paketinin tamamında ve sitenin yardım aynalarında 562 bağlantı, artı wiki’de 138 tanesi, var olmayan bir hesabı gösteriyordu. Eksik görsel sayesinde bir kullanıcı fark etti. - Beş tarihsel sürüm göndermesi kaydı. Aynı sürümdeki
85 → 87taramasıv1.85.0’ıv1.87.0yaptı ve hiç çıkmamış bir sürüm uydurdu.
Notlar
- Rakam sınırı yeterli değil: bir sayıyı komşu rakamlardan korur, bir tanımlayıcının ya da bir sürüm dizesinin parçası olmaktan değil. Sayaçların kendisi doğru: 92 kaynak, 87 EN bağdaştırıcı, 3009 test.
- Üst depo etkilenmedi.
[1.231.0] — 2026-09-05
Eklendi — üst career-ops v1.32.0’dan iki tarama kaynağı (Collage, Telegram katı), Gem’in REST kipi ve taşımanın üst projenin kendi kodunda ortaya çıkardığı bir kusur.
Eklendi
- İki yeni kaynak, 90 → 92 (87 EN + 5 RU),
ALL_ADAPTERS85 → 87. İkisi de belirteçsiz.- Collage (
provider: collage) — Collage HR’ın açık iş sitesi API’si. Yol parçası, kiracının kendi seçtiği site adresidir, şirket adından türetilmiş bir slug değil:api:’den ya da birsecure.collage.co/jobs/<adres>URL’sinden okunur ve asla tahmin edilmez — tahmin edilen bir adres başkasının panosunu tarardı. - Telegram (katı) (
provider: telegram-channel) — mevcuttelegramkaynağının okuduğu aynıt.me/s/<kanal>önizlemelerini okur, ama ters takası yapar: bir gönderi ancak bir işveren adı verip bir ilan sayfasına bağlanıyorsa satır olur. Derlemeler, işvereni gizli gönderiler ve yalnızca iletişim içeren gönderiler elenir. Kapsam bilinçli olarak düşük — yukarı akışta gönderilerin %32-77’sinin geçtiği ölçüldü — ama her satır gerçek bir işveren ve gerçek bir bağlantı taşır. İkisi de üst projedeki gibi birlikte sunulur.
- Collage (
- Gem’e isteğe bağlı bir REST kipi eklendi, GraphQL yolunun yanına (
api: https://api.gem.com/job_board/v0/<board>/job_posts). Asla bir pano kimliğinden türetilmez ve GraphQL yolu varsayılan kalır. #3783’ten taşındı.
Düzeltildi
telegram-channel’ın konum süzgeci Kiril harflerini göremiyor ve şehirleri işveren diye adlandırıyordu. Üst projedekiLOCATIONISH_RE, yalnızca ASCII için çalışan ve Kiril harflerinin yanında hiç tetiklenmeyen\bsınırını kullanıyordu: içindeki tüm Rusça seçenekler erişilemezdi veSenior Engineer | Москва“Москва”yı işveren olarak döndürüyordu. Bu, tüm atıf politikasının önlemek için var olduğu yanlış-alan-gerçek-yerine ikamesinin ta kendisi ve sağlayıcının asıl kitlesini vuruyordu. web-ui taşıması Unicode denetimleri kullanıyor; üst projenin bir sabit aşağıdaROLE_WORD_REiçinde zaten yaptığı şey. ASCII biçiminde başarısız olan bir testle sabitlendi. Yukarı akışta henüz düzeltilmedi.
Notlar
- Üst projenin Workday faset kurtarma çalışması (#3851, #3874) taşıma gerektirmedi — web-ui Workday’i hiç sayfalamıyor,
offset: 0ile tek bir POST. providers/_types.jsyalnızca belgelerde değişti.- Testler: 2962 → 3009 (+47).
[1.230.0] — 2026-09-05
Değişti — üst career-ops v1.32.0’dan üç sağlayıcı düzeltmesi ve taşımanın kendisinin ortaya çıkardığı bir kusur.
Eklendi
- Welcome to the Jungle sunucu tarafında bir Algolia
filtersifadesi kabul ediyor (wttj: { filters: "offices.country_code:FR AND contract_type:full_time" }). Tek başına bir anahtar sözcük küresel bir panoyu daraltmaz: hangimax_hitssonucun geleceğine tarayıcının filtreleri değil, Algolia’nın alaka sıralaması karar verir — bizimkiler sonradan, gelmiş olanın üzerinde çalışır; dolayısıyla üst sınırın ötesindeki her şey, ne kadar iyi eşleşirse eşleşsin görünmezdir. Bir filtre sonuçları yeniden sıralamak yerine kümeyi küçültür, bu yüzden sorgu başına sınır 200’den 1000’e çıkar. Filtre varkenqueriesisteğe bağlı hale gelir: boş sorgu “filtreden geçen her şey” demektir. Üst projeden #3757 taşındı.
Düzeltildi
- Radancy, bir kiracı yalnızca kendi başlığının iddia ettiğinden daha az ilan sunduğunda artık “truncated” uyarısı vermiyor. Üst proje
data-total-resultsdeğerini dokuz gerçek kiracıyla karşılaştırdı: beşi tuttu, ancak dördü — biri küçük, biri devasa — ilan edilenden %10–56 daha az benzersiz ilan verdi, hem de tek bir yinelenen satır olmadan. Başlık, kiracının kendi arama dizininin gerçekte sunduğunu abartıyor; bu yüzden biriken sayımı onunla karşılaştırmak panoların çoğunda yanlış alarm üretiyordu. Uyarı artık yalnızca yürüyüşü bizim kendimax_jobs/max_pagesdeğerimiz durdurduğunda çıkıyor — çağıranın üzerinde işlem yapabileceği tek durum;totalResultsbağlam olarak iletide kalıyor ve asla karar vermiyor. #3839’dan taşındı. - Radancy her JSON parça isteğinde önbelleği atlıyor. Bu yolun önündeki bir önbellek katmanı bazı kiracılarda eski yanıtları tekrarlıyor: aynı ilan sayfalar sonra yeniden çıkarken bir başkası hiç sunulmuyor — yukarı akışta dokuzda dokuz kez yeniden üretildi.
Cache-Control/Pragmabaşlıkları hiçbir şeyi değiştirmedi; istek başına rastgele bir parametre sorunu çözdü. Bu parametre çağrı başına benzersiz olmalı, asla sayfa numarasından türetilmemeli: belirlenimci bir parametre önbelleğe yine kararlı bir anahtar, dolayısıyla aynı kararlı ve yanlış eşlemeyi verir. #3839’dan taşındı. - Greenhouse ofis listeleri belirlenimci sıradadır. Greenhouse yanıtlar arasında
offices[]sırasını garanti etmez ve/officesağacından toplanan küme kendi gezinme sırasını izler. İkisi de ilanınlocationalanına ulaşır; bu yüzden ofislerini yeniden sıralayan bir pano o dizgiyi yeniden yazıyor ve değişmemiş bir ilan yeni gibi okunuyordu. Üst proje kümeyi düzeltti (#3839); web-ui’de aynı kusurun üst projede bulunmayan ikinci bir örneği vardı — ilanın kendi konumu yokken devreye girenoffices[0]yedeği — ve artık ikisi de sıralanıyor.
Notlar
- Üst projedeki iCIMS düzeltmesi (#3728) taşıma gerektirmedi. O, ayrıntı sayfasının JSON-LD’sindeki her
jobLocationgirdisini okur; çünkü bazı kiracılar gerçek adresten önce tamamenUNAVAILABLEbir girdi yayınlar. web-ui’nin iCIMS’i konumu liste sayfasının HTML’inden alır ve hiçbir zaman ayrıntı sayfası açmaz. _http.mjsdeğişikliği taşıma gerektirmedi.isRefusedRedirectError’ı web-ui’de bulunmayan ikinci bir tüketici için ayırır;isRetryableError’ın davranışı değişmez.- Konum duyarlı yinelenen ayıklama (#3751) yansıtılmaz — üst CLI’nin
scan.mjshattında yaşar. - Kayıt defteri değişmedi: 90 kaynak (85 EN + 5 RU). Testler: 2956 → 2962 (+6).
[1.229.0] — 2026-09-03
Eklendi — üst proje career-ops v1.31.0’dan dört tarama kaynağı: Built In, Feishu Jobs, Garena ve MokaHR.
Eklendi
- Dört yeni kaynak, 86 → 90 (85 EN + 5 RU),
ALL_ADAPTERS81 → 85, dördü de jetonsuz. Built In ABD teknoloji panosunun dokuz pazarını kapsar ve varsayılan sorgu taşımaz:queries:vecategories:olmayan bir kayıt hiçbir şey taramaz ve bunu söyler — paylaşılan bir kaynak kimsenin arama sözcüklerini taşımamalı; listede olmayan bir pazar reddedilir, sessizce ulusal panoyla değiştirilmez. Feishu Jobs tam olarak iki ana bilgisayar biçimi kabul eder ve bunlar ilan sayfasına farklı yollar kullanır. Garena tek şirkettir:officebağlantıyı biçimlendirir, listeyi değil. MokaHR şifreli yanıt döndürür (anahtarı yanında gelen AES-128-CBC zarfı) — güvenlik değil gizleme, ama çözmeden hiçbir şey okunmaz.
Düzeltildi
htmlToTextmetne yarım bir etiket açıcısını sızdırabiliyordu.safe <img src=x onerror=1şöyle çıkıyordu:safe <img src=x onerror=1. Artık her çözümlemeyi bir temizleme izliyor ve sondaki açıcı köşeli işaretini yitiriyor. Üst projeden portlandı (#3491).
Notlar
- Üst projenin Workday düzeltmesinden hiçbir şey portlanmadı. O düzeltme, arka ucu sayfalamayı 2000. konumda kilitleyen kiracıları kurtarır — web-ui Workday’i hiç sayfalamıyor (
offset: 0’da tek POST, 100 satır). verify-cv-factsvemerge-trackerdüzeltmeleri port gerektirmedi: web-ui bu betikleri üst projenin checkout’undan çalıştırır.- Testler: 2909 → 2956 (+47).
[1.228.5] — 2026-08-30
Düzeltildi — bildirilen sürüm diskteki dosyayı tarif ediyordu, çalışan kodu değil.
Düzeltildi
-
/api/healthher istektepackage.json’ı yeniden okuyordu, dolayısıyla eskimiş bir süreç çalıştırmadığı bir sürümü bildiriyordu. QA,version: 1.228.4yanıtı verirken 1.228.3’te eklenen/api/pingiçin 404 döndüren yerel bir örnek buldu: dağıtımdan önce başlatılmış, eski kodu sunuyor ve yeni dosyanın sürümünü bildiriyordu. Dosyaları kopyalayıp asla yeniden başlatmayan bir dağıtım tam olarak böyle başarılı görünür: bir operatörün baktığı tek dizge, sorunu göremeyen dizgedir. v1.228.1’deki sembolik bağla aynı sınıf — rsync aktarımın ortasında durup yine de başarı bildiriyordu.Sürüm artık modül yüklenirken yakalanıyor ve çalışan kodu tarif ediyor. Eskimiş bir süreç eski sürümü bildirir — gerçeği, ilk istekte görünür biçimde.
parentVersionistek başına kalmaya devam ediyor: üst projenin checkout’unu tarif eder; bu süreç onu yüklemez ve çalışan bir sunucunun altında meşru olarak değişebilir.
[1.228.4] — 2026-08-30
Düzeltildi — kimlik doğrulaması olmayan canlılık probu her istekte disk işi yapıyordu.
Düzeltildi
GET /api/pingher vuruştapackage.jsonokuyup ayrıştırıyordu. Kimlik bilgisi olmadan erişilebilen tek uç nokta olduğundan, istek başına bir disk okuması artı JSON ayrıştırması herkese uzatılmış bir hizmet reddi kaldıracıdır — CodeQL bunu hız sınırlaması eksikliği olarak işaretledi. Sürüm artık rota kaydında bir kez okunuyor; yeniden başlatmadan zaten değişemez, dolayısıyla işleyici hiç G/Ç yapmıyor. Hız sınırlaması hasarı sınırlardı; işi kaldırmak kaldıracı kaldırır.- Profil sahibinin gerçek adının loopback dışında maskelenmesi artık bir testle sabitlendi.
/api/healthbunu zatenhiddenile değiştiriyordu — ama yalnızca o satırhidden ?? valuekoruyucusunu proje köküyle paylaştığı için. Bunu hiçbir şey sınamıyordu; satıra kendi değerini veren bir düzenleme, gerçek bir kişinin adını fark edilmeden yerel ağa sızdırırdı.
[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.
buildAskPromptdidif (ctx.length + sec.body.length > MAX_CONTEXT) break— abreak, 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 addedtelegram_channelsto 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, sotelegram_channelsis 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 (продуктовая разработка, высоконагруженные системы)becameFinCore 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 (soCoca-Colasurvives), 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/healthreports 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 singleincludes(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-designwas 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.mjsalso 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 onlyreferomatches in the repo are the Polish word preferowany.
[1.228.0] — 2026-08-29
Eklendi — tarama kaynağı olarak Telegram kanalları ve /api/scan-results için sayfalı sorgu kipi.
Eklendi
- Telegram kanalları artık taranabilir bir kaynak.
portals.ymliçindekitelegram_channels:bloğu onları listeler; her biri herkese açıkhttps://t.me/s/<kanal>önizlemesinden okunur. Kayıt defteri: 85 → 86 kaynak (81 EN + 5 RU),ALL_ADAPTERS80 → 81. Telegram RSS yayımlamaz ve Bot API, botun yönetmediği bir kanalı okuyamaz — iki bariz yol da kapalı./s/önizlemesi sunucuda üretilmiş düz HTML’dir: oturum yok, JS yok, çerez yok. 16 kanalda doğrulandı: 15’i çıplak bir GET’te 20’şer gönderi döndürdü. GET /api/scan-resultssayfalı sorgu kipi kazandı.?q=<metin>&limit=50[®ion=ru|en][&set=filtered|fresh][&offset=N]{ total, returned, offset, limit, set, rows }döndürür;totalsayfalamadan ÖNCEKİ sayıdır. Parametresiz haliyle rota yine tüm anlık görüntüyü döndürür —#/scantablosu o biçime bağlıdır.
Düzeltildi
- Telegram asistanı verinin bir kısmıyla yanıt veriyordu. Becerisi zaten
/api/scan-results’ı gösteriyordu, ama rota yalnızca tüm anlık görüntüyü döndürebiliyordu — gerçek makinede yaklaşık 2 MB — ki bu bir ajanın bağlamına sığmaz. «Tüm Product Manager’ları bul» isteğine, anlık görüntüde yüzlercesi varken 9 eşleşme bildirdi ve «sınırlı bir yerel dizinle çalıştığını» söyledi. Doğruydu: uç noktayı görüyor ama sindiremiyordu. Sayfalı kiple aynı soru 2 KB tutuyor ve dürüst birtotaldöndürüyor. Beceri de yeniden yazıldı: yeni gönderileri özetlemeyi istiyordu, yanifilteredyerinefresh’i işaret ediyordu.
Notlar
- Kanal gönderisi düzyazıdır, iş kaydı değil. Yapılandırılmış alan yok: başlık ilk anlamlı satırdan, şirket/konum/ücret açık etiketlerden alınır. Gerçek ilanları reklam ve derlemelerden ayırmak mevcut
title_filter’a bırakılmıştır — diğer kaynaklar için zaten ayarlanmış olana. Bunlar ipucudur, liste değil. - Şirket asla tahmin edilmez. Etiket yoksa satır kanala atfedilir (
@rabotaphp): yanlış bir işveren izleyiciye gerçek olarak girer. - Boş ayrıştırma bir hatadır, «ilan yok» değil. t.me gizli veya var olmayan bir kanala yönlendirmeyle yanıt verir; sıfır satır döndürmek sakin bir gün gibi okunur ve yapılandırmadaki yazım hatasını sonsuza dek gizler.
jobGeekstam da bunu yapar (HTTP 302) ve bilinçli olarak yapılandırılmadı. - Uzaktan çalışma tespiti
\byerine Unicode sözcük sınırı kullanır;\byalnızca ASCII bilir — v1.227.3’te başlık filtresinin düştüğü tuzağın aynısı, burada yayından önce bir testle yakalandı. - 15 kanal yapılandırıldı ve canlı doğrulandı: 299 gönderi, 15/15 kanal. 30 yeni test. Testler: 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
Totalrow 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
Düzeltildi — bölgesel tarama sunucunun belleğini tüketiyordu ve bir Playwright takımı kendi sökümünde kararsız biçimde düşüyordu.
Düzeltildi
- Bölgesel tarama sunucuyu OOM ile öldürüyordu.
ru-scanner, tüm sorguların tüm ham sonuçlarını biriktirip yinelenenleri ayıklamayı ve süzmeyi ancak en sonda yapıyordu. Sorgu listesi bilerek yakın eşanlamlılarla dolu (Golang,Go разработчик,Golang разработчик,Senior Go…), yani aynı ilan her sorguda bir kez dönüyor ve dizi benzersiz sayının katlarını tutuyordu — üstelik ilan nesnesinin büyük kısmını oluşturan ve süzgeçlerin neredeyse tümünü attığı açıklamalarla birlikte. Ölçüm: 21 sorgulu gerçek bir koşuda 742 MB yığın. Sunucu Node yığınını 490 MB ile sınırlıyor (V8 bunu makinenin 956 MB RAM’ine göre belirliyor), bu yüzden tarama servisiFATAL ERROR: Reached heap limitile deviriyordu — bir günde dört kez. Artık ayıklama ve süzme her sorguda yapılıyor; aynı koşu 177 MB’a indi, %76 azalma. Raporlanan sayılar değişmedi: benzersiz toplamı URL dizgilerinden oluşan birSettaşıyor. net::ERR_SOCKET_NOT_CONNECTEDCI’ı rastgele düşürüyordu. Üç Playwright takımı, konsol hatası olmadığını doğrulamadan önce süren istekleri durdurmak içinwindow.stop()çağırır. Chromium bu tek kasıtlı eylemi soketin durumuna göre üç farklı adla bildirir: iptaldeERR_ABORTED, yoldaykenERR_EMPTY_RESPONSE, soket çoktan gitmişseERR_SOCKET_NOT_CONNECTED. Ortak filtre yalnızca ilk ikisini biliyordu.tryerel taramasında ortaya çıktı; aynı çağrıyı yapanplaywright-formsveplaywright-smokeda tek şanssız koşum uzaktaydı.
Notlar
- Neden ancak şimdi bozuldu. Ürün müdürü aramaları eklenince liste 14’ten 21 sorguya çıktı. Eski uygulamanın belleği toplam sonuç sayısıyla ölçekleniyordu, dolayısıyla %50 daha fazla sorgu makinenin tavanını aştı.
- Ayıklama değişikliği davranışı korur ve bu iddia değil, test edilmiştir.
tests/ru-scanner-dedup-order.test.mjszor yönü sabitler — süzgeçlerden geçemeyen sonraki bir yineleme, geçmiş olan öncekini dışarı atmalıdır — ve eski uygulamaya karşı 200 rastgele denklik denetimi koşar. - Konsol süzgeci dar kalıyor. Yalnızca iptal edilmiş istek ailesi zararsızdır; reddedilen bağlantı, DNS hatası, sıfırlama, her 5xx ve yakalanmamış JS istisnaları hâlâ savı düşürür.
- İki hipotez gönderilmek yerine sınandı ve elendi: Caddy zaman aşımı (yapılandırma temiz, SSE için
flush_interval -1doğru) ve Node’un varsayılan 5 dakikalıkrequestTimeoutdeğeri (küçültülmüş bir yeniden üretim, uzun bir akış yanıtını kesmediğini gösterdi). Asıl kanıt, günlüktekiReached heap limitidi. Testler: 2860 → 2865.
[1.227.4] — 2026-08-29
Düzeltildi — word: / stem: content_filter tarafından hâlâ yok sayılıyordu; v1.227.3 yalnızca başlık filtresini düzeltmişti.
Düzeltildi
content_filterönekleri dikkate almıyordu. v1.227.3,title_filter’a üst projeninword:/stem:öneklerini öğretti amacontent_filter’ı kendi hamlower.includes(k)çağrısıyla bıraktı; dolayısıyla orada önekli bir girdi hâlâ birebir metin olan"word:java"ile eşleniyordu — aynı sessiz no-op, bir filtre ötede.content_filterilanın AÇIKLAMASINI okur ve varsayılanı hep düz alt dize olmuştur: bu yüzden çıplak bir olumsuzjava, yalnızca „JavaScript“ten söz eden her ilanı eler; önek ise tek bir girdiyi bu varsayılandan çıkarma yoludur. Üst projenincompileContentKeywordişlevi aktarıldı: aynı önek düzeneğini paylaşır ama kısa anahtar kelimeleri bilinçli olarak sabitlemez — başlık filtresi 2–3 harfli kısaltmaları sabitler çünkü „Coordinator“ içindeki „COO“ her zaman yanlıştır; oysa bir düzyazı paragrafındaki kısa dizi çoğu kez kasıtlıdır (aws,gcp,sql,go).
Notlar
- v1.227.3 PR’sinin yapay zekâ incelemesinde bulundu; inceleme, kodun kendi yorumunun iddia ettiğini karşılamadığını fark etti — yorumda „
title_filter/content_filter“ yazıyordu ama yalnızca başlık yolu bağlıydı. Yorum artık açıkça ayırıyor: önekleri iki filtre de tanır, kısaltmaları yalnızca başlık filtresi sabitler. - Yine o incelemeden doğrulandı ve değişmedi: 2–3 harfli kısaltma kuralını
\byerine Unicode sınırına taşımak ASCII’de birebir aynı davranır ve yalnızca olması gereken yerde daha katıdır —COO_leadvecoo1korunmaya devam eder (alt çizgi ve rakam her ikisinde de sözcük karakteridir),Coordinatorkorunur, „Директор COO“ ve „VP «Продукт»“ doğru biçimde elenir. 14 sınır durumu denetlendi. - Öneksiz
content_filtergirdileri önceki eşleşmesini bayt bayt korur, boş veya eksik bir açıklama yine geçer ve içi boş birword:/stem:her şeyle değil hiçbir şeyle eşleşir.tests/content-filter.test.mjsiçinde 6 yeni durum. Testler: 2852 → 2858.
[1.227.3] — 2026-08-29
Düzeltildi — başlık filtresindeki word: / stem: önekleri sessizce yok sayılıyor, o filtre satırlarını etkisiz bırakıyordu.
Düzeltildi
- web-ui, üst projenin
word:/stem:öneklerini uygulamıyordu.title_filter(vecontent_filter) varsayılan olarak büyük/küçük harf duyarsız alt dize eşleşmesi yapar; bu yüzden çıplak bir olumsuzinterngirdisi „International Product Manager“ ve „Internal Tools Engineer“ başlıklarını da eler. Bu varsayılanı tersine çevirmek yapılandırılmış her kurulumu bozacağından, üst proje kesinliği girdi başına isteğe bağlı yaptı:word:internyalnızca tam sözcüğü,stem:agentise bir sözcüğün başını eşler ve devam edebilir („Agentforce“ ile „Reagents“ı ayırır). web-ui’de ikisi de yoktu; girdiyi birebir metin olan"word:intern"şeklinde eşliyordu — böyle bir dizi hiçbir ilan başlığında geçmez. Satır sessiz bir no-op’a dönüştü: aynıportals.ymlCLI’da doğru süzerken burada hiç süzmüyordu, dolayısıyla dışlanan her staj ilanı yine#/scantablosuna ulaşıyordu. Üst projenintitle-keywords.mjsdosyasından aktarıldı; yalnızca ASCII bilen ve aksanlı ya da Kiril başlıklarda sözcük ortasında eşleşen\byerine Unicode farkında sözcük sınırı (\p{L}\p{M}\p{N}_) dahil.
Notlar
- Gerçek bir
portals.ymlincelenirken bulundu; orayaword:interntam da çıplakinterngirdisi „International Product Manager“ı elemesin diye yeni eklenmişti. Önek CLI’da çalışıyordu; web-ui sessizce tüm staj ilanlarını tutuyordu. Artık davranış aynı. - Varsayılanlar değişmedi. Öneksiz bir anahtar kelime önceki eşleşmesini korur: öbekler ve harf dışı karakter içeren her şey (
.NET,SAP,L&D) alt dize, 2–3 harfli kısaltmalar sözcük sınırına bağlı. İçi boşword:/stem:yazım hatası sayılır ve hiçbir şeyle eşleşmez — olumsuz olarak boş bir desen her başlıkla eşleşir ve tek bir başıboş iki nokta yüzünden tüm taramayı geçersiz kılardı. - 2–3 harfli kısaltma kuralı da aynı Unicode sınırını kullanıyor: önceden
\bkullanıyordu, bu yüzden ASCII dışı başlıklardacooileword:cooayrışıyordu — tek kuralın iki yazımı. tests/title-filter.test.mjsiçinde 6 yeni durum. Testler: 2846 → 2852.
[1.227.2] — 2026-08-29
Düzeltildi — dar telefonlarda #/config yana kayıyordu.
Düzeltildi
- MOBILE-1:
#/config≤ 352 px görünüm alanlarında yatay taşıyordu. Her select alanı satır içi birmin-width: 300pxtaşıyordu. Satır içi stil stil sayfasını yener, dolayısıyla denetim kabıyla birlikte küçülemiyordu: 320 px görünüm alanında select’in sağ kenarı 353 px’e düşüyor, sayfada yatay kaydırma oluşuyor ve denetimler sağ kenarın dışına itiliyordu. 18 sağlayıcı/model select’inin tamamı etkileniyordu (cfg-llm-providerve tümcfg-*-model). Artıkmin-width: min(300px, 100%)+max-width: 100%; rahat 300 px yalnızca yer varsa uygulanıyor. Eşikteki ve altındaki cihazlar: iPhone SE (1. nesil, 320 px), eski Android’ler, Galaxy Fold dış ekranı.
Notlar
- Önceki tüm mobil geçişlerin bunu neden kaçırdığı. 360 px ve 375 px taşmayı gizlemeye tam yetecek paya sahip ve Playwright takımları 1280 px genişliğinde bir pencerede koşuyor. CI’da 375 px’ten dar bir görünüm alanı hiç ölçülmemişti. Yeni
tests/playwright-narrow-viewport.mjsform taşıyan rotaları 320 px’te tarıyor ve herhangi bir yatay taşmada başarısız oluyor; mesajda en geniş öğeyi adlandırıyor. İkinci durum, hiçbir#/configselect’inin görünüm alanını aşmadığını sabitliyor. Önce hatayı yeniden ürettiği doğrulandı (scrollWidth 353 > clientWidth 320, sağ kenarı 353 olan 18 select). Playwright: 99 → 101. - Bilinen ve bilinçli olarak henüz kapı altında değil: 280 px (Galaxy Fold dış ekranı) hâlâ ~5 px taşıyor, ama nedeni farklı — yapılandırma kartının
<details>bloklarındaki uzun içerik ve 280 px görünüm alanına karşı 256 px’lik kenar çubuğu; bu sürümün düzelttiği satır içimin-widthdeğil. Yaygın hiçbir telefonun bildirmediği bir genişliğe göre yeniden akıtmak ayrı bir iş; takımınWIDTHSlistesi buna hazır. - v1.227.1 QA istemi de düzeltildi: takip rotasını
#/modes/followupolarak adlandırıyordu. Mode sayfaları çıplak slug ile kaydolur (Router.register(cfg.slug)), dolayısıyla rota#/followup’tır ve#/modes/followupdoğru şekilde 404 verir. Yalnızca belge. - Birim takımı 2846’da değişmedi (yeni kapsam tarayıcı düzeyinde).
[1.227.1] — 2026-08-29
Düzeltildi — yardımdaki kaynak dökümü kendisiyle tutmuyordu ve GitHub afişi uygulamada ham işaretleme olarak basılıyordu.
Düzeltildi
- §17 toplamı ve dökümü birbirini tutmuyordu. Tüm yardım paketleri „
server/lib/sources/kaydı 85 adaptör içerir — 78 İngilizce + 5 Rusça“ diyordu. 78 + 5 = 83, 85 değil; ja/ko’da sapma 77’ye (= 82) kadar gitmişti. Her yeni kaynak toplamı yükseltip terimi olduğu gibi bıraktığı için iki sayı birkaç sürümdür ayrışıyordu. Döküm artık 17 dilin tamamında 80 EN + 5 RU. Bu görsellikten fazlası:docs/help/<lang>.md, „Ask the docs“un dayandığı TEK derlem; dolayısıyla kaç kaynak desteklendiğini soran kullanıcı tek bir cümleden birbiriyle çelişen iki sayı alıyordu. - Aynı cümle eskimiş bir sürüm çıpası tutuyordu. „v1.213.0 itibarıyla kayıt …“ 16 dilde hayatta kalırken sayaç iki kez değişti (v1.219.0’da 83, v1.226.0’da 85). Çıpa v1.210.1’de elle bir kez onarılmış ve yeniden kaymıştı. Sürümsüz bir ifade lehine kaldırıldı — sayacın kendisi canlı kayda karşı doğrulanıyor ve eskiyemez.
- Sağlayıcı afişi
#/helpbaşında kaçışlanmış işaretleme olarak basılıyordu. v1.225.0/v1.225.1, onun „UI.md()tarafından uygulamada kaldırıldığını (görsel desteği yok)“ kaydetmişti. Bu iki farklı şeyi karıştırıyor:UI.md()önce kaçışlar — herhangi bir markdown dönüşümünden önce kaynağın her baytını kaçışlar; bu doğru XSS sınırıdır ama kaldırmanın tam tersidir. Kimse afişi kaldırmıyordu çünkü kimse denemiyordu ve 17 dilin tamamı#/helpi 268 karakterlik düz<p align="center"><img src="https://…ile açıyordu. Yeni ortak giriş (server/lib/help-markdown.mjs::stripGithubOnlyBlocks) okuma sırasında tek başına duran HTML görsel bloklarını atıyor — hemGET /api/help/:langhem de docs-assistant derlemi için. Dosyalarda afiş kalıyor, dolayısıyla GitHub vitrini yine görünüyor. - Kadans panosundaki „#“ sütunu v1.117.0’dan beri boştu.
entry.appNumokuyordu; oysafollowup-cadence.mjsnumyayıyor —appNumyükte hiç var olmadı. Artık ikisi de okunuyor. v1.227.0’daki „Next up“ satırı aynı hatayı devralmıştı, birlikte düzeltildi.
Notlar
- Dördü de kendilerini kollayan bir şey olmadığı için gözden kaçtı. Yardım kapıları (
canonical-docs-coverage,help-ui,help-ru-config-section) BAŞLIK sayar — 32 H2 / 121 H3 — ve hiçbir test bir paragrafın içindeki sayıyı okumamış, yardım girişinin gerçekte ne sunduğuna bakmamıştı. İki yeni takım bunu kapatıyor:tests/help-source-counts.test.mjs(belirtilen toplamSOURCES.lengthe eşit; terimler canlı EN/RU bölünmesine eşit ve toplamı veriyor; paragraf sürüm sabitlemiyor) vetests/help-banner-strip.test.mjs(afiş GitHub için diskte kalır, süzmeden asla sağ çıkmaz, her paketin ilk render satırı başlığıdır, süzme dar kalır ve iki tüketici de oradan geçer). İkisinin de commit öncesi tam bu hatalara karşı kırmızı düştüğü doğrulandı. Test paketi: 2837 → 2846. - Kayıt, tarayıcı veya rota sözleşmelerinde değişiklik yok; kaynaklar 85 (80 EN + 5 RU),
ALL_ADAPTERS80 olarak kalıyor.
[1.227.0] — 2026-08-28
Eklendi — SEEK Hong Kong (JobsDB), takipler için yalnızca-zamanı-gelenler süzgeci ve gizli işverenlerin kendilerini sunan ajansı göstermesi.
Eklendi
- Mevcut Jobstreet/SEEK kaynağı üzerinden JobsDB Hong Kong. Hong Kong JobsDB markasıyla işliyor ama aynı v5 uç noktasının arkasındaki aynı SEEK platformunda duruyor; bu yüzden ayrı bir kaynağa gerek yok — host beyaz listesine
hk.jobsdb.comvesiteKey: HK-Mainyeterli. Kayıt defteri değişmiyor: 85 kaynak (80 EN + 5 RU) veALL_ADAPTERS80 — bu, mevcut bir adaptör üzerindeki yeni bir PAZAR, yeni bir adaptör değil. - Kadans panosunda yalnızca-zamanı-gelenler süzgeci (
#/modes/followup). Yeni bir onay kutusu panoyu şu anda aksiyon alınabilir olanlarla sınırlıyor. Zamanın gelip gelmediği, üst projeninfollowup-cadence.mjsdosyasının zaten hesapladığıurgencyalanından okunuyor (urgent/overdue) — asla izleyicininstatusalanından değil; o alanapplied/responded/interviewdeğerlerini taşır ve hiçbir şeyle eşleşmezdi. Zamanı gelen bir şey yoksa pano, boş bir ekran göstermek yerine en yakın planlanmış takibi bildiriyor. Mantık, üst projedekifollowup-view.mjsdosyasının aynası olan safpublic/js/lib/followup-view.jsmodülünde yaşıyor. - Gizli işverenler, kendilerini sunan ajansa atfediliyor. İşvereni saklanan bir ilan izleyicide
?olarak kaydedilir ve işe alım uzmanıViasütununa yazılır.#/trackerçıplak bir?gösteriyordu; bu yüzden birden çok gizli satır birbirinden ayırt edilemiyor, logo çözücü de eşleştirecek bir şey bulamıyordu. Böyle bir satır artık “Gizli · <ajans> aracılığıyla” biçiminde okunuyor, logosunu ajans adından çözüyor ve arama kutusunda o adla bulunabiliyor. Yalnızca sunum — kanonikcompanyalanının üzerine asla işe alım uzmanı yazılmıyor. Üst projedekicompany-presentation.mjsdosyasının aynası olan yeni safpublic/js/lib/company-presentation.jsmodülü.
Düzeltildi
- Jobstreet/SEEK kullanımdan kaldırılmış bir uç noktayı çağırıyordu. Kaynak hâlâ SEEK’in emekliye ayırdığı chalice-search v4’e (
/api/chalice-search/v4/search) işaret ediyordu; üst proje/api/jobsearch/v5/searchadresine geçmiş, web-ui ise hiç takip etmemişti. Artık her Jobstreet/SEEK girdisi v5’i sorguluyor. v5 öğe biçimi doğal olarak okunuyor (iş URL’siidüzerinden kuruluyor,locations[0].label,advertiser.description,salaryLabel), v4’e özgüsolrFieldsizdüşüm parametresi kalktı veportals.ymldosyasında hâlâ ölü v4 yolunu sabitleyen bir girdi, pazar ana makine adını korurken yolu v5 üzerinde yeniden kuruluyor — kullanıcının düzenleme yapmasına gerek yok.
Notlar
- career-ops 1.30.0 eşitliği (üst projenin HEAD’i
8d64f65→6cc46a4;VERSIONdosyası hâlâ 1.30.0 diyor — release-pleasemain’in gerisinde). Aktarılmayanlar ve gerekçeleri: iCIMS JSON-LD konum doldurma — web-ui’nin iCIMS kaynağında hiçenrichDate()kancası yok (yalnızca liste sayfaları), dolayısıyla düzeltilecek bir kod yolu da yok; ölümcül olmayan CLI stderr (#1974) — web-ui’nin çalıştırıcısı başarısızlığa yalnızca çıkış koduna bakarak karar verir ve o buluşsal yönteme hiç sahip olmadı; Turbopack yol izleme — web-ui’de paketleyici yok;cv-sync-checkdüzeltmeleri — salt okunur ve fail-soft biçimde aktarılıyor;scan.mjsiçinde Playwright sıralaması, Block H yanıtları, updater/doctor/update-systemkorumaları, özyinelemeli sözdizimi denetimi, Go panosu vejd-skill-gap/verify-cv-factsöz-testlerine yapılan eklemeler — web-ui’nin çağırmadığı yalnızca-CLI yüzeyleri veya davranış değiştirmeyen öz-testler. Test paketi: 2818 → 2837.
[1.226.0] — 2026-08-27
Eklendi — iki Vietnam iş kaynağı: ITviec ve CareerViet.
Eklendi
- ITviec + CareerViet (Vietnam). Host-sabitlemeli iki Vietnam panosu
provider: itviec/provider: careervietgirdileriyle tarayıcıya katılır: ITviec (itviec.com, teknoloji) ve CareerViet (careerviet.vn, geniş kapsam). İkisi de token gerektirmeyen HTML kazıyıcılardır; SSRF host-pin, yalnızca-HTTPS, şirket bazında fail-soft ve sayfa üst sınırları içerir. Kayıt artık 85 kaynak (80 EN + 5 RU),ALL_ADAPTERS80 taşır — ikisi de#/scanKaynak filtresinde görünür.
Notlar
- career-ops 1.30.0 paritesi (parentVersion 1.29.0 → 1.30.0). Taşınmadı (yalnızca CLI/topluluk veya zaten kapsanmış): Hired Wall,
/calibrate, clean-markers, şablon paketleri, doctor, pdf/LaTeX ve web-ui’nin çağırmadığı eval/tracker/scan CLI’leri;_html-to-textdüzeltmesi veroleFuzzyMatchzaten vardı;title-filter stem:öneki ertelendi. Test paketi: 2818.
[1.225.1] — 2026-08-27
Düzeltildi — sağlayıcı logo afişi artık README ve yardımda görünüyor.
Düzeltildi
- v1.225.0 afişi GitHub’da görünmüyordu: bağımsız
images/providers.svgdosyasında GitHub’ın reddettiği geçersiz birfont-family(iç içe çift tırnak) vardı,<img>depo-göreli birsrckullanıyordu (ham HTML<img>GitHub’da göreli yolları çözmez) ve<p>bloğunda sondaki boş satır yoktu. Artık mutlak bir URL üzerinden işlenmiş birimages/providers.pnggösteriyor, boş satırlarla ayrılmış olarak; SVG de geçerli XML’e düzeltildi.
Notlar
- Yalnızca dokümanlar; kod veya test değişikliği yok. cvstart.org vitrini ve uygulamanın kutucukları zaten doğruydu (satır içi SVG, bu dosya değil). 2784
[1.225.0] — 2026-08-27
Eklendi — README ve yardım kılavuzunda bir sağlayıcı logo afişi.
Eklendi
- Sağlayıcı logo afişi. Tek ve kendi kendine yeten bir
images/providers.svg— 18 LLM sağlayıcısı, simge yayımlayan 11’i için gerçek marka logosu (simple-icons, CC0) ve kalan 7’si için marka renkli monogram ile — artık README’nin (×17) ve uygulama içi yardım kılavuzunun başında. (Uygulama gerçek logo kutucuklarını kendisi çizer; afiş GitHub’da işlenir ve uygulamada XSS-güvenli işleyici tarafından kaldırılır.)
Notlar
- Yalnızca dokümanlar — kod veya test değişikliği yok; SVG satır içidir (uzak kaynak yok). Tarama kaynakları değişmedi: 83. Test paketi: 2784.
[1.224.0] — 2026-08-26
Değiştirildi — LLM sağlayıcı kutucukları artık gerçek marka logolarını gösteriyor.
Değiştirildi
- Gerçek sağlayıcı logoları. Sağlayıcı kutucukları — Ayarlardaki API anahtarı alanları, Kullanım satırları, pano çipi, Ayarların “Etkin” özeti, ⚡ değerlendirme sonucu ve karşılama afişi — artık açık kaynak simge yayımlayan 11 sağlayıcı için gerçek marka logosunu işliyor (Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub · DeepSeek · Kimi · MiniMax · Mistral · Ollama; simple-icons’ten tek yollu SVG’ler, CC0). Yayımlanmış simgesi olmayan 7’si (Hermes · GLM/Z.ai · Grok · Together · Fireworks · BytePlus Ark · Volcengine Ark) marka renkli monogramı korur. Hâlâ yapısı gereği CSP-güvenli: logo yolu gömülü statik bir sabit — uzak kaynak yok,
innerHTMLyok.
Notlar
- Rota veya davranış değişikliği yok; aynı
ProviderLogo.el(slug)API’si.provider-logo.jsbüyüdü (gömülü logo yolları). Tarama kaynakları değişmedi: 83. Test paketi: 2784.
[1.223.0] — 2026-08-26
Düzeltildi — başarılı bir ⚡ canlı değerlendirme hata olarak boyanıyordu; ayrıca OpenWorker coworker’ını doğrudan GitHub URL’sinden veya .zip’ten kurun.
Düzeltildi
- ⚡ değerlendirme sonuç rozetinin tonu. Başarılı bir canlı değerlendirme artık başarısızlık gibi boyanmıyor. Süreç içi sağlayıcılar (OpenRouter, DeepSeek, …) alt süreç çıkış
code’u döndürmez, bu yüzden katıcode === 0yanlıştı ve her başarı kırmızı görünüyordu (“exit 0” yazarken). Ton artık sonucu izliyor — yalnızca sıfırdan farklı kodla çıkan bir alt süreç kırmızı boyar; kodsuz bir canlı sonuçbadge-ok’tur ve “· exit N” son eki yalnızca gerçek bir çıkış kodu varken görünür.
Değiştirildi
- OpenWorker coworker’ını GitHub URL / .zip’ten kurun. Coworker’ın dokümantasyonu artık tek komutluk kurucuyu (
curl … | bash, idempotent — mevcut career-ops / web-ui’yi yeniden kullanır) ve OpenWorker’daki üç kurulum yolunu (GitHub URL ·.zip· tek dosya içe aktarma)docs/integrations/openworker.md, uygulama içi yardım §32 (×17) ve README’de açıklar.
Notlar
- Uzun süredir açık olan bir kapsam boşluğu kapatıldı: Recruitee kaynağının artık v1.214.2 tırnaklı-açı düzeltmesi için uçtan uca bir testi var (bir etiket özniteliğindeki
>açıklamaya sızmamalı). Tarama kaynakları değişmedi: 83. Test paketi: 2783.
[1.222.0] — 2026-08-26
Değiştirildi — genişletilmiş sağlayıcıların (DeepSeek … Volcengine Ark) alan ipuçları artık 17 dilin tamamında yerelleştirildi.
Değiştirildi
- Sağlayıcı alan ipuçları yerelleştirildi. v1.216.0–v1.217.0’te eklenen 11 OpenAI uyumlu sağlayıcının (DeepSeek · GLM/Z.ai · Kimi · MiniMax · Mistral · Grok · Together · Fireworks · Ollama · BytePlus Ark · Volcengine Ark) her
config.<slug>Hintdeğeri — Ayarlar → API anahtarları altındaki API anahtarı, model ve temel URL ipuçları — artık İngilizceye geri düşmek yerine 17 dilin tamamına çevrildi. Kayıt URL’leri, model id’leri ve ⚡ canlı değerlendirme işareti aynen korunur.
Notlar
- Davranış değişikliği yok —
field-specs.jsiçindeki İngilizcehintFallbackeksik bir anahtarı hâlâ korur ve yeni bir sözleşme testi, alan tanımlayıcılarının herhintKeydeğerinin 17 dilde çözümlendiğini doğrular. Tarama kaynakları değişmedi: 83. Test paketi: 2779.
[1.221.0] — 2026-08-26
Güvenlik — tarayıcı fetch yolunda DNS-rebinding’e karşı derinlemesine savunma.
Güvenlik
- Tarayıcının HTTP çekirdeği (
server/lib/http-json.mjsiçindekifetchJson/fetchText) artık her kaynağın ana bilgisayarını gerçek ağ yolunda çözüyor ve özel, loopback, link-local, CGNAT veya bulut meta veri adresine çözülürse bağlanmayı reddediyor — bir DNS-rebinding vektörünü kapatıyor. Tarayıcı ana bilgisayarları zaten genel alan adlarına sabitlenmiş, dolayısıyla bu derinlemesine savunmadır; kullanıcı URL yolunda zaten daha güçlü bağlantı sabitleme (safe-fetch.mjs) vardı. Koruma yalnızca gerçekfetchtaşımasında çalışır — enjekte edilen testfetchImpl’i asla çözülmez.
Notlar
- Sağlıklı bir taramada davranış değişmez. Tarama kaynakları değişmedi: 83. Testler: 2775.
[1.220.0] — 2026-08-26
Eklendi — tek girişten birden çok Get on Board kategorisi tarayın.
Eklendi
- Bir
getonbrdgirişi artık yalnızcaprogrammingakışı yerinecategories: [programming, operations-management, machine-learning-ai](ya da tek bircategory:) ayarlayabilir; ilanlar kategoriler arasında URL’ye göre yinelenenlerden arındırılır, en fazla 12. Mevcut girişler aynı kalır (varsayılan hâlâprogramming).
Notlar
- Yalnızca sunucu; SSRF ana bilgisayar sabitlemesi (www.getonbrd.com) ve
redirect:'error'değişmez, geçersiz bir kategori slug’ı herhangi bir istekten önce reddedilir. Tarama kaynakları değişmedi: 83. Testler: 2771.
[1.219.0] — 2026-08-26
Eklendi — Torre tarayıcıya katıldı ve artık her sağlayıcı etiketi doğru.
Eklendi
- Torre (
provider: torre) — torre.ai’nin pan-Latin Amerika yetenek pazarı; Greenhouse/Lever/Ashby’ye ulaşmayan uzaktan roller taşıyan, kimlik doğrulaması gerektirmeyen açık bir arama; giriş başına tek sınırlı istek. Kayıt artık 83 kaynak içeriyor (78 İngilizce + 5 Rusça). Ayrıca karşılama afişinde aktif sağlayıcının monogramı.
Düzeltildi
- a16z Speedrun taraması, dönen bir panoda erken duruyordu (tarama ortasındaki kısa bir sayfa sonuncusu sanılıp ~300’de 149’a kırpılıyordu); artık akışın kendi
total_pagesdeğerine güveniyor. Karşılama afişi ise sağlayıcıyı 4 girişli bir haritadan çözüyordu (kalan 14 için ham slug gösteriyordu) — şimdi 18’in etiket+monogramını kullanıyor; Ayarlar’daki sağlayıcı notu 7’den 18’e çıkıyor.
Notlar
- Get on Board’un giriş başına çoklu kategori seçeneği burada henüz bağlı değil (kaynak düzeyinde bir refactor gerekiyor). Testler: 2768.
[1.218.0] — 2026-08-26
Eklendi — sağlayıcının gösterildiği her yerde sağlayıcı rozetleri (ve doğru adlar).
Eklendi
- Pano çipinde, Ayarlar’daki “Etkin” özetinde ve ⚡ değerlendirme sonucu başlığında sağlayıcı monogramları.
Düzeltildi
- Eski etiketler: üç ekran adı 5 girişli bir haritadan çözüyordu (değerlendirme sonucu Anthropic olmayan her sağlayıcıyı “Gemini” olarak yanlış etiketliyordu); artık paylaşılan
ProviderStatus.label(18) kullanıyor. Anahtar sayısı “/ 7” gösteriyordu → 18.LLM_PROVIDERipucunun slug listesi 17 dilin tümündeark/arkcnkazandı.
Notlar
- Yalnızca istemci, CSP güvenli. Sunucu değişikliği yok. Tarama kaynakları: 82. Testler: 2758.
[1.217.1] — 2026-08-26
Test sağlamlaştırma — tüm sağlayıcı listesi için uç nokta kapsamı.
Eklendi
- Kimi, MiniMax, Mistral ve Fireworks için uç noktayı, varsayılan modeli ve Bearer kimlik doğrulamasını doğrulayan parametreli bir
run<Provider>testi.
[1.217.0] — 2026-08-26
Eklendi — Ark, LLM listesine katılıyor (18 sağlayıcı). ByteDance’in Doubao modelleri BytePlus Ark ve Volcengine Ark artık ⚡ canlı sağlayıcılar — aynı OpenAI uyumlu çekirdek ve bölgeye göre temel URL ile.
Eklendi
- BytePlus Ark (
ARK_API_KEY, uluslararası) ve Volcengine Ark (ARK_CN_API_KEY, Çin) —runOpenAICompatible()üzerinden OpenAI uyumlu Chat Completions.ARK_MODEL/ARK_CN_MODEL(bir Doubao model adı ya daep-…uç nokta id’niz) ayarlayın;ARK_BASE_URL/ARK_CN_BASE_URLbölgeyi değiştirir. İkisi deautosırasına (en sona) katılır; Ayarlar ve Kullanım’da monogramlarıyla görünür. Web arayüzü artık 18 sağlayıcıyı canlı kapsıyor.
Notlar
- Geri kalanla aynı güvenilir yapılandırma + http(s) şema denetimi yolu (asla iş ilanı URL’si için SSRF doğrulayıcısı değil). Tarama kaynakları değişmedi: 82. Testler: 2755.
[1.216.0] — 2026-08-26
Eklendi — dokuz LLM sağlayıcısı daha, her birinin kendi marka karosu. ⚡ Canlı değerlendirmelerin artık DeepSeek, GLM (Z.ai), Kimi (Moonshot), MiniMax, Mistral, Grok (xAI), Together, Fireworks veya tamamen yerel Ollama üzerinden çalışabilir — bir anahtar kadar uzakta, her biri Ayarlar’daki alanının yanında bir monogramla işaretli.
Eklendi
- Dokuz OpenAI uyumlu sağlayıcı. DeepSeek, GLM (Z.ai), Kimi (Moonshot), MiniMax, Mistral, Grok (xAI), Together AI, Fireworks AI ve Ollama (tamamen yerel, anahtarsız). Ayarlar’da bir anahtar — Ollama için
OLLAMA_BASE_URL— girin; Hermes’ten sonraautosırasına katılır; herhangi biriniLLM_PROVIDERile sabitleyin. Together, Thinking Machines’in Inkling modelini de (thinkingmachines/Inkling) barındırır. Web arayüzü artık 16 sağlayıcıyı canlı kapsıyor. - Sağlayıcı monogramları. CSP güvenli, marka renginde bir baş harf karosu her sağlayıcıyı Ayarlar’daki anahtar alanının yanında ve Kullanım sayfasındaki satırında işaretler — satır içi SVG, harici logo yok, hiçbir şey cihazından çıkmaz.
Notlar
- Sağlayıcıların temel URL’leri,
runOpenAICompatible()üzerinden http(s) şema denetimiyle (Ollama’nın loopback’ine izin verilir) geçen güvenilir yapılandırmadır; asla iş ilanı URL’si için SSRF doğrulayıcısından geçmez. Tarama kaynakları değişmedi: 82. Testler: 2752.
[1.215.0] — 2026-08-26
Eklendi — tüm iş aramanı OpenWorker’dan yürüt. Yeni bir coworker bu hattı Andrew Ng’nin açık kaynak yapay zekâ coworker uygulamasından yürütür ve uygulama içi yardım artık bunu kapsar, böylece Belgelere Sor asistanı sana yol gösterebilir.
Eklendi
- OpenWorker coworker. Kodsuz bir OpenWorker coworker’ı — Fighter90/career-ops-coworker — tüm iş aramayı (tara, puanla, uyarla, izle, takip et) yürütür ve bu panoyu başlatabilir, hepsi masaüstünde. 17 dilde sunulan tek dosyalık bir persona olup OpenWorker’ın kendi yükleyicisiyle kurulabilir olduğu doğrulanmıştır.
- Yardım §32 “Run it from OpenWorker” (17 dilin tümü) bunu belgeler; böylece uygulama içi Belgelere Sor asistanı ve yüzen yardım düğmesi hakkında soruları yanıtlayabilir. Ayrıca açılış sayfası altbilgisinden, README’den, wiki’den ve
docs/integrations/openworker.md’den bağlanmıştır.
Notlar
- Yalnızca belgeler + site — uygulama kodu değişikliği yok. Tarama kaynakları 82’de değişmedi. Test takımı: 2742.
[1.214.2] — 2026-08-25
Düzeltildi — paylaşılan HTML→metin hattı (Greenhouse / Recruitee açıklamaları) bir öznitelik değeri > karakteri içerdiğinde artık etiket özniteliklerini açıklamaya sızdırmıyor.
Düzeltildi
- Öznitelik içinde
>bulunan HTML açıklamaları temiz biçimde ayıklanıyor. Greenhouse ve Recruitee açıklamalarının arkasındaki etiket ayıklayıcı ilk>’de duran naif bir eşleşme kullanıyordu, bu yüzden<a title="salary > 100k">gibi bir etiket sondaki öznitelik metnini (100k">) açıklamada bırakıyordu. Artık tırnaklı öznitelik değerlerine (tek veya çift) saygı gösteriyor, varlıkları çözmeden önce işaretlemeyi ayıklıyor (bir öznitelik içindeki kodlanmış tırnak sahte bir sınırlayıcı olmasın diye) ve düz metinde sabit bir<>’i hâlâ koruyor.
Notlar
- Test takımı: 2742. Tarama kaynakları 82’de değişmedi. Bu turda üst projeden başka yeni bir şey yok: kalan değişiklikler salt-okunur olarak aktarılıyor (follow-up / weekly-digest / rejection-latency / salary-gap düzeltmeleri web-ui değişikliği gerektirmiyor) ya da web-ui yüzeyi değil (harici bir X/Xquik BYO-key eklentisi, CLI/verify düzeltmeleri). İsteğe bağlı öğeler — SmartRecruiters ayrıntı açıklamaları, detect-reposts toplayıcı atlaması,
stem:/word:başlık önekleri, DNS-rebinding sıkılaştırması — sırada bekliyor.
[1.214.1] — 2026-08-25
Düzeltildi — Ashby iş açıklamaları artık Greenhouse ve Recruitee ile aynı uzunlukta kırpılıyor, böylece bir içerik filtresi üç panoda da aynı davranıyor ve tek bir pano tarama önbelleğini şişiremiyor.
Düzeltildi
- Ashby açıklamaları artık diğer panolarla aynı uzunluk sınırına uyuyor. v1.214.0 Ashby’nin ilan gövdesini içerik filtresine veriyordu, ama — 4000 karakterde kırpan Greenhouse ve Recruitee’nin aksine — Ashby’ninki sınırsız doğrudan eşleniyordu (bazıları 4 kat uzun). Böylece aynı
content_filterkelimesi, yalnızca metinde nereye düştüğüne göre Ashby’de eşleşip Greenhouse’da eşleşmeyebiliyordu ve tek bir pano,#/scan’in yüklediği tarama önbelleğine yüzlerce KB ekleyebiliyordu. Ashby artık aynı 4000 karaktere kırpılıyor (metni zaten düz olduğundan kesiliyor, asla etiketten arındırılmıyor).
Notlar
- Test takımı: 2738. Tarama kaynakları 82’de değişmedi.
[1.214.0] — 2026-08-25
Düzeltildi — Greenhouse, Ashby ve Recruitee iş açıklamaları artık içerik filtresini besliyor, böylece kelime / ülke / vize filtreleri bu panolarla gerçekten eşleşiyor; ve “Associate <kıdemli unvan>” (akademik rütbeler dâhil) artık başlangıç seviyesi olarak yanlış sınıflandırılmıyor.
Düzeltildi
- İçerik filtreleri artık Greenhouse, Ashby ve Recruitee’de çalışıyor. Bu panolar artık her ilanın tam metnini açıklaması olarak taşıyor, böylece açıklamayı okuyan bir
content_filter(ya da ülke / vize kelime filtresi) panoyu körlemesine geçirmek yerine ilan gövdesiyle eşleşiyor. Ashby ve Recruitee gövdeyi liste yükünde bedavaya veriyor; Greenhouse zaten veriyordu. Üçü de tek bir paylaşılan HTML→metin hattından geçiriliyor. - “Associate Director” / “Associate Professor” başlangıç değil, kıdemlidir. Kıdem sınıflandırıcısı (
skip_tiers:tarafından kullanılır) “associate” kelimesini kıdemli bir unvanı önlese bile başlangıç seviyesi işareti sayıyordu. Artık “Associate <kıdemli isim>”—akademik rütbeler dâhil (Associate Professor, Associate Dean)—kıdemli okuyor, gerçek başlangıç varyantlarını (Associate Attorney, Associate Editor) başlangıç seviyesinde tutuyor ve baştaki “Intern, Associate Dean”i hâlâ staj olarak sınıflandırıyor.
Notlar
- Test takımı: 2736. Tarama kaynakları 82’de değişmedi. Sonraya sıraya alındı: isteğe bağlı SmartRecruiters açıklama zenginleştirmesi (ilan başına bir detay isteği), detect-reposts’un
aggregator: truepano atlaması ve sabitlenmiş kelimestem:/word:başlık önekleri — her biri varsayılan davranış değişikliği değil, isteğe bağlı bir yapılandırma. DNS-rebinding sıkılaştırması kendi güvenlik sürümü için hâlâ sırada.
[1.213.0] — 2026-08-22
Eklendi — Singapur’un ulusal iş bankası MyCareersFuture bir tarama kaynağı olarak. Düzeltildi — Greenhouse ilanları artık içerik filtrelerinin çalışması için tam metnini taşıyor ve uzaktan Ashby rolleri yalnızca-şehir bir konumun arkasında gizlenmiyor.
Eklendi
- MyCareersFuture (Singapur) (mycareersfuture.gov.sg) — Workforce Singapore tarafından işletilen Singapur ulusal kamu iş bankası için yeni, token gerektirmeyen bir tarama kaynağı.
#/scansayfasındaki Kaynak filtresinden seçin ya da isteğe bağlı birkeywordslistesiyleprovider: mycareersfutureolan bir şirket ekleyin (yoksa Job Bank gibi profilinizin hedef rollerine düşer). Genel arama API’sini okur, ana bilgisayara sabitli, anahtarsız.
Düzeltildi
- Greenhouse ilanları artık içeriğe göre filtrelenebiliyor. Greenhouse panoları ilanın tam gövdesiyle çekilir, ilanın açıklaması olarak düz metne çözülür — böylece açıklamayı okuyan bir
content_filter(ya da ülke/vize kelime filtresi) artık Greenhouse ilanlarını körlemesine geçirmek yerine gerçekten eşleştirir. - Uzaktan Ashby rolleri artık bir şehir filtresiyle elenmiyor. Ashby çalışma modelini (Remote/Hybrid/Onsite) ofis şehrinden ayrı tutar, bu yüzden tamamen uzaktan bir rol hâlâ örn. “San Francisco” olarak okunuyordu — ve o şehri engelleyen bir konum filtresi kabul edebileceğiniz bir rolü gizliyordu. Rol uzaktansa artık konuma “Remote” eklenir ve ofise bağlı bir hibrit rolün yanlış etiketlenmemesi için
workplaceType, eskimiş birisRemotebayrağına üstün gelir.
Notlar
- Tarama kaynakları: 82 (77 İngilizce + 5 Rusça). Test takımı: 2724. Bir DNS-rebinding sıkılaştırması (bir ana bilgisayarın çözümlenen adresini bağlanmadan önce doğrulamak) özel bir sürüm için sıraya alındı — doğrudan bir port yerine web-ui’ye özgü bir tasarım gerektiriyor.
[1.212.1] — 2026-08-21
Düzeltildi — cvstart.org açılış sayfası tarayıcının iş kaynaklarını eksik sayıyordu (80 gösteriyor ve Job Bank (Kanada)’yı atlıyordu); artık uygulamanın 81’iyle yeniden eşleşiyor ve ikisi ayrışırsa site derlemesi yüksek sesle başarısız oluyor.
Düzeltildi
- Açılış sayfasının “İş kaynakları” sayımı uygulamayla yeniden senkron. v1.212.0 sonrasında cvstart.org 80 pano gösteriyor ve yeni Job Bank (Kanada) çipi eksikti; oysa uygulama, tarama açılır menüsü ve yardım kılavuzu hepsi 81 listeliyordu. Açılış sayfası listesini canlı tarayıcı kaydını yükleyerek kurar ve bir kaynak, bir YAML bağımlılığını içeri alma biçimi yüzünden o derlemede yüklenemedi — böylece sessizce düştü. Job Bank artık bu bağımlılığı, uygulamanın geri kalanının tarama sırasında yaptığı gibi tembel yükler, dolayısıyla her zaman görünür.
- Site derlemesi artık uyuşmayan bir kaynak sayısını yayımlamayı reddediyor. Kayıt, diskte var olandan daha az kaynak sayarsa (yüklenemeyen bir kaynağın izi), derleme yanlış sayıyı sessizce yayımlamak yerine açık bir mesajla başarısız olur.
Notlar
- Uygulama davranışı değişmedi — tarayıcıda her zaman 81 kaynağın tümü vardı; yalnızca açılış sayfası etkilendi. Tarama kaynakları: 81 (76 İngilizce + 5 Rusça) — değişmedi. Test takımı: 2687.
[1.212.0] — 2026-08-21
Eklendi — Job Bank (Kanada), federal ulusal iş panosu. Kaldırıldı — EchoJobs (beslemesi artık bot korumasının arkasında). Düzeltildi — Consider tabanlı panolar yeniden sonuç döndürüyor ve çok konumlu Lever ilanları artık konumlarının yarısını gizlemiyor.
Eklendi
- Job Bank (Kanada) (jobbank.gc.ca) — hiçbir toplayıcının iyi kapsamadığı yüksek hacimli bir pano olan Kanada federal ulusal istihdam hizmeti için yeni, token gerektirmeyen bir tarama kaynağı.
#/scansayfasındaki Kaynak filtresinden seçin ya da isteğe bağlı birkeywordslistesiyleprovider: jobbankcaolan bir şirket ekleyin (yoksa profilinizin hedef rollerine düşer). Genel ATOM beslemesini okur, ana bilgisayara sabitli, anahtarsız.
Kaldırıldı
- EchoJobs — emekliye ayrıldı. Genel beslemesi artık bot korumasının arkasında ve hiçbir şey döndürmüyor; onu tutmak yalnızca bir tarama yuvası harcıyordu.
Düzeltildi
- Consider tabanlı panolar yeniden sonuç döndürüyor. Consider artık aramayı kabul etmeden önce anonim bir el sıkışma (oturum çerezi + CSRF belirteci eken bir GET) istiyor; onsuz istek sessizce reddediliyor ve pano boş görünüyordu.
- Çok konumlu Lever ilanları artık konumlarının yarısını gizlemiyor. Lever bir birincil şehri
location’a, geri kalanınıallLocations’a koyar; yalnızca birincili okumak, Barselona VE Montevideo’da açık bir ilanı yalnızca-Barselona gibi gösteriyordu (ve bir konum filtresince yanlışlıkla eleniyordu). Artık ikisi birleştiriliyor.
Notlar
- Sayfalanmış panolarda sayfalar arası tempo daha yumuşak (150 yerine 250 ms), tek ana bilgisayarlı kariyer sitelerine nezaketen. Tarama kaynakları: 81 (76 İngilizce + 5 Rusça) — değişmedi (Job Bank girdi, EchoJobs çıktı). Test takımı: 2685.
[1.211.0] — 2026-08-19
Eklendi — Yourator, Tayvanlı bir teknoloji iş panosu. Düzeltildi — başlık/şirket adındaki aksanlı varlıklar artık her yerde çözülüyor ve adında aksan olan bir şirket artık yanlışlıkla işaretlenmiyor.
Eklendi
- Yourator (yourator.co) — Tayvan teknoloji ve dijital iş pazarı için yeni, token gerektirmeyen bir tarama kaynağı.
#/scansayfasındaki Kaynak filtresinden seçin ya daprovider: youratorolan bir şirket ekleyin. Genel JSON API’sini okur (anahtar yok, tarayıcı yok), panonun her sayfasını gezer ve her ilanın gerçek işveren bağlantısını (kendi ATS’i) izleme parametreleri temizlenmiş olarak verir.
Düzeltildi
- Aksanlı adlandırılmış varlıklar artık her yerde çözülüyor. Paylaşılan HTML çözücü Latin-1 harflerini kazandı (
é→ é,ç→ ç, …); böyleceDéveloppeurya daFrançaisyazan bir Avrupa panosu bu düz metni artık bir başlıkta, izleyicide veya üretilen bir belgede bırakmıyor. (Büyük harfler büyük kalır —ÉÉ’dir, é değil — ve&constructor;gibi bir arama artık kendisine çözülür.) - Adında aksan olan bir şirket, kendi alan adında olduğu için artık yanlışlıkla işaretlenmiyor. “Işık” artık “isik” olarak katlanıp isik.com.tr ile eşleşiyor; “Société Générale” societegenerale.com ile eşleşiyor. Eski denetim aksanlı harfleri ASCII tabanına katlamak yerine siliyordu.
Notlar
- Tarama kaynakları: 81 (76 İngilizce + 5 Rusça). Test takımı: 2667.
[1.210.1] — 2026-08-19
Düzeltildi — “&” ya da tırnak içeren Habr Career ilan başlıkları ve şirket adları artık bozuk gelmiyor.
Düzeltildi
- Habr Career kaynağı artık başlık ve şirket adı içindeki HTML varlıklarını ileri akmadan önce çözüyor. Sunucuda işlenen kartlar kaçışlı geliyor (“Changellenge >>”, “Demand Forecasting & Inventory Optimization”, “ООО "М-ТЕХ"”); bu yüzden çözülmemiş bir “&”, kendi “&” başlık filtrenizde sessizce başarısız oluyordu — önceki sürümün diğer beş panoda kapattığı belirtinin aynısı — ve şirket adları izleyiciye ve raporlara bozuk ulaşıyordu. Varlık çözme artık etkilenen altı kaynağın tamamında tamamlandı.
Notlar
- Test takımı: 2644.
[1.210.0] — 2026-08-19
Eklendi — Senjob, tarayıcının ilk Afrika iş ilan panosu (Senegal); beş panoda daha isabetli başlık eşleştirme.
Eklendi
- Senjob (senjob.com) — Senegal için yeni, token gerektirmeyen bir tarama kaynağı ve tarayıcının ilk Afrika panosu.
#/scansayfasındaki Kaynak filtresinden seçin ya daprovider: senjobolan bir şirket ekleyin. Genel listeyi düz HTTP ile okur (anahtar yok, tarayıcı yok), her isteği senjob.com’a sabitler ve — HTML ayrıştırdığı için — birden hiçbir şey döndürmeyen bir listeyi işsiz bir ülke değil, bozuk bir pano (görünür bir hata) olarak ele alır.
Düzeltildi
- İçinde “&” olan başlıklar artık beş panoda ilan düşürmüyor — beesite, Cornerstone (csod), Hacker News “Who is hiring”, Phenom ve TKMS’te başlıklar HTML kaçışlı gelir; bu yüzden “R&D Engineer” gibi bir roldeki kaçışlı “&”, kendi “r&d” anahtar kelimenizde başarısız olur ve ilan sessizce kaybolurdu (“sales & marketing” vetosu da hiç tetiklenmezdi). Artık başlıklar — ve Phenom konumları — filtrelemeden önce çözülür.
Notlar
- Tarama kaynakları: 80 (75 İngilizce + 5 Rusça). Test takımı: 2643.
[1.209.0] — 2026-08-17
Eklendi — uygulama içi yardım artık bir başvurunun sonucunu kaydetmeyi kapsıyor ve “Dokümana sor” seni oraya yönlendirebiliyor.
Eklendi
- İzleyici yardımı (§11) 17 dilin tümünde bir “Bir sonucu kaydet” bölümü kazandı; Sonuç düğmesini anlatıyor: ne olduğunu seç (reddedildi / teklif / işe alındı / geri çevrildi / görmezden gelindi / mülakata geçti), ne yapacağını önizle, sonra kaydet — bu, sonucu not eder, gönderdiğin CV ve ön yazıyı arşivler ve satırın Durumunu senin yerine eşitler. Yüzen “Dokümana sor” yardımcısı bu kılavuzu okur, bu yüzden artık yalnızca Durumu elle düzenlemeni önermek yerine seni o düğmeye yönlendirir.
Notlar
- Her yardım paketi artık 31 H2 / 119 H3 (önceden 118); eşlik bekçileri buna göre yükseltildi. Yalnızca belge — kod veya davranış değişikliği yok. Takım: 2625.
[1.208.2] — 2026-08-16
Düzeltildi — telefonda bildirim ve tema düğmeleri artık arama kutusunun üstünde durmuyor.
Düzeltildi
- v1.208.1, üst çubuğun düğmelerinin sayfa başlığıyla çakışmasını önledi ama dar — en dar olmasa da — bir telefonda, özellikle düğme etiketleri uzun olan dillerde, çubuğun tamamı yine tek satıra sıkışıyor, böylece 🔔 ve 🌙 düğmeleri arama kutusunun üstüne binebiliyordu. İşlem düğmeleri (bildirimler, tema, Tanılama, Scan Aç) artık telefonda her zaman tam genişlikte kendi ikinci satırına iniyor; böylece arama kutusu tümüyle okunabilir kalıyor ve hiçbir şey çakışmıyor.
Notlar
- Telefonda çubuğun işlem düğmeleri tam genişlikte ikinci bir satıra taşınarak, düzenin artan negatif alanı çakışma olarak dağıttığı kırılgan “neredeyse dolu satır” bandını ortadan kaldırıyor. Bir Playwright bekçisi artık tam tetikleyiciyi — 565–640px bandında uzun etiketli bir dil — yeniden üretiyor ve çubuğun denetimlerinin asla piksel paylaşmadığını doğruluyor. Takım: 2621.
[1.208.1] — 2026-08-16
Düzeltildi — telefonda üst çubuğun düğmeleri artık sayfayla çakışmıyor.
Düzeltildi
- v1.208.0, dar ekranlarda üst çubuğun işlem düğmelerini (Tanılama, Scan Aç, bildirimler, tema) ikinci satıra kaydırıyordu ama çubuk sabit yükseklikte kaldığından, kaydırılan satır taşıp sayfa başlığının üstüne biniyordu. Çubuk artık satırlarını almak için büyüyor ve içerik altından akıyor.
Notlar
- Çubuğun sabit
heightdeğerimin-heightoldu; böylece her genişlikte içerikle birlikte büyüyor (masaüstü değişmedi). Bir Playwright bekçisi artık çubuğun sayfaya taşmadığını da denetliyor. Takım: 2621.
[1.208.0] — 2026-08-16
Düzeltildi — uygulama artık bir telefon ekranına sığıyor: yana kaydırma bitti.
Düzeltildi
- Dar ekranda uygulamanın tamamı yana kayıyordu — üst çubuk, tablolar, yardım makaleleri ve ayar sekmeleri sağ kenarı aşıyordu. Artık her sayfa her genişliğe sığıyor: üst çubuk düğmeleri ikinci satıra kayar, geniş tablolar ve kod blokları kendi kutusunda kayar, yardım içindekiler tablosunu makalenin üstüne yığar, düğme/sekme satırları alt satıra geçer ve uzun yollar veya URL’ler sayfayı germek yerine satır kırar.
Notlar
- Kök neden klasik flex/grid min-width: auto tuzağı ve birkaç sarmalanmamış geniş öğeydi; ızgara öğelerine
min-width: 0, markdown/başlıklaraoverflow-wrap, kaydırılabilir bir markdown tablosu ve mobil kırılma noktasında yardım ızgarasının dikey yığılmasıyla düzeltildi. Bir Playwright bekçisi ana rotalarda 375 px’te 0 yatay taşma doğrular.tests/playwright-smoke.mjs. Takım: 2621.
[1.207.2] — 2026-08-16
Düzeltildi — yapay zekâ planları ve kariyer yönlendirme profilleri artık ham kod dökümü olarak görünmüyor.
Düzeltildi
- Bazı modeller tüm yanıtı bir
markdown …kod çitine sarar. Bu olduğunda gelişim planı ve yönlendirme profili, başlıklı ve listeli bir belge yerine tek aralıklı kod bloğu olarak görünüyordu. Saran çit artık kaldırılıyor — yalnızca tüm yanıtı sardığında ve dil açıkçamarkdown/mdolduğunda, böylece gerçek birpython/js/dilsiz ``` kod yanıtı olduğu gibi kalır.
Notlar
- Ortak LLM temizleme adımında (
cleanLlmMarkdown) tek seferde ele alındı, böylece tüm yapay zekâ rotaları yararlanır ve sarılmış yanıtın içindeki kod blokları korunur.tests/llm-output.test.mjs(+3). Takım: 2621.
[1.207.1] — 2026-08-16
Düzeltildi — açılış sayfası küçük telefonlarda artık yana taşmıyor.
Düzeltildi
- Dar bir telefonda hero bölümü — başlık, giriş satırı ve kurulum terminali — sağ kenardan kırpılabiliyordu; çünkü uzun bir kurulum komutu ve düzen sütunları ekrana göre küçülmüyordu. Artık her genişliğe sığıyorlar; kurulum komutu kendi terminal kutusunun içinde kayıyor.
Notlar
- Ayrıca, bir kaynağın geçici 404’ü yüzünden başarısız olabilen kararsız bir E2E duman testi sağlamlaştırıldı: artık komşu testler gibi zararsız ağ gürültüsünü (favicon / bağlantı / başarısız kaynak) yok sayıyor, gerçek betik hatalarını yakalamayı sürdürüyor. Uygulama davranışı değişmedi. Takım: 2618.
[1.207.0] — 2026-08-15
Eklendi — bir başvurunun sonucunu doğrudan takip tablosundan kaydedin.
Eklendi
- Her takip satırına bir Sonuç işlemi geldi: ne olduğunu seçin (reddedildi, teklif alındı, işe alındı, teklif reddedildi, yanıt yok, mülakata geçti), isteğe bağlı bir not ekleyin, ortaya çıkan durumu önizleyin ve kaydedin. Kaydetmek gönderilen CV ve ön yazı dosyalarını arşivler ve takip tablosunu kanonik duruma senkronlar — elle düzenleme yerine tek, belirlenimci bir işlem.
Notlar
- Yeni
POST /api/outcome, sonuç CLI’sini aktarır:dryRun:truesalt-okunur bir önizlemedir (satırı eşler, ortaya çıkan durumu bildirir, hiçbir şey yazmaz); gerçek çağrı kaydeder. Yazma güvenliği: sonuç türü bilinen kümeyle sınırlanır ve her metin alanı çağrıdan önce kontrol karakteri içerirse reddedilir (dizi argümanları, spawn — kabuk yok).tests/outcome-route.test.mjs. Takım: 2618.
[1.206.0] — 2026-08-15
Belgeler — uygulama içi yardım kılavuzu artık en yeni beş özelliği 17 dilin tamamında kapsıyor.
Eklendi
- Yerleşik yardım kılavuzu — ve ona dayanarak yanıt veren «Yardıma sor» asistanı — artık yakın zamanda eklenen beş özelliği belgeliyor: Kurulum doktoru (Ayarlar — CV ve profilinizi eksikler ve kalan örnek veriler için denetler), ATS panolarını keşfet (Portallar — bir şirketin kariyer panosunu otomatik bulur), «hâlâ açık mı?» denetimi (Takip — ilanın hâlâ açık olup olmadığı), «önceki CV’yi yeniden kullan?» ipucu (CV Stüdyo — daha önce uyarlanmış bir CV yeni ilana uyduğunda bildirir) ve Beceri günlüğü (Analitik — öz değerlendirme puanlarını kaydet). Beş yeni alt bölüm, 17 dilin tamamına çevrildi.
Notlar
- Kılavuz yapısı 31 H2 / 118 H3’e büyür, her dilde parite güvence altında. Başvuru belgeleri güncellendi:
docs/architecture/API.mdbu özelliklerin beş rotasını belgeliyor veCLAUDE.mdiledocs/sdd/CONVENTIONS.mdiçindeki rota/sürüm sayaçları güncel (36 rota modülü). Takım: 2610.
[1.205.0] — 2026-08-15
Eklendi — sınav/değerlendirme sonuçlarını kaydeden bir Beceri günlüğü.
Eklendi
- Yeni bir Beceri günlüğü (Analitik → Beceri günlüğü) bir öz değerlendirmeyi kaydetmenizi sağlar — şirket, platform, beceri, puan % ve isteğe bağlı bir not —
data/assessments.tsv’ye eklenir; geçmiş kayıtlar (en yeni önce) listelenir. Sıfır token, belirlenimci; dosya biçimini üst projenin CLI’si yönetir.
Notlar
- Yeni
GET /api/assessments(assessment-log.mjs’nin varsayılan JSON listesini aktarır; yumuşak başarısızlık{available:false}) +POST /api/assessments(açık yazma: alanlarassessment-log.mjs add’e dizi argümanları olarak geçirilir). Yazma güvenliği: kontrol karakteri içeren her metin alanı reddedilir (TAB bir sütunu bozar, yeni satır bir satır enjekte eder) → yazmadan önce 400; puan/eşik 0–100 ile sınırlı, uzunluklar sınırlı.tests/assessments-route.test.mjs. Takım: 2610.
[1.204.0] — 2026-08-15
Eklendi — Ayarlar’da eksik ya da örnek veri kalıntılı CV/profili işaretleyen bir “Kurulum doktoru” paneli.
Eklendi
- Ayarlar → Kurulum doktoru artık
cv.mdveconfig/profile.ymldosyanızı sıfır token ile denetler ve engelleyici sorunları (eksik dosya/alan) ve uyarıları (kalan örnek/yer tutucu veriler, sabit kodlanmış metrikler) listeler — böylece eksik bir kurulumu, taramalarınızı ve uyarlamalarınızı zayıflatmadan yakalarsınız. Salt okunur; tek tıkla yeniden çalıştırılır.
Notlar
- Yeni salt okunur
GET /api/cv-sync-check, üst projenincv-sync-check.mjs’sini aktarır; bu betik metin + bir çıkış kodu yazar (--jsonyok); rota, kararlıERROR:/WARN:satırlarını hafifçe{ok, errors[], warnings[]}olarak ayrıştırır — başarıyı çıkış kodu değil, başlık belirler. Bağımsız kurulumlarda{available:false}ile yumuşak başarısızlık.tests/cv-sync-check-route.test.mjs. Takım: 2602.
[1.203.0] — 2026-08-15
Eklendi — CV Studio’da “önceki bir CV’yi yeniden kullan?” ipucu.
Eklendi
- CV Studio’da kayıtlı bir ilanı açtığınızda, uygulama artık onu diğer kayıtlı ilanlarınızla karşılaştırır (belirlenimci sözcük örtüşmesi, sıfır token) ve en yakınının o uyarlanmış CV’yi yeniden kullanmaya, düzeltmelerle yeniden kullanmaya yetip yetmediğini ya da yeni bir tane uyarlamanız gerektiğini söyler — böylece zaten hedeflediğiniz bir rol için sıfırdan başlamazsınız.
Notlar
- Yeni salt okunur
GET /api/jds/:name/reuse, üst projeninjd-similarity.mjs’sini (Jaccard örtüşmesi + kıdem koruması; JSON{decision, score, reason}) her önceki ilan için bir kez aktarır (fan-out 25 ile sınırlı, en iyisi kazanır); betik veya önceki ilanlar yoksa{available:false}ile yumuşak başarısızlık.tests/jd-similarity-reuse-route.test.mjs. Takım: 2594.
[1.202.0] — 2026-08-15
Eklendi — bir şirketin ATS iş panosunu #/portals’tan keşfedin ve izlemeye başlayın.
Eklendi
- #/portals’ta bir şirket adı yazın; uygulama Greenhouse, Ashby ve Lever’i genel panosu için yoklar — sıfır LLM, tarayıcı yok — ve mevcut olup şu anda ≥1 ilan listeleyen panoları gösterir. Tek tık, seçilen panoyu tarayıcınızın izlediği şirketlere ekler. Yoklama salt okunurdur;
portals.yml’ye yazma yalnızca Ekle’ye tıklayınca olur.
Notlar
- Yeni
server/lib/discover-ats.mjs(sabit ana makine, karakter kümesi doğrulanmış slug’ı DNS sabitlisafeGetile yoklar, istek başına ≤12 yoklama) +POST /api/portals/discover(salt okunur) vePOST /api/portals/track(açık yazma:withFileLock+ metin ekleme + yeniden ayrıştırma koruması + atomik yeniden adlandırma; yalnızca bilinen ATS ana makineleri, idempotent). Tarayıcının adaptör kaydını yeniden kullanır. i18n ×17.tests/discover-ats-resolver.test.mjs+tests/discover-ats-route.test.mjs. Takım: 2588.
[1.201.0] — 2026-08-15
Düzeltildi — yerelleştirilmiş veya değişken sütun başlıkları olan bir izleyici artık boş görünmüyor.
Düzeltildi
data/applications.mddosyanız İngilizce olmayan veya değişken başlıklar kullanıyorsa — İspanyolcaempresa/puesto/estado/fecha/enlaceya daposition/stage/link— izleyici bunları yanlış anahtarlarla okuyup Şirket / Rol / Durum / Tarih / Bağlantı sütunlarını boş gösteriyordu. Artık bu başlıklar kanonik alan adlarına katlanıyor ve izleyici doğru görünüyor. Tamamen İngilizce bir izleyici eskisi gibi işlenir.
Notlar
parseApplications(server/lib/parsers.mjs) içinde yeniHEADER_ALIASEStablosu + bir normalleştirme katlaması; bilinmeyen veya zaten kanonik başlıklar değişmeden geçer.tests/tracker-header-aliases.test.mjs. Takım: 2563.
[1.200.0] — 2026-08-15
Eklendi — takip listenizde ATS barındırmalı ilanlar için tek tıkla “hâlâ açık mı?” kontrolü.
Eklendi
- #/tracker üzerinde, URL’si Greenhouse / Lever / Ashby / Workday / SmartRecruiters ilanı olan bir başvuru artık “Hâlâ açık mı?” düğmesi gösteriyor. Tek tık, ATS’nin kendi genel JSON’unu sorgular — sıfır token, tarayıcı yok — ve Açık / Süresi dolmuş / Bilinmiyor gösterir; böylece her birini açmadan ölü ilanları fark edersiniz. Tasarımı gereği ihtiyatlı: yalnızca kesin 404/410 Süresi dolmuş sayılır; belirsiz olan Bilinmiyor kalır (asla yanlış Süresi dolmuş).
Notlar
- Yeni
server/lib/liveness-core.mjs+liveness-api.mjsve salt okunurGET /api/liveness?url=(yazma yok, LLM yok). SSRF güvenli: URLisValidJobUrl’den geçer, ardından ATS API’sine yalnızca DNS sabitlisafeGetile sabit host ve karakter kümesi doğrulanmış yol parçalarıyla erişilir.tests/liveness-core.test.mjs+tests/liveness-route.test.mjs. Takım: 2557.
[1.199.0] — 2026-08-15
Düzeltildi — geniş tablolar artık kırpılmak yerine yatay kayıyor.
Düzeltildi
- Scan sayfasında (ve diğer tüm tablolarda — İzleyici, İstatistikler, Kullanım, Panel) pencereden geniş bir tablo kaydırma çubuğu olmadan kırpılıyor ve en sağdaki sütunlara erişilemiyordu. Geniş tablolar artık gerektiğinde yatay kaydırma çubuğu gösteriyor, böylece her sütun her genişlikte erişilebilir kalıyor.
Notlar
public/css/components.cssiçindeki.table-wrap,overflow: hiddenyerineoverflow-x: autooldu (mevcut.reports-scrollkabıyla aynı); yuvarlatılmış kenarlık korunur.tests/table-wrap-scroll.test.mjs. Takım: 2540.
[1.198.0] — 2026-08-15
Eklendi — tarama yeniden denemeleri artık üstel geri çekilme, jitter kullanıyor ve hız sınırlayıcının Retry-After başlığına uyuyor.
Eklendi
- Bir iş ilanı panosu tarama sırasında kısa süreliğine hız sınırladığında veya hata verdiğinde (HTTP 429 / 5xx), yeniden deneme artık sabit kısa bir gecikme yerine üstel geri çekilme + jitter ile bekliyor — meşgul bir pano aynı tempoda tekrar tekrar dövülmüyor ve eşzamanlı yeniden denemeler yeniden aynı anda çarpışmıyor. Panonun gönderdiği
Retry-Afterdikkate alınıyor (ancak sınırlandırılmış, böylece düşmanca birRetry-After: 86400tüm taramayı durduramıyor). Kalıcı hatalar (404, reddedilen yönlendirmeler) hâlâ hemen başarısız oluyor — değişiklik yok.
Notlar
server/lib/http-json.mjsiçinde yeniparseRetryAfterMs()ve safcomputeRetryDelayMs();fetchJsonartık ok olmayan bir yanıtta.retryAfteryakalıyor vefetchJsonWithRetryisteğe bağlı birmaxDelayMs(varsayılan 8000) alıyor.tests/http-json.test.mjs(+9). Takım: 2536.
[1.197.0] — 2026-08-14
Eklendi — bir Getro VC iş ilan panosunu yalnızca careers_url ile takip edin; koleksiyon id’si kendiliğinden çözülür.
Eklendi
- Takip edilen bir Getro panosu (b2venture, Earlybird, Point Nine, …) artık elle bulunan sayısal bir
getro_collectiongerektirmiyor. Panonun kendicareers_urldeğerini verin; id, ilk taramada o sayfadan kendiliğinden çözülür — SSRF’ye karşı güvenli tek bir GET, sayısalnetwork.iddeğerini sayfanın gömülü verisinden doğrudan okur. Açık birgetro_collectionyine önceliklidir ve getirmeyi tümüyle atlar.
Notlar
server/lib/sources/getro.mjsiçinde yenihttpsCareersUrl(),extractCollectionId()ve asenkronresolveCollectionId(); pano sayfası DNS’e sabitlenmiş, boyutu sınırlısafeGetile getirilir ve çözülen id,assertGetroUrltarafından hâlâapi.getro.comana bilgisayarına sabitlenir. Adaptör artık id olmadan bile httpscareers_urltaşıyan birprovider: getrogirdisiyle eşleşir.tests/sources-getro.test.mjs(+8). Takım: 2527.
[1.196.0] — 2026-08-14
Düzeltildi (güvenlik) — Workday adaptörü bir api uç noktasını alt dize değil, ana bilgisayar adıyla doğrular.
Düzeltildi
portals.yml’deki bir Workdayapi:değeri artık yalnızca ana bilgisayar adımyworkdayjobs.com(veya.myworkdayjobs.comalt alan adı) olduğunda kabul edilir. Eski kontrol bir alt dize eşleşmesiydi, bu yüzden dizeyi yalnızca içeren herhangi bir URL — örn.https://example.com/?x=myworkdayjobs.com— geçiyor ve uç nokta olarak kullanılabiliyordu. Gerçek Workday uç noktaları etkilenmez. (CodeQL tarafından bildirildi, #443.)
Notlar
- Yeni
isWorkdayApi()URL’yi ayrıştırır ve ana bilgisayarı kontrol eder (server/lib/portals/adapters/workday.mjs).tests/workday-adapter-endpoint.test.mjs(+1). Takım: 2522.
[1.195.0] — 2026-08-14
Performans (tarayıcı) — yeniden yayın tespiti büyük tarama geçmişlerinde hızlı kalıyor.
Performans
- Yinelenen ilan tespiti büyük bir
scan-history.tsv’de artık O(N²)’ye düşmüyor. Şirket bazında başlık gruplaması, her çift için tam birroleFuzzyMatchödeyen iç içe bir döngüydü; artık bir ters dizin — satırları tek geçişte tam başlığa göre kovalara ayır, sonra yalnızca ayırt edici (temel olmayan) bir belirteci paylaşan FARKLI kovalar arasında bulanık eşleştirme yap. Çıktı aynı — aynı yeniden yayın kümeleri — eski algoritmaya karşı 200+ rastgele geçmişte diferansiyel testle kanıtlandı.
Notlar
server/lib/detect-reposts.mjsiçindegroupRowsByTitle(diferansiyel test için dışa aktarıldı).tests/detect-reposts-grouping.test.mjs(+2). Takım: 2521.
[1.194.0] — 2026-08-14
Düzeltildi (tarayıcı) — tek segmentli URL’ye sahip Workday kariyer sayfaları artık doğru taranıyor.
Düzeltildi
- Workday adaptörü artık yolu tek segment olan kariyer URL’lerini ayrıştırıyor — örn.
https://parsons.wd5.myworkdayjobs.com/Search,.../KBR_Careers,.../Careers. Önceden siteExternal’e düşüyor, adaptör yanlış CXS uç noktasına gidiyor ve bir sonda sağlıklı görünüp hiçbir şey döndürmeyebiliyordu. Artık yolun ilk boş olmayan segmentini site olarak alıyor (en-USgibi bir dil önekini atarak); belgelenen/en-US/Externaldurumu değişmedi. (#255’te bildirildi.)
Notlar
server/lib/portals/adapters/workday.mjsiçinde yapısal yol ayrıştırma.tests/workday-adapter-endpoint.test.mjs(+7). Takım: 2519.
[1.193.0] — 2026-08-14
Eklendi (istatistikler) — hatırlatmaya değer mülakatları öne çıkaran bir “Mülakat sonrası sessizlik” sekmesi.
Eklendi
#/statsiçinde bir Mülakat sonrası sessizlik sekmesi: bir nezaket penceresini (varsayılan 30 gün) aşarak sessizleşen mülakatlar, aktif mülakatlarını ve takip panonu birleştirir — her birinin ne kadar süredir sessiz olduğu, son mülakat tarihi ve nedeniyle. Nazik bir hatırlatma/kapatma listesi; yalnızca öneri, asla bir ret iddiası değil. Token yok.
Notlar
- Yeni
GET /api/stats/rejection-latencyrotası (fail-soft{available:false}).tests/stats-rejection-latency-route.test.mjs(+2). +10 i18n anahtarı ×17;#/statshelp-hint 7→8 sekme. Takım: 2510.
[1.192.0] — 2026-08-14
Eklendi (cv-studio) — hiç sahip olmadığın sayıları yakalayan bir “CV’nizin gerçeklerini denetleyin” kapısı.
Eklendi
#/cv-studioiçinde bir CV’nizin gerçeklerini denetleyin kartı: uyarlanmış bir CV veya ön yazı yapıştırın ve öne sürülen her metriği ve olguyu gerçek CV, profil ve two-pager’ınızla karşılaştırın. pass / warn / block kararının yanı sıra tam olarak uydurma metrikleri, desteksiz olguları ve yasak / uyarı ifadelerini alırsınız. LLM yok; hiçbir şey yazılmaz.
Notlar
- Yeni
POST /api/cv-studio/verify-factsrotası: metni tek kullanımlık geçici bir dosyaya yazar veverify-cv-facts.mjs’yi çalıştırır; betik block’ta 1 ile çıksa bile JSON kararına güvenir.tests/cv-studio-verify-facts-route.test.mjs(+4). +15 i18n anahtarı ×17. Takım: 2508.
[1.191.0] — 2026-08-14
Eklendi (istatistikler) — önce öğrenilecek becerileri sıralayan bir “Sırada ne öğrenmeli” sekmesi.
Eklendi
#/statsiçinde bir Sırada ne öğrenmeli sekmesi: tüm takip panosu genelinde beceri boşluğu özeti — düşük uyumu en sık batıran eksik beceriler, ağırlıklı (her raporda 5−uyum puanı) ve Critical / High / Medium kademeli — ayrıca CV/profilinin zaten kapsadıkları. Salt okunur, yalnızca öneri, token yok.
Notlar
- Yeni
GET /api/stats/upskillrotası (veri azken{ error }alanı; betik yokken{available:false}).tests/stats-upskill-route.test.mjs(+3). +15 i18n anahtarı ×17. Takım: 2504.
[1.190.0] — 2026-08-14
Eklendi (takip panosu) — hangi şirketlerin sana gerçekten yanıt verdiğini gösteren bir “Şirket geçmişi” paneli.
Eklendi
#/trackerüzerinde bir Şirket geçmişi kartı: bir şirket seç ve salt okunur kanıt al — sana ne kadar yanıt verdiği (sana karşı sessiz / karışık / daha önce yanıt verdi) ve aynı ilanın tekrar tekrar yayınlanıp yayınlanmadığı — takip panonu, takip mesajlarını ve tarama geçmişini birleştirerek. Token yok; tarayıcı hiç çağrılmaz.
Notlar
- Yeni
GET /api/stats/company-history[?company=]rotası (fail-soft{available:false}).tests/stats-company-history-route.test.mjs(+3). +18 i18n anahtarı ×17. Takım: 2501.
[1.189.0] — 2026-08-14
Düzeltildi (tarayıcı) — Roma rakamıyla yazılan kıdem seviyeleri artık Latin olmayan başlıklarda da sayılıyor.
Düzeltildi
skip_tiersarkasındaki kademe sınıflandırıcısı artık herhangi bir yazı sisteminde rol kelimesinden sonra gelen Roma rakamı seviye ekini (I / II / III / IV / V) okuyor — “Инженер III”, “エンジニア I”, “Ingénieur IV” — yalnızca ASCII kelimelerden sonra değil. Önceden Latin olmayan bir kelimeden sonraki seviye rakamı yok sayılıyor ve ilan mid’e düşüyordu, bu yüzdenskip_tiers: [senior]veya[entry]onları atlıyordu.
Notlar
server/lib/classify-tier.mjsiçinde yazı sisteminden bağımsız lookbehind; ölü yinelenenSr.eşleştiricisi kaldırıldı.tests/classify-tier.test.mjs(+1). Takım: 2498.
[1.188.0] — 2026-08-14
Düzeltildi (UI) — birincil eylem düğmeleri artık sayfa alt başlığına yapışık durmuyor.
Düzeltildi
- Haftalık mülakat özeti, Yatırım alan şirketler, Portallar, Kariyer planı ve Kariyer yönlendirmesi sayfalarındaki birincil eylem/kontrol satırı artık uygun bir üst kenar boşluğuna sahip; böylece düğme alt başlığa yaslanmak yerine altında nefes alıyor.
Notlar
- Regresyon koruması
tests/lead-row-top-margin.test.mjs(+5). Takım: 2497.
[1.187.0] — 2026-08-14
Düzeltildi (tarayıcı) — skip_tiers ayarı yeniden çalışıyor: kıdeme göre atlamak istediğiniz ilanlar eleniyor.
Düzeltildi
portals.yml’deki birskip_tiers:listesi (ör.skip_tiers: [intern, entry]) artık taramada dikkate alınıyor. Her ilanın başlığı bir kıdem düzeyine (intern / entry / mid / senior) sınıflandırılır ve düzeyi listenizdeyse elenir. Önceden tarama başlık / konum / içerik / güven filtrelerini çalıştırıyor ama düzey filtresi yoktu, bu yüzdenskip_tierssessizce yok sayılıyordu. Düzey sözcüğü olmayan başlıklar mid’e düşer (böyleceskip_tiers: [mid]sıradan ilanların çoğunu da eler) ve sınıflandırıcı EN SOLDAKİ düzey sözcüğünü okur.
Notlar
- Yeni saf modül
server/lib/classify-tier.mjs(classifyTier+buildTierFilter), EN ve RU tarayıcılarının filtre zincirlerine bağlandı.tests/classify-tier.test.mjs(+7). Takım: 2492.
[1.186.0] — 2026-08-14
Eklendi (CV Studio) — bir “Beceri açığı” paneli: bir işin gerekli becerilerinden hangilerini CV’niz adlandırıyor, ima ediyor veya eksik.
Eklendi
- CV Studio’da yeni bir Beceri açığı paneli. Kayıtlı bir iş tanımı seçin; her gerekli beceriyi CV’nizde adlandırılan, CV’nizde ima edilen veya eksik olarak ayırır — LLM’siz kelime karşılaştırması, hiçbir şey yazılmaz. İlanda net bir gereksinim bölümü yoksa düşük güven notu görünür.
Notlar
- Yeni
GET /api/jds/:name/skill-gap(iş adı, argüman olmadan önce yol-temizlemesinden geçirilir vejds/altında doğrulanır; betik yoksa{available:false}’e yumuşak geri dönüş). +13 i18n anahtarı ×17. Testler:tests/jds-skill-gap-route.test.mjs(+4, yol geçişi reddi dahil). Takım: 2485.
[1.185.0] — 2026-08-14
Eklendi (istatistik) — “Huni ve hız” sekmesi: huniniz piyasayla nasıl kıyaslanıyor ve aşamalar arasında ne kadar hızlı ilerliyorsunuz.
Eklendi
- İstatistik’teki yeni Huni ve hız sekmesi, piyasa kıyaslama aralıklarının yanında yanıt ve mülakat oranlarınızı (küçük örneklem ve seçim yanlılığı uyarılarıyla), tipik ilk yanıt penceresini aşan süregelen başvuruların bir bekleme listesini ve aşama başına medyan günü (Başvuruldu → Yanıtlandı → Mülakat → Teklif) gösterir — yavaş satırlar medyanları saptırmasın diye sağdan sansürlenir. Salt okunur ve sıfır token; yalnızca kendi takipçinizi okur.
Notlar
- Yeni
GET /api/stats/funnel(betik yoksa{available:false}’e yumuşak geri dönüş). +18 i18n anahtarı ×17. Testler:tests/stats-funnel-route.test.mjs(+2). Takım: 2481.
[1.184.0] — 2026-08-14
Düzeltildi (arayüz) — Panodaki hızlı işlem kutucukları artık düzgün bir ızgarada hizalanıyor.
Düzeltildi
- Panoda (Komuta Merkezi) 3 kutucukluk bir grup 4 kutucukluktan daha geniş görünüyor, bu da bölümlerin sağ kenarını düzensiz bırakıyordu. Artık her grup eşit genişlikte sütunlar kullanıyor (geniş ekranda 4, pencere daraldıkça 3 / 2 / 1’e iniyor), böylece tüm kutucuklar aynı boyutta ve sağ kenarları hizalı.
Notlar
- Yalnızca CSS (
.qa-grid:auto-fillyerine sabitrepeat(N, minmax(0,1fr))).tests/dashboard-grid-align.test.mjsile korunuyor (+2). Takım: 2479.
[1.183.0] — 2026-08-14
Eklendi (tarayıcı) — daha akıllı yinelenen tespiti: takip bağlantısıyla yeniden yayımlanan aynı ilan artık iki kez görünmüyor.
Eklendi
- Tarayıcı artık bir ilanı kanonik URL anahtarıyla tanıyor; böylece takip parametresiyle (
?utm_…,gclid, …),httpyerinehttps, ya da sondaki eğik çizgi /#parçaile yeniden yayımlanan aynı ilan, olduğu tek ilan olarak ele alınır — tarama sonuçlarında veya pipeline’da yinelenen satır yok ve zaten gördüğünüz bir ilana boşa değerlendirme yok. Gerçekten farklı ilanlar (gh_jidgibi korunan işlevsel bir id) hâlâ ayrı sayılır.
Notlar
- Yeni
server/lib/url-key.mjs, her iki tarayıcının dedup’ına ve pipeline yazıcısına bağlandı. Bilerek az normalleştirir — iki farklı ilanı asla birleştirmez. Testler:tests/url-key.test.mjs(+5),tests/parsers.test.mjs(+1). Takım: 2477 (+6).
[1.182.0] — 2026-08-14
Düzeltildi (tarayıcı) — maaş aralıkları artık her dilde aynı görünüyor.
Düzeltildi
- Tarama ve takipçi satırlarındaki maaş rakamları, İngilizce olmayan arayüzlere çevrilmeden sızan İngilizce “from” / “up to” sözcükleri yerine yerelden bağımsız ≥ ve ≤ sembollerini kullanıyor (ör.
≥ 120000 EUR,≤ 90000). Tek yönlü aralık bildiren tüm panolara uygulanır (Getro, Remotli, Manfred, Agentic Jobs, JustJoin, Jobicy); çift yönlü aralıklar (100000–150000 USD) zaten nötrdü.
Notlar
- Yalnızca görüntüleme — istemci maaş filtresi ön eke bakmadan sayıları ayrıştırır, filtreleme değişmez. Takım: 2471.
[1.181.0] — 2026-08-14
Eklendi (tarayıcı) — Getro iş panoları artık maaş, tüm konumları ve uzaktan ilanları gösteriyor.
Eklendi
- Getro tarayıcısı (fonların yetenek ağı panoları) artık her ilanda bir maaş (yıllık aralık + para birimi) gösteriyor, yalnızca ilkini değil tüm konumları listeliyor ve uzaktan ilanları etiketliyor. Taramanızdaki ve takipçinizdeki bir Getro ilanı artık diğer panolarla aynı maaş + konum ayrıntısını taşıyor.
Notlar
- Yalnızca tarayıcı; yeni bağımlılık yok, rota / CSP / SSRF değişikliği yok. Testler:
tests/sources-getro.test.mjs(+5). Takım: 2470 (+5).
[1.180.0] — 2026-08-14
Düzeltildi (ORTA, raporlar) — #/reports listesi artık bir tablo ve bir Machine Summary yer tutucusunun gizlediği gerçek bir puan geri kazanıldı.
Düzeltildi
#/reportslistesi 4 kartlık bir ızgara değil, bir tablodur (Rapor · Tarih · Meşruiyet · Puan). Uzun bir “Puan algılanmadı” çipi başlık sütununu neredeyse sıfıra sıkıştırıyor, ardından kart başlığındakioverflow-wrap: anywhererapor adını harf harf bölüyordu. Artık her alanın kendi sütunu var, ad hücresi sözcüklerden bölünür ve dar ekranda tablo yatay kayar (yeni.reports-scrollkonteyneri). Yeni i18n anahtarırep.colReport×17.- Gövdedeki gerçek bir puan (
**Итоговый балл:** 1.8 / 5) artık bir Machine Summary yer tutucusu (score: —) tarafından gizlenmiyor.## Machine Summarybloğu sayısal olmayan veya aralık dışı bir puan taşıdığında, ayrıştırılmış puan yuvasını dolduruyor ve kalın değer-biçimi yedeğini engelliyordu; böylece gövdede gerçek birX / 5olmasına rağmen rapor “Puan algılanmadı” gösteriyordu.parseReportHeaderartık kullanılabilir bir sayı kalmadığında gövdenin değer-biçimini geri kazanır (adım 4.5).
Notlar
- Yalnızca istemci + ayrıştırıcı; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/reports-table.test.mjs(+5),tests/report-header-locale.test.mjs(+2). Takım: 2465 (+7).
[1.179.0] — 2026-08-13
Değiştirildi (LOW, tarayıcı) — 20 yinelenen HTML varlık çözücüsü ortak modülde birleştirildi (parite devamı, worklist’i kapatır).
Değiştirildi
- 20 kazıma tarama kaynağının her biri kendi
decodeEntities/decodeXmlEntities’ini (+ birfromCodePointyardımcısı) taşıyordu — sürüklenmiş kopyalar (üçüRangeErrorfırlatabiliyordu, v1.172.0’de düzeltildi; diğerleri NUL/C0’a izin veriyor veyaa2;’yi yanlış ayrıştırıyordu). Artık hepsi tekserver/lib/html-entities.mjs’ten (XML 1.0 Char güvenli çözücü) geçiyor ve ~237 satır yineleme kaldırıldı. 8 RSS tarzı kaynak çözümü kazandı (önceden yalnızca 5 varlık); cryptocurrencyjobs’un kasıtlı çift çözümü bir takma adla korundu.hhkendi çözücüsünü tutuyor (—/–’yi işler, ortak 6’nın dışında). Yeni bir nöbetçi test, herhangi bir kaynak yerel çözücü yeniden oluşturursa başarısız olur.
Notlar
- Davranışı koruyan yeniden düzenleme; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/decoder-consolidation.test.mjs(+2). Takım: 2458 (+2).
[1.178.0] — 2026-08-13
Düzeltildi (LOW, üst parite) — iki eski sabit üst projeye uyacak şekilde güncellendi (PARENT-SYNC GAP #4 + #5).
Düzeltildi
- Tarayıcı User-Agent (GAP #4) —
BROWSER_LIKE_USER_AGENT(workable/workday/oraclecloud/a16z/eightfold tarafından WAF/bot geçitlerini aşmak için gönderilir) Chrome 131’den 151’e yükseltildi, üst projeninuser-agent.mjs’iyle uyumlu; eski bir sürüm daha sık engellenir. BirChrome major ≥ 151testiyle korunuyor. - Tracker durumları FALLBACK (GAP #5) —
states.mjs’deki son çareFALLBACK(yalnızca canlıtemplates/states.ymlokunamadığında kullanılır — taze klon / CI izole kök) üst projenin Türkçe durum takma adlarını (#2615) kazandı: değerlendirildi, başvuruldu, yanıt verildi, mülakat, teklif, reddedildi, iptal edildi, uygun değil, kabul edildi/işe alındı. Üretimde canlı dosya bunları zaten sağlıyordu.
Notlar
- Yalnızca iki sabit; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/http-json.test.mjs(+1) +tests/states.test.mjs(+1). Takım: 2456 (+2).
[1.177.0] — 2026-08-13
Düzeltildi (MEDIUM, tarayıcı) — arama API’sini oturum çerezleriyle koruyan kiracılarda csod (Cornerstone) 0 iş döndürüyordu (parent #2769, PARENT-SYNC GAP #1).
Düzeltildi
- Bazı Cornerstone kiracıları kariyer sitesi açılış sayfasında oturum çerezleri ayarlar ve bu çerezler anonim bearer belirteciyle birlikte geri gelmezse arama API’sine
401 CSOD Unauthorizedyanıtı verir.sources/csod.mjsartık açılışı yeni birfetchResponseyardımcısıyla okur,Set-Cookiedeğerlerinden birCookiebaşlığı kurar (cookieHeaderFrom— yalnızca ad=değer, jar semantiği) ve arama POST’unda yeniden gönderir. Yalnızca aynı köken (host sabitlenmiş +redirect:'error'), böylece oturum çerezleri asla üçüncü tarafa ulaşamaz; çerez ayarlamayan bir kiracı eskisi gibi davranır.
Notlar
- Yeni
server/lib/http-json.mjs::fetchResponse(eklemeli; mevcut kaynaklar etkilenmez). Rota / CSP / SSRF / üst yazma değişikliği yok. Testler:tests/sources-parity-v1118a.test.mjs(+1). Takım: 2454 (+1).
[1.176.0] — 2026-08-13
Düzeltildi (MEDIUM, raporlar) — RU tablosunun listelemediği kalın bir etiket altındaki puan hâlâ “Score not detected” gösteriyordu (FIND-5).
Düzeltildi
- İki RU raporu puanı
**Итоговый балл:** 1.8 / 5/**Скор:** 1.8 / 5olarak yazıyordu —REPORT_LABELS.ru’nun saymadığı kalın etiketler (yalnızca “Оценка”/“Балл” bilir), bu yüzden puan ayrıştırılmadan kalıyordu. Eş anlamlı listesini büyütmek yerine,parseReportHeaderartık değer biçimine düşüyor: herhangi bir kalın etiket altında /5 ölçütüne göre bir kesir. Dilden bağımsızdır, bir başlığa bağışıktır (**yok,/5değeri yok) ve5/5/2026gibi bir tarihi reddeder (paydaya negatif ileri bakış).
Notlar
- Yalnızca sunucu ayrıştırıcı; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/report-header-locale.test.mjs(+2). Takım: 2453 (+2).
[1.175.0] — 2026-08-13
Düzeltildi (LOW, sağlamlaştırma) — FIND-3 SEO açıklaması için bir regresyon nöbetçisi + null’a dayanıklı meşruiyet temizliği (AI-review takibi).
Düzeltildi
- SEO açıklaması parite nöbetçisi — her dilin
meta.descalanındaki sabit kodlu “~55”i kayıt defterinden türetilen{adapters}yer tutucusuyla değiştiren v1.174.0 düzeltmesinin testi yoktu, bu yüzden bir sonraki dil düzenlemesinde sessizce geri dönebiliyordu. Yeni, CI’dan yalıtılmıştests/site-meta-desc-parity.test.mjs, 17site/src/i18n/*.jsondosyasından biri yer tutucuyu kaybederse veya bir sayıyı yeniden sabit kodlarsa ya daLanding.astroonu üç açıklama meta’sına yerleştirmeyi bırakırsa başarısız olur. - Null’a dayanıklı meşruiyet temizliği —
stripEmphasisboş girdi için “undefined” dizesi yerine''döndürür (alanlar dize olarak başlatılır, yani derinlemesine savunma).
Notlar
- Test + ayrıştırıcıda tek satırlık bir nöbetçi; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/site-meta-desc-parity.test.mjs(+3). Takım: 2451 (+3).
[1.174.0] — 2026-08-13
Düzeltildi (HIGH, raporlar) — yerelleştirilmiş raporlar “Score not detected” gösteriyordu; SEO açıklaması eskimişti.
Düzeltildi
- Puan ayrıştırma (FIND-1) — H1’i puan etiketi sözcüğünü içeren İngilizce olmayan bir rapor (
# Оценка вакансии: <başlık>) artık o başlığı puan sanmıyor.parseReportHeaderşimdi yerelleştirilmiş kalın etikete (**Оценка:** 1.5 / 5) sabitleniyor, başlık satırlarını atlıyor ve etiketin iki noktaya bitişik olmasını istiyor — böylece “Score not detected” gösteren RU raporları gerçek puanını gösteriyor. - Meşruiyet rozeti (FIND-2) — değerden Markdown vurgusu temizleniyor, rozet “** High Confidence” yerine “High Confidence” gösteriyor.
- Puan taşması — sonuna durum metni eklenmiş bir puan satırı (“1.8, Status: Evaluated, …”) yalnızca puana sıkıştırılıyor;
.score-pillbir kaydırma-yok/taşma sınırı kazanıyor ve başlık sütunu daralabiliyor, böylece renkli rozet kart kenarından hiç taşmıyor. - SEO açıklaması (FIND-3) — cvstart.org’un meta / OG / Twitter açıklamaları (17 dilin tümü) “Scan ~55 job boards” değerini sabit kodluyordu, oysa gövde gerçek kayıt defterini sayıyordu (“~75”). Açıklama artık kayıt defterinden türetilen sayıyı yerleştiriyor, böylece bir daha kaymıyor.
Notlar
- Sunucu ayrıştırıcı + istemci render/CSS + site i18n; rota / CSP / SSRF / üst yazma değişikliği yok. Testler:
tests/report-header-locale.test.mjs(+4). Takım: 2448 (+4).
[1.173.0] — 2026-08-13
Eklendi (LOW, yapılandırma) — Hermes, algılanan yapay zeka CLI listesine katıldı (career-ops paritesi).
Eklendi
#/config→ “Yapay Zeka CLI Araçları” sekmesi artık üst projenin yeni desteklediği aracı çalışma zamanı Hermes’i (Nous Research, ikilihermes) algılıyor.server/lib/routes/cli-detect.mjsiçindeki sabit izin listesi 10’dan 11 araca çıkıyor; algılama salt okunur bir PATH taraması olarak kalıyor (hiçbir ikili asla çalıştırılmaz).
Notlar
- i18n / rota / CSP / SSRF / üst yazma değişikliği yok; liste sabittir, asla girdi değildir. Takım: 2444 (cli-detect kanaryası 10 → 11 güncellendi).
[1.172.0] — 2026-08-13
Düzeltildi (MEDIUM, tarayıcı) — bozuk bir HTML varlığı bir tarama kaynağını çökertebiliyordu (career-ops #2150 paritesi).
Düzeltildi
oraclecloud,gemvedassaultkaynakları, sayısal HTML varlıklarınıString.fromCodePointöncesinde yalnızca zayıf birNumber.isFinitedenetimiyle çözüyordu —0x10FFFFüzerindeki bir başvuru (ör. bozuk veya kötü niyetli bir akıştan�) yakalanmayan birRangeErrorfırlatıp o kaynağın tüm ayrıştırmasını iptal ediyordu. Ortak bir modülserver/lib/html-entities.mjs(üst projenin_html-entities.mjsdosyasını yansıtır) artık sayısal başvuruları XML 1.0 §2.2 Char kümesiyle sınırlar; böyleceString.fromCodePointasla fırlatamaz ve onaltılık ile ondalığı ayrı eşleştirdiği içina2;artık yanlış ayrıştırılmaz. Üç kaynak bunu içe aktarır.
Notlar
- Geçerli akışlar için davranış değişmez; JS / i18n / rota / CSP / SSRF / üst yazma değişikliği yok. Kaynaklardaki kalan ~20 çözücü kopyasının birleştirilmesi
qa/PARENT-SYNC-WORKLIST-v1.26.0.mdiçinde izleniyor. - Testler:
tests/html-entities.test.mjs(+7). Takım: 2444 (+7).
[1.171.0] — 2026-08-13
Değiştirildi (DÜŞÜK, tasarım sistemi) — yazı ölçeği + z-index katman belirteçleri (D-4, ilk adım). Boyutlar ve katmanlama bileşen başına düz değerdi.
Değiştirildi
- z-index katmanları —
--z-*belirteçleri (--z-topbar…--z-skiplink) eklendi ve her z-index düz değeri taşındı. Değerler korundu, katmanlama aynı; yeni bir kanarya yeni sihirli sayıları yasaklıyor. - Yazı ölçeği —
--font-size-*rampası (xs 11…2xl 28, taban = Inter 15px); bileşenlerin zaten kullandığı çekirdek boyutlar taşındı (görsel değişiklik yok). Rampa dışı değerler kademeli taşınır (docs/UX-ROADMAP.md).
Notlar
- Yalnızca CSS belirteci; davranış/JS/i18n/rota/CSP/SSRF/yazma değişikliği yok. Piksel değişikliği yok.
tests/design-tokens-scale.test.mjs(+3). Takım: 2437 (+3).
[1.170.0] — 2026-08-13
Eklendi (DÜŞÜK) — uzun yapay zekâ oluşturmalarında dürüst ETA ipuçları (P4-ETA). Ağır oluşturmalar (kariyer planı ~40 sn, yönlendirme / pazar / networking ~30 sn, two-pager ~20 sn) süre hissi olmadan yalnızca “Oluşturuluyor…” gösteriyordu.
Eklendi
- Her uzun oluşturma düğmesinin yanında artık sönük bir
⏱ ~Nsnipucu var (#/autoETA’sı gibi). Paylaşılan.eta-hintstili + iki genel anahtar (common.eta~{n}s,common.etaTitle).
Notlar
- Yalnızca istemci; rota/CSP/SSRF/yazma değişikliği yok. +2 i18n anahtarı ×17 (anlık görüntü 1219 → 1221).
tests/generation-eta-hint.test.mjs(+2). Takım: 2434 (+2).
[1.169.0] — 2026-08-13
Eklendi (DÜŞÜK) — satır içi PDF önizleme (D-5). GET /api/output/pdfs/:name, Content-Disposition: attachment dayatıyordu; bu yüzden #/cv’deki “Aç” bağlantısı bile göstermek yerine indiriyordu.
Eklendi
?inline=1, AYNI temizlenmiş dosyayıContent-Disposition: inlineile sunar; tarayıcı yeni sekmede 👁 Önizleme olarak işler. Varsayılan (parametresiz) hâlâ indirmedir. Yeni rota yok; aynı ad korumaları.#/cvPDF listesindeki ilk düğme artık 👁 Önizleme (İndir’in yanında).cv.openPdf“Aç” → “Önizleme” ×17.
Notlar
- CSP/SSRF değişikliği yok — aynı
sanitizePathName. Mevcut bir i18n anahtarı ×17 yeniden yazıldı (anlık görüntü 1219).tests/output-pdfs.test.mjs(+3). Takım: 2432 (+3).
[1.168.0] — 2026-08-13
Düzeltildi (DÜŞÜK, a11y) — onay kutusu satırları artık WCAG 2.5.8’in 24×24 minimumunu karşılıyor (D-2). #/scan, #/config, #/evaluate ve #/cv-studio üzerindeki onay kutusu/radyo etiketleri ~22 px’lik bir bantta duruyordu.
Düzeltildi
- Kapsamı sınırlı
label:has(> input[type="checkbox"/"radio"]) { min-height: 24px }kuralı ≥24 px’lik bir bant garanti eder. Yalnızcamin-height— etiketler zaten flex, hiçbir şey kaymaz;.apply-checklist(32 px) zaten uyumluydu.
Notlar
- Yalnızca CSS; davranış/JS/i18n/rota/CSP/SSRF/yazma değişikliği yok.
tests/checkbox-target-size.test.mjs(+1). Takım: 2429 (+1).
[1.167.0] — 2026-08-13
Düzeltildi (DÜŞÜK, tasarım sistemi) — yükseltilmiş yüzeyler artık ince çizgilerden ayrışıyor (D-3). --panel-2 / --surface-elev1 tokenları, ince çizgiler --line / --border ile aynı --slate değerine çözümleniyordu, görsel ayrım yoktu.
Düzeltildi
- Temaya duyarlı özel bir token
--elev(açık#eef1f6/ koyu#1e232e, her iki temada--slate’ten farklı) artık yükseltilmiş yüzeyleri destekliyor; ince çizgiler--slate’te kalıyor. Kalan bulgular (D-2, D-4, D-5, P4-ETA)docs/UX-ROADMAP.md’de backlog.
Notlar
- Yalnızca CSS token; davranış/JS/i18n/rota/CSP/SSRF/yazma değişikliği yok.
tests/elevation-token.test.mjs(+2). Takım: 2428 (+2).
[1.166.0] — 2026-08-13
Düzeltildi (DÜŞÜK) — rubrik terminolojisi artık kanonik belgeleri yansıtıyor. career-ops.org/docs “beş boyut artı bütünsel bir genel puan” diye tanımlıyor, ancak web-ui, cvstart.org ve wiki hepsi “altı boyutlu rubrik” diyordu (5 + 1 = 6, ama sözcükler uyuşmuyordu).
Düzeltildi
- Belgelerin ifadesi — “beş boyut artı bütünsel bir genel puan” — README ×17, cvstart.org sitesi ×17, yardım kılavuzu ×17,
docs/career-ops-canonical.mdve wiki (Home ×17 + Features) genelinde tutarlı biçimde benimsendi.
Notlar
- Yalnızca belge/pazarlama; kod/i18n anahtarı/rota/CSP/SSRF/yazma değişikliği yok.
tests/rubric-terminology.test.mjs(+2). Takım: 2426 (+2).
[1.165.0] — 2026-08-13
Düzeltildi (DÜŞÜK) — “Two-pager” terimi artık her dil içinde tutarlı. Arapçada kenar çubuğu Latin “Two-pager” gösterirken <h1> tamamen yerelleştirilmişti — aksi halde aynalanmış RTL gezinmesindeki tek Latin dizesi.
Düzeltildi
- Karar uygulandı: dil başına
nav.twoPagervetwoPager.titleterimde uyuşur (ikisi de Latin ya da ikisi de yerelleştirilmiş). Yalnızca Arapça ayrıktı; gezinme etiketi artık yerelleştirildi (“الصفحتان”). Yeni bir kanarya, bir dil onları tekrar ayırırsa başarısız olur.
Notlar
- Yalnızca metin; rota/CSP/SSRF/yazma değişikliği yok. Bir i18n değeri değişti (ar); yeni anahtar yok (anlık görüntü 1219).
tests/two-pager-term-consistency.test.mjs(+2). Takım: 2424 (+2).
[1.164.0] — 2026-08-13
Düzeltildi (DÜŞÜK) — üst çubuk arama yer tutucusu artık hiçbir dilde taşmıyor. “Find a company, role or URL…” arama çubuğu küçüldüğünde kırpılıyordu; “…or URL” yarısı asla görünmüyordu.
Düzeltildi
top.search(×17) artık kısa “Ara veya URL yapıştır” (her dilde ≤24 karakter), dar bir çubukta bile sığar ve URL ipucunu korur.index.htmlyedeği eşleşir;aria-labeltam ayrıntıyı korur.
Notlar
- Yalnızca metin; rota/CSP/SSRF/yazma değişikliği yok. Mevcut bir i18n anahtarı ×17 yeniden yazıldı (yeni yok; anlık görüntü 1219).
tests/search-placeholder-fit.test.mjs(+2). Takım: 2422 (+2).
[1.163.0] — 2026-08-13
Düzeltildi (DÜŞÜK) — uygulama içi “Belgelere sor” asistanı artık bir raporu PDF olarak dışa aktarmayı kapsıyor. #/reports/:slug’da çalışan bir 📄 Generate PDF düğmesi olmasına rağmen kılavuzun bunu kapsamadığını söylüyordu.
Düzeltildi
- 17 yardım paketinin tamamında §10 Raporlar altına “Bir raporu PDF olarak dışa aktarma” H3’ü eklendi (düğme nerede, dosya
output/*.pdf’e yazılır, Playwright gerekir, göndermeden önce gözden geçir). Asistan getirimi artık Raporlar bölümünü gösteriyor.
Notlar
- Yalnızca belge/yardım; kod/rota/CSP/SSRF/yazma değişikliği yok. Yardım eşiği 112 → 113 H3 (31 H2 değişmedi).
tests/help-reports-pdf-section.test.mjs(+2). Takım: 2420 (+2).
[1.162.0] — 2026-08-13
Düzeltildi (ORTA) — yardım “?” artık ≥24×24 işaretçi hedefi (WCAG 2.5.8). .help-hint her başlıkta padding:0 ile 18×18 px, minimumun altındaydı.
Düzeltildi
.help-hintkutusu artık 24×24 (ölçülebilir hedef), görünen halka 18px kalıyor — ortalanmış bir::beforeile çizilir, böylece glif ve<h1>taban çizgisi değişmez. Hover/etkin/odak durumları halkayı izler; kenar boşluğu 6→3px ile boşluk korunur.
Notlar
- Yalnızca CSS; JS/i18n/rota/CSP/SSRF/yazma değişikliği yok.
tests/help-hint-target-size.test.mjs(+2). Takım: 2418 (+2).
[1.161.0] — 2026-08-13
Düzeltildi (ORTA) — #/reports boşluk yerine “Puan algılanmadı” çipi gösteriyor. v1.159.0 dil-duyarlı ayrıştırıcıdan sonra bile puanı ayrıştırılamayan bir rapor boş alan gösteriyordu — başarısızlıktan ayırt edilemez.
Düzeltildi
- Puan hücresi artık dallanıyor: puan varsa → ton hapı; yoksa → sönük
.score-mutedçipi (“Puan algılanmadı”, ×17) ve “Raporu aç…” ipucu. Kart klavyeyle kullanılabilirrole="link"olarak kalır ve tarih gösterilir. - Mevcut nötr belirteci yeniden kullanır; yeni renk yok.
Notlar
- Yalnızca istemci; rota/CSP/SSRF/yazma değişikliği yok. +2 i18n anahtarı ×17 (anlık görüntü 1217 → 1219). Takım: 2416 (+3).
[1.160.0] — 2026-08-13
Düzeltildi (YÜKSEK) — sağlayıcı metni artık 7 sağlayıcı vaadiyle çelişmiyor. #/config, canlı değerlendirmenin “Anthropic veya Gemini anahtarını kullandığını” ve OpenAI anahtarının “web arayüzü tarafından kullanılmadığını” söylüyordu; panoda “Anthropic-first scoring” yazıyordu — 7 sağlayıcı zincirinden (v1.157.0) beri yanlış.
Düzeltildi
config.providerModelNote(×17): artık ⚡ canlı değerlendirmenin yedi anahtarından (Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub Models · Hermes) herhangi biriyle başsız çalıştığını, otomatik sıralı ve yedekli olduğunu belirtiyor. Yanlış OpenAI cümlesi kaldırıldı.dash.quick.evaluateSub(×17): sağlayıcıdan bağımsız (“0–5 uygunluk puanı”).Keys: N / 5→N / 7.
Notlar
- Yalnızca metin; rota/CSP/SSRF/yazma değişikliği yok. Yeni i18n anahtarı yok (anlık görüntü 1217). Takım: 2413 (+3).
[1.159.0] — 2026-08-13
Düzeltildi (YÜKSEK) — rapor meta verileri artık dile bağlı değil. İngilizce dışında bir dilde üretilen raporlar #/reports üzerinde boş bir meta veri şeridi gösteriyordu, çünkü parseReportHeader yalnızca İngilizce kalın etiketleri tanıyordu.
Düzeltildi
parseReportHeaderartık dilden bağımsız## Machine SummaryYAML bloğunu ayrıştırıyor (score:/legitimacy:/date:—auto-pipeline’ın zaten okuduğu kaynak): İngilizce etiketler → Machine Summary → yerelleştirilmiş etiketler (REPORT_LABELS, 17 dil). İngilizce raporlar bayt bayt aynı kalır.- Toleranslı sayı ayrıştırma (
1.5/5,1,5/5,1.5 из 5,4.5 out of 5); gövdede tarih yoksa dosya mtime’ına düşer.
Notlar
- Yalnızca okuma/ayrıştırma; rota, CSP, SSRF veya üst yazma değişikliği yok. Yeni i18n anahtarı yok. Takım: 2410 (+8).
[1.158.0] — 2026-08-12
Düzeltildi — iki kozmetik görüntüleme hatası (sekme başlığına sızan bir «?» ve açılış sayfasında yanlış sağlayıcı sayısı). Yalnızca görüntüleme; davranış, güvenlik veya veri akışı değişikliği yok.
Düzeltildi
- HelpHint’in «?» işareti artık
document.title’a sızmıyor. Yönlendirici sekme başlığını hamh1.textContent’ten türetiyordu, bu yüzden sekme «Vacancy search» yerine «Vacancy search?» gösteriyordu.router.js::focusNewViewartık başlığı klonluyor,.help-hint’i kaldırıyor ve sonra metni okuyor; görünen «?» dokunulmadan kalıyor. - cvstart.org «7» yerine «17 AI providers» gösteriyordu.
Features.astro’dakisub()yardımcısı, kart bazlı değiştirmeden önce tüm{n}değerlerini dil sayısıyla (17) yeniden yazıyordu; artık{n}kart bazında çözülüyor (sağlayıcılar → 7, diller → 17).
Notlar
- Sunucu, rota, CSP, SSRF veya i18n anahtarı değişikliği yok;
facts.jsonbiçimi değişmedi. Takım: 2402 test (+1).
[1.157.0] — 2026-08-12
Düzeltildi — canlı değerlendirmeler artık yalnızca Anthropic/Gemini değil, YAPILANDIRILMIŞ herhangi bir sağlayıcıyla çalışıyor. Yalnızca OPENROUTER_API_KEY ayarlı bir kullanıcı yanlışlıkla manuel moda zorlanıyordu.
Düzeltildi
- Kök neden: anahtarsız bir
LLM_PROVIDERsabiti (ör.init’ten gelenLLM_PROVIDER=claude) çıkmaza giriyordu; artık yapılandırılmış sağlayıcılar arasında auto sırasına geri düşüyor (selectActiveProvider+ her iki dağıtım kaskadında). - İstemci kapılaması (
#/deep+ mode-page görünümleri) artık eski Anthropic/Gemini yoklaması yerinewindow.ProviderStatus(/api/status/providers, yedisi) kullanıyor; yeniden yazılmış metinler (deep/eval × 17) + panodaki «Canlı değerlendirmeler» rozeti +config.llmProviderHint.
Notlar
- Güvenlik değişikliği yok. Takım: 2401 test (+5).
[1.156.0] — 2026-08-12
Refactor — scan.js’i boyut sınırının altına bölmek (P-16) + bir CodeQL düzeltmesi. scan.js 906 satırdı; davranışı koruyan iki fabrika çıkarılarak 648’e indirildi. P-15/P-16 görünüm-bölme çiftini tamamlar.
Değiştirildi
- Yeni
scan/runner.js(tarama yürütme motoru) vescan/filters.js(filtre durum makinesi)ctx/refstorbalarıyla;scan.jsikisini bağlar.
Düzeltildi
- CodeQL
js/useless-assignment-to-local(#428)config/tab-controller.js:let n = i;→let n;.
Notlar
- Saf refactor, davranış değişikliği yok; kaynağı okuyan 4 test yeniden yönlendirildi. İki büyük görünüm de artık 800’ün altında (P-15/P-16 tamam). Takım: 2396 test.
[1.155.0] — 2026-08-12
Refactor — config.js’i boyut sınırının altına bölmek (P-15). config.js 1030 satırdı (800 sınırının üstünde); davranışı koruyan iki modül çıkarılarak 783’e indirildi.
Değiştirildi
- Yeni
config/field-specs.js(alan verisi + model listeleri) veconfig/tab-controller.js(sekme çubuğu fabrikası);config.jsbunlara başvurur, render mantığı değişmez.
Notlar
- Saf refactor, davranış değişikliği yok; kaynağı okuyan 6 test yeniden yönlendirildi.
scan.js(906) olduğu gibi bırakıldı (zaten kısmen bölünmüş; çekirdek temiz bir mekanik bölme için fazla bağlı). Takım: 2396 test.
[1.154.0] — 2026-08-12
Yeni kılavuz — “Tüm yığını bulutta çalıştır.” career-ops’un kendine ait bir bulut/sunucu anlatısı yok, biz de ekledik: üst career-ops hattını, bu career-ops-ui görüntüleyiciyi ve yapay zekâ motorunu (Claude Code üzerinden Claude aboneliği, yerel Hermes, veya API anahtarları) küçük ve her zaman açık bir sunucuya koymak için adım adım tarif. 17 dilde Yardım §31, bir README bölümü ve bir wiki sayfası olarak gelir.
Eklendi
- Yardım §31 “Tüm yığını bulutta çalıştır” (× 17) — üç parça, hazırlama + kurulum, motor seçimi, güvenli yayınlama (HTTPS ters proxy + kimlik doğrulama + CSP/SSRF/XSS/sır-yok değişmezleri). Yardım paketi 31 H2 / 112 H3’e büyür.
- README — “Tüm yığını bulutta çalıştır” bölümü (× 17) + wiki’de Cloud-Deployment sayfası.
Notlar
- Yalnız docs — rota, sunucu veya istemci değişikliği yok; yeni i18n anahtarı yok. 4 yardım testi 31 H2 / 112 H3 sözleşmesine geçer. Takım: 2396 test (değişmedi).
[1.153.0] — 2026-08-12
Jobvite tarayıcısı herkese açık XML akışına taşındı (ebeveyn senkronu). Ebeveyn, Jobvite JSON API’sini emekliye ayırdı (artık sıfır iş döndürüyor); web-ui’nin source’u aynı ölü uç noktayı kullanıyordu, bu yüzden izlenen her Jobvite şirketi sessizce boş taranıyordu. Ebeveyn düzeltmesini (#2623) taşır: source artık companyEId ile anahtarlanan herkese açık kiracı-başına XML akışını okur.
Düzeltildi
- Source, emekli JSON API’sini çağırıp sıfır iş döndürüyordu; artık
https://app.jobvite.com/CompanyJobs/Xml.aspx?c={companyEId}çağırıp XML<result><job>…ayrıştırıyor (CDATA + varlıklar,detail-url,apply-url’den önce).
Değiştirildi
companyEIdçözümü: (1) portaldakicompany_eid:, (2) açık birapi:’ninc=parametresi, (3) pano sayfası keşfi.fetchText(http-json.mjs) non-ok hatasına.location/.retryAfterekler (salt okunur, geriye dönük uyumlu).
Notlar
- Güvenlik — iki host (
jobs.jobvite.com,app.jobvite.com) her istekten önceassertJobviteUrlile sabitlenir: yalnız https, katı izin listesi, hiçbir yönlendirme izlenmez.companyEIdyalnızca bir?c=değeridir; source sayısı değişmez. - Takım: 2396 test (+4).
[1.152.0] — 2026-08-12
Hermes sağlayıcısı — kablolama tamamlandı + doküman güncellemesi. v1.151.0 Hermes entegrasyonunun kod incelemesi iki gerçek boşluk ve dört tamlık maddesi buldu; hepsi burada düzeltildi ve uygulamanın tüm LLM sağlayıcı listesi tüm doküman yüzeylerinde ve 17 dilde tam yediye çıkarıldı.
Düzeltildi
#/configHermes’i zorlayamıyordu —LLM_PROVIDERaçılır listesi yalnızca altı sağlayıcı listeliyordu, bu yüzdenHERMES_API_KEYayarlanabiliyor ama Hermes UI’dan zorlanamıyordu. Artıkhermes8. seçenek ve yeni bir eşlik testi açılır listeninLLM_PROVIDERS’tan tekrar sapmasını engelliyor.- Kısa kendi barındırılan anahtarlar sessizce reddediliyordu —
isUsableKey’in 20 karakter tabanı bulut anahtarlarına göreydi;hasHermesKeyartık gevşetilmiş 8 karakter tabanı kullanıyor (Hermes dokümanının örneği 19 karakter).
Değiştirildi
- Sağlayıcı listesi README (× 17), uygulama içi yardım (× 17),
config.llmProviderHintsözlüğü (× 17) vedocs/sdd’de tam yediye normalleştirildi;hermesChatUrlyolsuz bir ana bilgisayarı tamamlıyor; manuel yedek metni Hermes’i anıyor.
Notlar
- Güvenlik değişmedi — yeni rota veya SSRF/CSP değişikliği yok; health/doctor bir
HERMES_API_KEYsatırı kazanıyor. - Takım: 2392 test (+2).
[1.151.0] — 2026-08-12
Hermes artık bağlı bir LLM sağlayıcısı (Phase 5) — Phase 5 kapsam çalışması, Nous Research’ün Hermes’inin OpenAI uyumlu bir API Server (hermes gateway → POST /v1/chat/completions) içerdiğini doğruladı; böylece career-ops-ui canlı değerlendirmeleri artık tıpkı OpenAI/Qwen gibi yerel bir Hermes üzerinden çalıştırıyor. Uygulama ayarları’nda HERMES_API_KEY ayarlayın; auto sırasına katılır (en son). Yol haritasının son açık maddesini kapatır — Phase 5, Shape A.
Eklendi
- Hermes LLM sağlayıcısı (Shape A) — paylaşılan
runOpenAICompatibleistemcisi üzerinderunHermes(server/lib/openai.mjs), her iki kaskatta (llm-dispatch.mjs+routes/llm.mjs), auto sırasının sonunda +LLM_PROVIDER=hermessabiti,/api/status/providersvellm-pricing.mjs. Yapılandırılabilir yerel bir base URL’ye (varsayılanhttp://127.0.0.1:8642/v1) Bearer kimlik doğrulamasıyla ulaşır — bu, kullanıcı tarafından verilen bir iş URL’si değil, YAPILANDIRILMIŞ bir sağlayıcı uç noktasıdır (OpenRouter/Qwen gibi), dolayısıyla SSRF korumasına dokunmaz. #/configalanları —HERMES_API_KEY(gizli) +HERMES_BASE_URL+HERMES_MODEL(varsayılanhermes-agent), 6 yeni i18n anahtarı × 17 dil (anlık görüntü 1208 → 1214).
Değişti
- Kapsam çalışması çözüldü:
docs/integrations/HERMES.md, uygulama içi yardım §30 (× 17), README tanıtımı (× 14),hermes-bridgeskill’i ve yol haritası “planlandı / henüz bağlanmadı”dan bağlandı (Shape A)’ya geçiyor. Shape B (özel bir ajan çalışma zamanı relay’i) gerekmedi.
Notlar
- Güvenlik: sağlayıcı fetch’i yapılandırılmış bir uç noktadır, diğer OpenAI uyumlu sağlayıcılarla aynı kategoride — yeni SSRF yüzeyi yok, CSP/sanitizer değişikliği yok.
HERMES_API_KEYbirSECRET_KEY’dir (asla gösterilmez). - Testler (CI-izole, sahte taşıma):
tests/hermes-provider.test.mjs(+5); v1.146.0’ın “Hermes dalı yok” kanaryası, BAĞLI olduğunu doğrulamak için tersine çevrildi; sağlayıcı yüzey testleri 7 sağlayıcı sırasına güncellendi. - Takım: 2390 test (+5).
[1.150.0] — 2026-08-12
Tutarlı boş durumlar (Phase 4 rötuşu) — her “henüz bir şey yok” paneli artık bazı görünümlerin görünümü sihirli bir 40px ile satır içi yeniden tanımlaması yerine, tek bir paylaşılan .empty stiliyle çiziliyor. Küçük bir görsel tutarlılık düzeltmesi; #/activity, #/cv-studio, #/stats ve #/usage boş durumları artık diğerlerinin tümüyle eşleşiyor (belirteçlenmiş 48px dolgu + kesikli kenarlık).
Değişti
#/activity,#/cv-studio,#/stats,#/usageboş panellerdeki satır içistyle: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' }ifadesini kaldırdı — üç özellik de zaten paylaşılan.emptysınıfı tarafından sağlanıyor (--space-7= 48px, ortalanmış, soluk, kesikli kenarlık). Böylece bu dördü diğer ~25.emptypaneliyle birebir aynı çiziliyor.- Görünüme özgü meşru geçersiz kılmalar (
#/dashboardwidth:100%,#/pipelineborder:none) el değmeden kaldı — yalnızca tamamen gereksiz yeniden tanımlamalar çıkarıldı.
Notlar
- Yalnızca istemci CSS kullanımı temizliği — rota, sunucu, i18n anahtarı veya CSS kuralı değişikliği yok (
.emptysınıfının kendisi değişmedi); sözlük anlık görüntüsü 1208. Tarayıcıda doğrulandı (#/usageboş paneli 48px dolgu + kesikli kenarlık hesaplıyor, 0 konsol hatası). - Yeni kanarya testi
tests/empty-state-consistency.test.mjs,.empty’yi tek doğruluk kaynağı olarak korur. Phase 5 (Hermes sağlayıcısı) engelli kalmaya devam ediyor. - Takım: 2385 test (+2:
tests/empty-state-consistency.test.mjs).
[1.149.0] — 2026-08-12
Portallar Ayarlara taşındı (Phase 4) — #/portals artık Sourcing altında değil, Uygulama ayarları yanındaki Setup gezinme grubunda. v1.144.0’dan beri bu bir ayar yüzeyi (takip edilen şirketleri aç/kapat + bir ATS sağlık yoklaması), bir sourcing eylemi değil — dolayısıyla ait olduğu yer burası. Yalnızca gezinme değişikliği; sayfa ve rotası değişmedi.
Değişti
#/portalsgezinme öğesi → Setup grubu (public/index.htmliçinde), Uygulama ayarları’nın hemen ardına yerleştirildi. Sourcing grubundan çıkarıldı (grup Scan / Pipeline / Auto-pipeline / Finanse edilen şirketleri korur).#/portalsrotası, görünümü venav.portalsetiketi değişmedi — yalnızca kenar çubuğundaki konum değişti.
Notlar
- Yalnızca gezinme biçimlendirmesi — rota, görünüm, i18n anahtarı veya sunucu değişikliği yok. Tarayıcıda doğrulandı (0 konsol hatası);
tests/portals-nav-placement.test.mjsile korunuyor. - Takım: 2383 test (+2:
tests/portals-nav-placement.test.mjs).
[1.148.0] — 2026-08-12
Daha derli toplu tarama filtreleri (Phase 4) — filtre paneli artık düzenli bir ızgara — #/scan filtre paneli, değişken genişlikte katı kutulardan oluşan dağınık bir flex-wrap’ten duyarlı bir ızgaraya geçti ve Uygula / Sıfırla eylemleri artık kendi ayrı, sağa hizalı satırında yer alıyor. Aynı filtreler, aynı davranış — sadece daha okunaklı. Bir tasarım rötuşu (parent-sync yok).
Değişti
#/scanfiltre paneli → duyarlı ızgara —.scan-filtersartıkrepeat(auto-fill, minmax(180px, 1fr))sütunları ve eşit boşluklarladisplay: grid, böylece 11 etiketli filtre her genişlikte dağınık bir satıra sarmak yerine düzenli sütunlara hizalanır.- Uygula / Sıfırla eylemleri kendi satırında tüm ızgarayı kaplar, ince bir çizgiyle ayrılır ve sağa hizalanır.
scan.js’deki eski gizli etiket hilesi + iç flex sarmalayıcı kaldırıldı.
Notlar
- Yalnızca CSS + küçük bir DOM temizliği — her filtre id’si (
#scan-filter-*,#scan-apply) veSR.render()bağlantısı değişmedi, dolayısıyla Playwright akışı el değmeden kaldı. Yeni i18n anahtarı yok. - Tarayıcıda doğrulandı (0 konsol hatası);
tests/scan-filters-grid.test.mjsile korunuyor. - Takım: 2381 test (+3:
tests/scan-filters-grid.test.mjs).
[1.147.0] — 2026-08-12
Hermes & Telegram — uygulama içi yardım bölümü + cvstart.org yüzeyi (Phase 5b, bölüm 2) — Hermes belge çalışmasının ikinci ve son parçası: nasıl yapılır artık uygulamanın kendi yardım kılavuzunun içinde, 17 dilin tümünde yaşıyor ve uygulama içi belge asistanı Hermes sorularını buradan yanıtlıyor. Hâlâ yalnızca belge — Hermes LLM sağlayıcı yolu planlandı / henüz bağlanmadı durumunda kalıyor (Phase 5).
Eklendi
- Uygulama içi yardım §30 “Hermes & Telegram” × 17 dil — yeni bir kılavuz bölümü (Hermes nedir + iki entegrasyon biçimi; bir bulut sunucusunda çalıştırma; Hermes üzerinden Telegram + “NEYİN açığa çıkarılmaması gerektiği” kuralı),
#/helpüzerinden erişilebilir.docs-assistant/DocsFabgrounding’i bunu otomatik alır çünkü ikisi dedocs/help/<lang>.mdokur. - cvstart.org — Hermes kılavuzuna bir bağlantı, GitHub’daki belgeye yönlendirir.
Değişti
- Yardım paketi eşiği 29 → 30 H2 / 105 → 108 H3 yükseltildi (
canonical-docs-coverage,help-ui,help-ru-config-section); §30 üç H3 ekler.
Notlar
- Hâlâ hiçbir şey Hermes’i çağırmıyor. Yeni kanarya testi
tests/help-hermes-section.test.mjs, her dilin §30’u dilden bağımsız çıpalarıyla (docs/integrations/HERMES.md,hermes-bridge,#/help,127.0.0.1, Telegram) içerdiğini doğrular. Sağlayıcı, Phase 5 API sözleşmesine kadar engelli kalır. - Bu, Phase 5b’nin belge + skill çıktısını kapatır; sağlayıcı entegrasyonu (Phase 5) ayrı, engellenmiş bir madde olarak kalır.
- Takım: 2378 test (+2:
tests/help-hermes-section.test.mjs).
[1.146.0] — 2026-08-12
Hermes ajanı + Telegram — entegrasyon kılavuzu + bir skill (Phase 5b, bölüm 1) — career-ops-ui’yi bir bulut sunucusunda çalıştırabilir ve olaylarını (tamamlanmış bir tarama, yeni bir rapor, acil bir takip) Nous Research’ün Hermes ajanı üzerinden Telegram’a bağlayabilirsiniz. Bu sürüm tasarım + dağıtım belgelerini ve bir hermes-bridge skill’ini sunar; Hermes LLM sağlayıcı yolu hâlâ planlanan / henüz bağlanmamış durumda (Phase 5 API sözleşmesi spike’ına tıkanmış). Belgeler kasıtlı olarak koddan önde.
Eklendi
docs/integrations/HERMES.md— derinlemesine inceleme: iki entegrasyon biçimi (OpenAI uyumlu endpoint vs. ajan çalışma zamanı), bulut sunucusuna dağıtım (reverse proxy + HTTPS + systemd, başsız bir makinede salt okunur parent sözleşmesi), Hermes üzerinden Telegram ve bir tehdit modeli «NEYİN açığa çıkarılmaması gerektiği» listesi (kanal’a CV / maaş / rapor içeriği / anahtar sızdırılmaz).- README’deki
## Hermes agent + Telegramtanıtımı — İngilizce README’de kısa bir yönlendirme + bağlantı, her dilin tam çevrilmiş README’sinde de yansıtılır. - Kılavuzu işlevsel kılan bir
hermes-bridgeskill’i (.claude/skills/hermes-bridge/) — ön koşul + kapsam denetimleri (Node ≥ 18, anahtarların varlığı, SSRF’ye karşı güvenli yol üzerinden endpoint erişilebilirliği), sırları asla diske/loglara yazmaz ve bir Hermes endpoint’i icat etmeyi veya sağlayıcının bağlı olduğunu iddia etmeyi reddeder. docs/architecture/OVERVIEW.md’deki bir Integrations bölümü kılavuza bağlanır.
Notlar
- Şu an hiçbir şey Hermes’i çağırmıyor. Bir kanarya testi (
tests/hermes-docs.test.mjs) «planlanan / henüz bağlanmamış» dürüstlük işaretlerini vellm-dispatch.mjs’de hiçbir Hermes/Nous dalı olmadığını doğrular — yani sağlayıcının ileride bağlanması, belgeleri + yol haritasını aynı değişiklikte güncellemek zorundadır. - v1.147.0’a ertelendi (Phase 5b, bölüm 2): uygulama içi yardımdaki «Hermes & Telegram» H2 bölümü × 17 dil ve cvstart.org pazarlama yüzeyi.
- Takım: 2376 test (+4:
tests/hermes-docs.test.mjs).
[1.145.0] — 2026-08-12
Anlayışlı istatistikler (devam): yeniden oluşturulabilir grafik — #/stats’teki “Hedef rol eğilimi” sekmesinde artık bir Grafik oluştur aracı var: bir metrik × boyut seçin, canlı olarak yeniden çizilsin. Kullanıcı bildirimli bir UX isteği (parent-sync yok).
Eklendi
- Yeniden oluşturulabilir metrik × boyut grafiği — bir metrik (İlanlar / Medyan maaş / Ortalama maaş) ve bir boyut (Ülkeye göre / Role göre) seçin, çubuk grafik anında yeniden çizilir. Maaş metrikleri para birimi + yıllık ⇄ aylık anahtarına uyar; ilanlar basit bir sayımdır.
- 8 yeni i18n anahtarı × 17 dil; anlık görüntü 1200 → 1208.
Notlar
- Tarayıcıda doğrulandı (0 konsol hatası). Takım: 2372 test (+2).
[1.144.0] — 2026-08-12
Ayarlar ve filtreler (Aşama 4, bölüm 1): izlenen portalları etkinleştir/devre dışı bırak — artık izlenen bir şirketi #/portals’tan açıp kapatabilirsiniz ve tarayıcı buna uyar. Kullanıcı bildirimli bir UX isteği (parent-sync yok).
Eklendi
#/portals’ta şirket başına Etkinleştir/Devre dışı bırak düğmesi — tek tıkla bir portalı kapatır (EN tarayıcı zatenenabled: falseşirketleri atlar, böylece devre dışı portal sonraki tüm taramalardan düşer) veya yeniden açar, iyimser bir bildirimle.POST /api/portals/toggle—portals.yml’deki bir şirketinenabledbayrağını cerrahi biçimde ve ayrıştırma doğrulamasıyla değiştiren açık bir kullanıcı yazımı (yorumlar, sıra ve diğer alanlar korunur). 5 yeni i18n anahtarı × 17 dil; anlık görüntü 1195 → 1200.
Notlar
- Tarayıcı değişikliği sıfır oldu —
en-scanner.mjszatenenabled !== falseile filtreliyor. Takım: 2370 test (+3).
[1.143.0] — 2026-08-12
Anlaşılır (devam): ana iş akışı görünümlerinde ? ipuçları — yardım ?’i artık tüm dillerde dokuz ana eylem sayfasını kapsıyor. Kullanıcı bildirimli bir UX düzeltmesi (parent-sync yok).
Eklendi
- 9 görünüm başlığına daha
?yardım ipucu —#/scan,#/evaluate,#/cv-studio,#/tracker,#/config,#/deep,#/batch,#/auto,#/applysatır içi bir?alır (HelpHint.titleile) ve yerelleştirilmiş bir «ne yapar / nasıl kullanılır / ne beklenir» açılır kutusu açar — v1.139.0’daki aynı CSP-güvenli bileşen. - 9 yeni i18n anahtarı × 17 dil (
help.hint.scan/…/apply); anlık görüntü 1186 → 1195.
Notlar
- Tarayıcıda doğrulandı (0 konsol hatası). Takım: 2365 test (+1).
[1.142.0] — 2026-08-12
Düzeltme: artık “Unknown” kariyer arketipi yok — #/orientation artık bazen “Unknown” yanıtlayıp ona “daha çok yüklenmenizi” önermek yerine, her zaman sekiz adlandırılmış kariyer vektöründen sıralama yapıyor. Kullanıcı bildirimli bir düzeltme (parent-sync yok).
Düzeltildi
#/orientation— AI istemi artık küme dışı bir arketipi yasaklıyor. Model, ilk üçü tam olarak sekiz adlandırılmış vektörden sıralamak ZORUNDA ve asla “Unknown”/“N/A”/“yetersiz veri” yanıtlayamaz veya yeni etiket uyduramaz. Özgeçmiş zayıfsa yine de en yakın üçünü daha düşük güvenle adlandırır ve hangi kanıtın eksik olduğunu söyler.
Notlar
- Yalnızca sunucu istemi değişikliği (
buildOrientationPrompt); i18n/şema değişikliği yok. Takım: 2364 test (+1).
[1.141.0] — 2026-08-12
Anlayışlı istatistikler (devam): finansman alan şirketlerin zenginleştirilmesi — #/funded artık daha görsel: şirket logoları, finansman tutarına göre bir grafik ve tur / tutar / keşif puanı / önerilen eylem içeren kartlar. Kullanıcı bildirimli bir UX düzeltmesi (parent-sync yok).
Değişti
#/funded— düz tablo → kart ızgarası. Yakın zamanda finansman alan her şirket artık bir kart: logo (CompanyLogoile addan türetilir, başarısızsa harf avatarı), tur + tutar çipleri, üst projenin keşif puanı ve önerilen eylemi, ayrıca finansman haberi bağlantısı ve tarihi.- Finansman tutarı görselleştirmesi — açıklanan tutara göre en büyük şirketlerin yatay çubuk grafiği; “$120M”/“€1.5B” gibi serbest metin tutarlar yeni bir
parseAmountile büyüklüğe ayrıştırılır. 3 yeni i18n anahtarı × 17 dil.
Notlar
- Hâlâ
GET /api/company-fundedüzerinde salt okunur; açıklama ve maaş aralığı finansman kaynağında yok. Takım: 2363 test (+2).
[1.140.0] — 2026-08-12
Anlayışlı istatistikler: daha zengin maaş rakamları — #/stats’teki “Pipeline’ım” maaş dökümü artık (yalnız medyan değil) ortalamayı, bir yıllık ⇄ aylık anahtarını ve ülke başına min · ort · medyan · maks tablosunu gösteriyor. Faz 3’ün ilk dilimi. Kullanıcı bildirimli bir UX düzeltmesi (parent-sync yok).
Eklendi
- Ortalama maaş —
RoleStats.salaryStatsartıkminUsd/medianUsd/maxUsdyanındaavgUsddöndürüyor. Medyan aykırı değerlere dayanıklıdır, ortalama çarpıklığı gösterir — birlikte bir dağılım olarak okunur. - Maaş bölümünde yıllık ⇄ aylık anahtarı ve ülke başına min · ort · medyan · maks tablosu (para birimi ve dönem seçicilerine bağlı). 8 yeni i18n anahtarı × 17 dil.
Notlar
- Rakamlar hâlâ yalnızca okunabilir maaşlı ilanlardan türetilir ve USD’ye normalize edilir (gösterge niteliğinde). Takım: 2361 test (+1).
[1.139.0] — 2026-08-12
Anlaşılır: ? yardım ipuçları — tıklayınca «ne yapar / nasıl çalışır / ne beklenir» sorularını dilinizde açıklayan, yeniden kullanılabilir ve CSP-güvenli bir ? düğmesi. Kullanıcı bildirimli bir UX düzeltmesi (parent-sync yok).
Eklendi
?yardım ipucu açılır kutusu (window.HelpHint) — bir başlığın yanındaki yuvarlak?, temaya uyumlu ve RTL’de yansıtılan hafif bir açılır kutu açar veUI.md()ile yerelleştirilmiş bir açıklama gösterir; erişilebilir (role="tooltip",aria-expanded, Escape/dışa tıklama ile kapanma, odak geri yükleme) ve CSP-güvenli.#/stats’in 5 sekmesine ve 8 AI/analitik görünüm başlığına (career-plan, yönlendirme, two-pager, networking, deneme mülakatı, bellek, funded, haftalık özet)?eklendi — 14 yeni i18n anahtarı × 17 dil.
Notlar
- Tüm görünümlerde zaten tek satırlık bir alt başlık vardı;
?, istendiğinde daha derin açıklamayı ekler ve boş durumları kendini açıklar hale getirir. Takım: 2360 test (+4).
[1.138.0] — 2026-08-12
Arayüz dilinde üretim — her AI üretimi artık arayüzde seçtiğin dilde yanıt veriyor; ayrıca incelemeden doğan test sağlamlaştırmaları. Kullanıcı bildirimli bir UX düzeltmesi (parent-sync yok).
Değişti
- AI üretimleri artık arayüz dilini gözetiyor. Arayüz Rusça, İspanyolca, Japonca … olduğunda üretilen metin her zaman İngilizce yerine o dilde dönüyor. Çıktı-dili yönergesi tüm üretim uç noktalarına iletiliyor — kariyer planı, yönlendirme, pazar raporu, deneme mülakatı, networking planı, «belgeye sor», bellek notu önerisi ve two-pager taslağı. Kod ve tanımlayıcılar İngilizce kalır (ör. two-pager YAML anahtarları); yalnızca düzyazı, başlıklar ve maddeler yerelleştirilir.
Düzeltildi
- CSS renk-rolü koruması (
tests/css-role-tokens.test.mjs) — v1.137.0 karanlık mod takma-ad token’larının rolü asla ters çevirmediğini doğrulayan statik bir kanarya: metin-rolü token’ları (--fg/--danger/--ok/…) aslabackgroundolarak, yüzey token’ları (--card/--panel/--line/…) asla metincolor’ı olarak kullanılmaz; tüm CSS ve SPA satır-içi stillerinde. UI.md()XSS yükleyici öz-sondası —api.js’tenmd()’i yükleyen test artık çıkarımın hemen ardındanmd('<script>…')’i yokluyor ve escape eksikse hata fırlatıyor; böylece gelecekteki hatalı bir dilimleme, güvenlik takımını kırpılmış bir fonksiyon üzerinde yeşile boyamak yerine yüksek sesle başarısız oluyor.#/career-plankaydırma koruması — üretim sonrasıscrollIntoViewyalnızca önizleme hâlâ belgeye bağlıysa çalışır.
Notlar
docs/UX-ROADMAP.mdgüncellendi:?yardım ipuçları + sayfa açıklamaları + boş durumlar artık v1.139.0; bir Nous Research / Hermes sağlayıcısı — bulut sunucu + Telegram dağıtım kılavuzu ve bir Hermes becerisi ile — Aşama 5 / 5b olarak izleniyor.- Takım: 2356 test (+5).
[1.137.0] — 2026-08-11
Okunabilirlik ve render düzeltmeleri — karanlık mod kontrastı, grafik etiketleri ve kariyer planı. Kullanıcı tarafından bildirilen bir UX geçişi (üst proje senkronizasyonu yok).
Düzeltildi
- Birçok ekranda karanlık modda beyaz-üzerine-beyaz / siyah-üzerine-siyah — birkaç görünümün referans verdiği on beş CSS özel özelliği (
--fg,--panel,--panel-2,--ok,--danger,--card, …) hiçbir zaman tanımlanmamıştı, bu yüzden sabit kodlanmış açık/siyah değerlere geri dönüyorlardı: açık modda sorun yoktu, karanlık modda okunamazdı (#/pipelinegenel bakış çipleri,#/statsetkin sekme,#/config“Etkin / Anahtarlar” + “✓ ayarlandı”,#/two-pagerbölümleri,#/mock-interviewsoru balonu, hata metni). Artık gerçek temaya duyarlı belirteçlere takma adlandırılmış durumdalar, böylece temayı otomatik olarak takip ediyorlar — otomatik bir denetleyiciyle doğrulanmış, 29 görünümün tümünde 0 WCAG-AA kontrast hatası;#/configetkin sekmesi okunabilir, tonlanmış bir stile taşındı. Bir regresyon koruyucusu (tests/dark-theme-tokens.test.mjs) onları takma adlı tutuyor. #/statsgrafik etiketleri kelimenin ortasından kesiliyordu (“Senior Backend Engineer” → “…Enginee”) — artık üç nokta ile kısaltılıyor ve tam etiket bir üzerine gelme araç ipucu olarak korunuyor.#/career-planoluşturulan planı ham Markdown olarak gösteriyordu — artık biçimlendirilmiş, okunabilir metin olarak otomatik render ediliyor (düzenlenebilir Markdown metin kutusunda kalıyor; Önizleme onu değiştiriyor).
Notlar
#/career-plan,#/two-pager,#/statsve haftalık mülakat özeti bozuk değil — bir plan oluşturana / veriniz olana kadar boş durumlar gösteriyorlar. Daha açık sayfa içi rehberlik ve?yardım ipuçları bir sonraki adım olarak planlanıyor (docs/UX-ROADMAP.md).
[1.136.0] — 2026-08-11
Üst proje career-ops v1.26.x paritesi (v1.26.0 sonrası ana hat) — bir yeni sıfır-kimlik-doğrulama kaynak artı web-ui yansılarına yönelik bir kalite ve sağlamlık düzeltmeleri dalgası. Kayıt defteri artık 79 kaynak = 74 İngilizce + 5 Rusça (ALL_ADAPTERS 74).
Eklendi
eightfold(Eightfold AI, #2684) — sıfır-kimlik-doğrulamahttps://<tenant>.eightfold.ai/api/apply/v2/jobsAPI’si üzerinden yetenek-kazanımı panoları,*.eightfold.ai’a ana bilgisayar-sabitli (markalıcareers.<company>.comCNAME’i kasıtlı olarak reddediliyor); bir güvenlik üst sınırıyla sayfalanmış, ölü-pano-fırlatma, url-çiftleme. Kaynak + adaptör + CI-izole paket;#/scanKaynak filtresinde ve açılış sayfasında görünüyor.
Düzeltildi
- Unicode-duyarlı çiftleme ve rol anahtarları (#2569 / #2587 / #2667) — yeni bir paylaşılan
normalizeTextKey(NFKC, herhangi bir yazı sisteminin harflerini/işaretlerini/rakamlarını koruyor) yalnızca-ASCII anahtarların yerini alıyor:detect-repostsartık genişlik/noktalama şirket varyantlarını kümeliyor (“Acme, Inc.” ≡ “Acme Inc”) ve farklı Latin-olmayan işverenleri asla çökertmiyor,role-matcherise tam-genişlikli unvanları katlıyor ve Latin-olmayan rol belirteçlerini silmek yerine koruyor. fetchJsonWithRetryartık reddedilen bir yönlendirmeyi yeniden denemiyor (#2657) — bir 3xx ile karşılaşanredirect:'error'koruyucusu determinist olduğundan, artık yeniden-denenemez olarak işaretleniyor ve yeniden deneme bütçesini tüketmek yerine hızlıca başarısız oluyor.title_filter.positiveVE-grupları (#2552) — pozitif bir girdi içindeki boşlukla ayrılmış bir+artık her terimin, herhangi bir sırada, başlıkta görünmesini gerektiriyor.oraclecloud, numaralandırılmış kiracı apekslerini kabul ediyororaclecloud1.com … oraclecloud99.com(#2683) — sınırlı bir aile (baştaki sıfır yok, ≤ 2 hane), asla bir joker aleksi değil.workablesağlamlaştırıldı (#2675) — Cloudflare-önlü ana bilgisayara karşı yeniden deneme, tarayıcı-benzeri başlıklar ve istek serileştirmesi.personio, XML beslemesi devre dışıyken hiçbir şey döndürmek yerine bir HTML kazımasına düşüyor.statesFALLBACK takma adları üst projeyle yeniden eşzamanlandı (#2615).
Notlar
- Taşınmadı (web-ui tarafından yansılanmıyor veya yalnızca-CLI): reply-matcher (#2672), jd-similarity (#2661), jd-skill-gap (#2686), tarama ortam-yolu (#2568) /
--flag=value(#2589) ayrıştırması, ve kapak mektubu / CV-şablonu / doctor / ollama / generate-pdf değişiklikleri. Webjs-yaml/nanoidYÜKSEK önerileri web-ui v1.135.0’da zaten yamalanmıştı.
[1.135.0] — 2026-08-11
Üst proje career-ops v1.26.0 paritesi — beş yeni sıfır-kimlik-doğrulama tarama kaynağı artı web-ui’nin zaten taşıdığı dört panoya doğruluk düzeltmeleri. Kayıt defteri artık 78 kaynak = 73 İngilizce + 5 Rusça (ALL_ADAPTERS 73).
Eklendi
- Beş yeni tarama kaynağı (her biri bir kaynak + adaptör + CI-izole bir paket;
#/scanKaynak filtresinde ve cvstart.org açılış sayfasında görünüyorlar):join(JOIN) — bir şirketin JOIN panosu,join.com/companies/<slug>içindeki Next.js__NEXT_DATA__’sından (ana bilgisayara sabitli, sayfa sınırlı).getro(Getro) — VC “yetenek ağı” portföy panoları, herkese açıkapi.getro.comPOST API’si üzerinden, en yeniden-eskiye sayfalanmış; her iş fona değil portföy işverenine atfediliyor.consider(Consider) — getconsider.com VC portföy panoları, aynı-kökenli bir POST üzerinden; yapılandırma-güdümlü ana bilgisayar yapısal bir SSRF koruyucusuyla sabitleniyor (yalnızca herkese açık HTTPS ana bilgisayarı).joinup(JOINUP) — İsviçre panosu joinup.ch, SSR edilmiş en yeni sayfayı okuyor; bir kazıyıcı kırılmasında hata-kapalı davranıyor.remotli(Remotli) — remotli.ch, İsviçreli şirketlerdeki uzaktan roller (CHF maaşları); işverenin kendi ATS başvuru URL’sini yayınlıyor, böylece çapraz-listelemeler çiftlemeden ayıklanıyor.
Düzeltildi
- a16z Speedrun artık geçici bir aksaklıkta tüm panoyu iptal etmiyor — sayfa getirmeleri artık paylaşılan bir
fetchJsonWithRetryüzerinden geçiyor (yalnızca geçici 429/5xx/zaman aşımında sınırlı yeniden denemeler, asla kalıcı bir 4xx’te), ve sayfa bütçesi 50 işlik sayfa için yeniden boyutlandırıldı. - arbeitsagentur v6 Jobsuche API’sine (
/pc/v6/jobs) taşındı — eski v4 uç noktası 404 veriyor; yanıt şekli yeniden adlandırıldı ve uzaktan filtreleme artık sunucu tarafında daralıyor. - thehub v2
jobsandfeaturedAPI’sine taşındı; satırlar yayın tarihi taşımıyor ve yaş filtresinden muaf. - hackernews, Algolia aramasını serbest metin sorgusu yerine
author_whoishiringhesap etiketine filtreleyerek aylık “Kim işe alıyor?” konusunu güvenilir şekilde buluyor.
Notlar
- Taşınmadı (web-ui zaten güvenli, aktarım-tarafından-emilmiş veya yalnızca-CLI): Unicode rol-çiftleme / şirket-eşleştirme anahtarları (web-ui’nin tekrar-ilan gruplaması zaten şirketi düz küçük harfle anahtarlıyor, bu yüzden farklı Latin-olmayan işverenler asla çökmüyor); takip reddi-gecikme sinyali + finanse edilen şirket rötuşları (salt-okunur, hataya-toleranslı olarak aktarılıyor); tarama ortam-değiştirilebilir yolları ve
--flag=valueayrıştırması (web-ui tarayıcıları işlem içinde çalıştırıyor); User-Agent birleştirme yeniden düzenlemesi (web-ui zaten bunu merkezileştiriyor); ve yalnızca-CLI öğeleri (güvenilmeyen-içerik listesi, oferta/offer-prep, doctor, kapak/CV şablon değişiklikleri).
[1.134.1] — 2026-08-05
Doğrulama sağlamlaştırması — kapsamlı bir proje denetimiyle ortaya çıkan düzeltmeler.
Düzeltildi
successfactorsartık tarama-ortası bir hatada kazınan işleri atmıyor (v1.134.0’daki ölü-pano-fırlatma aktarımında bir regresyon) — sayfalama döngüsündetry/catchyoktu, bu yüzden 2. sayfa ve sonrasında (1. sayfa başarılı olduktan sonra) bir hata fırlatılıyor ve o ana kadar toplanan her şeyi düşürüyordu; ve bu hata bir404ise (aralık dışı birstartrow),en-scannercanlı bir kiracıyı günlerce ölü olarak karantinaya alıyordu. Şimdiphenom/radancyile aynı: 0. sayfadaki bir hata hâlâ fırlatılıyor (ölü pano), ancak daha sonraki bir sayfadaki hata kısmi sonuçları koruyor.#/scanfiltre çipleri artık klavyeyle çalıştırılabiliyor (WCAG 2.1.1) — faset çipleri (ve “temizle” çipi) bir tıklama işleyicisine sahip amatabindex/rolü olmayan span’lerdi, bu yüzden klavye ve ekran okuyucu kullanıcıları onlara erişemiyor veya değiştiremiyordu. Şimdirole="button",tabindex="0",aria-pressedtaşıyorlar ve Enter/Boşluk ile etkinleştiriliyorlar.- Üç sabit kodlanmış İngilizce dize artık yerelleştirildi —
#/scangüven-rozeti araç ipucu,#/scanyer değiştirme sütun başlığı ve#/dashboardpuan başlığı, i18n parite kapısının göremediği çıplak literallerdi (hiçbir zaman anahtar olmamışlardı), bu yüzden İngilizce olmayan her yerelleştirmede İngilizce kalıyorlardı. Şimdiscan.trustTip+scan.col.reloc(2 yeni anahtar) ve mevcuttrack.col.score’un yeniden kullanımı var, kaynak-statik bir koruyucuyla (tests/scan-chip-a11y.test.mjs) sabitlenmiş. - +3 test → paket 2187.
[1.134.0] — 2026-08-05
Üst proje career-ops v1.25.0 paritesi.
Eklendi
- Yeni tarama kaynağı: getManfred (
manfred) — yayınlanmış maaşlarla İspanyol/AB teknoloji rollerinin pano-geneli bir beslemesi,www.getmanfred.com/api/v2/public/offers’tan (sıfır-kimlik doğrulama, ana bilgisayara sabitlenmiş + yalnızca-HTTPS, tek istekli tam katalog). Kaynak + adaptör + CI-izole bir paket (tests/sources-manfred.test.mjs); kayıt defteri artık 73 kaynak = 68 İngilizce + 5 Rusça (ALL_ADAPTERS68).#/scanKaynak filtresinde ve cvstart.org açılış sayfasında görünür.
Düzeltildi
- a16z Speedrun beslemesi sessizce 50 işe kısaltılıyordu (#2404) — besleme bir sayfayı 50 ile sınırlıyor ancak kaynak
PER_PAGE = 100istiyordu, bu yüzden sayfalama 1. sayfadan sonra duruyordu. 50’ye düzeltildi. - Ölü panolar artık “canlı ama boş” olarak okunmak yerine hata fırlatıyor (#2379) —
cryptocurrencyjobs,phenom,radancy,successfactors: hiçbir isteğin hiç çözümlenmediği bir getirme hatası artık hata fırlatıyor (böylece#/portalssağlığı ve tarama gerçek bir hatayı kaydediyor), onu boş bir listeye yutmak yerine; en az bir başarıdan sonraki bir tarama-ortası hata kısmi sonuçları koruyor. - workable artık genel widget API’sini kullanıyor (#5ab8425) — büyük bir hesabın tam ilan listesini tek bir istekte döndüren
apply.workable.com/api/v1/widget/accounts/<slug>’a geçildi, böylece büyük hesaplar artık kısaltılmıyor.
Notlar
- Taşınmadı (yalnızca CLI veya web-ui tarafından yansıtılmıyor): detect-reposts #2389 başlık-gruplama performans yeniden yazımı; Unicode şirket-anahtarı düzeltmeleri (web-ui’nin kendi takipçi çiftlemesi zaten Latin-olmayan-güvenli);
scan --since;cv-facts; CV şablonu / PDF denetim geçişi;doctor; modes güvenilmeyen-içerik direktifi.
[1.133.1] — 2026-08-02
Düzeltildi
#/funded(Finanse edilen şirketler) artık sonuçları gösteriyor — üst projenincompany-funded.mjs’i eksiksiz bir liste döndürdüğünde bile tablonun her zaman “finanse edilmiş şirket yok” göstermesine neden olan iki hata vardı. (1) Görünüm sonuçlarıres.candidatesaltında okuyordu, ancak üst proje bunlarıcompaniesaltında yayınlıyor (her biri{ company, amount, round, funding: { sources: [{ source, url, observed_date }] } }); istemci artık doğru anahtarı okuyor ve gerçek kanıt şeklini eşliyor. (2) Sonuç tablosu hücreleriniUI.el('tr', {}, …)’a değişken sayıda bağımsız değişken (varargs) olarak geçiriyordu, ancakUI.el(tag, attrs, children)children’ı tek bir düğüm veya dizi olarak alıyor, bu yüzden yalnızca ilk sütun (Şirket) render ediliyordu — hücreler artık bir dizi olarak geçiriliyor. Gerçek bir tarayıcıda doğrulandı: dört besleme genelinde 11 şirket, Şirket / Finansman sinyali / Kaynak / Tarih sütunlarıyla ve çalışan kanıt bağlantılarıyla render ediliyor, sıfır konsol hatası. Boş bir tarama artık kaynak başına tanılamaları da gösteriyor, böylece sessiz bir haber günü engellenmiş bir beslemeden ayırt edilebiliyor.tests/parity-routes-v1133.test.mjsiçinde regresyon korumaları: sahte üst proje betiği artık gerçekcompaniesçıktı şeklini yayınlıyor (orijinal test sabiti yanlışcandidatesşeklini yansıtıyordu — hatanın yeşil geçerek yayınlanmasının tam nedeni buydu), ayrıcafunded.js’inres.companies’i okuduğunu (aslares.candidates’i değil) ve tablo satırlarını dizi children ile oluşturduğunu doğrulayan kaynak-statik kanaryalar eklendi (+1 → 2144).
[1.133.0] — 2026-08-01
Eklendi
- Finanse edilen şirket keşfi (
#/funded, üst proje paritesi #2117) — üst proje career-ops’uncompany-funded.mjs’iniGET /api/company-fundedüzerinden aktaran yeni bir salt-okunur görünüm: herkese açık, ana bilgisayara sabitlenmiş finansman beslemelerinden (TechCrunch, PR Newswire, The Guardian, Hacker News) keşfedilen, yakın zamanda finanse edilmiş şirketlerin inceleme-öncelikli bir listesi. Aktarım, betiği--json --dry-runile çalıştırır (stdout’a JSON, dosya yazması yok), kullanıcı girdisini asla--sources’a aktarmaz, hız sınırlaması taşır ve kullanıcı tarafından tetiklenir (bir Keşfet düğmesi, asla bağlanma sırasında değil). Yeni rota modülüserver/lib/routes/funded.mjs+public/js/views/funded.js, Kaynak bulma altında. - Haftalık mülakat özeti (
#/interview-digest, üst proje paritesi #2129/#2130) — üst projenin sıfır-LLMweekly-digest.mjs’iniGET /api/interview/weekly-digestüzerinden aktaran yeni bir salt-okunur görünüm: mülakat oturumu notlarının mekanik bir toplu özeti — bu hafta hangi şirketlerle ve hangi turlarda mülakat yaptığınız, tekrar eden yetkinlikler ve elden geldiğince tespit edilen açık boşluklar. İsteğe bağlı?from=&to=aralığı yalnızca İKİSİ de geçerliYYYY-MM-DDolduğunda aktarılır; boş bir aralık geçerli biravailable:trueözetidir.server/lib/routes/interview.mjs+public/js/views/interview-digest.js’e eklendi, Analitik altında. - Her iki aktarım da üst proje betiği yokken (CI, bağımsız kurulumlar) yerleşik hataya karşı toleranslı
available:falsesözleşmesini izler. 26 yeni i18n anahtarı ×17 yerelleştirme; CI-izole pakettests/parity-routes-v1133.test.mjs(+5 → 2143).
Notlar
- Üst proje career-ops, Next.js
web/uygulamasının Takip İzleyicisi sayfası (#1422) ve arka uç PDF render’ı (#2182) ile v1.24.0’ın ötesine geçti — taşınmadı: web-ui’nin zaten kendi takip aktarımı ve PDF çalıştırıcıları var ve alttakifollowup-cadence.mjssağlamlaştırması kabuk-açma aktarımı üzerinden bedavaya geliyor.set-status.mjs/tracker-utils.mjsdeğişiklikleri CLI-dahilidir ve yansıtılmıyor.
[1.132.0] — 2026-07-31
Değiştirildi
#/scansonuç-render alt sistemipublic/js/lib/scan-results.js’e çıkarıldı (dosya-boyutu-sözleşmesi borcu —public/js/views/scan.js~1254 satıra kadar büyümüştü). Alt sistem (renderResults,buildChipRow,getRows, satır/faset oluşturucuları, seçenek boyacıları veFALLBACK_SOURCESkayıt defteri aynası) görünümün sağladığı bir bağlam nesnesini kapsayan birwindow.ScanResults.create(ctx)fabrikasına taşındı. Davranış değişikliği yok — fonksiyonlar birebir taşındı, kapatma değişkenlerictx.*’e yeniden bağlandı;scan.jsartık ~906 satır (800 satırlık hedefe doğru ikinci bir çıkarma geçişi planlanıyor).- Kaynak-statik testler her iki dosyayı
tests/helpers/scan-src.mjs::loadScanSrc()üzerinden okuyor;tests/scan-fallback-sources.test.mjsartık kayıt defteri aynasınıscan-results.js’ten okuyor. - Yeni tarayıcı-içi regresyon kapısı —
tests/playwright-scan-filters.mjshazır birdata/last-scan.jsontohumluyor ve her#/scanfiltresini çalıştırarak tam satır sayılarını doğruluyor (npm run test:e2e:browser); bunun için kararlı filtre kimlikleri (#scan-filter-*,#scan-apply) eklendi. - README “En son sürüm” afişi tek satırlık bir özet + tam changelog’a bir bağlantıya indirildi (uzun çok-sürümlü anlatı duvarı kaldırıldı). Tüm 17 yerelleştirmede uygulandı.
[1.131.2] — 2026-07-31
Değiştirildi
app.cssüç sıralı stil sayfasına bölündü (dosya-boyutu-sözleşmesi borcu — tek dosya ~1990 satıra kadar büyümüştü, 800 satırlık sert hedefin çok üzerinde). Artıkapp.css(~672 — erişilebilirlik, tasarım token’ları/tema, kenar çubuğu, ana içerik, düğmeler, içerik kabuğu),components.css(~595 — kartlar, ızgaralar, sayfalayıcı, rozetler, tablolar, formlar, günlük/konsol, markdown, dil değiştirici, çip filtresi, bağlantı afişi) veoverlays.css(~737 — toast, bildirim çekmecesi, modal, çeşitli/duyarlı,[dir="rtl"]aynası, docs-fab, usage-hud), her biri sert sınırın içinde.- Kesim bitişik ve sırayla yapıldı, böylece kaskad bölünmeden önceki dosyayla bayt bayt aynı;
index.htmlüçünü sıralı<link>ler olarak yüklüyor. Davranış, biçimlendirme veya i18n değişikliği yok. - CSS doğrulayan testler artık birleştirilmiş içeriği paylaşılan bir
tests/helpers/css.mjs::loadAppCss()yardımcısı üzerinden okuyor. Yenitests/css-modularization.test.mjsbölünmeyi kilitliyor (dosyalar var · her biri ≤ 800 satır · index.html bağlantı sırası) → paket 2138. Tarayıcıda doğrulandı: üç stil sayfası da ayrıştırılıyor ve kuralları uygulanıyor.
- Kesim bitişik ve sırayla yapıldı, böylece kaskad bölünmeden önceki dosyayla bayt bayt aynı;
[1.131.1] — 2026-07-31
Düzeltildi
- v1.130.0’daki iki kaynağın adaptör ana bilgisayar sabitleme tutarlılığı (kod incelemesi takip işleri, derinlemesine savunma; geçerli girdiler için davranış değişikliği yok):
a16z-speedrun-talentadaptörü artıkapi:/a16z-speedrun-talent:geçersiz kılmasınıbuildEndpoint’te yeniden doğruluyor (HTTPS + tam ana bilgisayarspeedrun-talent-network.com) ve başarısız olduğunda kanonik beslemeye geri dönüyor —cryptocurrencyjobsadaptörüyle parite, böylece ana bilgisayar dışı bir değer asla getirme yuvasına ulaşmıyor (önceden yalnızca getirme zamanındakiassertSpeedrunUrlkoruyucusuna güveniyordu). Tam ana bilgisayar kontrolü artık koruyucu ve adaptör tarafından paylaşılan tek, dışa aktarılmış birSPEEDRUN_TALENT_HOST_RE.cryptocurrencyjobsayrıştırıcısı —cleanUrlartıkassertCryptocurrencyJobsUrlve adaptör geçersiz kılmasıyla aynı tam eşleşen ana bilgisayar koruyucusunu kullanıyor (önceden alt alan adlarını kabul edenendsWithidi). Ayrıştırıcı asla SSRF koruyucusundan daha izin verici değil: birsub.cryptocurrencyjobs.coilan bağlantısı düşürülüyor.- +2 test → paket 2135.
[1.131.0] — 2026-07-31
Eklendi
#/trackerCRM aşama-sekmesi panosu (üst projenin web uygulamasının/pipelinegörünümünden taşındı). İzleyicinin huni-çipi çubuğu + durum açılır menüsü bir aşama-sekmesi şeridi ile değiştirildi: bir Tümü sekmesi artı her kanonik durum için bir sekme — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — her biri canlı bir tüm-geçmiş sayısı gösteriyor, sıfır sayılı aşamalar dahil olmak üzere, böylece tüm huni her zaman görünür kalıyor (CRM görünümü). Etkin sekme filtreyi yönlendirir; tekrar tıklamak Tümü’ne geri temizler. Satırlar puan-tonu, meşruiyet, PDF ve rapor olanaklarını korur ve şirket hücresi artık logolar etkinleştirildiğinde bir marka logosu gösterir (varsayılan olarak kapalı → sıfır ekstra istek).- Yeni salt-okunur rota
GET /api/tracker/stageskanonik huniyi (sırayla etiketler) + bir takma-ad-katlama haritasını döndürür,server/lib/states.mjs’ten kaynaklanır (templates/states.yml, yerleşik yedekle) — böylece istemci durum beyaz listesini asla sabit kodlamaz. Eski parametresizGET /api/trackeryanıtı değişmedi (yalnızca{ rows }). - Yeni saf, birim test edilmiş istemci kitaplığı
public/js/lib/tracker-stages.jssatırları sunucunun aşamalarına göre gruplandırır, başıboş markdown kalın yazısını ve yerelleştirilmiş takma adları (ör.aplicado→Applied) tolere eder. Sekmeler erişilebilir (role tablist/tab, aria-selected, ≥44 px dokunma alanı, her sekmenin erişilebilir adında sayılar). Yeni i18n anahtarı yok. Paket 2133.
- Yeni salt-okunur rota
[1.130.0] — 2026-07-31
Eklendi
- Üst proje career-ops v1.24.0’dan taşınan iki yeni tarama kaynağı (işlem içinde, yeni bağımlılık yok; ikisi de
#/scanKaynak filtresinde ve cvstart.org açılış sayfasında görünüyor):- a16z Speedrun (
a16z-speedrun-talent, #2231) — a16z Speedrun yetenek ağı panosu genelindeki JSON beslemesi.speedrun-talent-network.com’a ana bilgisayar sabitli, yalnızca HTTPS, sayfa sınırlı 0-indeksli sayfalama, şirket başınaq/yapılandırma iş parçacığı, hataya karşı toleranslı. - Cryptocurrency Jobs (
cryptocurrencyjobs) — Web3 iş panosucryptocurrencyjobs.co, herkese açık RSS 2.0 beslemesi üzerinden alınıyor (kimlik doğrulamasız). İki geçişli XML varlık çözme, yalnızca uzaktan ilanlar, işveren başlık kuyruğundaki"… at <Company>"kalıbından ayrıştırılıyor. - Kayıt defteri toplamı artık 72 kaynak = 67 İngilizce + 5 Rusça (
ALL_ADAPTERS= 67 İngilizce portal adaptörü).
- a16z Speedrun (
Düzeltildi
echojobs— hibrit roller uzaktandan ayırt edilebilir kalıyor (üst projenin #2258’ini yansıtıyor). Büyük/küçük harf duyarsız birhybridişareti artık"<Şehir> · Hibrit"(şehir yoksa yalnızcaHibrit) veworkplaceType: 'Hybrid'üretiyor,Remote’a indirgenmek yerine.radancy— eski TalentBrew biçimlendirmesi + JSON sonuç-parçası taşıması (üst projenin a3e6df9’unu yansıtıyor), enjekte edilebiliropts.fetchJsonile kapılı.
Notlar
- Taşınmadı — yalnızca CLI üst proje özellikleri. career-ops v1.24.0’ün geniş CLI/mod yüzeyi web-ui’nin dışında kalıyor; web-ui bir görüntüleyici + ince yazma-geçişidir, bir mod barındırıcısı değil: uyumluluk/yargı bölgesi tabloları, kişi telefon rehberi + vCard, mülakat transkript-değerlendirmesi / çağrı platformu algılama, defter durum belirleme, sonuç kaydı, iki geçişli triyaj, iş ilanı benzerliği, sürümlü başvuru-CV yapı şeması, doctor Playwright-MCP algılama ve
portals/fix-slugs.mjs. Üst projeninscan.mjs’inde yaşayan tarama-orkestrasyonu değişiklikleri — Interamt.de Playwright tarayıcısı, iCIMS ters-ATS tam taraması, ülke uygunluğu uzaktan filtresi, DNS arama hızlandırması, StepStonerltryinelenen giderme ve tarama geçmişi normalleştirilmiş şirket sütunu — geçerli değil: web-ui EN/RU tarayıcılarını işlem içinde çalıştırır vescan.mjs’e kabuk açmaz. - Zaten kapsanmış.
role-matcheraksan katlama düzeltmesi (#2209) v1.127.0’de taşınmıştı, bu yüzden burada no-op’tur.
[1.129.1] — 2026-07-29
Düzeltildi
- v1.128/v1.129 web taşımalarına dair AI inceleme takipleri (hepsi tavsiye niteliğinde, kaynağında düzeltildi):
job-facets.jsseviye önceliği (açık bir niteleyici artık yönetim kelimesini yener —Senior Engineering Manager→senior, öncedenlead);states.mjsyedeği artık sabitlenmiyor (başarılı okuma belleğe alınır, yedek önbelleksiz döner — açılışta geçici olarak erişilemeyen üst proje sonraki çağrıda yeniden okunur) + mevcut ama bozuk dosyadaconsole.warn;score-tone.js— puansız satır nötr (muted), kırmızı değil;domainFromName()/api/logoöncesi ASCII olmayan slug’ları atlar; +tests/states.test.mjsizolasyon koruması. +4 test → 2073.
[1.129.0] — 2026-07-29
Eklendi
#/scanseviye faseti + yaş sütunu — v1.128.0’de gelenjob-facets.jskütüphanesi artık tarama arayüzüne bağlı (önceden yalnızca mantıktı). Yeni Seviye açılır menüsü her ilan başlığını lead/staff/senior/orta/junior/stajyer olarak sınıflar (JobFacets.seniorityFromTitle) ve sonuçlarda gerçekte olanlarla otomatik dolar (Ülke faseti gibi); seviye kelimesi olmayan başlıklar hep geçer. Kayıtlı aramalar, Sıfırla ve Uygula’da korunur. Tablo bir Seviye rozet sütunu ve token’sız bir Yaş sütunu (bugün/Ng,JobFacets.daysSince’ten) kazanır. 12 i18n anahtarı ×17, +3 test → 2069.
[1.128.0] — 2026-07-29
Eklendi
- Üst projenin kendi web uygulamasından (
../web/, Next.js) dört çözüm taşındı, saf JS/ESM ile yeniden yazıldı, yeni bağımlılık yok: (1)server/lib/states.mjs, izleyicinin durum sözlüğü içintemplates/states.yml’i canlı okur (CI yedeği) — her sürümdeki manuel beyaz liste yeniden senkronunu kaldırır; POST takma adları (İspanyolca/eski) kanonik etikete katlar, GET hunisi kanonik duruma göre gruplar; (2) ATS barındırmalı satırlarda şirket logoları —domainFromName()(~90 marka→alan adı); (3)score-tone.js— 4 kademeli puan tonu (≥4.2/3.8/3.0 + harf yedeği); (4)job-facets.js— seniority/source/days facet’leri. +21 test.
Notlar
- Taşınmadı (yalnızca kavram): üst projenin ajan eylem katmanı (
actions/registry.ts+api/assistant/route.ts) —docs-fabbir yardımcı pilota dönüşürse diye taslak. Yeni kaynak yok (kayıt defteri 70), i18n/help değişikliği yok.
[1.127.0] — 2026-07-29
Eklendi
- Üç yeni tarama kaynağı (career-ops v1.23.0 paritesi) — kayıt defteri artık 70 adaptör (65 EN + 5 RU) sunuyor: Flowxtra (kimlik doğrulamasız genel toplayıcı), VDAB (Flaman kamu istihdam servisinin anahtar kelime API’si) ve iCIMS (
careers-<tenant>.icims.comportalları,jibeapply’dan ayrı). Ayrıca Cursor CLI listesine geri döndü (parent #2115):cli-detectartıkcursor’ı algılıyor (10 araç), liste help/README/config ×17’de geri getirildi.
Düzeltildi
- agenticjobs HTML kazımadan REST API’ye geçti (#2167);
location.nameyalnızca çalışma modeliyken Greenhouse şehri/offices’ten kurtarıyor (#2104); role-matcher paritesi (#1933/#2164/#2009: MTS öneki,producttaban çizgisi, aksan katlama, alt-taban uyuşmazlığı).
Notlar
- Taşınmadı. v1.23.0’ün çoğu web-ui’nin kullanmadığı CLI/pano yüzeyi (batch-tailor, discover-ats, NL/PT modları, PDF temaları, Go panosu, updater/doctor); aktarma betikleri değişmiyor. Üst projenin VERSION’ı → 1.23.0.
[1.126.1] — 2026-07-25
Düzeltildi
- v1.126.0 yeniden senkronunun kaçırdığı iki CLI listesi kayması — (1)
#/configAPI keys sekmesi girişi (config.providerModelNote, i18n ×17) yalnızca 7 CLI listeliyordu — artık Antigravity ve Grok Build OpenCode’dan sonra ekleniyor; (2) yardım kılavuzundaki (×17) ikinci karşılaştırma tablosu satırı ve CI’da derlenen site help’i hâlâInside Claude Code / Codex / Cursor / Gemini CLI(eski Cursor içeren küme) diyordu — artık tam liste. İkisi de v1.126.0 taramasının desenlerinin kapsamadığı eğik çizgi/orta nokta ayırıcıları kullanıyordu. i18n anlık görüntüsü yeniden üretildi; paket 1969’da kalıyor.
[1.126.0] — 2026-07-25
Eklendi
- AI CLI araçları sekmesi artık career-ops’un 8 birinci sınıf CLI’sinin tümünü algılıyor —
#/configlistesi üst projenindocs/SUPPORTED_CLIS.mddosyasıyla senkronlandı:server/lib/routes/cli-detect.mjsGrok Build CLI (grok) ve Kimi CLI (kimi) kazanıyor ve Antigravity artık önce kanonikagyikili dosyasını yokluyor. Salt-okunur PATH taraması artık 9 araç bildiriyor; bulunan bir ikiliyi hâlâ asla çalıştırmıyor.
Değiştirildi
- career-ops.org/docs ile dokümantasyon yeniden senkronu — her doküman yüzeyi üst projenin canlı sayfalarıyla (31’inin tümü okundu) karşılaştırıldı. Kanonik AI asistan listesi (help ×17 + README ×17) artık 8 birinci sınıf CLI’yi — Claude Code, Codex, OpenCode, Antigravity CLI, Grok Build CLI, Qwen Code, Kimi, GitHub Copilot CLI — ve Gemini CLI’yi (eski sarmalayıcı) listeliyor. Yardım paketleri 29 H2 / 105 H3 yapısını koruyor.
[1.125.4] — 2026-07-23
Değiştirildi
- site bağımlılıkları (dependabot #151–#153) —
site/içindesharp0.34.5→0.35.3,svgo4.0.1→4.0.2,fast-uri(dev) 3.1.3→3.1.4; Astro derlemesi yeşil, SPA/sunucu etkilenmedi.
Notlar
- Üst proje parite taraması (career-ops
37d17ec..254764a, v1.22.0 sonrası) — taşınacak bir şey yok:set-statusyanlış-satır korumasi (#2108) yalnızca CLI (web-ui’de izleyici satırları arayüzde açıkça seçilir ve hiçbir rotaset-status.mjs’i çağırmaz), yerelleştirilmiş modlardaki Risk Summary (#2109) web-ui’nin hiç okumadığımodes/<lang>/dosyalarına dokunur (yalnızca üst düzeymodes/*.mdokunur),update-systemmanifest doğrulaması (#2111) yalnızca güncelleyiciye aittir, gerisi üst proje belgeleridir (Türkçe README, SIGNATURES ×4, SCRIPTS.md, es aksanları). Üst projenin VERSION’ı 1.22.0 olarak kalır —parentVersiondeğişmedi.
[1.125.3] — 2026-07-23
Düzeltildi
- Danca ve Hintçe LLM istemleri İngilizce yanıt veriyordu (kullanıcı bildirimi) —
server/lib/prompts.mjsiçindekiLOCALE_NAMESve beşSCAFFOLD_STRINGSbloğudavehiiçin hiç genişletilmemişti;resolveLocale()en’e düşüyor ve her AI istemi — deep research (canlı ve manuel), modlar, değerlendirme, mülakat, networking, CV Studio — bu iki dilde# Output languageyönergesini kaybediyordu. Artık ikisi de birinci sınıf: dil yönergesi + yerelleştirilmiş iskele.tests/locale-scaffold.test.mjsiçindeki regresyon kapısı artık sabit kodlu 12 yerine kanonik 17 dillik listeyi tarıyor ve yeni yapısal parite kapısı İngilizceye düşen her iskele anahtarını başarısız sayıyor — gelecekteprompts.mjs’i atlayan bir dil artık yayınlanamaz (+12 test, paket artık 1969).
[1.125.2] — 2026-07-22
Düzeltildi
- Gemini ile derin araştırma: HTTP 502 (
MALFORMED_FUNCTION_CALL) (#145, @Alien10140 katkısı) — canlı/api/deepistemi modele “Use WebFetch / WebSearch” komutunu ve brifi dosyaya kaydetmesini söylüyordu; ancak araçsız API sağlayıcılarında araç kanalı yoktur ve Gemini metin yerine bir işlev çağrısıyla yanıt veriyor, bu da boş bir HTTP 502 olarak görünüyordu.buildDeepPromptvebundleProjectContextartık birheadlessbayrağı alıyor: canlı çalıştırmalar (Anthropic/Gemini/yedek kaskadı) brifi gömülü bağlamdan yazan araçsız bir istem alırken, Claude Code için kopyala-yapıştır istemi araç talimatlarını koruyor.tests/critical-fixes.test.mjsiçinde +1 test.
Değiştirildi
- Gemini varsayılanları, kullanımdan kaldırılan
gemini-2.0-flashmodelinin ötesine taşındı (#144, @Alien10140 katkısı) — Yapılandırma açılır listesi,gemini.mjsiçindeki sunucu yedeği (ipucuyla sessizce çelişiyordu), OpenRouter yedek zinciri,config.geminiModelHint×17 ve yardım kılavuzu ×17 artık tutarlı biçimdegemini-3.6-flashgösteriyor. Yeni kayma kapısıtests/gemini-default-model.test.mjs(+5 test) tüm yüzeyleri aynı değişmeze sabitliyor — paket artık 1957 test.
[1.125.1] — 2026-07-21
Düzeltildi
- SuccessFactors: çok markalı RMK kiracıları marka yollarını koruyor (üst proje #2099, v1.22.0 sonrası) — birkaç satın alınmış markayı tek bir paylaşılan RMK örneği üzerinden yürüten holding şirketleri, bunları bir yol segmentiyle birbirinden ayırt eder (
careers.nemetschek.com/Bluebeam/vs…/Vectorworks/); adaptör yapılandırılmış URL’yi daha önce kök alanına indirgiyor ve sessizce yalnızca ana markanın ilanlarını tarıyordu. Uç nokta artık marka önekini koruyor ve yalnızca sondaki bir/search/veya/tile-search-results/segmentini kırpıyor, böylece hiçbir şey kendi üzerine katlanmıyor; tek domainli kiracılarda tek bir bayt bile değişmiyor. Yeni dışa aktarılanresolveTenantBaseyardımcı fonksiyonu +tests/sources-successfactors.test.mjsiçinde 1 taşınmış test bloğu.
[1.125.0] — 2026-07-21
Eklendi
- cvstart.org: Landingde “İş kaynakları” bölümü — ekran görüntüleri ile karşılaştırma listesi arasına eklenen yeni bir bölüm, 67 tarama kaynağının tümünü tıklanabilir çipler olarak listeler (62 İngilizce pano/ATS + kendi alt başlığı altında 5 Rus panosu), her biri kaynağın herkese açık sitesine bağlanır. Liste, build sırasında canlı adaptör kayıt defterinden senkronize edilir (
sync-assets.mjs→facts.sources), böylece uygulamadan asla sapamaz;Sources.astroiçindeki düzenlenmiş bağlantı haritası yenitests/site-sources.test.mjsile korunur. Üst gezinme çubuğu yeni bir Kaynaklar çapası kazandı; 4 yeni site i18n anahtarı ×17. Ayrıca, hâlâhieksik olan landing JSON-LDinLanguagelistesi düzeltildi.
[1.124.0] — 2026-07-21
Eklendi
- Beş tarama kaynağı (üst proje v1.22.0 paritesi, #1808/#1572/#2024/#2055) — Welcome to the Jungle (pano geneli JSON API), Agentic Engineering Jobs (agentic/yapay zeka mühendisliği panosu), Jobvite (sıfır-kimlik-doğrulamalı kiracı-başına ATS), Gem (kiracı-başına ATS) ve Alibaba Group (kariyer JSON API’si, Meituan/Tencent kalıbı). Her biri ana bilgisayara sabitlenmiş, CI-izole bir kaynak + adaptör çifti; kayıt artık 67 adaptör (62 İngilizce + 5 Rusça) gönderiyor;
#/scanKaynak açılır menüsü yedeği ve onun sapma kapısı güncellendi; beş yeni test paketitests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.
Düzeltildi
- Arbeitsagentur:
homeofficetypyalnızcaVOLLSTAENDIGolduğunda tüm ülke çapında uzaktan sayılıyor (üst proje #1981) —homeoffice=nv_truesorgusu hibrit rolleri de döndürüyordu, bu yüzden uzaktan geçişi artık her sonucu küçük gruplar hâlinde ilan detayları uç noktasına karşı doğruluyor ve hataya karşı temkinli davranıyor (bir sorgu hatası ilanın gerçek şehrini korur, böylece konum filtreleri yine de uygulanmaya devam eder). - SmartRecruiters: herkese açık iş URL’leri
/postings/olmadan oluşturuluyordu (üst proje #2047) — bağlantılar artık, herkese açık sitesi bu segmenti atlayan kiracılar için 404 yerine herkese açık ilan sayfasına iniyor.
Notlar
- Üst proje v1.22.0 ayrıca web-ui’nin shell ile çağırmadığı veya zaten kapsadığı CLI tarafı değişiklikler gönderdi: zh-CN CV şablonu + PDF tipografisi,
/expandmodu, sağlayıcı prompt-önbelleği ince ayarları (Gemini/OpenAI/Ollama), adım başına token dökümü (web-ui’nin kendi kullanım göstergesi var), tracker’ın yazıcı-kilidi serileştirmesi (web-ui yazmaları v1.21’den beri zatenwithFileLocküzerinden yönlendiriyor), taramavisa_filter’ı + mutlak yayın-tarihi CLI bayrakları (web-ui’nin kendi “Posted within” yaş filtresi var) ve görülen-kaynak tekilleştirme tohumlaması (web-ui tarayıcısı kendi tarama-geçmişi tekilleştirmesini tutuyor).
[1.123.0] — 2026-07-17
Eklendi
- Oracle Recruiting Cloud tarama kaynağı (üst proje v1.21.0 paritesi, #1929) — Oracle Fusion/ORC kariyer sitelerinin (JPMorgan Chase, Oracle, BNY Mellon, American Express, Honeywell, …) sıfır-kimlik-doğrulamalı
recruitingCEJobRequisitionsREST API’si:*.fa[.<bölge>][.ocs].oraclecloud.comana bilgisayarına sabitlenmiş, site numarası her takip edilen şirketincareers_urlalanından çözümlenmiş, sabit bir sayfa üst sınırıyla offset sayfalandırma ve WAF’a duyarlı tarayıcı-benzeri başlıklar. Kayıt artık 62 adaptör (57 İngilizce + 5 Rusça) gönderiyor;#/scanKaynak açılır menüsü yedeği ve onun sapma kapısı güncellendi; yeni CI-izole test paketitests/sources-oraclecloud.test.mjs.
Düzeltildi
- Repost dedektörü: temel başlıklar özelleştirilmiş-ek adı olan kardeşlerinden ayrı kalıyor (üst proje #1922) — “Senior Analytics Engineer” artık “Senior Analytics Engineer, People Analytics” ile kümelenmiyor: bir başlığın belirteçleri diğerinin belirteçlerinin kesin bir alt kümesi olduğunda ve fazladan belirteç gerçek bir uzmanlaşma ise (temel bir sözcük değil), iki ilan ayrı ayrı yayınlanabilir açık pozisyonlar olarak ele alınıyor. Yeniden yayınlama açıklamaları (“(Repost)”, “relisted”) artık anlamsız gürültü olarak durak-sözcük listesine alındı.
tests/detect-reposts.test.mjs’de +2 doğrulama.
Notlar
- Üst proje v1.21.0 ayrıca web-ui’nin shell ile çağırmadığı veya zaten kapsadığı CLI tarafı değişiklikler gönderdi: tekrar-şirket yeniden başvuru uyarısı (web-ui’de v1.84.0’dan beri yeniden-başvuru soğuma süresi var), ön yazı
--format/--reportbayrakları, mülakat kırmızı-bayrak / panel-istihbaratı / gelmeme e-postası prompt modları, tarama güven-sinyali & portal sağlığı kalıcılığı (web-ui kendi süreç-içi tarayıcısınıtrust-validatorile ve Portallar sağlık sayfasıyla çalıştırıyor) ve istatistik/maaş-farkı uzantıları (salt okunur ve arızaya-toleranslı olarak aktarılıyor).
[1.122.0] — 2026-07-16
Eklendi
- Hintçe (हिन्दी) — 17. dil — tam arayüz sözlüğü (~1.110 anahtar), eksiksiz uygulama içi yardım kılavuzu (29 H2 / 105 H3 paritesi),
README.hi.md, yeni birCHANGELOG.hi.md(de/it/tr emsalini izleyerek v1.122.0’dan başlıyor), cvstart.org landing + Metodoloji/Lisans/Değişiklik Günlüğü/Yardım sayfaları, dil değiştirici (🇮🇳), tarayıcı diline göre otomatik algılama ve yerelleştirilmiş bir dashboard ekran görüntüsü. Her ×16 parite kapısı artık ×17 çalışıyor: i18n sözlük paritesi + anlık görüntü, yardım H2/H3 kapıları, CHANGELOG paritesi, sitecheck-i18nve Playwright yerel ayar taraması.
[1.121.0] — 2026-07-16
Eklendi
- cvstart.org: Metodoloji, Lisans ve Değişiklik günlüğü sayfaları — landing sayfası, mevcut Karşılaştırma bloğunun yanına 16 dilin tümünde üç yeni bölüm kazandı: /methodology/ (altı boyutlu 0.0–5.0 puanlama ölçeği, 4.0 başvuru eşiği ve asla yapılmayacak kurallar — career-ops.org/methodology adresinin yerelleştirilmiş bir özeti), /license/ (NOTICE.md işaretçisiyle birlikte resmi MIT metni) ve /changelog/ (bu dosya, depodaki 16 çevrilmiş CHANGELOG’dan yerel ayara göre işlenir). Yeni başlık Metodoloji girdisi ve altbilgi Kaynaklar bağlantıları;
sync-assets.mjsartık derleme sırasında CHANGELOG ×16 ve LICENSE’ı siteye eşitliyor, böylece sayfalar depodan asla sapamaz. - Dokümanlar genelinde metodoloji bağlantıları — README (16 dilin tümü), uygulama içi yardım kılavuzu §1 kanonik listesi (16 dilin tümü) ve wiki artık mevcut career-ops.org/docs kılavuzlarının yanı sıra career-ops.org/methodology adresine (ayrıca SSS ve sözlüğe) bağlantı veriyor.
Değiştirildi
- README sürüm banner’ı ve rozetleri güncellendi (testler 1850, sürüm v1.121.0) — banner hâlâ v1.119.5’i duyuruyordu.
[1.120.0] — 2026-07-16
Eklendi
- CareerOps Manifestosu (üst proje v1.20.0 paritesi) — üst proje CareerOps Manifestosu’nu (
MANIFESTO.md· career-ops.org/manifesto) yayınladı ve şimdi bunu README’sinden, güncelleyicisinden ve Go dashboard’ından öne çıkarıyor. Web-ui de aynısını yapıyor: yeni bir kenar çubuğu altbilgi bağlantısı manifesto sayfasını açıyor (16 yerel ayarın tümünde yenifooter.manifestoi18n anahtarı), uygulama içi yardım kılavuzu 16 dilin tümünde §29 “CareerOps Manifestosu”nu kazandı, README manifestonun ne olduğunu ve nasıl imzalanacağını açıklıyor ve cvstart.org landing altbilgisi de ona bağlantı veriyor.
Notlar
- Üst proje v1.20.0 ayrıca
upskillhedefli modun bilinen-beceri bastırmasını düzeltti,scan --jsonstdout’unun ayrıştırılabilir kalması için dotenv’i sessizleştirdi ve bir rol başlığının madde işaretleriyle birlikte kalması için HTML CV şablonunu düzeltti — bunlar web-ui’nin shell ile çağırmadığı CLI tarafı yüzeyler; web-ui kodunda değişiklik gerekmedi.
[1.119.5] — 2026-07-13
Düzeltildi
- Landing’deki dil düğmesi artık satır atlamıyor — v1.119.2’deki bayraklarla başlıktaki değiştirici etiketi (ör. «🇷🇺 Русский») dar masaüstü genişliklerinde üç satıra kadar bölünebiliyordu; değiştirici etiketi ve açılır menüdeki tüm seçenekler artık
whitespace-nowrap— bayrak + endonim her zaman tek satırda. Altbilgideki dil listesi katı iki sütunlu ızgaradan tek satırlık öğelerden oluşan sarmalanan bir sıraya geçti — «🇧🇷 Português (Brasil)» da artık adın ortasından bölünmüyor.
[1.119.4] — 2026-07-13
Değiştirildi
- LICENSE yazarı belirtiyor — telif satırı artık şöyle: Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors (kanonik MIT metni dokunulmadı). Yeni NOTICE.md lisanslamayı ayrıntılı açıklıyor: telif hakkını kim tutuyor, MIT izni tam olarak neyi kapsıyor (kod, belgeler, çeviriler, landing, wiki), neyi KAPSAMIYOR (çalışma zamanı verileriniz, üst proje, iş ilanı içerikleri, ticari markalar), üçüncü taraf bileşen tablosu (express/js-yaml — MIT; Astro/Tailwind — MIT; Figtree ve JetBrains Mono yazı tipleri — SIL OFL 1.1; sharp — Apache-2.0) ve isteğe bağlı bir atıf satırı.
[1.119.3] — 2026-07-13
Eklendi
- SECURITY.md — CONTRIBUTING’in işaret ettiği güvenlik politikası artık mevcut: desteklenen sürümler, özel bildirim akışı (depoda GitHub private vulnerability reporting artık etkin — Security sekmesi → «Report a vulnerability»), localhost’a bağlı tek kullanıcılı bir uygulamanın tehdit modeli (kapsamda: düşmanca ilanlar üzerinden XSS / SSRF / path traversal / gizli anahtar sızıntısı / CSP zayıflatma; kapsam dışı: kendi localhost’una DoS ve üst projenin sorunları) ve gözden geçirenler için sertleştirme taban çizgisi.
[1.119.2] — 2026-07-13
Eklendi
- CONTRIBUTING.md — landing’in ve README’nin başından beri bağlantı verdiği katkıda bulunan rehberi artık mevcut: kurulum, proje haritası, katı güvenlik/no-build kuralları, test katmanları, tarama kaynağı eklemek için «iki kayıt» walkthrough’u, ×16 i18n sözleşmesi, commit/PR kuralları ve sürüm süreci.
- Landing’de dil bayrakları — cvstart.org dil değiştirici, alt bilgideki dil ızgarası ve «kendi dilinde oku» banner’ı artık her yerel ayarın bayrağını endoniminin yanında gösteriyor (uygulamanın dil
<select>’iyle aynı bölgesel gösterge seti; bayrak glifleri olmayan yerlerde bölge harflerine düşer). - Landing altbilgi düzeltmeleri — ölü Discussions bağlantısı (özellik depoda etkin değil) artık projenin wiki’sine gidiyor ve altbilgi yazarı belirtiyor: Sergei Emelianov (sergey-cv.com · LinkedIn).
[1.119.1] — 2026-07-13
Düzeltildi
#/scankaynak filtresi kayda yetişti — Source açılır menüsünün arkasındaki statikFALLBACK_SOURCESlistesi (yalnızcaGET /api/scan/sourcesulaşılamazken kullanılır) v1.87.0’dan beri sessizce geride kalmıştı: çevrimdışı fallback’te 20 sağlayıcı eksikti (Amazon, Avature, SAP SuccessFactors, Get on Board, Dassault Systèmes, beesite, HigherEdJobs, JibeApply (iCIMS), softgarden, Cornerstone, Phenom, Radancy, Deutsche Bahn, EchoJobs, TKMS, Heckler & Koch, Rheinmetall, LaraJobs ve yeni Meituan / Tencent). Tüm 61 ile eşitlendi ve artık istemci listesi sunucu kaydından saptığında CI’ı düşüren bir kayma testiyle korunuyor (değerler VE etiketler). +1 test (1845).
[1.119.0] — 2026-07-13
Üst career-ops v1.19.0 paritesi + cvstart.org landing yenilemesi.
Eklendi
- 2 yeni tarama sağlayıcısı — Meituan (
zhaopin.meituan.com) ve Tencent (careers.tencent.com): Çin tech kartlarının kimlik doğrulamasız açık JSON API’leri, host’tan tespit edilir veya açıkprovider:ile seçilir; anahtar kelime başına sunucu tarafı arama, sayfalama ve URL’ye göre tekilleştirme — artık 61 adaptör (56 EN + 5 RU). +20 test (1844). - Landingde katkıda bulunanlar bloğu — cvstart.org, kod katkısı yapan herkesin avatarını gösterir (build sırasında GitHub
/contributorsAPI’si, botlar filtrelenir), 16 dilin tümünde yerelleştirilmiştir ve tam katkı grafiğine bağlantı verir. - Landingde canlı GitHub yıldız sayacı — başlıktaki rozet artık her ziyarette GitHub API’sinden istemci tarafında yenilenir (build anlık görüntüsü fallback olarak kalır) ve haftalık zamanlanmış Pages yeniden derlemesi anlık görüntü + katkıda bulunanlar listesini taze tutar; CI’daki API çağrıları token ile doğrulanır.
Düzeltildi
- Workday CXS istekleri tarayıcı benzeri başlıklar taşır (üst #1813) — Cloudflare arkasındaki kiracılar (canlıda görüldü: geico) olağan UA/
accept-language/origin/refereriçermeyen isteklere 500 döner; fetch’leyici artık origin + site slug’ını CXS URL’sinin kendisinden türetir. Glints istekleri aynı tarayıcı UA + origin/referer’ı kazandı; ikisi dehttp-json.mjsiçindeki ortakBROWSER_LIKE_USER_AGENTsabitinden gelir.
[1.118.4] — 2026-07-10
Düzeltildi
- hh.ru taramaları Rus IP’sinden 0 sonuç döndürüyordu (bölgesel alt alan bağlantıları) — Rus konut IP’sinden hh.ru aramayı 302 ile bölgesel bir alt alana (
sochi.hh.ru,spb.hh.ru, …) yönlendiriyor ve ilan bağlantılarını o alt alanda döndürüyor. Ayrıştırıcı başlık bağlantısını sabithttps://hh.ru/vacancy/ana makinesinde arıyordu ve bölgesel olanların hiçbiriyle eşleşmiyordu; tamamen çalışan bir tarama sessizce 0 kaydediyordu. Artık herhangi bir*.hh.ruana makinesini kabul ediyor (adsrv.hh.ru/click?…reklamları hâlâ hariç tutuluyor —/vacancy/<id>yolu yok) ve her sonuç URL’sinihttps://hh.ru/vacancy/<id>biçimine normalleştiriyor. Canlı doğrulandı: önceden 0 veren birsochi.hh.rusayfasından artık 17 gerçek ilan ayrıştırılıyor. +1 test (1824).
[1.118.3] — 2026-07-10
Düzeltildi
- hh.ru sessizce 0 sonuç döndürüyordu (VPN doğrulama ara sayfası) — hh.ru artık VPN/proxy olarak işaretlediği ağları (datacenter IP’leri) HTTP 200 ile tek bir ilan kartı bile içermeyen
/vpncheeckara sayfasına (“VPN мешает работе сайта”) 302 ile yönlendiriyor; bu yüzden tarama hiçbir hata vermeden 0 raporluyordu. Tarayıcı artık yönlendirmeyi yanıtın nihai URL’sinden algılıyor, hh.ru’yu çalıştırmanın geri kalanı için devre dışı bırakıyor ve dürüst bir ipucu yazıyor: trafik gerçekten konut tipi bir IP üzerinden çıkmalı — sistem genelindeki bir VPN/proxy, tarayıcıdaki anahtar kapalıyken bile etkin kalabilir. +1 test (1823).
[1.118.2] — 2026-07-10
Bakım
- Landing takibi (#118) —
site/README.mdAstro 7 ile uyumlandı (#116’daki güvenlik yükseltmesi), kullanılmayan import kaldırıldı ve landing derleme betikleri için +4 çalıştırılabilir koruma eklendi: i18n parite kapısı bozuk bir sözlükte kanıtlanabilir şekilde başarısız olur vesync-assetsaslasite/dışına yazmaz — takım 1822. İki CodeQL uyarısı çözüldü (biri kaynakta düzeltildi, biri amaçlanan derleme davranışı olarak reddedildi).
[1.118.1] — 2026-07-10
Düzeltildi
- Rusya dışından hh.ru taraması — hh.ru artık halka açık arama sayfalarında Rus olmayan IP’lere HTTP 451 (bölgesel yasal engel) döndürüyor. Tarayıcı 451’i 403 gibi ele alır: ilk engelden sonra hh.ru çalıştırmanın geri kalanı için devre dışı bırakılır ve günlüğe Rus IP’si / VPN çıkışına işaret eden dürüst bir satır yazılır; kalan sorgular ve diğer RU kaynakları boşa gitmez. Yardım §7 tüm 16 dilde güncellendi. +1 test (1818).
[1.118.0] — 2026-07-09
Üst career-ops v1.18.0 parite paketi.
Eklendi
- 9 yeni tarama sağlayıcısı — Cornerstone OnDemand (
csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — artık 54 adaptör. Lever adaptörü ayrıca EU tenant panolarını (jobs.eu.lever.co) algılar. - Takipçide
Hireddurumu (üst projeninstates.ymlparitesi): kabul edilen teklifler kendi kanonik durumunu, kutlama rozetini ve#/trackerüzerinde «iş bulundu» banner’ını alır; huni ve dönüşüm grafikleri onu tüm aşamalardan geçmiş sayar. #/statsiçinde Toplam sekmesi — üst projeninstats.mjsdosyasının salt okunur aktarımı (toplam takipçi özeti, kümülatif huni oranları, tarayıcı toplamları, portal kapsamı) artısalary-gap.mjsücret gözlemleri (istenen vs ilan edilen vs gerçek, başvuru başına). Yeni rotalarGET /api/stats/lifetimeveGET /api/stats/salary-gap— sıfır token maliyetli shell-out, üst proje yokken güvenli{available:false}düşüşü.- 16 dilin tamamında 28 yeni i18n anahtarı; yardım kılavuzu §14/§26 tüm dillerde güncellendi.
Testler
- +38 birim testi (üç sağlayıcı parite paketi + aktarım/durum rotaları) — toplam 1817.
[1.117.2] — 2026-07-06
Parite shell-out’ları için boş izleyici düzeltmesi. İzleyicide henüz başvuru yokken üst betikler kod 1 ve yapılandırılmış {error} JSON ile çıkar; takip panosu ve ret kalıpları sekmesi bunu “script-error” olarak gösteriyordu. Her iki rota artık bunu sağlıklı bir boş durum (available:true, empty:true) olarak iletir ve UI dürüst “henüz bir şey yok” mesajını gösterir. Gerçek bir üst projeyle canlı doğrulandı.
Yeni: yok.
[1.117.1] — 2026-07-06
v1.117.0 sertleştirmesi (CodeQL triyajı). Üç shell-out uç noktası (GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns) artık paylaşılan IP başına sınırlayıcıyı taşıyor (her istek bir alt süreç başlatır; loopback’te no-op). CV’ye ekle’nin URL metin çıkarımı etiketleri sabit noktaya kadar soyar, sonra kalan tüm </> karakterlerini siler — LLM istem metni için kanıtlanabilir şekilde eksiksiz bir arındırma. Geçerli girdi için davranış değişikliği yok.
Yeni: yok.
[1.117.0] — 2026-07-06
Üst proje parite paketi — üst career-ops’un altı yeteneği UI’ya taşındı. (1) #/followup’ta kadans panosu: followup-cadence.mjs’ten başvuru başına aciliyet (🔴/🟠/🟡/🔵) + Takip tarihlerini ekle düğmesi (followup-seed.mjs --backfill). (2) Ret kalıpları: dördüncü İstatistik sekmesi analyze-patterns.mjs’i (salt okunur) çalıştırır — sonuç dağılımı, öneriler, ATS sağlayıcısı başına ilerleme oranı. (3) CV’ye ekle: bir CV Studio kartı URL’yi veya yapıştırılan metni YALNIZCA o kaynağa dayanan ATS maddelerine çevirir (yalnız öneri, yazma yok; URL getirme SSRF korumalı). (4) 4 yeni tarama sağlayıcısı — beesite, HigherEdJobs (RSS), JibeApply (iCIMS), softgarden — kayıt defteri artık 50 adaptör (45 EN + 5 RU), hepsi Scan açılır listesinde. (5) Apply kontrol listesine eleme ön taraması adımı. (6) Reconcile çalıştırıcısı (/api/run/reconcile). Shell-out rotaları üst betikler olmadan dürüstçe düşer.
- Yeni rota modülü
server/lib/routes/followup.mjs(31.) + yeni rotalar + 8 source/adapter dosyası. Testler: 6 + 7 yeni; süit 1737 → 1750. 41 yeni i18n anahtarı ×16. Yardım §13/§17/§24/§26 ×16 genişletildi.
Yeni: GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns, POST /api/cv-studio/add-entry, POST /api/run/reconcile.
[1.116.0] — 2026-07-06
Kullanım göstergesi yeniden yapıldı + ilk uçtan uca widget testi. AI kullanım göstergesi (v1.114.0) düzeltildi ve doğru sabitlendi: artık sol kenar çubuğunun altına sabitli (tam kenar çubuğu genişliği, aynı yüzey) ve altta kendi yüksekliği kadar boşluk ayırarak menü asla kapanmaz — gezinme ve sürüm altbilgisi her zaman onun üstünde serbestçe kayar. Canlı yenilenir (her 15 sn, sekme odağında ve rota değişiminde) ve her pencere satırı artık her zaman %100 olan “pay” yerine gerçek <jeton> · <tahmini maliyet> gösterir (çubuklar 30 günlük pencereye göre ölçeklenir). Ayrıca: CV içe aktarıcısındaki kalıcı bir typeof bariyeri, tekrarlayan CodeQL tür karışıklığı yanlış pozitifini kaynağında kapatır ve yeni bir Playwright uçtan uca testi her iki kalıcı widget’ı gerçek bir tarayıcıda çalıştırır.
public/js/lib/usage-hud.js+app.css,server/lib/cv-import.mjs. Testler:tests/playwright-widgets.mjs(2 E2E) +tests/usage-hud.test.mjs(10). Yardım §6 ×16 genişletildi.
Yeni: yok.
[1.115.0] — 2026-07-06
Tasarım rötuşu (muhafazakâr, mercan marka korundu). Ortak tasarım sistemi üzerinde hafif bir ince ayar geçişi — yeniden yapılandırma yok, palet değişikliği yok. Pano metrik kartları artık üzerine gelince hafifçe yükselir ve mercan bir kenarlık kazanır (hızlı eylem karoları gibi); içerik kartları azıcık yükselir; primary / dark / danger düğmeleri derinlik için durağan bir gölge ve nazik bir hover yükselişi kazanır; büyük sayılar tabular-nums ile hizalanır; ve etkileşimli denetimler net 2px klavye halkasının arkasında yumuşak bir mercan odak halesi alır. Tüm hareket prefers-reduced-motion’a saygı gösterir ve hale denetimlerle sınırlıdır — asla küresel bir *:focus-visible değil.
- Yalnızca CSS (
public/css/app.css); işaretleme, i18n, rota veya CSP değişikliği yok. Testler:tests/design-polish-v1115.test.mjs(5). Playwright ile canlı doğrulandı.
Yeni: yok.
[1.114.0] — 2026-07-06
Kenar çubuğunda AI kullanım ve maliyet göstergesi (sol alt). Kompakt bir KULLANIM bölümü artık her sayfada kenar çubuğunun altında yer alır (kenar çubuğu yoksa sol altta sabit bir kart; RTL’de sağ altta). LLM jeton kullanımını 24s / 7g / 30g pencerelerinde gösterir — her biri <jeton> · <pay%> olarak (tüm zamana göre pay) yeşil bir çubukla — ve tahmini 24s maliyet altbilgisi ekler. Veri, data/llm-usage.jsonl dosyasının salt okunur GET /api/usage özetidir (yalnızca yerel), #/usage sayfasıyla aynı kaynak; maliyet bir tahmindir ve manuel mod çalıştırmaları ücretsizdir ve sayılmaz. Katlanabilir — başlık değiştirir ve durum korunur.
index.html’den yüklenen yeni istemci bileşenipublic/js/lib/usage-hud.js, sürüm altbilgisinin üstünde kenar çubuğuna takılır (sabit köşe yedeği). CSP güvenli; temaya duyarlı + RTL aynalı. Yeni sunucu rotası yok. Testler:tests/usage-hud.test.mjs(8). 3 yeni i18n anahtarı ×16.
Yeni: yok.
[1.113.0] — 2026-07-06
Her sayfada yüzen “Yardıma sor” asistanı. Gradyanlı bir robot sohbet düğmesi artık her sayfanın sağ alt köşesinde (RTL’de sol altta) yüzer. Kullanım sorularını YALNIZCA kendi dilindeki uygulama içi yardım kılavuzuna dayanarak yanıtlayan kompakt bir sohbeti açmak için tıkla — #/docs-assistant sayfasıyla aynı uç nokta (POST /api/docs-assistant/ask), dolayısıyla asla CV’ni, profilini veya izleyicini okumaz. LLM anahtarıyla canlı; anahtar yoksa → çalıştırmaya hazır bir istem. Başlıkta robot avatarı + çevrimiçi durum; çipler sık soruları doldurur; Esc veya dışına tıklama kapatır; #/docs-assistant sayfasında gizlenir.
index.html’den global olarak takılan yeni istemci bileşenipublic/js/lib/docs-fab.js; CSP güvenli;app.cssiçinde temaya duyarlı + RTL aynalı stiller. Yeni sunucu rotası yok. Testler:tests/docs-fab.test.mjs(8). 6 yeni i18n anahtarı ×16. Yardım §1 yerinde genişletildi.
Yeni: yok.
[1.112.0] — 2026-07-06
Doküman & QA konsolidasyonu. Kullanıcıya görünür kod değişikliği yok. SDD kurallar belgesi (docs/sdd/CONVENTIONS.md) mevcut 30 rota modülüne (önceden 24) ve mevcut test temeline güncellendi; projenin tamamı için belirleyici QA istemi (qa/QA-REGRESSION-PROMPT.md) konsolide edildi — yayım mekaniği güncellendi (v1.111, parentVersion 1.17.0, yayım olayıyla tetiklenen yayınlama), §14 eklemeler tablosu düzeltildi (Scan Hariç Tut v1.109.0 olarak yeniden etiketlendi) ve v1.111 CodeQL kapanışıyla genişletildi — böylece tüm işlevsellik için tek başına regresyon istemi olur. Aşırı büyük yükleme dalı için bir kapsam testi ekler.
Yeni: yok.
[1.111.0] — 2026-07-06
Güvenlik — CodeQL biriktirme listesi kapanışı. Kalan statik analiz bulgularını göz ardı etmek yerine kaynağında kapatan üç derinlemesine savunma sertleştirmesi. stripDangerousMarkdown artık herhangi bir kesilmiş tehlikeli etiket açılışının (<script/<iframe/… ile biten yük) < karakterini kaçışlar; böylece çıktısı kanıtlanabilir şekilde canlı tehlikeli etiket içermez. CV içe aktarımı, yüklenen arabelleğin boyutunu açık bir Number() dönüşümüyle okur — tür karışıklığına karşı bir bariyer. Mod rol satırları artık saklanan işlevler yerine String.replace ile enterpole edilen şablon dizeleridir; bu da dinamik gönderim çağrısını tamamen kaldırır. Kullanıcıya görünür davranış değişikliği yok.
server/lib/security.mjs,server/lib/cv-import.mjs,server/lib/prompts.mjs. Testler:tests/security-hardening-v1111.test.mjs(7) + güncellenen v1108 koruma testi. i18n/yardım/rota değişikliği yok.
Yeni: yok.
[1.110.0] — 2026-07-06
Docs & QA tazeleme (tüm diller). Kod değişikliği yok. Tüm proje QA istemi v1.109.0’a tazelendi ve v1.98→v1.109’u kapsayan yeni bir §14 eklendi; kalıcı UX-denetim ve tasarım-dışa-aktarım istemleri güncel sayfa kümesini kazandı. v1.100–v1.109’da eklenen her yardım paragrafı artık 16 dilin tümüne çevrildi.
Yeni: yok.
[1.109.0] — 2026-07-06
Scan Hariç Tut filtresi + pipeline genel bakışı (web düzeni paritesi). #/scan’de Ara kutusu artık virgülleri VEYA olarak ele alır (“bulunacak roller”) ve yeni bir Hariç tut alanı, şirketi/rolü/konumu virgülle ayrılmış kelimelerden birini (örn. senior, staff) içeren satırları gizler; ikisi de kayıtlı aramalarınızda hatırlanır. #/pipeline’de kompakt bir genel bakış şeridi pipeline’ınızı bir bakışta gösterir — N gelen kutusunda, N izlenen ve izleyiciden Applied / Responded / Interview / Offer sayıları, her rozet #/tracker’a bağlanır.
- Yalnızca istemci (yeni rota/yazma yok).
public/js/views/scan.js+public/js/views/pipeline.js. Testler:tests/scan-pipeline-ui-v1109.test.mjs(2). 4 yeni i18n anahtarı ×16. Yardım §7 + §8 yerinde genişletildi.
Yeni: yok.
[1.108.0] — 2026-07-06
Güvenlik sıkılaştırması (CodeQL triyajı, 2. tur). Üç düşük önem dereceli bulgu daha düzeltildi: prompt oluşturucu, yerel ayar rol satırını kendi anahtarı + typeof === function ile çözerek kurcalanmış bir yerel ayarın bir prototip yöntemine yönlenmesini engeller (unvalidated-dynamic-method-call); PDF dosya adı slug’ı regex’ten önce 200 karaktere sınırlandırılır ki tamamı tire olan bir girdi geri izleme yapmasın (polinom ReDoS); ve belge içe aktarma dizi türünde bir filename’i (tekrarlanan başlık) dizeye zorlar (type-confusion). Geçerli girdi için davranış değişikliği yok.
server/lib/prompts.mjs,server/lib/routes/runners.mjs,server/lib/cv-import.mjs+tests/security-hardening-v1108.test.mjs(3). v1.106–v1.108 boyunca statik analiz birikimi 167’den ~14’e düştü; gerçekten güvenlikle ilgili her bulgu düzeltildi, kalanı (korumalı/temizlenmiş yanlış pozitifler + not düzeyi lint) gerekçeyle reddedildi.
Yeni: yok.
[1.107.0] — 2026-07-06
Temizleyici sıkılaştırması (durağan XSS derinlemesine savunma). stripDangerousMarkdown — depolanan özgeçmiş/ilan markdown’ındaki tehlikeli HTML’i etkisiz kılarak, render’da-kaçışlı istemciyi atlayan herhangi bir tüketiciyi bile güvende tutar — artık etiket temizliğini bir sabit noktaya kadar çalıştırıyor (kararlı olana dek tekrarla), böylece bir yükü yeniden oluşturan bir kaldırma (örn. <scr<script></script>ipt>) yakalanır, script/style vb. sonunda çöp bulunan kapanış etiketleriyle (</script foo>) eşleşir ve kapatılmamış bir yürütülebilir açıcıyı (<script …>) kaldırır. Geçerli markdown için davranış değişmez — yalnızca daha fazlasını kaldırır.
server/lib/security.mjs: sabit nokta döngüsü (8 geçişle sınırlı) +[^>]*>kapanış etiketi kalıpları + kapatılmamış açıcı kaldırma.tests/cv-xss-bypasses.test.mjsiçinde +3 regresyon vakası. Yetkili XSS sınırı hâlâ çıktı kaçışıdır (UI.md); bu, durağan garantiyi güçlendirir ve ilgili CodeQL bulgularını kapatır.
Yeni: yok.
[1.106.0] — 2026-07-06
Güvenlik sıkılaştırması (CodeQL triyajı). Statik analiz birikimini gözden geçirdikten sonra üç gerçek (düşük önem dereceli de olsa) bulgu düzeltildi: rota render hata yolu artık hata mesajını DOM’a ulaşmadan önce kaçışlıyor (bir sunucu hatası kullanıcı girdisini yansıtabildiğinden güvenilmez sayılır — XSS sınırı) ve profil/yapılandırma özellik yazımları __proto__ / constructor / prototype anahtarlarını reddediyor (her ihtimale karşı prototip kirliliği koruması — anahtarlar sabit alan özelliklerinden gelir, ham istek girdisinden değil). Kalan uyarıların çoğu, tarayıcının meşru data/* okuma/yazmaları ve zaten kendi hız sınırlayıcısını taşıyan rotalar üzerindeki yanlış pozitiflerdir; gerekçeyle reddedildi.
public/js/router.js,innerHTML’den önceUI.escapeHtmlileerr.message’i kaçışlar;server/lib/routes/content.mjsveserver/lib/routes/config.mjsprototip anahtarlarını korur. Geçerli girdi için davranış değişikliği yok. Testler:tests/security-hardening-v1106.test.mjs(3). Yeni i18n anahtarı yok.
Yeni: yok.
[1.105.0] — 2026-07-06
AI kullanımı ve maliyeti sayfası. Yeni bir AI kullanımı sayfası (kenar çubuğu, Sağlık’ın yanında), canlı AI üretimlerinde — değerlendirmeler, raporlar, sohbetler — harcadığınız jetonları son 24 saat, 7 gün, 30 gün ve tüm zamanlar boyunca sağlayıcı başına ayrıştırarak tahmini USD maliyetiyle gösterir. Her canlı çağrı, data/llm-usage.jsonl’ye küçük bir {provider, in, out} kaydı ekler (hiçbir yere gönderilmez); anahtarsız çalıştırmalar (manuel kip) hiçbir şeye mal olmaz ve kaydedilmez.
- Yeni rota modülü (30.)
server/lib/routes/usage.mjs—GET /api/usage(salt okunur toplamalar) +server/lib/llm-usage.mjs(recordUsageAnthropic/OpenAI/Gemini kullanım biçimlerini normalleştirir ve best-effort ekler;readUsage/aggregate24s/7g/30g/tümü penceresi × sağlayıcıya göre toplar) +server/lib/llm-pricing.mjs(sağlayıcı başına düzenlenebilir bir$/1Mjeton fiyat tablosu — jetonlar kesin, dolarlar planınıza göre düzeltebileceğiniz yaklaşık liste fiyatlarıdır; asla faturalanmaz). Kayıt, gönderim noktalarına (runActiveProvider+routes/llm.mjs) bağlanır. - Yeni görünüm
public/js/views/usage.js(#/usage, pencere sekmeleri). Testler:tests/usage-routes.test.mjs. 17 yeni i18n anahtarı ×16 (usage.*+nav.usage). Yardım §6 yerinde genişletildi.
Yeni: server/lib/routes/usage.mjs; server/lib/llm-usage.mjs; server/lib/llm-pricing.mjs; public/js/views/usage.js.
[1.104.0] — 2026-07-06
Tarama tablosunda şirket logoları (gizliliği koruyan). Uygulama ayarları’ndaki yeni Görünüm anahtarı — Tarama tablosunda şirket logolarını göster (varsayılan kapalı) — #/scan üzerinde her şirketin logosunu adının yanına çizer. Logo, şirketin kendi alan adından alınan favicon’udur ve sunucu tarafında proxy’lenir (GET /api/logo); böylece hiçbir üçüncü taraf logo servisi hangi işverenlere baktığınızı öğrenemez. Paylaşılan bir iş ilanı portalındaki (Greenhouse, Lever, Ashby, …) ilanlar portal simgesi yerine renkli bir harf rozeti gösterir ve yüklenemeyen her logo aynı rozete geri döner.
- Yeni rota modülü (29.)
server/lib/routes/logos.mjs—GET /api/logo?domain=. Alan adını doğrular (şema/yol/loopback yok),/favicon.ico’yu SSRF güvenlisafeGetüzerinden alır (yeni birbinarymodu ham baytları + content-type döndürür; DNS sabitleme, yönlendirme doğrulama ve boyut sınırı değişmedi), bir HTML hata sayfasını asla görüntü olarak sunmamak için görüntü sihirli bayt koklaması yapar, isabetleri ve ıskaları bellek içi LRU’da önbelleğe alır ve diske hiçbir şey yazmaz. - Yeni istemci kütüphanesi
public/js/lib/company-logo.js(window.CompanyLogo): localStorage bayrağıyla varsayılan kapalı; paylaşılan ATS ana bilgisayarlarını atlayıp deterministik bir harf avatarı kullanır; CSP güvenliimg.onerrorgeri dönüşü. Testler:tests/logo-routes.test.mjs. 5 yeni i18n anahtarı ×16 (appear.*). Yardım §2 yerinde genişletildi.
Yeni: server/lib/routes/logos.mjs; public/js/lib/company-logo.js.
[1.103.0] — 2026-07-06
Ayarlar: “Yapay zeka CLI araçları” — hangileri kurulu. career-ops Claude Code ile çalışır ama açık skill standardındaki herhangi bir ajan CLI’ıyla uyumludur. Uygulama ayarları’ndaki (#/config) yeni Yapay zeka CLI araçları sekmesi, bunlardan — Claude Code, Codex, Gemini CLI, OpenCode, GitHub Copilot CLI, Qwen, Antigravity — hangilerinin sunucuyu çalıştıran makinede kurulu olduğunu ve yollarını gösterir. Bu salt okunur bir PATH taramasıdır: yalnızca her ikili dosyanın var olup olmadığını kontrol eder ve asla çalıştırmaz (--version yok, yürütme yok), hiçbir şey yazmaz ve kullanıcı verisine dokunmaz.
- Yeni rota modülü (28.)
server/lib/routes/cli-detect.mjs—GET /api/cli-detect. Algılama, sabit 7 girişli bir izin listesindenprocess.env.PATHüzerinden bir ikilinin yolunu çözer (Windows.cmd/.exe/.batshim’leri; POSIX yürütme biti); PATH’teki kötü niyetli bir dosya bu rota tarafından asla çalıştırılamaz. public/js/views/config.jsiçinde yeni “Yapay zeka CLI araçları” sekmesi (tembel yükleme,#/config?tab=cliile derin bağlantı). Testler:tests/cli-detect-routes.test.mjs. 8 yeni i18n anahtarı ×16 (cli.*+config.tabCli). Yardım §2 yerinde genişletildi.
Yeni: server/lib/routes/cli-detect.mjs.
[1.102.0] — 2026-07-05
“Belgelere sor” — uygulama içi yardım kılavuzuna dayalı bir sohbet. Yeni bir Belgelere sor 💬 sayfası (kenar çubuğu, Yardım altında): “İş portallarını nasıl tararım?” gibi bir soru yazın ve yalnızca uygulamanın kendi yardım kılavuzundan dilinizde bir yanıt alın — hangi bölümleri kullandığını gösterir ve özgeçmişinizi, profilinizi veya iş aramanızı asla okumaz. Bu, sizinle değil, uygulamanın nasıl kullanılacağıyla ilgilidir. LLM anahtarıyla canlı yanıtlar; anahtar yoksa ilgili yardım bölümleriyle önceden doldurulmuş, hazır bir istem verir.
- Yeni rota modülü (27.)
server/lib/routes/docs-assistant.mjs—POST /api/docs-assistant/ask. Bağımlılıksız getirme: dilinizdeki yardım belgesi##bölümlerine ayrılır ve sorunuzla anahtar kelime örtüşmesine göre puanlanır; en iyileri satır içine alınır ve model bunlardan yanıt vermeli ya da kılavuzun bunu kapsamadığını söylemelidir (uydurma özellik/rota yok). Paylaşılan sağlayıcı basamaklaması, manuel geri dönüş, hız sınırlı, yazma yok, kullanıcı verisi okumaz. - Yeni görünüm
public/js/views/docs-assistant.js. Testler:tests/docs-assistant-routes.test.mjs. 14 yeni i18n anahtarı ×16 (docs.*+nav.docsAssistant). Yardım §1 yerinde genişletildi.
Yeni: server/lib/routes/docs-assistant.mjs; public/js/views/docs-assistant.js.
[1.101.0] — 2026-07-05
CV Studio: özgeçmişinizi belirli bir işe göre uyarlayın + ön yazı yazın, işe alım uzmanı kontrol listesiyle denetlenir. #/cv-studio üzerinde yeni Bir işe göre uyarla kartı: bir iş ilanı yapıştırın (ve isteğe bağlı olarak hedef rol/başlık), CV Studio o ilana uyarlanmış bir özgeçmiş ve uyumlu bir ön yazı üretir, ardından teslim etmeden önce ikisini de bir kontrol listesi kapısından geçirir — error engeller (siz sonucu görmeden düzeltilir), warn önerir. Mekanik, kariyer koçluğu pratiğinden genel kurallara damıtılmıştır — işe alım uzmanı saniyeler içinde okur, bu yüzden ilgili deneyim en üste gelir, başlık ilanın rolüyle eşleşir, sonuçlar belirli sayılar taşır ve ön yazı tek bir “gereksinim ↔ sizin uyan gerçeğiniz” köprüsüyle kısa bir teaser olarak kalır. Yalnızca kendi özgeçmişiniz, profiliniz ve two-pager’ınıza dayanır ve asla uydurmaz — gömülü şirket, rol veya geçmiş yok.
- Yeni uç nokta
POST /api/cv-studio/tailor(mevcut cv-studio modülünü genişletir — 27. modül yok):buildTailorPrompt+ genel birTAILOR_INSTRUCTIONSkapısı,bundleProjectContexttabanlı, paylaşılan sağlayıcı basamaklaması, anahtar yoksa manuel istem, hız sınırlı, yazma yok. Sonuç, paylaşılanreport-export.jsçubuğuyla Markdown / PDF / DOCX olarak dışa aktarılır. - Testler:
tests/cv-studio-routes.test.mjsiçinde +3. 10 yeni i18n anahtarı ×16 (cvs.tailor*). Genel referansdocs/prompts/resume-cover.md. Yardım §24 yerinde genişletildi.
Yeni: docs/prompts/resume-cover.md.
[1.100.0] — 2026-07-05
Two-pager: özgeçmişinizden yapay zeka ile otomatik doldurma + Önizleme + PDF/DOCX/Markdown dışa aktarımı. Two-pager (#/two-pager) bir sonraki rolünüzden gerçekte ne istediğinizi kaydeder, ancak şimdiye dek her alanı elle yazmanız ya da bir istemi başka bir araca kopyalamanız gerekiyordu. Artık ✨ yapay zeka doldurma yardımcısı yapılandırdığınız sağlayıcıyla canlı çalışıyor — yalnızca özgeçmişinizi + profilinizi okur (bundleProjectContext üzerinden, hiçbir şey uydurmadan), tüm alanları (ben kimim / sevdiklerim / olmazsa olmazlar / nefret ettiklerim / kesin engeller / pazarlıksızlar / hedef ortam) taslaklar ve gözden geçirip düzenleyip kaydetmeniz için formu doldurur. API anahtarı yoksa eskisi gibi istemi-kopyala kipine döner. Yeni bir 👁 Önizle ve dışa aktar düğmesi two-pager’ı biçimlendirilmiş bir belge olarak işler ve .md indir / PDF olarak kaydet / DOCX olarak kaydet / Kopyala çubuğunu sunar.
- Bağımlılıksız
.docxdışa aktarımı. Yeniserver/lib/docx.mjs, minimal ama geçerli bir Office Open XML.docxüretir (dört OOXML parçasının DEFLATE ZIP’i, girdi başına CRC-32) — yeni çalışma zamanı bağımlılığı yok (bağımlılıklarexpress+js-yamlolarak kalır). Yeni rotaPOST /api/export/docx(server/lib/routes/export.mjs, 26. rota modülü; durumsuz, 200 KB sınırlı, yazma yok / LLM yok / URL fetch yok). Paylaşılanpublic/js/lib/report-export.js’e bağlandı, böylece pazar raporu, kariyer planı ve kariyer yönlendirmesi de DOCX dışa aktarımı kazanır. - Canlı otomatik doldurma, paylaşılan sağlayıcı basamaklamasını (
runActiveProvider/providerAvailable) kullanır; dönen YAML ayrıştırılır ve sınırlı two-pager biçimine (parseYamlFields+normalizeTwoPager) geri zorlanır — bilinmeyen anahtarlar atılır, diziler/dizeler sınırlanır. Manuel kip korunur. - Testler:
tests/export-routes.test.mjs. 4 yeni i18n anahtarı ×16 (export.saveDocx,twoPager.preview,twoPager.aiFilling,twoPager.aiFilled).
Yeni: server/lib/docx.mjs; server/lib/routes/export.mjs.
[1.99.0] — 2026-07-05
Portal sağlığı sayfası (#/portals). Tarayıcı portals.yml içindeki bir dizi şirketi izler; bir ATS slug’ı sessizce bozulabilir ve o işveren tüm gelecekteki taramalardan kaybolur. Yeni Portals sayfası izlenen her şirketi listeler ve Check portal health ile her careers_url adresini DNS’i sabitlenmiş safeGet üzerinden (SSRF’ye karşı güvenli) yoklar ve ölüleri işaretler (404 = sessizce elenmiş) — salt okunur. Ayrıca v1.98.0 hata bildiricisini inceleme sonrası sağlamlaştırır: hata halka tamponu artık ağ katmanı fetch hatalarını yakalar ve temizleyici etiketsiz sağlayıcı anahtarlarını gizler.
Yeni: server/lib/routes/portals.mjs; public/js/views/portals.js.
[1.98.0] — 2026-07-05
Uygulama içi hata bildirici (üst projenin web-v0.2.0 web parçasıyla parite). Bildirim çekmecesindeki 🐞 Report a bug düğmesi gizlilik tabanlı bir tanılama anlık görüntüsü toplar — sürümler, ekranınız, tarayıcı, bir /api/health kontrol özeti ve yeni bir istemci tarafı halka tamponundan son 20 hata — artı deterministik bir yinelenenleri ayıklama parmak izi (co-web-<base36>), tam Markdown’ı incelemenize izin verir ve ardından önceden doldurulmuş bir GitHub sorunu açar. Hiçbir şey otomatik olarak gönderilmez; asla CV’nizi, profilinizi, yanıtlarınızı, iş URL’lerinizi veya anahtarlarınızı taşımaz. Yeni kitaplıklar logbuf.js + bug-report.js; 11 i18n anahtarı ×16; tests/bug-report.test.mjs.
Yeni: public/js/lib/logbuf.js; public/js/lib/bug-report.js.
[1.97.1] — 2026-07-05
Düzeltilenler
- İnceleme odaklı sağlamlaştırma & dokümantasyon paritesi (v1.97.0 devamı). AI-inceleme günlüklerinin taranması gerçek düzeltmeleri ortaya çıkardı:
fit-score.js(tarama◎uygunluk rozeti).salaryFloor()artık yıllık-altı bir oranı sahte bir yıllık tabana yükseltmiyor — “at least 500 EUR/day”, “$80/hr”, “6000 monthly” artık 500k/80k’lık bir anlaşma-bozucu yerinenulldöndürüyor. Ülke eşleştirmesi artık tam-sözcük (\b…\b) olduğundan “Germany” artık “German” sıfatıyla eşleşmiyor (ne de “Nigerian” içindeki “Nigeria”) ve yanlış bir başka-yerde-olmalı ihlali tetiklemiyor.tests/fit-score.test.mjsiçinde +3 test.- Dokümantasyon paritesi. Her yerelleştirilmiş README artık tutarlı biçimde 16 yerel dil duyuruyor — Help-satırı sayımı/listesi (×13) ve Yerelleştirme-bölümü metni artı “anahtarı N dosyanın tümüne ekleyin” notu (×8) hâlâ v1.85 öncesi sayımlardaydı (8/9). Uygulama-içi yardım §17 adaptör sayımı, 16 paketin tümünde 46 adaptör — 41 İngilizce + 5 Rusça olarak düzeltildi.
Uygunluk-rozeti sezgiselinin ötesinde davranış değişikliği yok; yeni rota, anahtar veya i18n eklemesi yok.
[1.97.0] — 2026-07-05
Eklenenler
- Dassault Systèmes tarayıcı kaynağı + üç cepheli bir kalite taraması.
- Yeni tarama kaynağı — Dassault Systèmes (üst career-ops eşdeğerliği, #1498).
server/lib/sources/dassault.mjs+server/lib/portals/adapters/dassault.mjs, üst projenin sıfır-token Exalead “kart araması” sağlayıcısını (3ds.com/careers/jobsarkasındaki genel akış) yansıtır. Tek bir global uç nokta olduğundan sağlayıcıyla seçilir (provider: dassault) veya bir3ds.comana bilgisayarından otomatik algılanır; SSRF için ana bilgisayarwww.3ds.com’a sabitlenir veredirect:'error'kullanılır. XML, DOM olmadan ayrıştırılır (her<Hit>için<Meta>haritaları), şehir/ülke yerelleştirilmiş kategori dizesinden çekilir ve ilanlar yalnızca genel URL’leri*.3ds.comüzerindeyse tutulur. Kayıt defteri artık 46 adaptör sağlıyor (41 EN + 5 RU);ALL_ADAPTERSsayımı, sıralı-id ve/api/scan/sourcesEN-kümesi doğrulamaları 40 → 41 yükseltildi.tests/sources-dassault.test.mjspaketi (10 durum). - Üst projeden taşınan sağlamlık düzeltmeleri. Avature ayrıştırıcısı artık iki canlı kiracı biçimlendirme varyantını tolere ediyor (konum-indeksi son ekli
article--result+ sınıfsız bir JobDetail başlık bağlantısı, #1541); Get on Board bir0/negatifpublished_atdeğerine karşı koruma sağlıyor (artık sahte 1970 tarihleri yok); SuccessFactors son sayfayı sınırlayarakMAX_JOBS’u aşamamasını sağlıyor (#1528). - Sunucu denetim düzeltmeleri.
safe-fetchartık limiti aşan bir yanıtta askıda kalmıyor — boyut-limiti yolu artık, yok edilmiş bir akışın asla yaymayacağı bir'end'olayını beklemek yerine promise’i doğrudan çözüyor (büyük sayfalı/api/pipeline/preview+ auto-pipeline getirmelerini düzeltir). SSEstream.*etkinlik günlüğü yeniden erişilebilir (/api/stream/denetimi, genel “GET’i atla” korumasının üstüne taşındı). - SPA denetim düzeltmeleri.
#/statssekme değiştiricisi, asenkron bir render yarışına karşı koruyor — yavaş bir sekmenin sonucu, kullanıcının zaten geçtiği daha yeni bir sekmenin üzerine artık yazamaz. Deneme mülakatı ve networking silme onayları artık uygun bir başlık + gövde iletiyor (artık gövdesi boş diyalog yok). - Çeviri düzeltmeleri. Çevrilmemiş sözlük değerleri düzeltildi — Ukraynaca
config.modes*(Adaptive Framing / Exit Narrative / Location Policy), Rusçaeval.jdLbl(“Job Description”), İtalyancadash.quick.contactoSub(“referral” → “segnalazione”) — ayrıca İngilizce 16 yerel dil şablonu ru/uk/ja/ko/zh-CN/zh-TW CHANGELOG’larında yerelleştirildi. - Yeni:
server/lib/sources/dassault.mjs;server/lib/portals/adapters/dassault.mjs.
[1.96.0] — 2026-07-04
Eklenenler
- Kariyer yönelimi (Epic 27). Yeni bir
#/orientationsayfası “hangi yönler bana gerçekten uygun?” sorusunu yanıtlar — bir meslek testinden alacağın türden bir okuma, ama bir anketten değil, kendi özgeçmişin ve profilinden çıkarılır. Profil oluştura tıkla ve model şunları döndürür: en uygun kariyer vektörlerin (sekiz arketipten — İşlevselci, İdareci, İletişimci, Uzman, Analist, Yenilikçi, Yönetici, Girişimci — hangileri uyuyor, kanıtlarıyla), bir kariyer-tipi eğilimi, önerilen roller, özgeçmişine bağlı mesleki güçlü yönler, çalışma-stili eğilimleri ve gelişim önerileri. Bu, özgeçmişinin nasıl okunduğuna dair bir yapay zeka yansımasıdır — psikometrik bir test değil: asla başarı uydurmaz ve sayısal puanları asla ölçülmüş gibi bildirmez. Markdown veya PDF olarak dışa aktar; diske hiçbir şey yazılmaz.- Yeni rota
server/lib/routes/orientation.mjs(24. rota modülü) —POST /api/orientation/generate, paylaşılan sağlayıcı kaskadı aracılığıyla CV+profil+two-pager+bellekten profil istemini oluşturur; kopyala-yapıştır bir manuel geri dönüşle ve dosya yazımı olmadan. - Markdown/PDF/kopyalama için
report-export.jsyeniden kullanılır, Büyüme gezinme grubu altında. - Testler:
tests/orientation-routes.test.mjs(yansıma çerçevelemesi / uydurma puan yok, CV/profil ile beslenen manuel mod). 16 dilde 7 yeni i18n anahtarı, Yardım §28 ×16.
- Yeni rota
- Yeni:
#/orientation;server/lib/routes/orientation.mjs.
[1.95.0] — 2026-07-04
Eklenenler
- Kariyer planı (Epic 26). Yeni bir
#/career-plansayfası, CV’ni ve profilini somut, kişiselleştirilmiş bir gelişim planına dönüştürür. Bir ufuk (6/12/24 ay) ve isteğe bağlı bir odak seç; model — CV’ni, profilini, two-pager’ını ve bellek notunu okuyarak — bir başlangıç noktası anlık görüntüsü, güçlü yönler/büyüme SWOT’u, SMART / OKR / WOOP olarak hedefler, alternatif yörüngeler, bir hard/soft beceri planı, bir ay ay yol haritası, ilerleme izleme yöntemleri, tuzaklar ve destek adımları yazar. Materyallerinin gerçekten gösterdiğinden ileriye doğru plan yapar ve geçmişin hakkında asla gerçek uydurmaz. Onu inline düzenle, kullanıcı katmanına (config/career-plan.md) Kaydet ve Markdown veya PDF olarak dışa aktar.- Yeni rota
server/lib/routes/career-plan.mjs(23. rota modülü) —GET/PUT /api/career-plan(config/career-plan.mdyazar) +POST /api/career-plan/generate(paylaşılan sağlayıcı kaskadı, manuel geri dönüş, uydurma yok).PATHS.careerPlan. - Markdown/PDF/kopyalama için paylaşılan
report-export.js(v1.94.0) yeniden kullanılır ve yeni bir Büyüme gezinme grubu eklenir. - Testler:
tests/career-plan-routes.test.mjs(sınırlama, GET/PUT gidiş-dönüşü, ufuk farkında ve CV/profil ile beslenen istem). 16 dilde 20 yeni i18n anahtarı, Yardım §27 ×16.
- Yeni rota
- Yeni:
#/career-plan;server/lib/routes/career-plan.mjs;PATHS.careerPlan.
[1.94.0] — 2026-07-04
Eklenenler
- İstatistik, yeniden tasarlandı (Epic 25).
#/statssayfası artık üç sekmeli bir İstatistik bölümü; gerçek grafikler ve çok daha fazla veriyle. Yeni bir Pazar raporu sekmesi, seçtiğin bir bölge ve para biriminde hedef rollerin için modelden bir maaş ve işgücü piyasası analizi ister — yönetici özeti, P10/P25/P75/P90 yüzdelikleriyle seviyeye göre maaş, önde gelen işverenler, talep gören beceriler tablosu, yan hakların sıklığı, ofis/hibrit/uzaktan dağılımı, 12–24 aylık eğilimler ve müzakere rehberliği. Her rakam modelin bilgisinden yönlendirici bir tahmin olarak etiketlenir, asla kazınmış veri olarak sunulmaz. Yeni bir Kendi pipeline’ım sekmesi kendi izleyicini grafikler: puan dağılımı, durum hunisi, önde gelen şirketler ve roller, zaman içindeki başvurular ve dönüşüm oranları. Orijinal hedef rol görünümü (ülkeye göre açık pozisyon/maaş + kayıtlı anlık görüntü eğilimi) artık bir para birimi seçici ve bir role göre ilanlar genel bakışıyla üçüncü bir sekmenin altına taşınır.- Herhangi bir raporu dışa aktar Markdown veya PDF olarak, ya da kopyala — paylaşılan
report-export.jsyardımcısı aracılığıyla (Markdown blob indirme; PDF mevcut satır içi PDF çalıştırıcısı üzerinden). - Yeni rota
server/lib/routes/market.mjs(22. rota modülü) —POST /api/stats/market, CV’nden/profilinden (böylece hedef rollerini bilir), bölgeden ve para biriminden bir pazar analizi istemi oluşturur, bunu paylaşılan sağlayıcı kaskadından geçirir ve anahtar yoksa bir kopyala-yapıştır istemine geri döner. Dosya yazımı yok. - Testler:
tests/market-routes.test.mjs(bölge/para birimi sınırlaması, dürüstlük etiketli istem, CV/profil ile beslenen manuel mod). 16 dilde 36 yeni i18n anahtarı, Yardım §26 ×16.
- Herhangi bir raporu dışa aktar Markdown veya PDF olarak, ya da kopyala — paylaşılan
- Yeni:
#/statssekmelere yeniden tasarlandı;server/lib/routes/market.mjs;public/js/lib/report-export.js.
[1.93.0] — 2026-07-04
Eklenenler
- Bellek katmanı (Epic 24). Yeni bir
#/memorysayfası, asistanın her görevde aklında tuttuğu kısa, düzenlenebilir bir “benim hakkımda bunu hatırla” notu barındırır:- Tek not, her yerde —
bundleProjectContextiçine gömülü olduğu için not, tüm sağlayıcılarda her AI isteğine (değerlendirme, deneme mülakatı, networking, CV Studio) otomatik olarak ulaşır. Bir kez yaz; her şeyi yönlendirir. - Yönlendirme, olgu değil — tercihlerini ve nasıl çalışmayı sevdiğini yakalar (ton, biçim, deal-breaker, kadans), deneyimin hakkında asla yeni olgusal iddialar değil — onlar hâlâ yalnızca özgeçmişinde, profilinde ve two-pager’ında yaşar. Kullanıcı katmanında
config/memory.mdiçine kaydedilir, güncellemelerle asla üzerine yazılmaz. - Verilerinden öner —
POST /api/memory/suggest, kendi başvuru izleyicini davranış kalıpları için tarar ve gözden geçirip düzenlemen için madde imleri taslağı çıkarır. İzleyicini okur; asla olgu uydurmaz ve hiçbir canlı çağrı yapmaz.
- Tek not, her yerde —
- Yeni:
server/lib/routes/memory.mjs(21. rota modülü —GET/PUT /api/memory+POST /api/memory/suggest),public/js/views/memory.js,PATHS.memoryvebundleProjectContext’e eklenen birconfig/memory.mdbloğu. Tüm 16 dilde 11 yeni i18n anahtarı. Testler:tests/memory-routes.test.mjs.
[1.92.0] — 2026-07-04
Eklenenler
- CV Studio (Epic 21). Yeni bir
#/cv-studiosayfası, özgeçmişine dürüst ve çoğunlukla yerel üç araç sunar:- Özgeçmiş tanılaması — kontrol başına açıklamalarla 0–100 arası deterministik bir puan (nicelendirilmiş etki, zayıf fiiller, moda sözcükler, uzunluk, temel bölümler, iletişim bilgileri). Tamamen istemci tarafında (
window.CvDiagnostics) — LLM yok, uydurma yok, her bulgu açıklanır ki neyi değiştireceğine sen karar veresin. - Gizlilik maskesi — özgeçmişini örnek ya da ekran görüntüsü olarak paylaşmadan önce PII’yi (e-posta, telefon, bağlantılar/kullanıcı adları, sokak adresi ve isteğe bağlı olarak adın → baş harfler) karartır. Tümüyle tarayıcıda çalışır (
window.CvPrivacy); tam olarak neyi karartığını bildirir ve orijinali asla saklamaz. - İnsanileştir / ses eşleştir — sert bir satır veya paragraf yapıştır ve onu senin sesinde yeniden yaz; sunucu tarafında
voice-dna.mdvewriting-samples/ile temellenir. Katı koruma bandı: yeniden sıralayabilir, sıkılaştırabilir ve yeniden seslendirebilir, ancak metinde zaten olmayan bir olguyu, metriği ya da başarıyı asla eklemez. Paylaşılan sağlayıcı zinciri üzerinden canlı çalışır ya da anahtar olmadan kopyala-yapıştır için bir istem döndürür.
- Özgeçmiş tanılaması — kontrol başına açıklamalarla 0–100 arası deterministik bir puan (nicelendirilmiş etki, zayıf fiiller, moda sözcükler, uzunluk, temel bölümler, iletişim bilgileri). Tamamen istemci tarafında (
- Yeni:
server/lib/routes/cv-studio.mjs(20. rota modülü —POST /api/cv-studio/humanize),public/js/views/cv-studio.js,public/js/lib/cv-diagnostics.js,public/js/lib/cv-privacy.js,PATHS.voiceDna+PATHS.writingSamplesDir. Tüm 16 dilde 29 yeni i18n anahtarı. Testler:tests/cv-diagnostics.test.mjs,tests/cv-studio-routes.test.mjs. (Şablon galerisi, Word dışa aktarımı ve ilan PDF arşivi, sonraki CV Studio çalışması olarak izlenmektedir.)
[1.91.0] — 2026-07-04
Eklenenler
- Networking ve derin şirket araştırması (Epic 16). Yeni bir
#/networkingsayfası, bir şirketi mülakat kazanmak için uygulanabilir bir plana dönüştürür; özgeçmişine, profiline ve two-pager’ına dayanır:- Şirket dosyası — şirketin ne yaptığına, alıntılanmaya değer son sinyallere ve gerçek geçmişinden çıkarılan “neden uygunum” kancalarına dair sıkı bir brief.
- Kiminle iletişime geçilmeli — her birini bulmak için somut bir LinkedIn arama dizesiyle 3–5 hedef persona (işe alım müdürü, kurum içi işe alımcı, ekipte kıdemli bir IC, sıcak/mezun bağlantısı). Asla gerçek isimler uydurmaz.
- En sıcak tanıştırma yolu — senin geçmişin için en gerçekçi sıcak giriş rotası (ortak işveren/okul/topluluk, ikinci derece bir yol veya sinyali güçlü bir soğuk DM) ve nedeni.
- İletişim taslakları — başlıca persona’lar için gerçek kanıt noktalarına dayanan kısa, spesifik mesajlar.
- Canlı veya manuel — herhangi bir anahtarla paylaşılan sağlayıcı zinciri üzerinden canlı çalışır ya da kopyala-yapıştır için hazır bir istem döndürür (dürüst yedek, uydurma yok). Planı kaydet, tamamlanmış bir planı kullanıcı katmanında saklar (
networking/net-{company}-{role}-{date}.md); sayfa kaydedilen planları listeler, açar ve siler.
- Yeni:
server/lib/routes/networking.mjs(19. rota modülü),public/js/views/networking.js,PATHS.networkingDir. v1.90.0’dakiserver/lib/llm-dispatch.mjszincirini yeniden kullanır. Tüm 16 dilde 24 yeni i18n anahtarı. Testler:tests/networking-routes.test.mjs.
[1.90.0] — 2026-07-04
Eklenenler
- Mock Interview 2.0 (Epic 15). Yeni bir
#/mock-interviewsayfası; özgeçmişini, profilini, two-pager’ını ve hikâye bankanı sıra sıra bir mülakat provasına dönüştürür:- Sohbet tabanlı pratik — bir hedef rol (+ isteğe bağlı şirket / iş tanımı) gir ve mülakatçı odaklı bir soruyla açılış yapsın. Gönderdiğin her yanıt yapılandırılmış bir karşılık alır: Feedback (güçlü yönler + STAR+R boşluğu), bir Score (
N/5) ve son yanıtının en zayıf kısmını yoklayan bir Next question. Sunucu tarafında gerçek belgelerine dayanır — sahip olmadığın bir deneyimi asla uydurmaz. - Hikâye bankası farkında —
interview-prep/story-bank.mdisteme gömülür (cv.mdile aynı güven seviyesinde), böylece geri bildirim seni en iyi hikâyelerine yönlendirebilir. - Canlı veya manuel — bir sağlayıcı anahtarıyla tur, paylaşılan zincir üzerinden canlı çalışır (Anthropic → Gemini → OpenAI → Qwen → OpenRouter → GitHub Models); anahtar yoksa kopyala-yapıştır için hazır bir istem alırsın (dürüst yedek, uydurma yanıt yok).
- Kaydedilen oturumlar — bitmiş bir mülakatı kullanıcı katmanında saklamak için Transkripti kaydet’e tıkla (
interview-prep/mock-{company}-{role}-{date}.md); sayfa kaydedilen oturumları listeler, açar ve siler.
- Sohbet tabanlı pratik — bir hedef rol (+ isteğe bağlı şirket / iş tanımı) gir ve mülakatçı odaklı bir soruyla açılış yapsın. Gönderdiğin her yanıt yapılandırılmış bir karşılık alır: Feedback (güçlü yönler + STAR+R boşluğu), bir Score (
- Yeni:
server/lib/routes/interview.mjs(18. rota modülü),public/js/views/mock-interview.js,server/lib/llm-dispatch.mjs(paylaşılan sağlayıcı zinciri),PATHS.storyBank,bundleProjectContext({ extraFiles }). Tüm 16 dilde 30 yeni i18n anahtarı. Testler:tests/interview-routes.test.mjs.
[1.89.0] — 2026-07-04
Eklenenler
- Aday pazar uyumu — the two-pager (Epic 14). Yeni bir
#/two-pagersayfası, bir sonraki rolünden senin gerçekte ne istediğini yakalamanı sağlar; Never Search Alone kitabındaki “Mnookin two-pager” formatına göre modellenmiştir:- Rehberli oluşturucu — birinci tekil şahıs “Ben kimim” anlatısı, bir “Hedef ortam” notu ve beş çip listesi editörü: sevdiklerim, olmazsa olmazlar, sevmediklerim, anlaşma bozucular ve pazarlık edilemezler. Üst projenin kullanıcı katmanına (
config/two-pager.yml)PUT /api/two-pagerile kaydedilir — sistem güncellemelerinde asla üzerine yazılmaz. - AI doldurma asistanı (
POST /api/two-pager/draft) — CV + profilin satır içine yerleştirilmiş, herhangi bir LLM’de çalıştırıp geri yapıştırabileceğin, kullanıma hazır bir Mnookin istemi oluşturur. Yalnızca senin materyallerini kullanır; hiçbir şey uydurulmaz. - Uyum rozeti —
#/scanüzerindeki her ilan artık, ilanın çalışma türünü, ülkesini, maaş tabanını ve taşınma bilgisini two-pager’ınla karşılaştıran bir◎ Nuyum puanı gösterir (istemci tarafında,window.FitScoreile). Tasarım gereği dürüst: bir ilan karşılaştırılabilir sinyal vermediğinde hiçbir rozet gösterilmez (asla uydurma bir sayı). Anlaşma bozucu ihlalleri, basit hoşnutsuzluklardan daha ağır basar. - Her değerlendirmeyi besler — kaydedilen two-pager
bundleProjectContextiçine satır içine yerleştirilir, böylece tüm alt LLM değerlendirmeleri belirttiğin tercihleri CV-JD eşleşmesiyle harmanlar.
- Rehberli oluşturucu — birinci tekil şahıs “Ben kimim” anlatısı, bir “Hedef ortam” notu ve beş çip listesi editörü: sevdiklerim, olmazsa olmazlar, sevmediklerim, anlaşma bozucular ve pazarlık edilemezler. Üst projenin kullanıcı katmanına (
- Yeni:
server/lib/routes/two-pager.mjs,public/js/views/two-pager.js,public/js/lib/fit-score.js,PATHS.twoPager. Tüm 16 yerel ayarda 27 yeni i18n anahtarı. Testler:tests/two-pager-routes.test.mjs,tests/fit-score.test.mjs.
[1.88.0] — 2026-07-04
Değişenler
- Issue #29 rötuşu — Tarama i18n boşlukları + API hijyeni.
- Son kalan sabit kodlanmış Tarama dizeleri yerelleştirildi (yol haritası v1.69.4): kaynak özeti hapları (
N yeni / M eşleşen),N yeni ilanbildirimleri verelocrozeti artıkt()üzerinden akıyor — tüm 16 yerel ayarda 4 yeni anahtar (scan.pillNew,scan.pillMatching,scan.newOffers,scan.relocBadge). İngilizce konuşmayan kullanıcılar temel tarama akışında artık başıboş İngilizce görmüyor. X-Powered-Bybaşlığı devre dışı bırakıldı (yol haritası v1.69.5):createApp()içindeapp.disable('x-powered-by')— sunucu artık Express kullandığını duyurmuyor. (Bu destanın geri kalanı zaten teslim edilmişti:parentVersionkendi release-please yorumunu çıkarır, açık mod tema düğmesi, rota değişiminde modal kapatma ve Raporlar’da “Score” (rep.score) yerelleştirmesi.)- Testler:
tests/scan-i18n-gaps.test.mjs+tests/security-headers.test.mjsiçinde birX-Powered-Byyokluğu doğrulaması.
[1.87.0] — 2026-07-04
Eklenenler
- Kimlik doğrulaması gerektirmeyen 4 yeni tarama sağlayıcısı (üst career-ops v1.16.0 ile eşitlik). Tarayıcı kayıt defteri 41 → 45 adaptöre (40 EN + 5 RU) büyür — tümü herkese açık, kimlik doğrulamasız, ana bilgisayara sabitlenmiş,
redirect:'error'(SSRF güvenli) ve her biri CI’da izole bir teste sahip:- Get on Board (
getonbrd) — portal genelinde herkese açık JSON:API (LATAM/uzaktan teknoloji), sağlayıcıya göre seçilir, sayfalanır.server/lib/sources/getonbrd.mjs. - Amazon (
amazon) —amazon.jobsherkese açık arama JSON’u, ana bilgisayarla algılanır veyaprovider: amazon, ofsetle sayfalanır.server/lib/sources/amazon.mjs. - Avature (
avature) — kiracı başına*.avature.netATS, HTML’den ayrıştırılır, ana bilgisayarla algılanır veyaprovider: avature.server/lib/sources/avature.mjs. - SAP SuccessFactors (
successfactors) — kiracı başına RMK kutucuk listesi (*.successfactors.eu/.com,jobs2web.com), HTML’den ayrıştırılır.server/lib/sources/successfactors.mjs.
- Get on Board (
- Her biri bir
sources/<slug>.mjs(otomatik keşfedilenmeta→#/scanaçılır menüsü) veALL_ADAPTERSiçinde birportals/adapters/<slug>.mjs(iki kayıt defteri kuralı) +tests/sources-<slug>.test.mjssağlar.ALL_ADAPTERSsayısı ile sıralı id ve/api/scan/sourcesEN kümesi doğrulamaları 36→40’a yükseldi;GET /api/scan/sourcesartık 45 tanesini listeliyor.
[1.86.0] — 2026-07-03
Eklenenler
- Hedef rollere göre istatistikler (
#/stats) — HEDEF rollerin için piyasa ilan ve maaş istatistikleri. Yeni bir Analitik sayfası, profildeki hedef rollerini (config/profile.yml→ sabit kodlanmamış) ve son taramadaki ilanları okur, ardından her rol ve ülke için şunları gösterir: ülkeye göre ilanlar ve ülkeye göre medyan maaş (USD) — tarayıcıların zaten topladığı seyrek verilerden istemci tarafında toplanır (public/js/lib/role-stats.js,window.Countriesyeniden kullanılarak). - Herhangi bir para birimindeki maaşlar, açıkça yaklaşık olduğu belirtilen bir FX tablosu aracılığıyla USD’ye normalleştirilir ve örneklem büyüklüğü uyarısı eklenir — asla uydurulmaz. Ayrıca rol ve ülke filtreleri ile elle yazılmış satır içi SVG çubuk ve trend grafikleri (yeni bağımlılık yok, CSP güvenli — yalnızca
addEventListener). - Anlık görüntüyü kaydet (
POST /api/stats/snapshot) mevcut toplamıdata/role-stats.jsonldosyasında kalıcı hale getirir; trend grafiği (GET /api/stats/trend) ilan sayılarını zaman içinde izler — “dinamik” görünümü. Dürüst hibrit: anlık görüntüler yerel tarama verilerinden gelir ve istek üzerine yenilenir. - Tüm 16 yerel ayarda tamamen yerelleştirildi (26 yeni i18n anahtarı). Yeni:
server/lib/routes/stats.mjs(16. rota modülü),public/js/lib/role-stats.js,public/js/views/stats.js,PATHS.roleStats; testlerrole-stats.test.mjs(7) +stats-routes.test.mjs(5).
[1.85.0] - 2026-07-03
Eklenenler
- Almanca (
de), İtalyanca (it) ve Türkçe (tr) yerelleştirme — arayüz, uygulama içi Yardım kılavuzu, README ve CHANGELOG artık bu üç ek dilde de mevcut (career-ops 1.16.0 yerel ayar setinden aktarıldı). Arayüz artık 16 dili destekliyor. - Dil seçici artık Deutsch 🇩🇪, Italiano 🇮🇹 ve Türkçe 🇹🇷 dillerini listeliyor; tarayıcı dili otomatik algılama
de,it,trdillerini tanıyor. - Prompt iskeleleri (
server/lib/prompts.mjs) üç yeni dil için yerelleştirildi.