Değişiklik günlüğü

GitHub

Her ö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 (safeEncodeURIComponentURIError’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.2kritik, 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.4yüksek, libheif açıkları; ve her iki manifestte js-yaml 4.3.1 → 4.3.2yü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-width bunu çö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 durumu aria-expanded ile 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/health parentVersion: 1.31.0 bildiriyordu. 95 çalışma dosyası eşitlendi, iki tanesi kaldırıldı. Canlı yüzeyde tarayıcı QA’sıyla bulundu.
  • cvstart.ru her yolun başına /ru/ ekliyordu, orada ne olduğuna bakmadan. /ru/help /ru/ru/help oluyordu, /en/help ise /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, en kaldı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.md kendini «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.md sürümsüz bir ada ve v1.226.0 içeriğine sahipti. QA-REGRESSION-PROMPT-v1.76.0-FULL.md 155 sürüm geriye sabitlenmişti, REGRESSION-PROMPT-FINAL.md v1.58.52 → v1.59.10 döngüsünü kapatır ve QA-FULL-REGRESSION.md hepsini v1.131.1 temelinde yineliyordu. Onlarla birlikte PARENT-SYNC-WORKLIST-v1.26.0.md de gitti (üst proje artık 1.32.0) ve tarihli UX-AUDIT-2026-07-06.md reports/ altına taşındı. Geriye, kendi temelleri v1.231.2 gerçek değerlerine güncellenmiş dört sürücü kaldı. qa/README.md var olan klasörü anlatacak biçimde yeniden yazıldı.

Notlar

  • İki özgüllük tuzağı artık app.css içinde açıklanıyor: masaüstü kuralları max-width: 900px bloğundan daha aşağıda tanımlı, bu yüzden eşit özgüllükte onlar kazanıyordu — mobil gap sessizce 24 px kaldı (320 px’i taşıran buydu) ve simge gizli kaldı (boş kare düğmeler).
  • applyI18n() el.textContent atadığı 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 Fighter90 bağlantısı Fighter92 oldu. v1.231.0’daki kaynak sayacı taraması, 290 ve 901’i doğru şekilde atlayan ama Fighter90 içindeki 90 ile eşleşen bir rakam sınırı koruması altında 90’ı 92 ile 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 → 87 taraması v1.85.0’ı v1.87.0 yaptı 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_ADAPTERS 85 → 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 bir secure.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) — mevcut telegram kaynağı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.
  • 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 projedeki LOCATIONISH_RE, yalnızca ASCII için çalışan ve Kiril harflerinin yanında hiç tetiklenmeyen \b sınırını kullanıyordu: içindeki tüm Rusça seçenekler erişilemezdi ve Senior 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ğıda ROLE_WORD_RE iç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: 0 ile tek bir POST.
  • providers/_types.js yalnı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 filters ifadesi 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: hangi max_hits sonucun 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 varken queries isteğ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-results değ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 kendi max_jobs/max_pages değerimiz durdurduğunda çıkıyor — çağıranın üzerinde işlem yapabileceği tek durum; totalResults bağ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/Pragma baş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 /offices ağacından toplanan küme kendi gezinme sırasını izler. İkisi de ilanın location alanı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 giren offices[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 jobLocation girdisini okur; çünkü bazı kiracılar gerçek adresten önce tamamen UNAVAILABLE bir 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.mjs değ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.mjs hattı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_ADAPTERS 81 → 85, dördü de jetonsuz. Built In ABD teknoloji panosunun dokuz pazarını kapsar ve varsayılan sorgu taşımaz: queries: ve categories: 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: office bağ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

  • htmlToText metne yarım bir etiket açıcısını sızdırabiliyordu. safe &lt;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-facts ve merge-tracker dü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/health her istekte package.json’ı yeniden okuyordu, dolayısıyla eskimiş bir süreç çalıştırmadığı bir sürümü bildiriyordu. QA, version: 1.228.4 yanıtı verirken 1.228.3’te eklenen /api/ping iç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. parentVersion istek 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/ping her vuruşta package.json okuyup 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/health bunu zaten hidden ile değiştiriyordu — ama yalnızca o satır hidden ?? value koruyucusunu 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. buildAskPrompt did if (ctx.length + sec.body.length > MAX_CONTEXT) break — a break, so one oversized section ended the loop and left the context empty, and the assistant truthfully reported it had nothing. The English §5 had grown to 16 081 bytes against a 14 336-byte budget (partly because v1.228.0 added telegram_channels to it); the Russian §5 was 13 009 and fit. Same ranking in both languages — §5 was first — only the size differed.

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

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

Added

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

[1.228.2] — 2026-08-30

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

Fixed

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

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

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

[1.228.1] — 2026-08-29

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

Fixed

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

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

[1.228.0] — 2026-08-29

Eklendi — tarama kaynağı olarak Telegram kanalları ve /api/scan-results için sayfalı sorgu kipi.

Eklendi

  • Telegram kanalları artık taranabilir bir kaynak. portals.yml içindeki telegram_channels: bloğu onları listeler; her biri herkese açık https://t.me/s/<kanal> önizlemesinden okunur. Kayıt defteri: 85 → 86 kaynak (81 EN + 5 RU), ALL_ADAPTERS 80 → 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-results sayfalı sorgu kipi kazandı. ?q=<metin>&limit=50[&region=ru|en][&set=filtered|fresh][&offset=N] { total, returned, offset, limit, set, rows } döndürür; total sayfalamadan ÖNCEKİ sayıdır. Parametresiz haliyle rota yine tüm anlık görüntüyü döndürür — #/scan tablosu 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 bir total döndürüyor. Beceri de yeniden yazıldı: yeni gönderileri özetlemeyi istiyordu, yani filtered yerine fresh’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. jobGeeks tam da bunu yapar (HTTP 302) ve bilinçli olarak yapılandırılmadı.
  • Uzaktan çalışma tespiti \b yerine Unicode sözcük sınırı kullanır; \b yalnı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 Total row also repeated the unit count, so it under-summed the three suites below it; it now reads the real sum (3040).

[1.227.5] — 2026-08-29

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 servisi FATAL ERROR: Reached heap limit ile 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 bir Set taşıyor.
  • net::ERR_SOCKET_NOT_CONNECTED CI’ı rastgele düşürüyordu. Üç Playwright takımı, konsol hatası olmadığını doğrulamadan önce süren istekleri durdurmak için window.stop() çağırır. Chromium bu tek kasıtlı eylemi soketin durumuna göre üç farklı adla bildirir: iptalde ERR_ABORTED, yoldayken ERR_EMPTY_RESPONSE, soket çoktan gitmişse ERR_SOCKET_NOT_CONNECTED. Ortak filtre yalnızca ilk ikisini biliyordu. tr yerel taramasında ortaya çıktı; aynı çağrıyı yapan playwright-forms ve playwright-smoke da 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.mjs zor 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 -1 doğru) ve Node’un varsayılan 5 dakikalık requestTimeout değeri (küçültülmüş bir yeniden üretim, uzun bir akış yanıtını kesmediğini gösterdi). Asıl kanıt, günlükteki Reached heap limit idi. 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 projenin word: / stem: öneklerini öğretti ama content_filter’ı kendi ham lower.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_filter ilanın AÇIKLAMASINI okur ve varsayılanı hep düz alt dize olmuştur: bu yüzden çıplak bir olumsuz java, yalnızca „JavaScript“ten söz eden her ilanı eler; önek ise tek bir girdiyi bu varsayılandan çıkarma yoludur. Üst projenin compileContentKeyword iş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ı \b yerine Unicode sınırına taşımak ASCII’de birebir aynı davranır ve yalnızca olması gereken yerde daha katıdır — COO_lead ve coo1 korunmaya devam eder (alt çizgi ve rakam her ikisinde de sözcük karakteridir), Coordinator korunur, „Директор COO“ ve „VP «Продукт»“ doğru biçimde elenir. 14 sınır durumu denetlendi.
  • Öneksiz content_filter girdileri önceki eşleşmesini bayt bayt korur, boş veya eksik bir açıklama yine geçer ve içi boş bir word: / stem: her şeyle değil hiçbir şeyle eşleşir. tests/content-filter.test.mjs iç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 (ve content_filter) varsayılan olarak büyük/küçük harf duyarsız alt dize eşleşmesi yapar; bu yüzden çıplak bir olumsuz intern girdisi „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:intern yalnızca tam sözcüğü, stem:agent ise 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.yml CLI’da doğru süzerken burada hiç süzmüyordu, dolayısıyla dışlanan her staj ilanı yine #/scan tablosuna ulaşıyordu. Üst projenin title-keywords.mjs dosyasından aktarıldı; yalnızca ASCII bilen ve aksanlı ya da Kiril başlıklarda sözcük ortasında eşleşen \b yerine Unicode farkında sözcük sınırı (\p{L}\p{M}\p{N}_) dahil.

Notlar

  • Gerçek bir portals.yml incelenirken bulundu; oraya word:intern tam da çıplak intern girdisi „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 \b kullanıyordu, bu yüzden ASCII dışı başlıklarda coo ile word:coo ayrışıyordu — tek kuralın iki yazımı.
  • tests/title-filter.test.mjs iç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 bir min-width: 300px taşı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-provider ve tüm cfg-*-model). Artık min-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.mjs form 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 #/config select’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çi min-width değil. Yaygın hiçbir telefonun bildirmediği bir genişliğe göre yeniden akıtmak ayrı bir iş; takımın WIDTHS listesi buna hazır.
  • v1.227.1 QA istemi de düzeltildi: takip rotasını #/modes/followup olarak adlandırıyordu. Mode sayfaları çıplak slug ile kaydolur (Router.register(cfg.slug)), dolayısıyla rota #/followup’tır ve #/modes/followup doğ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 #/help başı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 — hem GET /api/help/:lang hem 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.appNum okuyordu; oysa followup-cadence.mjs num yayıyor — appNum yü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 toplam SOURCES.lengthe eşit; terimler canlı EN/RU bölünmesine eşit ve toplamı veriyor; paragraf sürüm sabitlemiyor) ve tests/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_ADAPTERS 80 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.com ve siteKey: HK-Main yeterli. Kayıt defteri değişmiyor: 85 kaynak (80 EN + 5 RU) ve ALL_ADAPTERS 80 — 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 projenin followup-cadence.mjs dosyasının zaten hesapladığı urgency alanından okunuyor (urgent / overdue) — asla izleyicinin status alanından değil; o alan applied/responded/interview değ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 projedeki followup-view.mjs dosyasının aynası olan saf public/js/lib/followup-view.js modülünde yaşıyor.
  • Gizli işverenler, kendilerini sunan ajansa atfediliyor. İşvereni saklanan bir ilan izleyicide ? olarak kaydedilir ve işe alım uzmanı Via sü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 — kanonik company alanının üzerine asla işe alım uzmanı yazılmıyor. Üst projedeki company-presentation.mjs dosyasının aynası olan yeni saf public/js/lib/company-presentation.js modü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/search adresine 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’si id üzerinden kuruluyor, locations[0].label, advertiser.description, salaryLabel), v4’e özgü solrFields izdüşüm parametresi kalktı ve portals.yml dosyası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 8d64f656cc46a4; VERSION dosyası hâlâ 1.30.0 diyor — release-please main’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-check düzeltmeleri — salt okunur ve fail-soft biçimde aktarılıyor; scan.mjs içinde Playwright sıralaması, Block H yanıtları, updater/doctor/update-system korumaları, özyinelemeli sözdizimi denetimi, Go panosu ve jd-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: careerviet girdileriyle 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_ADAPTERS 80 taşır — ikisi de #/scan Kaynak 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-text düzeltmesi ve roleFuzzyMatch zaten 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.svg dosyasında GitHub’ın reddettiği geçersiz bir font-family (iç içe çift tırnak) vardı, <img> depo-göreli bir src kullanı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ş bir images/providers.png gö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.svg18 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, innerHTML yok.

Notlar

  • Rota veya davranış değişikliği yok; aynı ProviderLogo.el(slug) API’si. provider-logo.js bü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 === 0 yanlış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>Hint değ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.js içindeki İngilizce hintFallback eksik bir anahtarı hâlâ korur ve yeni bir sözleşme testi, alan tanımlayıcılarının her hintKey değ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.mjs içindeki fetchJson/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çek fetch taşımasında çalışır — enjekte edilen test fetchImpl’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 getonbrd girişi artık yalnızca programming akışı yerine categories: [programming, operations-management, machine-learning-ai] (ya da tek bir category:) 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_pages değ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_PROVIDER ipucunun slug listesi 17 dilin tümünde ark / arkcn kazandı.

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 da ep-… uç nokta id’niz) ayarlayın; ARK_BASE_URL / ARK_CN_BASE_URL bölgeyi değiştirir. İkisi de auto sı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 sonra auto sırasına katılır; herhangi birini LLM_PROVIDER ile 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_filter kelimesi, 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: true pano atlaması ve sabitlenmiş kelime stem: / 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ğı. #/scan sayfasındaki Kaynak filtresinden seçin ya da isteğe bağlı bir keywords listesiyle provider: mycareersfuture olan 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ş bir isRemote bayrağı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ğı. #/scan sayfasındaki Kaynak filtresinden seçin ya da isteğe bağlı bir keywords listesiyle provider: jobbankca olan 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ğı. #/scan sayfasındaki Kaynak filtresinden seçin ya da provider: yourator olan 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ı (&eacute; → é, &ccedil; → ç, …); böylece D&eacute;veloppeur ya da Fran&ccedil;ais yazan 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 — &Eacute; É’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. #/scan sayfasındaki Kaynak filtresinden seçin ya da provider: senjob olan 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 height değeri min-height oldu; 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ıklara overflow-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ça markdown/md olduğunda, böylece gerçek bir python/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:true salt-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.md bu özelliklerin beş rotasını belgeliyor ve CLAUDE.md ile docs/sdd/CONVENTIONS.md iç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: alanlar assessment-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.md ve config/profile.yml dosyanı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 projenin cv-sync-check.mjs’sini aktarır; bu betik metin + bir çıkış kodu yazar (--json yok); 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 projenin jd-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 sabitli safeGet ile yoklar, istek başına ≤12 yoklama) + POST /api/portals/discover (salt okunur) ve POST /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.md dosyanız İngilizce olmayan veya değişken başlıklar kullanıyorsa — İspanyolca empresa / puesto / estado / fecha / enlace ya da position / 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 yeni HEADER_ALIASES tablosu + 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.mjs ve salt okunur GET /api/liveness?url= (yazma yok, LLM yok). SSRF güvenli: URL isValidJobUrl’den geçer, ardından ATS API’sine yalnızca DNS sabitli safeGet ile 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.css içindeki .table-wrap, overflow: hidden yerine overflow-x: auto oldu (mevcut .reports-scroll kabı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-After dikkate alınıyor (ancak sınırlandırılmış, böylece düşmanca bir Retry-After: 86400 tü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.mjs içinde yeni parseRetryAfterMs() ve saf computeRetryDelayMs(); fetchJson artık ok olmayan bir yanıtta .retryAfter yakalıyor ve fetchJsonWithRetry isteğe bağlı bir maxDelayMs (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_collection gerektirmiyor. Panonun kendi careers_url değerini verin; id, ilk taramada o sayfadan kendiliğinden çözülür — SSRF’ye karşı güvenli tek bir GET, sayısal network.id değerini sayfanın gömülü verisinden doğrudan okur. Açık bir getro_collection yine önceliklidir ve getirmeyi tümüyle atlar.

Notlar

  • server/lib/sources/getro.mjs içinde yeni httpsCareersUrl(), extractCollectionId() ve asenkron resolveCollectionId(); pano sayfası DNS’e sabitlenmiş, boyutu sınırlı safeGet ile getirilir ve çözülen id, assertGetroUrl tarafından hâlâ api.getro.com ana bilgisayarına sabitlenir. Adaptör artık id olmadan bile https careers_url taşıyan bir provider: getro girdisiyle 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 Workday api: değeri artık yalnızca ana bilgisayar adı myworkdayjobs.com (veya .myworkdayjobs.com alt 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 bir roleFuzzyMatch ö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.mjs içinde groupRowsByTitle (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 site External’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-US gibi bir dil önekini atarak); belgelenen /en-US/External durumu değişmedi. (#255’te bildirildi.)

Notlar

  • server/lib/portals/adapters/workday.mjs iç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

  • #/stats iç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-latency rotası (fail-soft {available:false}). tests/stats-rejection-latency-route.test.mjs (+2). +10 i18n anahtarı ×17; #/stats help-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-studio iç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-facts rotası: metni tek kullanımlık geçici bir dosyaya yazar ve verify-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

  • #/stats iç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/upskill rotası (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_tiers arkası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üzden skip_tiers: [senior] veya [entry] onları atlıyordu.

Notlar

  • server/lib/classify-tier.mjs içinde yazı sisteminden bağımsız lookbehind; ölü yinelenen Sr. 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 bir skip_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üzden skip_tiers sessizce yok sayılıyordu. Düzey sözcüğü olmayan başlıklar mid’e düşer (böylece skip_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 ve jds/ 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-fill yerine sabit repeat(N, minmax(0,1fr))). tests/dashboard-grid-align.test.mjs ile 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, …), http yerine https, ya da sondaki eğik çizgi / #parça ile 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_jid gibi 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

  • #/reports listesi 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ığındaki overflow-wrap: anywhere rapor 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-scroll konteyneri). 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 Summary bloğ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 bir X / 5 olmasına rağmen rapor “Puan algılanmadı” gösteriyordu. parseReportHeader artı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 (+ bir fromCodePoint yardımcısı) taşıyordu — sürüklenmiş kopyalar (üçü RangeError fırlatabiliyordu, v1.172.0’de düzeltildi; diğerleri NUL/C0’a izin veriyor veya &#1a2;’yi yanlış ayrıştırıyordu). Artık hepsi tek server/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 &nbsp; çözümü kazandı (önceden yalnızca 5 varlık); cryptocurrencyjobs’un kasıtlı çift çözümü bir takma adla korundu. hh kendi çözücüsünü tutuyor (&mdash;/&ndash;’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 projenin user-agent.mjs’iyle uyumlu; eski bir sürüm daha sık engellenir. Bir Chrome major ≥ 151 testiyle korunuyor.
  • Tracker durumları FALLBACK (GAP #5)states.mjs’deki son çare FALLBACK (yalnızca canlı templates/states.yml okunamadığı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 Unauthorized yanıtı verir. sources/csod.mjs artık açılışı yeni bir fetchResponse yardımcısıyla okur, Set-Cookie değerlerinden bir Cookie baş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 / 5 olarak 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, parseReportHeader artı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, /5 değeri yok) ve 5/5/2026 gibi 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.desc alanı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, 17 site/src/i18n/*.json dosyasından biri yer tutucuyu kaybederse veya bir sayıyı yeniden sabit kodlarsa ya da Landing.astro onu üç açıklama meta’sına yerleştirmeyi bırakırsa başarısız olur.
  • Null’a dayanıklı meşruiyet temizliğistripEmphasis boş 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-pill bir 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, ikili hermes) algılıyor. server/lib/routes/cli-detect.mjs iç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, gem ve dassault kaynakları, sayısal HTML varlıklarını String.fromCodePoint öncesinde yalnızca zayıf bir Number.isFinite denetimiyle çözüyordu — 0x10FFFF üzerindeki bir başvuru (ör. bozuk veya kötü niyetli bir akıştan &#99999999;) yakalanmayan bir RangeError fırlatıp o kaynağın tüm ayrıştırmasını iptal ediyordu. Ortak bir modül server/lib/html-entities.mjs (üst projenin _html-entities.mjs dosyasını yansıtır) artık sayısal başvuruları XML 1.0 §2.2 Char kümesiyle sınırlar; böylece String.fromCodePoint asla fırlatamaz ve onaltılık ile ondalığı ayrı eşleştirdiği için &#1a2; 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.md iç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 112xl 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 ⏱ ~Nsn ipucu var (#/auto ETA’sı gibi). Paylaşılan .eta-hint stili + 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: inline ile sunar; tarayıcı yeni sekmede 👁 Önizleme olarak işler. Varsayılan (parametresiz) hâlâ indirmedir. Yeni rota yok; aynı ad korumaları.
  • #/cv PDF 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ızca min-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.md ve 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.twoPager ve twoPager.title terimde 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.html yedeği eşleşir; aria-label tam 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-hint kutusu artık 24×24 (ölçülebilir hedef), görünen halka 18px kalıyor — ortalanmış bir ::before ile ç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ılabilir role="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 / 5N / 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

  • parseReportHeader artık dilden bağımsız ## Machine Summary YAML 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ı ham h1.textContent’ten türetiyordu, bu yüzden sekme «Vacancy search» yerine «Vacancy search?» gösteriyordu. router.js::focusNewView artı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’daki sub() 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.json biç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_PROVIDER sabiti (ör. init’ten gelen LLM_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ı yerine window.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) ve scan/filters.js (filtre durum makinesi) ctx/refs torbalarıyla; scan.js ikisini 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) ve config/tab-controller.js (sekme çubuğu fabrikası); config.js bunlara 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) portaldaki company_eid:, (2) açık bir api:’nin c= parametresi, (3) pano sayfası keşfi. fetchText (http-json.mjs) non-ok hatasına .location/.retryAfter ekler (salt okunur, geriye dönük uyumlu).

Notlar

  • Güvenlik — iki host (jobs.jobvite.com, app.jobvite.com) her istekten önce assertJobviteUrl ile sabitlenir: yalnız https, katı izin listesi, hiçbir yönlendirme izlenmez. companyEId yalnı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

  • #/config Hermes’i zorlayamıyorduLLM_PROVIDER açılır listesi yalnızca altı sağlayıcı listeliyordu, bu yüzden HERMES_API_KEY ayarlanabiliyor ama Hermes UI’dan zorlanamıyordu. Artık hermes 8. seçenek ve yeni bir eşlik testi açılır listenin LLM_PROVIDERS’tan tekrar sapmasını engelliyor.
  • Kısa kendi barındırılan anahtarlar sessizce reddediliyorduisUsableKey’in 20 karakter tabanı bulut anahtarlarına göreydi; hasHermesKey artı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.llmProviderHint sözlüğü (× 17) ve docs/sdd’de tam yediye normalleştirildi; hermesChatUrl yolsuz 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_KEY satı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 gatewayPOST /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 runOpenAICompatible istemcisi üzerinde runHermes (server/lib/openai.mjs), her iki kaskatta (llm-dispatch.mjs + routes/llm.mjs), auto sırasının sonunda + LLM_PROVIDER=hermes sabiti, /api/status/providers ve llm-pricing.mjs. Yapılandırılabilir yerel bir base URL’ye (varsayılan http://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.
  • #/config alanlarıHERMES_API_KEY (gizli) + HERMES_BASE_URL + HERMES_MODEL (varsayılan hermes-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-bridge skill’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_KEY bir SECRET_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, #/usage boş panellerdeki satır içi style: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' } ifadesini kaldırdı — üç özellik de zaten paylaşılan .empty sınıfı tarafından sağlanıyor (--space-7 = 48px, ortalanmış, soluk, kesikli kenarlık). Böylece bu dördü diğer ~25 .empty paneliyle birebir aynı çiziliyor.
  • Görünüme özgü meşru geçersiz kılmalar (#/dashboard width:100%, #/pipeline border: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 (.empty sınıfının kendisi değişmedi); sözlük anlık görüntüsü 1208. Tarayıcıda doğrulandı (#/usage boş 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

  • #/portals gezinme öğesi → Setup grubu (public/index.html içinde), Uygulama ayarları’nın hemen ardına yerleştirildi. Sourcing grubundan çıkarıldı (grup Scan / Pipeline / Auto-pipeline / Finanse edilen şirketleri korur). #/portals rotası, görünümü ve nav.portals etiketi 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.mjs ile 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

  • #/scan filtre paneli → duyarlı ızgara.scan-filters artık repeat(auto-fill, minmax(180px, 1fr)) sütunları ve eşit boşluklarla display: 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) ve SR.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.mjs ile 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 / DocsFab grounding’i bunu otomatik alır çünkü ikisi de docs/help/<lang>.md okur.
  • 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 + Telegram tanı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-bridge skill’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 ve llm-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ı zaten enabled: false şirketleri atlar, böylece devre dışı portal sonraki tüm taramalardan düşer) veya yeniden açar, iyimser bir bildirimle.
  • POST /api/portals/toggleportals.yml’deki bir şirketin enabled bayrağı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.mjs zaten enabled !== false ile 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, #/apply satır içi bir ? alır (HelpHint.title ile) 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 (CompanyLogo ile 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 parseAmount ile 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.salaryStats artık minUsd/medianUsd/maxUsd yanında avgUsd dö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 ve UI.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/…) asla background olarak, yüzey token’ları (--card/--panel/--line/…) asla metin color’ı olarak kullanılmaz; tüm CSS ve SPA satır-içi stillerinde.
  • UI.md() XSS yükleyici öz-sondasıapi.js’ten md()’i yükleyen test artık çıkarımın hemen ardından md('<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-plan kaydırma koruması — üretim sonrası scrollIntoView yalnızca önizleme hâlâ belgeye bağlıysa çalışır.

Notlar

  • docs/UX-ROADMAP.md gü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ı (#/pipeline genel bakış çipleri, #/stats etkin sekme, #/config “Etkin / Anahtarlar” + “✓ ayarlandı”, #/two-pager bölümleri, #/mock-interview soru 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ı; #/config etkin sekmesi okunabilir, tonlanmış bir stile taşındı. Bir regresyon koruyucusu (tests/dark-theme-tokens.test.mjs) onları takma adlı tutuyor.
  • #/stats grafik 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-plan oluş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, #/stats ve 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ğrulama https://<tenant>.eightfold.ai/api/apply/v2/jobs API’si üzerinden yetenek-kazanımı panoları, *.eightfold.ai’a ana bilgisayar-sabitli (markalı careers.<company>.com CNAME’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; #/scan Kaynak 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-reposts artık genişlik/noktalama şirket varyantlarını kümeliyor (“Acme, Inc.” ≡ “Acme Inc”) ve farklı Latin-olmayan işverenleri asla çökertmiyor, role-matcher ise tam-genişlikli unvanları katlıyor ve Latin-olmayan rol belirteçlerini silmek yerine koruyor.
  • fetchJsonWithRetry artık reddedilen bir yönlendirmeyi yeniden denemiyor (#2657) — bir 3xx ile karşılaşan redirect:'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.positive VE-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 ediyor oraclecloud1.com … oraclecloud99.com (#2683) — sınırlı bir aile (baştaki sıfır yok, ≤ 2 hane), asla bir joker aleksi değil.
  • workable sağ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.
  • states FALLBACK 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. Web js-yaml/nanoid YÜ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; #/scan Kaynak 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çık api.getro.com POST 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 jobsandfeatured API’sine taşındı; satırlar yayın tarihi taşımıyor ve yaş filtresinden muaf.
  • hackernews, Algolia aramasını serbest metin sorgusu yerine author_whoishiring hesap 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=value ayrış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

  • successfactors artı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ünde try/catch yoktu, 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 bir 404 ise (aralık dışı bir startrow), en-scanner canlı bir kiracıyı günlerce ölü olarak karantinaya alıyordu. Şimdi phenom/radancy ile aynı: 0. sayfadaki bir hata hâlâ fırlatılıyor (ölü pano), ancak daha sonraki bir sayfadaki hata kısmi sonuçları koruyor.
  • #/scan filtre çipleri artık klavyeyle çalıştırılabiliyor (WCAG 2.1.1) — faset çipleri (ve “temizle” çipi) bir tıklama işleyicisine sahip ama tabindex/rolü olmayan span’lerdi, bu yüzden klavye ve ekran okuyucu kullanıcıları onlara erişemiyor veya değiştiremiyordu. Şimdi role="button", tabindex="0", aria-pressed taşıyorlar ve Enter/Boşluk ile etkinleştiriliyorlar.
  • Üç sabit kodlanmış İngilizce dize artık yerelleştirildi#/scan güven-rozeti araç ipucu, #/scan yer değiştirme sütun başlığı ve #/dashboard puan 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ı. Şimdi scan.trustTip + scan.col.reloc (2 yeni anahtar) ve mevcut track.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_ADAPTERS 68). #/scan Kaynak 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 = 100 istiyordu, 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 #/portals sağ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 projenin company-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.candidates altında okuyordu, ancak üst proje bunları companies altı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ücrelerini UI.el('tr', {}, …)’a değişken sayıda bağımsız değişken (varargs) olarak geçiriyordu, ancak UI.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.mjs içinde regresyon korumaları: sahte üst proje betiği artık gerçek companies çı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ıca funded.js’in res.companies’i okuduğunu (asla res.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’un company-funded.mjs’ini GET /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-run ile ç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-LLM weekly-digest.mjs’ini GET /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çerli YYYY-MM-DD olduğunda aktarılır; boş bir aralık geçerli bir available: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:false sözleşmesini izler. 26 yeni i18n anahtarı ×17 yerelleştirme; CI-izole paket tests/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 alttaki followup-cadence.mjs sağlamlaştırması kabuk-açma aktarımı üzerinden bedavaya geliyor. set-status.mjs / tracker-utils.mjs değişiklikleri CLI-dahilidir ve yansıtılmıyor.

[1.132.0] — 2026-07-31

Değiştirildi

  • #/scan sonuç-render alt sistemi public/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ı ve FALLBACK_SOURCES kayıt defteri aynası) görünümün sağladığı bir bağlam nesnesini kapsayan bir window.ScanResults.create(ctx) fabrikasına taşındı. Davranış değişikliği yok — fonksiyonlar birebir taşındı, kapatma değişkenleri ctx.*’e yeniden bağlandı; scan.js artı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.mjs artık kayıt defteri aynasını scan-results.js’ten okuyor.
  • Yeni tarayıcı-içi regresyon kapısıtests/playwright-scan-filters.mjs hazır bir data/last-scan.json tohumluyor ve her #/scan filtresini ç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ık app.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) ve overlays.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. Yeni tests/css-modularization.test.mjs bö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.

[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-talent adaptörü artık api: / a16z-speedrun-talent: geçersiz kılmasını buildEndpoint’te yeniden doğruluyor (HTTPS + tam ana bilgisayar speedrun-talent-network.com) ve başarısız olduğunda kanonik beslemeye geri dönüyor — cryptocurrencyjobs adaptörüyle parite, böylece ana bilgisayar dışı bir değer asla getirme yuvasına ulaşmıyor (önceden yalnızca getirme zamanındaki assertSpeedrunUrl koruyucusuna güveniyordu). Tam ana bilgisayar kontrolü artık koruyucu ve adaptör tarafından paylaşılan tek, dışa aktarılmış bir SPEEDRUN_TALENT_HOST_RE.
    • cryptocurrencyjobs ayrıştırıcısıcleanUrl artık assertCryptocurrencyJobsUrl ve adaptör geçersiz kılmasıyla aynı tam eşleşen ana bilgisayar koruyucusunu kullanıyor (önceden alt alan adlarını kabul eden endsWith idi). Ayrıştırıcı asla SSRF koruyucusundan daha izin verici değil: bir sub.cryptocurrencyjobs.co ilan bağlantısı düşürülüyor.
    • +2 test → paket 2135.

[1.131.0] — 2026-07-31

Eklendi

  • #/tracker CRM aşama-sekmesi panosu (üst projenin web uygulamasının /pipeline gö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/stages kanonik 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 parametresiz GET /api/tracker yanıtı değişmedi (yalnızca { rows }).
    • Yeni saf, birim test edilmiş istemci kitaplığı public/js/lib/tracker-stages.js satırları sunucunun aşamalarına göre gruplandırır, başıboş markdown kalın yazısını ve yerelleştirilmiş takma adları (ör. aplicadoApplied) 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.

[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 #/scan Kaynak 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şına q/yapılandırma iş parçacığı, hataya karşı toleranslı.
    • Cryptocurrency Jobs (cryptocurrencyjobs) — Web3 iş panosu cryptocurrencyjobs.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ü).

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 bir hybrid işareti artık "<Şehir> · Hibrit" (şehir yoksa yalnızca Hibrit) ve workplaceType: '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 edilebilir opts.fetchJson ile 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 projenin scan.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ı, StepStone rltr yinelenen 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 ve scan.mjs’e kabuk açmaz.
  • Zaten kapsanmış. role-matcher aksan 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.js seviye önceliği (açık bir niteleyici artık yönetim kelimesini yener — Senior Engineering Managersenior, önceden lead); states.mjs yedeğ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 dosyada console.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.mjs izolasyon koruması. +4 test → 2073.

[1.129.0] — 2026-07-29

Eklendi

  • #/scan seviye faseti + yaş sütunu — v1.128.0’de gelen job-facets.js kü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çin templates/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-fab bir 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.com portalları, jibeapply’dan ayrı). Ayrıca Cursor CLI listesine geri döndü (parent #2115): cli-detect artık cursor’ı 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.name yalnızca çalışma modeliyken Greenhouse şehri /offices’ten kurtarıyor (#2104); role-matcher paritesi (#1933/#2164/#2009: MTS öneki, product taban ç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) #/config API 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#/config listesi üst projenin docs/SUPPORTED_CLIS.md dosyasıyla senkronlandı: server/lib/routes/cli-detect.mjs Grok Build CLI (grok) ve Kimi CLI (kimi) kazanıyor ve Antigravity artık önce kanonik agy ikili 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çinde sharp 0.34.5→0.35.3, svgo 4.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-status yanlış-satır korumasi (#2108) yalnızca CLI (web-ui’de izleyici satırları arayüzde açıkça seçilir ve hiçbir rota set-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üzey modes/*.md okunur), update-system manifest 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 — parentVersion değ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.mjs içindeki LOCALE_NAMES ve beş SCAFFOLD_STRINGS bloğu da ve hi iç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 language yönergesini kaybediyordu. Artık ikisi de birinci sınıf: dil yönergesi + yerelleştirilmiş iskele. tests/locale-scaffold.test.mjs iç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 — gelecekte prompts.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/deep istemi 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. buildDeepPrompt ve bundleProjectContext artık bir headless bayrağı 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.mjs içinde +1 test.

Değiştirildi

  • Gemini varsayılanları, kullanımdan kaldırılan gemini-2.0-flash modelinin ötesine taşındı (#144, @Alien10140 katkısı) — Yapılandırma açılır listesi, gemini.mjs içindeki sunucu yedeği (ipucuyla sessizce çelişiyordu), OpenRouter yedek zinciri, config.geminiModelHint ×17 ve yardım kılavuzu ×17 artık tutarlı biçimde gemini-3.6-flash gö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ılan resolveTenantBase yardımcı fonksiyonu + tests/sources-successfactors.test.mjs iç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.mjsfacts.sources), böylece uygulamadan asla sapamaz; Sources.astro içindeki düzenlenmiş bağlantı haritası yeni tests/site-sources.test.mjs ile korunur. Üst gezinme çubuğu yeni bir Kaynaklar çapası kazandı; 4 yeni site i18n anahtarı ×17. Ayrıca, hâlâ hi eksik olan landing JSON-LD inLanguage listesi 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; #/scan Kaynak açılır menüsü yedeği ve onun sapma kapısı güncellendi; beş yeni test paketi tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.

Düzeltildi

  • Arbeitsagentur: homeofficetyp yalnızca VOLLSTAENDIG olduğunda tüm ülke çapında uzaktan sayılıyor (üst proje #1981) — homeoffice=nv_true sorgusu 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, /expand modu, 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 zaten withFileLock üzerinden yönlendiriyor), tarama visa_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ı recruitingCEJobRequisitions REST API’si: *.fa[.<bölge>][.ocs].oraclecloud.com ana bilgisayarına sabitlenmiş, site numarası her takip edilen şirketin careers_url alanı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; #/scan Kaynak açılır menüsü yedeği ve onun sapma kapısı güncellendi; yeni CI-izole test paketi tests/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/--report bayrakları, 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-validator ile 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 bir CHANGELOG.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, site check-i18n ve 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.mjs artı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 yeni footer.manifesto i18n 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 upskill hedefli modun bilinen-beceri bastırmasını düzeltti, scan --json stdout’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

  • #/scan kaynak filtresi kayda yetişti — Source açılır menüsünün arkasındaki statik FALLBACK_SOURCES listesi (yalnızca GET /api/scan/sources ulaşı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çık provider: 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 /contributors API’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/referer iç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 de http-json.mjs içindeki ortak BROWSER_LIKE_USER_AGENT sabitinden 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ı sabit https://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.ru ana makinesini kabul ediyor (adsrv.hh.ru/click?… reklamları hâlâ hariç tutuluyor — /vacancy/<id> yolu yok) ve her sonuç URL’sini https://hh.ru/vacancy/<id> biçimine normalleştiriyor. Canlı doğrulandı: önceden 0 veren bir sochi.hh.ru sayfası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 /vpncheeck ara 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.md Astro 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 ve sync-assets asla site/ 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 Hired durumu (üst projenin states.yml paritesi): 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.
  • #/stats içinde Toplam sekmesi — üst projenin stats.mjs dosyası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 rotalar GET /api/stats/lifetime ve GET /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şeni public/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şeni public/js/lib/docs-fab.js; CSP güvenli; app.css iç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.mjs iç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 önce UI.escapeHtml ile err.message’i kaçışlar; server/lib/routes/content.mjs ve server/lib/routes/config.mjs prototip 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.mjsGET /api/usage (salt okunur toplamalar) + server/lib/llm-usage.mjs (recordUsage Anthropic/OpenAI/Gemini kullanım biçimlerini normalleştirir ve best-effort ekler; readUsage/aggregate 24s/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 $/1M jeton 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.mjsGET /api/logo?domain=. Alan adını doğrular (şema/yol/loopback yok), /favicon.ico’yu SSRF güvenli safeGet üzerinden alır (yeni bir binary modu 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üvenli img.onerror geri 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.mjsGET /api/cli-detect. Algılama, sabit 7 girişli bir izin listesinden process.env.PATH üzerinden bir ikilinin yolunu çözer (Windows .cmd/.exe/.bat shim’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.js içinde yeni “Yapay zeka CLI araçları” sekmesi (tembel yükleme, #/config?tab=cli ile 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.mjsPOST /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 bir TAILOR_INSTRUCTIONS kapısı, bundleProjectContext tabanlı, paylaşılan sağlayıcı basamaklaması, anahtar yoksa manuel istem, hız sınırlı, yazma yok. Sonuç, paylaşılan report-export.js çubuğuyla Markdown / PDF / DOCX olarak dışa aktarılır.
  • Testler: tests/cv-studio-routes.test.mjs içinde +3. 10 yeni i18n anahtarı ×16 (cvs.tailor*). Genel referans docs/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 .docx dışa aktarımı. Yeni server/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ıklar express + js-yaml olarak kalır). Yeni rota POST /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şılan public/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 yerine null dö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.mjs iç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/jobs arkasındaki genel akış) yansıtır. Tek bir global uç nokta olduğundan sağlayıcıyla seçilir (provider: dassault) veya bir 3ds.com ana bilgisayarından otomatik algılanır; SSRF için ana bilgisayar www.3ds.com’a sabitlenir ve redirect:'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_ADAPTERS sayımı, sıralı-id ve /api/scan/sources EN-kümesi doğrulamaları 40 → 41 yükseltildi. tests/sources-dassault.test.mjs paketi (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 bir 0/negatif published_at değerine karşı koruma sağlıyor (artık sahte 1970 tarihleri yok); SuccessFactors son sayfayı sınırlayarak MAX_JOBS’u aşamamasını sağlıyor (#1528).
  • Sunucu denetim düzeltmeleri. safe-fetch artı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). SSE stream.* etkinlik günlüğü yeniden erişilebilir (/api/stream/ denetimi, genel “GET’i atla” korumasının üstüne taşındı).
  • SPA denetim düzeltmeleri. #/stats sekme 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ça eval.jdLbl (“Job Description”), İtalyanca dash.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 #/orientation sayfası “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.js yeniden 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: #/orientation; server/lib/routes/orientation.mjs.

[1.95.0] — 2026-07-04

Eklenenler

  • Kariyer planı (Epic 26). Yeni bir #/career-plan sayfası, 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.md yazar) + 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: #/career-plan; server/lib/routes/career-plan.mjs; PATHS.careerPlan.

[1.94.0] — 2026-07-04

Eklenenler

  • İstatistik, yeniden tasarlandı (Epic 25). #/stats sayfası 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.js yardı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.
  • Yeni: #/stats sekmelere 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 #/memory sayfası, 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 yerdebundleProjectContext iç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.md içine kaydedilir, güncellemelerle asla üzerine yazılmaz.
    • Verilerinden önerPOST /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.
  • Yeni: server/lib/routes/memory.mjs (21. rota modülü — GET/PUT /api/memory + POST /api/memory/suggest), public/js/views/memory.js, PATHS.memory ve bundleProjectContext’e eklenen bir config/memory.md bloğ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-studio sayfası, ö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.md ve writing-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.
  • 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 #/networking sayfası, 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 yolusenin 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’daki server/lib/llm-dispatch.mjs zincirini 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-interview sayfası; ö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ındainterview-prep/story-bank.md isteme gömülür (cv.md ile 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.
  • 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-pager sayfası, 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-pager ile 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 ◎ N uyum puanı gösterir (istemci tarafında, window.FitScore ile). 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 bundleProjectContext içine satır içine yerleştirilir, böylece tüm alt LLM değerlendirmeleri belirttiğin tercihleri CV-JD eşleşmesiyle harmanlar.
  • 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 ilan bildirimleri ve reloc rozeti artık t() ü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-By başlığı devre dışı bırakıldı (yol haritası v1.69.5): createApp() içinde app.disable('x-powered-by') — sunucu artık Express kullandığını duyurmuyor. (Bu destanın geri kalanı zaten teslim edilmişti: parentVersion kendi 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.mjs içinde bir X-Powered-By yokluğ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.jobs herkese açık arama JSON’u, ana bilgisayarla algılanır veya provider: amazon, ofsetle sayfalanır. server/lib/sources/amazon.mjs.
    • Avature (avature) — kiracı başına *.avature.net ATS, HTML’den ayrıştırılır, ana bilgisayarla algılanır veya provider: 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.
  • Her biri bir sources/<slug>.mjs (otomatik keşfedilen meta#/scan açılır menüsü) ve ALL_ADAPTERS içinde bir portals/adapters/<slug>.mjs (iki kayıt defteri kuralı) + tests/sources-<slug>.test.mjs sağlar. ALL_ADAPTERS sayısı ile sıralı id ve /api/scan/sources EN kümesi doğrulamaları 36→40’a yükseldi; GET /api/scan/sources artı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.Countries yeniden 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.jsonl dosyası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; testler role-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, tr dillerini tanıyor.
  • Prompt iskeleleri (server/lib/prompts.mjs) üç yeni dil için yerelleştirildi.