Nhật ký thay đổi
GitHubMọi thay đổi đáng chú ý, theo từng bản phát hành. Cùng một tệp đi kèm repository và được dịch sang cả 19 ngôn ngữ.
[1.267.1] — 2026-11-04
Đã sửa
- Sửa chữa tàu release (các cổng CI của v1.267.0) — chuỗi đếm-test trong PROJECT-CONTEXT không còn đứt ở đầu v1.267.0 (định dạng mũi tên mà eval grader khớp), các prompt QA được tổ chức lại (một prompt sống cho mỗi release, v1.266.0 được lưu trữ), và coverage theo tập tin được nâng lên trên ratchet 98/90: renderer salary của applicantpro bỏ một fallthrough không-tới-được (salaryRangeOf được-chứng-minh chỉ trả về undefined, {min}, {max} hoặc {min,max}) với các nhánh một chiều ≥/≤ giờ được ghim qua fetch flow, và suite board-response-cache ghim bypass no-store, 304 do caller cung cấp đối với board chưa lưu, và eviction ở MAX_ENTRIES.
- Kiểm thử: số đếm trực tiếp là 7395 (các bộ của đợt v1.266.0/1.267.0 mang nhiều spec hơn những gì các ghi chú trước theo dõi — chuỗi được neo lại vào sàn đo được: 7392 sau đợt, +3 kiểm thử cổng trong bản vá này); độ phủ 98.51 dòng / 90.35 nhánh.
Ghi chú
-
Tag v1.267.0 được để trỏ đến commit merge đỏ — không trỏ lại (máy chủ từ chối tag bị trỏ lại); v1.267.1 là phương tiện triển khai.
-
Sửa lỗi bản vá cho tàu v1.267.0: các cổng CI xanh, cây code không thay đổi về bản chất.
[1.267.0] — 2026-11-04
Đã thêm
- Bốn nguồn quét mới — GermanTechJobs, Darwinbox, Keka, ApplicantPro/isolved (sổ đăng ký 125 → 129 = 124 EN + 5 RU · 124 adapters) — đợt parent-sync thứ hai đối chiếu career-ops @
7d8feb6d(87 commit upstream). GermanTechJobs (#6346): RSS toàn bảng tạigermantechjobs.de/rss(~626 mục trong một yêu cầu); nhà tuyển dụng là đoạn cuối" @ "của title — title thiếu nó bị loại, không bao giờ ghi dưới tên bảng; chỉ chọn quaprovider:tường minh. Darwinbox (#6416): JSONalljobskhông cần xác thực đằng sau<tenant>.darwinbox.in, id công ty lấy từ careers URL, bước đi POST phân trang (50/trang,max_pages20/200) với điều kiện dừng trang-ngắn đọc từ số hàng do chính nguồn báo. Keka (#6199): hai yêu cầu — vỏ careersredirect:'manual'mà script của nó gọi tên UUID của feed (tenant lạ 302 tớiTenantNotFound.htmlvà đọc như một 404 có tên), rồi toàn bộ tồn kho mở trong một mảng embed-jobs. ApplicantPro / isolved (#6252):domainIddạng số lấy từ bootstrap, rồi{success, data:{jobs, jobCount}};jobCount > rowscảnh báo danh sách chưa đầy đủ; tùy chọnapplicantpro: { fetchDetails: true }làm giàu từ JSON-LD với nhịp 250 ms. - Tái sử dụng phản hồi bảng qua ETag (#6105) — trong một lần quét, phản hồi bảng lấy được trong 15 phút qua được dùng lại nguyên trạng, còn phản hồi cũ hơn được kiểm tra lại bằng
If-None-Match(304 giữ nguyên body); cache key bao gồm method + URL + các header credential + body, các lượt đọc chồng nhau gộp vào promise đang chạy, vàCAREER_OPS_HTTP_CACHE=0/_TTL_MSghi đè nó. Trong bộ nhớ theo từng lần chạy quét (web-ui không có hợp đồng cache trên đĩa) — một điểm lệch được ghi nhận.
Đã sửa
- Ngày xuất bản trên bốn bảng (#6274) — remoteok, remotive, workingnomads và IBM nay phát ngày xuất bản, nên bộ lọc «Posted within» hoạt động trên các bảng này; timestamp naive của remotive được chuẩn hóa UTC (bug tuổi tính theo từng máy của nó từng xảy ra thật), còn
_sourcecủa IBM giờ thực sự yêu cầudcdate. - Khóa portals.yml sai chính tả bị từ chối (#6107) — lần quét EN nay ném lỗi có tên (file + khóa + gợi ý khóa gần nhất, Levenshtein ≤ 2) trước mọi fetch, thay vì âm thầm bỏ qua
titel_filter:. - getro tiếp tục bước đi qua ghim featured cũ (#6406) — bài đăng pinned đã cũ vẫn bị loại nhưng không còn chấm dứt phân trang; bước đi kết thúc trên một trang ngắn thật.
Ghi chú
- Cố ý không làm: bộ lọc seen của RU scanner chưa nhận biết ngôn ngữ và đường dẫn parse portals của nó chưa chạy cổng kiểm tra khóa sai chính tả (hand-off được ghi trong wave spec — chưa có bảng RU nào phát các hàng theo ngôn ngữ); remoteok giữ chuỗi ngày mang offset thay vì chuẩn hóa UTC (shape sống của nó là tất định). Tests 7096 → 7243; Playwright 173 pass / 0 fail / 1 opt-in skip; sổ đăng ký 129 = 124 EN + 5 RU · 124 adapters (tất cả cổng đếm được tái tạo từ sổ đăng ký sống).
[1.266.0] — 2026-11-01
Đã thêm
- Các phiên bản ngôn ngữ Personio ngừng nuốt nhau (CAR-223: parent #4789 + #5044 + #5285) — khối bị trì hoãn được thực thi thành một bản phát hành riêng. Scan-side (#4789):
scan_history.dedup_include_language: true(opt-in nghiêm ngặt — OFF là đồng nhất từng byte) làm các phiên bản ngôn ngữ của một bài đăng sống sót qua dedup nhờ cơ chế biến thể seen-history (languageFormsFromUrl/recordUrlVariant/isUnseenLanguageVersion); khóa chuẩn tách bỏ các tham sốlanguage/lang/locale. preferred_languages (#5285): sắp các hàng phiên bản của một bài đăng theo ưu tiên-trước (ổn định, khi hòa thì theo thứ tự provider) — độc lập với công tắc (OFF giữ phiên bản ưu tiên, ON giữ mọi phiên bản theo thứ tự đó), kèm bản portvalidatePreferredLanguagescủa validate-portals. fan-out personio (#5044): trang careers được fetch không còn ép?language=en(?language=xxriêng của tenant được tôn trọng) và phát một hàng cho mỗi phiên bản ngôn ngữ với URL manglanguage+?language=<code>;dedupIncludeLanguagethêm các fetch theo ngôn ngữ (trần 5, có nhịp); các fallback /xml và job-link không đổi. recruitee nhận cách phátlanguage+preferred_languagestương tự (từ opts hoặc mục). Các helper dùng chung nằm tạiserver/lib/language-preferences.mjs.
Ghi chú
- Hand-off được ghi, cố ý không làm: bộ lọc seen của RU scanner chưa nhận biết ngôn ngữ và chưa có bảng RU nào phát các hàng theo ngôn ngữ; mirror
url-key.jsphía client và việc nối kiểm tra xác thực trên tuyến portals vẫn mở. Tests 7096 → 7203; sổ đăng ký không đổi 125 = 120 EN + 5 RU · 120 adapters.
[1.265.0] — 2026-11-01
Đã thêm
- Hai nguồn quét mới — Apple và Bulldogjob (sổ đăng ký 123 → 125 = 120 EN + 5 RU · 120 adapters) — đợt parent-sync đối chiếu career-ops @
fe857ecf. Apple (jobs.apple.com, #5496 + #6196): trang là ứng dụng React Router SSR không có JSON API dùng được, nên nguồn đọc khối hydration của tuyến tìm kiếm thường (window.__staticRouterHydrationData); khám phá do mục điều khiển (apple.queriessắp theo độ liên quan + các trụcapple.teams, không có mặc định — mục thiếu cả hai sẽ ném lỗi), số trang bị chặn bởimax_pages(mặc định 2, trần 50) với nhịp 200 ms, mọi đoạn URL được mã hoá an-toàn-surrogate, và bài đăng Apple gắn nhãn PIPE mang trong snippet ghi chú «có thể là talent pipeline» — không lọc theo nó. Bulldogjob (bulldogjob.pl, #6253): bảng công nghệ Ba Lan cũng không có JSON API — trang liệt kê mang__NEXT_DATA__(50/trang,totalCount);careers_urlcủa mục là phép tìm kiếm người dùng dựng trên trang (bộ lọc nằm trong đường dẫn), mọi yêu cầu đều mang/page,Ntường minh, và bước đi dừng ở trang ngắn, tổng báo cáo hoặcmax_pages(mặc định 25, trần 100) kèm nhãn cắt ngắn trên bảng một phần. - Tái cấu trúc phân trang IBM (#6273) — bước đi cố định 600 bản ghi trở thành
max_pages(mặc định 20, trần 300, ghi đè theo mục) với nhịp 200 ms giữa các trang và retry từng trang quafetchJsonWithRetry; trang đầu thất bại sẽ ném, trang sau thất bại giữ phần đã thu và gọi tên trang, và chỉ trang đầy tại trần riêng của mục mới cảnh báo «raise max_pages».
Đã sửa
- justjoin đánh ngày đề xuất theo
lastPublishedAt(#6254) —publishedAtcủa API ứng viên tiến lên mỗi lần nhà tuyển dụng làm mới, nên phần lớn bảng mang ngày hôm nay vàmax_posting_age_daysđể lọt đề xuất đã cũ hàng tuần; nay ngày phát hành sớm hơn thắng, fallback khi thiếu hoặc không parse được. - jobvite gập các hàng chia sẻ một posting URL (#6127) — một feed công khai trả về mỗi thành phố một hàng
<job>cho cùng một detail URL; parser giữ thành phố đầu và để scanner đếm phần còn lại là trùng lặp. Nay các hàng anh em chỉ đóng góp địa điểm, nối bằng·theo thứ tự feed, giữ title/ngày đầu tiên, và remote được đánh giá lại trên địa điểm đã nối. - Liveness: một rung UltiPro (#6090) — UKG không có endpoint JSON theo bài đăng và trả 200 cả với bài đã đóng, nên cả 57 bài UltiPro đã đóng đều đọc uncertain. Trang chi tiết nhúng bản ghi:
OpportunityIsClosedtrue/false → expired/active, thông báo «opportunity unavailable» → expired, phần còn lại cho trình duyệt. Biểu ngữ của Built In «Sorry, this job was removed» trở thành hard-expired (#6336) — trang giữ nguyên JD đầy đủ và điều khiển APPLY; nay biểu ngữ thắng, và huy hiệu anh em «Job removed» không có «sorry» không khớp.
Ghi chú
- Cố ý không làm: nửa parent-side của bản sửa jobvite về bộ biên dịch địa điểm scan.mjs (web-ui ghi bộ biên dịch USPS là no-port) và trường
notecủa cha cho gợi ý PIPE của Apple (job shape của web-ui không cónote; nó đi trongsnippet). Tests 7096 → 7135 (+39); Playwright 173 pass / 0 fail / 1 opt-in skip; coverage gate ≥ 98/89; sổ 125 = 120 EN + 5 RU · 120 adapters (tất cả cổng đếm được tái tạo từ sổ đăng ký sống).
[1.264.3] — 2026-11-01
Đã sửa
- Đợt-củng-cố-rate-limit (rà-soát-LOW-№1–3 từ
REVIEW-2026-10-31-v1.264.1) —writeRateLimit()(express-rate-limit@7.5.1, 60 req/phút route×IP, 429 JSON + Retry-After) giờ phủ cả-47-endpoint-mutating (trước là 2): 9-guard-llmRateLimitgán-sai-phạm-vi được-thay (/api/config— chính-là-việc-viết-lại-.env!,PUT /api/batch,/api/batch/merge, outcome, followup/seed, assessments, stats/snapshot, mock-interview/save, networking/save), 3-xếp-chồng trước bucket-LLM trên-các-đường-tốn-kém (/api/evaluate,/api/deep,/api/auto-pipeline), và 33-đăng-ký-trần được-gắn-giới-hạn (các-bộ-soạn-CV/profile/modes, mọi-lượt-viết-tracker, pipeline POST/restore/DELETE, jds, cả-7-/api/run/*qua một-lần-sửa-vòng-lặp, posting-guard, Playwright-PDF-inline, portals toggle/health/track, discover, reports, export/docx, two-pager, career-plan, memory và ba-route-DELETE)./api/apply-helpervẫn-trần-trong-allowlist (thuần-tính-toán-cục-bộ, được-ghim); 16-route-LLM-thuần giữ bucket-LLM-có-điều-kiện theo-thiết-kế. Một-tripwire-đầy-đủ (tests/rate-limit-coverage.test.mjs, đỏ-trước ở-mốc-27-trần) làm-CI-thất-bại với-mọi-đăng-ký-mutating-chưa-giới-hạn trong-tương-lai. TRUST_PROXYtheo-chọn + các-xác-thực-tái-kích-hoạt (rà-soát-LOW-№1–2) —app.set('trust proxy', N)tôn-trọng một-số-hop trong-envTRUST_PROXY(không-bao-giờ-booleantrue— điều-đó sẽ-khóa-theo đầu-XFF-bên-trái nằm-trong-tay-tấn-công-viên); không-đặt-theo-mặc-định, nên loopback giữ-cách-suy-giảm-theo-socket-mỗi-route như-đã-tài-liệu-hóa.validate: falsetrở-thành một-writeValidateConfig()nhắm-đích: chỉxForwardedForHeaderđược-loại-trừ (XFF-của-Caddy bị-bỏ-qua có-cố-ý khi-không-có-trust-proxy), mọi-xác-thực-khác — kể-cảtrustProxy— lại-hét-to, nên một-cấu-hình-saitrust proxy: truetrong-tương-lai sẽ-hiện-ra dạng-ERR_ERL_PERMISSIVE_TRUST_PROXYthay-vì-im-lặng.keyGeneratortùy-biến bị-gỡ-một-cách-cố-ý: express-rate-limit gắn-các-xác-thực-proxy của-mình-vào bộ-sinh-khóa-mặc-định, và cách-cô-lập-mỗi-route không-đổi (mộtMemoryStoremỗi-lần-gọi-factory).- Phản-hồi-copy của-cvstart.org hoàn-nguyên sau-2 s (CAR-141) — trạng-thái-«Скопировано ✓» giờ giữ tiêu-chí-chấp-nhận trong-2 s (trước là 1.5 s), ghim-đỏ-trước trong
tests/site-copy-feedback.test.mjs. Việc-này đóng-tiêu-chí-CAR-141 cuối-cùng trong-tầm-sửa-của-agent; lượt-làm-mới-video-demo vẫn-ở-trạng-thái-hoãn-bởi-chủ (quyết-định 2026-11-01).
Đã thay đổi
- Các-gói-help nêu-19-ngôn-ngữ (×19) — các-câu-§19 “Localizing the app” và §32 “Run it from OpenWorker” không-còn-lệch-hai-locale: mọi-gói giờ nêu 19 với தமிழ் và Tiếng Việt theo-kiểu-liệt-kê-của-chính-mình (ar dùng-dạng-đọc-thành-chữ «التسع عشرة»), và tàn-dư-«cả-17» của chính-§32-trong-
vi.mdcũng-được-sửa-nốt. Các-cổng-cấu-trúc (33 H2 / 125+ H3) ổn-định-theo-byte. - Vệ-sinh-trạng-thái —
AGENTS.mdnêu-v1.264.2 / 7082-kiểm-thử (trước là v1.86.x / 1566);PLAN.mdđánh-dấu các-bản-phát-hành-1–7 Shipped và đoạn-ship-train của-nó nói docs ×19; bình-luận-StatsBar.astrogiờ mô-tả đúng những-gì-facts.adaptersthực-chứa (123 = tổng-số-nguồn, tên-khóa-lịch-sử được-giữ cho-các-bên-tiêu-dùng); phần-đầu-i18n.jsnói-19-ngôn-ngữ; QA-prompt-v1.264.2 mang coverage-thật (98.45/90.05) và phép-tính-Playwright (176 = 174 harness + 1 bỏ-qua-tùy-chọn + 2-suite-cấp-script).
Ghi chú
- Không-hành-động-cố-ý: đợt-parent-sync theo-danh-sách-port-đã-ghi vẫn-nằm-trong-BACKLOG — fork phải-sync-qua-quá
a9476866upstream trước (7-trong-10-commit-của-danh-sách-port chưa-có-trong-cây-parent-cục-bộ; IBM/UltiPro/Bulldogjob/apple scope-S–M, personio language-dedup hoãn-sang-bản-phát-hành-riêng-của-nó). Lượt-ghi-lại-video-demo-CAR-141 do-chủ-cố-ý-hoãn («видео не надо пока», 2026-11-01). - Tests 7082 → 7096 (+9-tripwire-coverage + 5-trust-proxy); Playwright 173 đạt / 0 thất-bại / 1 bỏ-qua-tùy-chọn (+2-ghim-chevron bên-trong-các-case-đã-có); coverage 98.46 line / 90.10 branch; evals 14/0/1skip; registry không-thay-đổi 123 = 118 EN + 5 RU · 118 adapters.
[1.264.2] — 2026-11-01
Đã sửa
- Các-tiêu-đề-nhóm-sidebar gia-nhập-điều-ước-cắt-bớt (CAR-219) — các-nhãn-toggle-nhóm (
.nav-v2-toggle > span) giờ được-cắt-bớt-bằng-dấu-ellipsis và mang tooltip-bản-địa-hóa qua cùng-cơ-chế-syncLabelTitles()như các-item-nav-CAR-203; mũi-tên-chevron không-bao-giờ-co-lại, toggle vẫn-nhấn-được, RTL giữ-nguyên. Ghim-đỏ-trước trongtests/nav-v2.test.mjs(+1 → 7082 tests).
Đã thay đổi
- Văn-bản-của-cvstart.org ra-mắt-đầy-dịch-trong-cả-19-ngôn-ngữ (CAR-220) —
meta.helpDesc,helpTeaser.c1.descvàfaq.a2giờ được-dịch-trong-mọi-locale-của-site (chúng chỉ-EN trong-v1.264.1 do-cố-ý); GitHub Pages đã-đưa-bản-văn-bản-nâng-cấp lên-sống trên cvstart.org. - Vệ-sinh-backlog + rà-soát (CAR-221/222) — sáu-mục-«port-when-merged-upstream» được-đóng: cả-bảy-PR-upstream đã-được-merge, bốn-mục đã-port-từ-trước, hai-mục thuộc-về-dự-án-gốc.
docs/reviews/REVIEW-2026-10-31-v1.264.1.mdđược-đưa-vào (0 HIGH / 0 MED, ba-follow-up-LOW được-ghi-trong-BACKLOG), và danh-sách-port-parent-sync được-ghi-lại (6 PORT / 3 VERIFY / khoảng-trống-nguồn-apple; đuôi-upstream 118 commits @ VERSION 1.38.0).
Ghi chú
- Bản-sửa-con-dấu-mirror-của-changelog (
92a05fcf) đi-kèm-trong-tag-này: mọi-mirror-phân-trang trên cvstart.org giờ mang phiên-bản-phát-hành-đã-sinh-ra-nó, nên grader-site-build-after-fanoutcuối-cùng-cũng-chạy-lôgic-thật-của-mình thay-vì-bỏ-qua. - Không-hành-động-cố-ý: giới-hạn-các-POST-mutating-còn-lại (rà-soát-LOW-№3) và ghép-bucket-trust-proxy — được-ghi-trong-BACKLOG cho-đợt-củng-cố-kế-tiếp. CAR-141 (video demo) vẫn-thuộc-về-chủ.
- Tests 7081 → 7082 (+1 ghim-CAR-219); Playwright 176; registry không-thay-đổi 123 = 118 EN + 5 RU · 118 adapters.
[1.264.1] — 2026-10-31
Đã sửa
- Các-viên-pill-viền-sidebar cắt-bớt-nhãn-bản-địa-hóa-dài một-cách-duyên-dáng (CAR-203) — span-nhãn-nav giờ là một công-dân-flex đúng-đắn (
min-width: 0+overflow: hidden+text-overflow: ellipsis+nowraptrongv2-nav.css), vàsyncLabelTitles()trongnav-v2.jsphản-chiếu nhãn-đã-bản-địa-hóa vào tooltip qua cùng-một-khóadata-i18n(không-thêm-khóa-i18n-mới nào) — chữ «Профинансированные компании» dài đọc-được lại khi hover thay-vì bị cắt-cứng bởioverflow: hiddencủa hàng. Đích-chạm-44 px, cách-vẽ-đang-chọn và đối-xứng-RTL không bị đụng-đến; ghim đỏ-trước trongtests/nav-v2.test.mjs. - Một-trần-đánh-giá-480 s cho-mọi-locale (CAR-218) — remote-QA v1.264.0 bắt-được các lượt-đánh-giá
502 · 300 s · 0 chtạm-thời trênesvàzh-CN(lượt-chạy-lại-điểm đã đạt, nhưng bức-tường là thật).EVAL_TIMEOUT_MSgiờ là480_000vàevalTimeoutMs(lang)trả-về nó vô-điều-kiện —GEMINI_EVAL_TIMEOUT_MSvà auto-pipeline kế-thừa. Ngân-sách-token nhận-thức-locale từ CAR-174 (16384 / 32768) vẫn là lần-tách-theo-locale duy-nhất.
Đã thay đổi
- FAQ-của-cvstart.org mang số-đếm-nguồn chính-xác (CAR-217) —
{sources} job-board sources: {sourcesEn} international boards plus {sourcesRu} Russian onesđược-thay-bằng-giá-trị từfacts.json— thứ được-sinh ra từ registry sống (123 = 118 EN + 5 RU) — nên các-con-số không-thể-bao-giờ trôi; các-locale-vẫn-còn cách-diễn-dẫn~{adapters}cũ tiếp-tục làm-tròn quaadaptersRounded. Các-nâng-cấp-văn-bản-EN đi-kèm-theo (meta.helpDesc,helpTeaser.c1.desc,faq.a2nêu menu-lệnh, pipeline-gộp-nhóm-có-undo và tracker-kanban).
Ghi chú
- Không-hành-động-cố-ý: các-nâng-cấp-văn-bản-i18n-của-site (
meta.helpDesc/helpTeaser.c1.desc/faq.a2) giữ-chỉ-EN trong-bản-phát-hành-này — các-locale-khác giữ cách-diễn-dẫn đúng-nhưng-quá-khái-quát cho-tới đợt-docs-kế-tiếp (faq.a7của-họ nhận các-placeholder-đếm-chính-xác ở-nơi-được-dịch). CAR-141 (video demo) vẫn-thuộc-về-chủ; nhánh-car136/m141bị-thay-thế đã-bị-xóa với-các-ý-tưởng được-ghi-lại-trên-nhiệm-vụ-Linear (khôi-phục-được-qua-tag-archive/car136-m141). - Tests 7041 → 7081 (ghim CAR-203 + viết-lại-ghim CAR-218); Playwright 176; registry không-thay-đổi 123 = 118 EN + 5 RU · 118 adapters.
[1.264.0] — 2026-10-31
Thêm mới
- Sửa-trạng-thái-tracker ngay-trên-dòng — huy hiệu trạng thái của mỗi dòng
#/trackergiờ là một<select>gọn với các giai đoạn chính tắc (từGET /api/tracker/stages, không bao giờ là whitelist hardcode).POST /api/tracker/statusrelayset-status.mjschính tắc của dự án gốc dưới khóaapplications.md(whitelist trạng thái quastates.mjs, passthrough--dry-run/--note, fail-soft 502 với chi tiết đã làm-sạch, spawn bằng mảng argv). Thành công cập nhật dòng tại chỗ (lớp tone + số-đếm-tab, giữ-focus); thất bại hoàn-nguyên giá trị và hiện toast. Các dòng mà relay không thể trỏ tới — trạng-thái-không-rõ-sửa-tay, hoặc số-sentinel-backfill#— giữ huy hiệu chỉ-đọc (các-sửa-LOW-từ-rà-soát-route; người-rà-soát: không có phát-hiện HIGH/MED). - Cảnh-báo-server hiện-trên-mọi-trang-AI —
evaluate,deep,auto-pipeline(cả-trang lẫn modal),career-plan,market,cv-studio(humanize + tailor) giờ kết-xuất mảngwarningscủa server (bắt-tay-token-đầu-ra, trôi-ngôn-ngữ, sửa-ngày) thành một-dải-badge-warn(role="status"); modal-auto-pipeline không-còn-làm-rơi-cảnh-báo-của-frame-done. Khóa mớillm.truncatedNotice×19. - Sóng-coverage (+111-kiểm-thử) —
routes/map.mjs100/94.9,geocode.mjs96.3/92.9,content.mjs99/84.9,networking.mjs96.4/89.1,sources/habr.mjs100/98.2 (tests/cov-*-routes.test.mjsmới ×3,tests/sources-habr.test.mjs); sàn-branch giữ-ở-≥ 90 %. - Gói-đóng-CAR-191…216-trên-Linear (
docs/reviews/2026-10-30-linear-car191-216-closure-bundle.md) — bản-đóng-sẵn-để-dán-cho-chủ với SHA-commit-theo-từng-CAR và các-bình-luận-bằng-chứng.
Đã sửa
- Nguồn-quét-Trudvsem — trang-rỗng (
results: {}, cả-«qua-điểm-cuối») không-còn-giết-cả-lượt-quét (kết-thúc-sạch-với-không-dòng-nào); phong-bì-lỗi-API (HTTP-200 vớistatus: 500) ném-với-văn-bản-của-chính-API; phân-trang đi-theo-offset-từng-bản-ghi (trước-đây-là-chỉ-số-trang — các-trang-bị-nhân-bản-ngầm, ~52-vacancy-thay-vì-hàng-trăm); lượt-đi dừng-trước-vùng-lỗi-offset-sâu-của-API (offset × limit ≥ 10000). Đã-xác-thực-trực-tiếp-từ-đầu-đến-cuối. - habr — tiêu-đề/công ty được-tước-thẻ sau-khi giải-mã-đối-tượng (ngang-hàng-với-hh.mjs):
<script>trong-tiêu-đề-thẻ không-còn-đến-được-các-dòng-quét dạng-markup-sống;>>hợp-lệ-trong-tiêu-đề sống-sót. - PUT /api/profile (đường-thô) — khối-
candidate:thiếu-full_namekhác-rỗng bị-từ-chối, cùng-một-hàng-với-đường-gộp-trường (trước-đây-nó lưu-full_name: null). - Trung-thực-của-hints —
.docbị-gỡ-khỏi-danh-sách-chấp-nhận-khi-tải-CV và khỏicv.uploadHint×19 (parser chưa-bao-giờ-hỗ-trợ nó);config.openaiModelHint×19 nêu-gpt-5(server ánh-xạ-mọi-id-*-codexvề nó);config.anthropicModelHint×19 và mặc-định-Anthropic giờ-đối-xứng-với-các-tier-của-dự-án-gốc — mặc-địnhclaude-sonnet-5-5, premiumclaude-opus-5-5. - Liên-kết-tài-liệu-Claude-Code →
code.claude.com(URLdocs.anthropic.com/en/docs/claude-codecũ ném-TypeError trong-cổng-liên-kết). - help ×19: gạch-dòng-mật-độ-hàng đã-bị-gỡ (toggle rời-UI-trong-v1.263.0) và 18-họ-span-
**đậm**-bị-hỏng được-sửa — cộng-với-lớp-lệch-renderer được-sửa-×19 (dòng-trống-thứ-hai-sau-mọi-bảng-trước-đoạn-văn; ký-tự-ống-nước ra-khỏi-ô-đậm): 0-ký-tự-**-nghĩa-đen-trong-kết-xuất-trên-cả-19-gói-help.
Ghi chú
- Mô-hình-mặc-định-của-Anthropic đã-thay-đổi thành
claude-sonnet-5-5(tier-chuẩn-của-dự-án-gốc). Các-bản-deploy dựa-vào-mặc-định-ngầm-cũ (claude-sonnet-4-6) tự-động-nâng-cấp — ghimANTHROPIC_MODELtrong.envđể-từ-chối. - Không-hành-động-cố-ý: hai-chấm-rà-soát-mức-LOW được-cố-để-ngỏ (select-nhúng không-đối-xứng-với-sự-suy-giảm-
movesReady-của-kanban — toast-thành-thực-khi-mọi-lần-thất-bại là-hành-vi-được-chọn; nhánh-code: 'timeout'vẫn-được-phủ-bởi-hợp-đồng-fake-writer, không-phải-bài-kiểm->30 s). CAR-141 (video demo) vẫn-thuộc-về-chủ. - help ×19 nhận-lượt-chỉnh-văn-bản-sau-phát-hành (bỏ-gạch-dòng-mật-độ, sửa-lớp-lệch-renderer) trên
mainsau-khi-v1.263.0 đã-ra-mắt — đây-là-tag-đầu-tiên mang nó. - Cũng trong tag này: nền tảng chip bằng chứng (bộ phân tích báo cáo + huy hiệu xem), runner fix-report-links (
POST /api/runners/report-links, thẻ «Sửa chữa» trên#/health) và ước tính/xác nhận chi phí batch kèm ghi nhận usage — vào main giữa lúc cắt nhánh và lúc đánh tag.
Tests 6905 → 7041 (+136) · Playwright 176 (173 đạt / 1 bỏ-qua-tùy-chọn) · coverage 98.5 % line / 90.1 % branch · registry không-thay-đổi: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.263.0] — 2026-10-30
Thêm mới
- Lớp-đánh-bóng-chuyển-động —
motion.cssmới (tệp-css-cuối-cùng-của-app): các-lượt-vào-của-modal/popover (scale .97 + fade, 130–180 ms), spring-in-của-toast + trạng-thái-rời-đi-mềm, spring-nhấn-của-nút-đổi-theme, nhấn-scale(.97)-cho-chip/tab, hạ-tầng-stagger (bước 50 ms, trần 12), fade.page-enterkhi-đổi-route (router), và-các-chuyển-tiếp-focus-halo trên-chip/tab. Mọi-quy-tắc đều-an-toàn-với-prefers-reduced-motion(chuyển-động-rơi-về-none, opacity/màu-giữ-nguyên). - Đúng-đắn-trên-màn-hình-cảm-ứng — 68-quy-tắc-hover-lift trước-đây-không-được-bảo-vệ: thiết-bị-cảm-ứng giữ-một-thẻ-«được-nâng»-bị-kẹt sau-một-lượt-chạm. Mọi-hover-transform giờ-được-gate-bằng-
@media (hover:hover)(bộ-trung-hòa-của-motion.css), và-hiệu-ứng-nâng-thẻ chỉ-áp-dụng-cho-các-thẻ-thực-sự-tương-tác (.card:has(a),a.card,button.card,[role=button].card) — không-còn-affordance-sai trên-các-thẻ-tĩnh. - A11y: mọi-bộ-điều-khiển có-tên-chương-trình. Trợ-lý-
A11yDumpmới đặt-tên-cả-16-dump-đầu-ra-LLM-chỉ-đọc; 12-trường-chỉ-có-placeholder (CV Studio ×6, config ×2, ô-tìm-kiếm-scan, select-điểm-tracker, ghi-chú-outcome, trình-soạn-thảo-kế-hoạch, URL-auto, bug report) nhận-aria-label; cổng-a11y-form-wiresgiờ-thi-hành-điều-này-cho-cả-lớp (trước-đây-26-mẫu-không-có-tên, giờ-0 + danh-sách-cho-phép-có-lý-do-được-tài-liệu-hóa).
Đã sửa
- #/scan: header-dính-của-bảng không-còn-vẽ-đè-lên-ô-tìm-kiếm-của-topbar khi-cuộn-dưới-nó (z-bằng-của-topbar, DOM-sau-thắng — giờ-dẫn-xuất-từ-token và-nằm-dưới); hai-ô-«Зарплата от/до» trở-lại-kích-thước-thường (một-quy-tắc-flex-
.v2-scan-bar .inputrò-vào-cột-flex-của-popover và-đặt-flex-basis 200 px làm-CHIỀU-CAO — giờ-scope-bằng->+ guard-popover); nút-đổi-mật-độ bị-gỡ-theo-quyết-định-của-chủ (phần-cấu-trúc-giữ-lại, các-khóa-i18n gỡ-×19). - Củng-cố-deploy-workflow (F1–F6): đầu-vào-
providerđược-kiểm-tra-charset trước-mọi-viết-lồng-vào-shell; chẩn-đoán-hermes redact-giá-trị (bộ-lọc-khóa-không-phân-biệt-hoa-thường + mặt-nạ-giá-trị + cắt-80-ký-tự trên-cả-ba-điểm-xả,?token=cũng-được-che); bước-hermes tôn-trọng-inputs.app_dir; public_url được-gate-https; guard-chống-hạ-cấp có-6-ghim-thực-thi (không-mặc-định, thứ-tự-guard-trước-Deploy, regex-tham-chiếu-nghiêm-ngặt). - Đuôi-rà-soát, đỏ-trước: vòng-backslash-nhập-CSV (nhập-lại-được-dedup-lại), tước-phần-đầu-cv-voice 4827→13 ms,
statedYearsMintính-lười, TOCTOU-capture-của-posting-guard, wildcard-MiniMax-CN, bỏ-token-deel, và-các-đề-phòng-kích-thước-của-bộ-chọn-nhập trước-khi-đọc. Import-modal: nav-guard được-gắn, input-tệp bị-gỡ-khi-cancel, duplicates-được-đọc-có-bảo-vệ,numqua-reduce. - Đợt-UX-của-chủ: nhịp-dọc-của-hero-dashboard (các-con-cấp-inline được-dán-thành-một-line-box); độ-lệch-hàng-đang-chọn-−8 px trong-TOC-help (rãnh-inline-theo-từng-hàng + cột-số); drawer-di-động (nút-đóng-✕-hiển-thị, reset-scrollTop, fade—paper-bóng-được-gate-vào-
.has-hud); trang-docs-assistant không-còn-tràn-khi-có-URL-dài-trong-câu-trả-lời (chuỗi-min-width-của-grid +overflow-wrap: anywhere); «Недавние» được-giải-thích (hint) + có-thể-xóa; Save-của-career-plan được-tái-kích-động-sau-một-lượt-tải-thất-bại; prefill-URL-của-evaluate không-còn-đốt-một-lượt-gọi-LLM vào-placeholder-dán; Enter-của-auto-pipeline tôn-trọng-trạng-thái-tổng-hợp-IME. - Tương-phản (kiểm-toán-WCAG, 296-cặp): gradient-docs-fab 2.43 → 6.4:1, cặp-toast.success → ok-soft (1.75 → AA-dark), lật-btn-dark-của-banner →
--ink, biến-thể-sáng cho-scan-logbtn/reposts-badge/fab-chip/close, và-viền-của-các-bộ-điều-khiển-form lên-3:1 (--cv3-input-line, WCAG 1.4.11 — trước-đây-1.2:1). - Quét-thẩm-mỹ: empty-state-của-tracker là-một-thẻ-trọn-chiều-rộng (trước-đây-bị-cắt-trong-bảng-760 px ở-390); dòng-console-scan được-ellipsis thay-vì-bị-cắt-nửa-vời; chat-FAB-trôi không-còn-che-nội-dung ở-390 (đích-44 px, inset 12); empty-state-«Application statuses»-của-dashboard theo-mẫu-v2-empty; hint-«?»-của-stats có-một-divider + đích-44 px; tab-Input-của-career-plan giải-thích-kết-quả-hạ-cánh-ở-đâu; markdown-§1-của-help (18-span-đậm-bị-hỏng).
Đã thay đổi
- Màu-nhấn-xanh-dương → đỏ-crimson (theo-yêu-cầu-của-chủ, hợp-logo, hue 15) — 5-token-cv3 × 3-khối-theme; văn-bản-bong-bóng-chat-
docs-assistantđi-trên---accent-ink(trước-đây-là-#fff-nghĩa-đen, 2.39:1 trên-dark); wash-funded đi-trên---accent-soft. Danger giữ-hue 25 với-các-xử-lý-riêng-của-nó. - Tài-liệu: số-đếm-bảng-kiểm-thử-trong-README ×17 (một-sai-lệch-thời-v1.248), help-§1 + 18-span-markdown, help-fr/it/ta-«118», giá-nhà-cung-cấp-CHECKED_ON-2026-10-30, các-sự-thật-HANDOFF/CONTEXT/TRACEABILITY.
Ghi chú
- Không-hành-động-cố-ý: việc-làm-lại-vòng-quét-skeleton nằm-ngoài (hợp-đồng-car112 ghim-chính-xác-hiệu-ứng-fade-hiện-tại); crossfade-biểu-tượng-đổi-theme giữ-là-swap-
display(hợp-đồng-Playwright-đổi-theme quan-sát-nó); scale-.btn:activekhông-bị-nhân-bản (app.css sở-hữu-nó); stagger-chuyển-động chỉ-là-hạ-tầng — các-thẻ-dashboard sẽ-đón-nó-sau; văn-bản-help-×19 (đề-cập-mật-độ, markdown-§1, «118») lên-đợt-fan-out-kế-tiếp. - Bằng-chứng-remote-QA-đầy-đủ: chạy-đích-ja-green (376 s / A–G ✓) trên-v1.262.4; en/it-green-từ-trước-trong-thời-kỳ-token-dense.
Tests 6869 → 6905 (+36) · Playwright 176 · coverage 98.4 % line / 89.9 % branch · registry không-thay-đổi: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.4] — 2026-10-30
Đã sửa
jagia-nhập-các-locale-đánh-giá-token-dense (ja→ trần-32768-token + đồng-hồ-480 s). Lượt-chạy-lại-có-đích-5-locale trên-prod-v1.262.3 tách-bốn-timeout-của-đêm502 · 300 s · 0 chthành-transient-và-xác-định:ar(250 s),ko(291 s) và-zh-CN(259 s) đạt-lượt-chạy-lại-của-mình, lệch-ngôn-ngữ-đột-phát-của-rukhông-tái-diễn — nhưng-jađâm-vào-trần-chuẩn hai-lần với-kết-quả-số-0 (lượt-chạy-đầy-đủ-×19 40981578549 và-lượt-chạy-có-đích 41012725839). Cùng-lớp-hình-dạng-với-it/pl. Ghim-đỏ-trước:evalMaxTokens('ja') = 32768,evalTimeoutMs('ja') = 480_000, các-locale-khác giữ-nguyên-300 s.
Ghi chú
- Không-hành-động-cố-ý: bản-patch-một-mục-đích — bản-sửa-
jalà thay-đổi-duy-nhất mà bản-phát-hành-này-mang; không-đóng-gói-thêm-bất-cứ-gì-khác.ar/ko/zh-CNgiữ-nguyên-trần-chuẩn dựa-trên-bằng-chứng-đêm-nay (chúng-đạt; các-timeout-của-đêm là-transient-tải-provider), còn-lệch-của-rulà một-flake-sinh-tạo-đột-phát.
Tests 6868 → 6869 (+1) · Playwright 176 · registry không-thay-đổi: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.3] — 2026-10-30
Bản-patch-token-dense-của-pl: full-remote-QA trên-prod-v1.262.1 bắt-gặp-lượt-đánh-giá-tiếng-Ba-Lan chết-ở-trần-300 s-chuẩn — 502 · 0 ch — hai-lần (lượt-chạy-đầy-đủ-×19 40960568766 và-lượt-chạy-lại-có-đích-của-v1.262.2 40968958062), trong-khi-18/19-locale đạt-A–G; pl giờ-gia-nhập ta/hi/it với-trần-32768-token và-đồng-hồ-480 s, được-ghim-đỏ-trước (evalMaxTokens, evalTimeoutMs). Cùng-lớp-hình-dạng-với-it-trong-v1.262.1. Tests 6867 → 6868.
Đã sửa
plgia-nhập-các-locale-đánh-giá-token-dense (pl→ trần-32768-token + đồng-hồ-480 s). Full-remote-QA trên-prod-v1.262.1 bắt-gặp-lượt-đánh-giá-tiếng-Ba-Lan chết-ở-trần-chuẩn —502 · openrouter · 300 s · 0 ch— và-lượt-chạy-lại-có-đích gửi-cùng-v1.262.2 tái-hiện-nó-chính-xác (hai-lượt-chạy 40960568766 và-40968958062): 18/19-locale đạt-A–G,itkết-thúc-ở-302 s bên-trong-đồng-hồ-token-dense-480 s, còn-plđâm-vào-tường hai-lần với-kết-quả-số-0. Một-timeout-xác-định, không-phải-flake — cùng-một-lớp-hình-dạng đã-đưa-itvào-v1.262.1. Ghim-đỏ-trước:evalMaxTokens('pl') = 32768,evalTimeoutMs('pl') = 480_000, 18-locale-chuẩn giữ-nguyên-300 s.
Ghi chú
- Không-hành-động-cố-ý: bản-patch-một-mục-đích — bản-sửa-
pllà thay-đổi-duy-nhất mà bản-phát-hành-này-mang; không-đóng-gói-thêm-bất-cứ-gì-khác; nội-dung-đuôi-rà-soát-v1.262.2 đã-ra-mắt-riêng-biệt. - Tests 6867 → 6868 (+1) trên-nhánh-phát-hành · Playwright 176 · registry không-thay-đổi: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.2] — 2026-10-30
Bản-patch-đuôi-rà-soát: bảy-phát-hiện-mức-thấp được-đóng-đỏ-trước — vòng-backslash-nhập-CSV (nhập-lại-cùng-một-tệp-export được-dedup-lại), tước-phần-<head>-cv-voice 4827 ms → 13 ms, years_min tính-lười-trên-các-lượt-quét-lớn, một-vụ-crash-TOCTOU-khi-liệt-kê-capture được-sửa, mặc-định-MiniMax-CN cho-mọi-URL-cơ-sở-*.minimax.cn, và-bộ-chọn-nhập kiểm-tra-trần-512 KB trước-khi-đọc-tệp — cộng-củng-cố-deploy.yml (F1–F6: guard-chống-chèn-input-provider, redact-nhật-ký-hermes, che-?token=, app_dir, cổng-https-của-public_url và-sáu-chốt-chống-hạ-cấp-thực-thi) và-đuôi-import-modal (nav-guard, dọn-dẹp-khi-cancel, duplicates-được-bảo-vệ). Kiểm-thử 6841 → 6867.
Đã sửa
- Đuôi-rà-soát-sóng — 7 phát-hiện-mức-thấp, mỗi-viên-đỏ-trước. Vòng-backslash-nhập-CSV: một
\trong-ô bị-ghi-thành-đôi và-đọc-về-cũng-thành-đôi, nên-việc-nhập-lại-cùng-một-CSV lỡ-cái-dedup-công-ty+vai-trò và-có-thể-tạo-ra-một-hàng-trùng — bộ-đọc giờ-unescapes\\sau-lệnh-split (vòng-write→read là-vô-tổn, nhập-lại được-dedup). Việc-tước-<head>-của-cv-voice có-độ-phức-tạp-bậc-hai trên-các-thẻ-chưa-đóng — 4827 ms → 13 ms trên-ngành-vào-64 KB mà-route ghim-trần.statedYearsMinchạy-toàn-bộ-bộ-phân-tích-số-năm cho-mọi-việc-làm-của-mọi-nguồn kể-cả-khiyears_minchưa-được-cấu-hình — giờ-lười-hóa, mấy-giây-CPU-mỗi-lượt-quét-lớn tan-biến. Một-capture bị-xóa-giữa-readdir và-statSync làm-crash-việc-liệt-kê-của-posting-guard (TOCTOU — tệp-biến-mất thì-được-bỏ-qua). Mặc-định-MiniMax-CN trước-đây chỉ-khớp-chính-xác-api.minimax.cn— giờ-mọi-URL-cơ-sở-*.minimax.cnđều-nhận-mô-hình-CN. Các-token-$-của-Deel không-phải-tham-chiếu-hex không-còn-rò-vào-snippet-dưới-dạng-văn-tự. Bộ-chọn-nhập kiểm-trafile.sizeTRƯỚC-khi-gọifile.text()— trần-512 KB-của-server trả-413 chỉ-sau-khi-trình-duyệt đã-phân-tích-xong-một-tệp-có-thể-khổng-lồ — kèm-toast-import.tooLargebản-địa-hóa ×19. - Củng-cố-deploy-workflow (rà-soát-workflows F1–F6).
providerlà-input-duy-nhất được-nội-suy-vào-remote-shell mà-không-có-charset-validation — một'trong-giá-trị thoát-khỏi-dấu-nháy và-chạy-code-tùy-ý-trên-prod; giờ-được-whitelist-^[A-Za-z0-9_-]+$trước-mọi-lệnh-nối, và-grep-của-key-guard không-còn-false-pass. Bước-chẩn-đoán-hermes in-nhật-ký-journalctl-thô + dump-unit ra-log-công-khai; bộ-lọc-của-nó lỡ-*_API_KEY=-viết-hoa và-không-che-gì-cả — giờ là-redact-chung-không-phân-biệt-hoa-thường + che-giá-trị + cắt-80-ký-tự trên-cả-ba-điểm-xả, các-query-string-?token=cũng-được-che. Bước-hermes bỏ-qua-inputs.app_dirvà-hardcode-/opt/career-ops/src/.env.public_urltới-nơi-curl mà-không-có-kiểm-tra-https (chèn-tùy-chọn-qua-một-dấu---đầu). Và-chốt-chống-hạ-cấp — bản-sửa-sự-cố-v1.238.0 — không-có-cổng-thực-thi nào: sáu-chốt-mới-trong-ci-workflows (refs không-có-default, guard chạy-trước-Deploy, regex-refs-nghiêm-ngặt). - Đuôi-import-modal (rà-soát-SPA). Modal-gắn-cùng-một-nav-guard-với-outcome-modal — việc-rời-đi-không-còn-bỏ-lại-nó-mồ-côi-đè-trên-một-view-khác. Input-tệp-ẩn bị-gỡ-khi-
cancel, không-chỉ-khi-change— những-lần-bỏ-đi-lặp-lại không-còn-làm-rò-input-vào-document.body.plan.duplicatesđược-đọc-qua-dạng-được-bảo-vệ trong-bản-xem-trước. Việc-phân-phối-num-của-tracker dùng-reducethay-cho-Math.max(...spread)— spread chạm-ngưỡng-đối-số ở-khoảng-~100k-hàng.
Đã thay đổi
- Docs: gạch-đầu-dòng-«118 EN adapters»-của-hướng-dẫn giờ-mang-số-đếm ở-fr/it/ta (15-locale-còn-lại đã-có-từ-trước). Giá-vendor trên-cvstart.org được-xác-minh-lại-với-các-trang-bảng-giá-chính-thức — cả-bốn-không-đổi, CHECKED_ON → 2026-10-30. Một-lượt-rà-trôi-sau-triển-khai đã-sửa-42-dòng-đếm/phiên-bản-lỗi-thời xuyên-suốt-README ×19, CONTEXT.md, CLAUDE.md và-các-sổ-tay-SDD (tàn-dư-thời-đại-109/104 và-thời-v1.262.0).
Ghi chú
- Không-hành-động-cố-ý:
window.confirm-thuần-của-cv-studio (thời-CAR-179) được-giữ-nguyên — chuyển-nó-sang-UI.confirmlà-một-việc-theo-sau, không-phải-mục-patch; tooltip-cụm-từ-sáo-rỗng-<mark title>giữ-nguyên-dạng-chỉ-tooltip (sàn-a11y-chấp-nhận-được);remote-qa.ymlgiữ-cancel-in-progress: true— việc-gửi-lại cố-ý-thay-thế-một-lượt-hồi-quy-đang-chạy. - Full-remote-QA trên-prod-v1.262.1: routes ×19 ✓ · site ×19 ✓ · links ✓ · live-LLM 18/19-locale A–G ✓ —
plvấp-một-timeout-nhà-cung-cấp-502 · 300 s · 0 ch(không-phải-vùng-token-dense; lượt-chạy-lại-có-đích đi-cùng-bản-phát-hành-này). - Kiểm-thử 6841 → 6867 (6864 pass / 0 fail / 3 skip, +26 so-với-v1.262.1) trên-nhánh-phát-hành · Playwright 176 · độ-phủ 98.42 % dòng / 89.94 % nhánh · registry không-thay-đổi: 123 sources = 118 EN + 5 RU · 118 adapters.
[1.262.1] — 2026-10-29
Bản-patch-đánh-giá-tiếng-Ý: kỷ-nguyên-OpenRouter bắt-gặp-nó-cắt-report-ngay-trước-khối-SCORE_SUMMARY nên it gia-nhập-các-locale-token-dense (trần-32768-token + đồng-hồ-480 s) — và-công-cụ-chuyển-provider giúp-được-cái-chẩn-đoán-đó lên-đường-trong-deploy-workflow.
Đã sửa
- Đánh-giá-
itbị-cắt-trước-SCORE_SUMMARY (đuôi-CAR-190): remote-QA 40928864980 (lần-chạy-đầu-với-tín-dụng-đã-nạp-lại) — một-lượt-đánh-giá-itchạy-264 s và-trở-về-với-15 045 ký-tự,tok ~15635ở-trần-16 384: khối-A–G nguyên-vẹn,---SCORE_SUMMARY---biến-mất. Cùng-một-lớp-hình-dạng đã-mang-cho-tacái-trần-của-nó-ở-v1.261.1 (CAR-174).itgia-nhập-TOKEN_DENSE_EVAL_LOCALES(ta,hi→ta,hi,it): cả-ngân-sách-32 768-token lẫn-đồng-hồ-480 s đều-áp-dụng, và-/api/evaluate+ auto-pipeline đứng-trên-một-nguồn-sự-thật-duy-nhất-trong-llm.mjs. - Report-en-không-có-khối — một-vụ-flake-sinh-ra-một-lần: cùng-lượt-chạy thấy-một-lượt-đánh-giá-
entrở-về-đúng-ngôn-ngữ nhưng-không-có-bất-kỳ-khối-A–G-nào; một-lượt-chạy-lại-có-đích vượt-qua-sạch-sẽ (21 091 ký-tự, A–G ✓). Không-thêm-vào-tập-token-dense — một-vụ-flake không-phải-là-lịch-sử.
Thêm mới
- Deploy-workflow:
mode=hermesvàmode=provider(đuôi-ops-CAR-190):mode=hermeskhởi-động-lại-gateway-Hermes và-in-ra-một-bản-chẩn-đoán-đầy-đủ (unit-file với-các-secret-đã-bị-loại, listeners trước/sau, nhật-ký-sudo, thăm-dò-từng-cổng, cái-nhìn-HERMES_BASE_URLcủa-chính-app, số-dư-tín-dụng-OpenRouter);mode=providerchuyển-LLM_PROVIDERvới-một-guard-kiểm-tra-sự-hiện-diện-của-khóa (từ-chối-khi-*_API_KEYcủa-provider-đích vắng-mặt) và-khởi-động-lại-app — đây-chính-là-cách-prod chuyển-sang-openrouterkhi-tín-dụng-Hermes hết-giữa-chừng. Guard-ref-của-các-chế-độ-deploy chỉ-được-xác-thực-cho-mode=deploy, nên-các-lượt-gửi-recon/verify hoạt-động-trở-lại (thay-đổi-required-inputs-thời-v1.261.3 đã-làm-chúng-im-lặng).
Ghi chú
- Không-hành-động-cố-ý:
enkhông được-thêm-vào-tập-token-dense — một-report-không-có-khối chỉ-là-một-vụ-flake-sinh-ra, không-phải-lịch-sử-khối-lượng. - Không-hành-động-cố-ý: chỉ-thị-ngôn-ngữ-củng-cố-của-ta không được-mở-rộng-sang-
it— không-quan-sát-thấy-trôi-ngôn-ngữ-nào-với-tiếng-Ý. - Không-hành-động-cố-ý: việc-ghi-hình-video-demo-UI-v2-mới thuộc-về-owner (CAR-141) — landing giờ-đây embed-qua-
youtube-nocookie.combất-chấp. - Kiểm-thử 6841 → 6841 trên-nhánh-phát-hành.
[1.262.0] — 2026-10-29
Bản-minor-tính-năng-upstream: board-việc-làm-Deel gia-nhập-scanner (registry 123), CSV-của-tracker-khác nhập-trực-tiếp vào #/tracker, chốt-kiểm-toàn-vẹn-posting-guard và-chốt-kiểm-giọng-CV đến-dưới-dạng relay/lint, scanner học-một-bộ-lọc-số-năm-kinh-nghiệm, và-các-nút-Apply ở-bảy-ngôn-ngữ-không-nữa không-còn-bị-đọc-là-thiếu — cùng-mô-hình-mặc-định-đã-nghỉ-hưu-của-MiniMax được-thay-thế và-các-repost không-còn-bị-bịa-ra-giữa-các-nguồn.
Thêm mới
- Nguồn-board-Deel (CAR-184): registry 123 sources = 118 EN + 5 RU · 118 adapters — tự-phát-hiện các-board-tenant
jobs.deel.com/<slug>(Klarna và-một-số-khác); payload-flight-Next.js mang-toàn-bộ-danh-mục-trong-một-lượt-yêu-cầu (tiêu-đề, vị-trí, hình-thức, ngày, mô-tả), đường-dẫn-/api/-bị-cấm không-bao-giờ-bị-đụng-tới, một-tenant-công-bố-vị-trí-ở-nơi-khác trả-lời-bằng-một-redirect mà-nguồn-từ-chối bằng-tên-gọi, và-lương được-cố-ý-để-unmapped (các-con-số-không-có-khoảng-thời-gian-trả-lương sẽ-chỉ-là-một-phỏng-đoán); cổng-đếm ×5 + help §17 ×19. - Nhập-CSV-tracker (CAR-181):
POST /api/tracker/import-csvvới-bản-xem-trước-dry-run và-commit-bị-khóa — trích-dẫn-RFC-4180, ngày-theo-các-dạng-ISO / ngày-trước / tên-tháng, các-giai-đoạn-của-tracker-ngoại được-fold-qua-các-trạng-thái-chuẩn (một-giai-đoạn-lạ về-dưới-dạng Evaluated kèm-ghi-chú, không-bao-giờ-bị-bỏ), dedup-theo-URL-đăng-chuẩn-hóa đọc-từ-ô-markdown-link hoặc-cột-Notes, giới-hạn-512 KB / 2000-hàng;#/trackercó-thêm-nút-Nhập-CSV với-modal-xem-trước, i18n ×19. - Relay-posting-guard (CAR-182):
POST /api/runners/posting-guard— chốt-kiểm-toàn-vẹn-JD-zero-LLM-xác-định-của-parent, được-giải-theo-số-report qua-quy-tắc-tiền-tố-capture-jds/(có-hay-không-có-pad, so-sánh-số-nguyên) hoặc-một-đường-dẫn-sạch-được-nêu-rõ; tiến-trình-con chỉ-nhận-argv, một-trần-30-sn và-một-hợp-đồng-fail-soft; một-hành-động-«Posting guard» trên-#/reports/:slughiển-thị-các-phát-hiện, i18n ×19. - Chốt-kiểm-giọng-CV (CAR-188): 27-cụm-từ-sáo-rỗng-trong-CV (
passionate about,proven track record,leveraged,spearheaded,delve…) cộng-các-heuristic-về-gạch-ngang (khoảng-năm-như-2022–2024 không-phải-một-dấu-hiệu;20–30%thì-có) dưới-dạngPOST /api/cv-studio/voice-checkchỉ-đọc và-một-thẻ-#/cv-studiotô-sáng-các-khớp-chính-xác; danh-mục-kiểm-của-Tailor lớn-lên-thành-sáu-bất-biến; i18n ×19. - Bộ-lọc-quét-số-năm-kinh-nghiệm (CAR-180): bộ-phân-tích-jd-years (65-cách-diễn-đạt, không-bao-giờ-bỏ-khi-chưa-chắc) đọc-mức-tối-thiểu-được-nêu-từ-mô-tả-các-đăng, một-tùy-chọn-
years_min:-mới-của-portals bỏ-qua-các-đăng-thiếu-đủ-năng-lực-dưới-dạng-skipped_experience(một-trạng-thái-lịch-sử-quan-sát không-bao-giờ-ghim-một-URL), và-yearsMinđi-cùng-snapshot-quét cho-UI-tương-lai. - Các-nút-Apply ở-bảy-ngôn-ngữ-không-nữa (CAR-185/189): tiếng-Việt
Nộp đơn ứng tuyển, tiếng-BulgariaКандидатствай/Кандидатстване/Външно кандидатстване(danh-từ-neo-vào-đầu-nhãn — các-liên-kết-bài-tư-vấn không-phải-Apply), tiếng-Hà-LanSolliciteer/Solliciteren, tiếng-Tây-Ban-Nha¡Apúntame!/Postularse(các-nhãn, không-phải-động-từ — liên-kết-FAQ không-còn-quan-trọng), tiếng-Trung申请职位/投递(neo-vào-toàn-bộ-nút) — các-đăng-còn-sống-trên-những-board-đó không-còn-bị-đọc-là-no_apply_control.
Đã sửa
- Mô-hình-mặc-định-MiniMax (CAR-187): mặc-định-đã-nghỉ-hưu-
MiniMax-Text-01được-thay-bằng-MiniMax-M3.1-Flashtrên-api.minimax.iovà-MiniMax-M3trên-api.minimax.cn; URL-cơ-sở được-ghim-vào-nhà-cung-cấp (một-host-không-phải-nhà-cung-cấp bị-từ-chối-khi-chạy và-khóa không-bao-giờ-tới-được-nó); gợi-ý-cài-đặt ×19 gọi-tên-các-mặc-định-mới. - Repost yêu-cầu-cùng-một-nguồn (CAR-186): một-vai-trí được-liệt-kê-trên-LinkedIn và-trên-Greenhouse-của-nhà-tuyển-dụng không-còn-bị-báo-là-repost — các-cụm giờ-chia-theo-
sourceHost(), hàm-này fold-subdomain-vùng-chỉ-trên-các-site-đã-biết (de.linkedin.com≡www.linkedin.com, nhưng-ca.example.comvẫn-riêng), fold-các-bí-danh-host-Greenhouse thành-một-nguồn-duy-nhất và-bỏ-một-dấu-chấm-cuối. - Trôi-ngôn-ngữ-đánh-giá-Tamil (CAR-183): một-chỉ-đạo-Tamil-được-củng-cố giờ-ngồi-trong-phần-đuôi-prompt-biến-động cạnh-ngân-sách-dung-lượng (slot-CAR-174) — các-report-remote-QA lại-về-tiếng-Tamil sau-cơn-trôi-ngắt-quãng-gặp-trong-v1.261.2.
Ghi chú
- Không-hành-động-cố-ý: relay-posting-guard lên-đường-dưới-dạng-fail-soft — fork không mang
posting-guard.mjscủa-parent (PR-upstream-#6146 vẫn-đang-mở), nên-đến-khi-một-lượt-đồng-bộ-parent chở-nó-về thì-điểm-cuối trả-lời-{available:false, reason:"script-not-found"}. - Không-hành-động-cố-ý:
yearsMinkhông được-biểu-diện-làm-chip-UI-#/scantrong-bản-phát-hành-này — trường-đi-trong-snapshot và-bộ-lọc-chỉ-là-config-của-portals. - Không-hành-động-cố-ý: các-thay-đổi-Machine-Summary-modes/reports-của-upstream (#6161/#6160/#6157) không được-port — chúng-đến-với-parent-đã-triển-khai, không-phải-dưới-dạng-các-mirror-web-ui.
- Kiểm-thử 6734 → 6841 trên-nhánh-phát-hành; khóa-dedup-của-scanner nguyên-vẹn (hành-vi-chuẩn-hóa-URL không thay-đổi).
[1.261.3] — 2026-10-28
Bản-patch-hoàn-thiện-thiết-kế: giai-đoạn-3-thiết-kế-Lovable (mật-độ + nghỉ-hưu-coral-hoàn-toàn), host-pool-quét (32-công-ty, 10-mỗi-host), sáu-bản-sửa-vị-trí-nhà-cung-cấp-upstream, nguồn-Trakstar-Hire (registry 122), undo + chốt-bảo-vệ-chưa-lưu của-CV-Studio — cùng-các-bản-sửa-P3-hồi-quy-cuối-cùng và-đồng-bộ-docs.
Đã sửa
- Nhãn-«related»-của-cluster-bản-đồ 3.16:1 → 4.68:1 (cả-hai-theme):
--map-score-mid-nhạt bị-làm-đậm-thành-#567b75(giá-trị-đề-xuất-#5f7f7achỉ-đo-được-4.37 — cần-một-bước-đậm-hơn); phía-dark từ-trước-đã-4.98:1, không-đụng-tới. Ghim-đỏ-trước trong-map-cluster-visual. - Vòng-focus-của-skip-link: outline-
#ff385c-trần-cuối-cùng →var(--accent-c)— cả-78-vòng-focus giờ-theo-token-accent. - Cấu-trúc-accent-của-
.tab-btn.is-active(#584, giai-đoạn-3): nút-bấm-từng-trộn-ba-họ-màu (sắc-phủ-coral + chữ-danger + viền-blue); giờ là-một-cặp-accent-soft-đơn-nhất. - Bản-sửa-vị-trí-nhà-cung-cấp-upstream ×5 (#580, CAR-176): cờ-
Fully Remote-của-workday (không-phải-một-nơi-chốn), fan-out-telecommuting-của-workable + chỉ-lấy-state-khi-không-có-thành-phố, dấu-phẩy-dư-cuối-của-successfactors, ranh-giới-từ-cho-remote-của-lever, các-nhãn-tiền-tố-Location-của-icims. - http-json: không-retry-trên-timeout-đã-cạn (#580) — một-lượt-hủy-do-quá-hạn là-lỗi-không-tạm-thời ở-cả-hai-trợ-lý-retry (upstream đo-được ~94s trên-một-board-Ashby với-30s×lần-retry).
- Đồng-bộ-docs (#587): những-bộ-đếm-thời-đại-17/18-cuối-cùng trong-HANDOFF/CONVENTIONS/README (uk nhận-phần-Локалізація-còn-thiếu; lịch-sử-§-mở-rộng-tới-§32/§33 — số-học-33-H2 được-kiểm-chứng).
Thêm mới
- Thiết-kế-Lovable giai-đoạn-3 (#584): các-token-mật-độ lên-sóng — hàng-bảng ≈32px, điều-khiển 30px, chip 24px (ngoại-lệ-khoảng-cách-WCAG 2.5.8); mọi-tàn-dư-rgba-coral chuyển-sang-các-cặp-cv3 (
.dash-hero,.badge-bad, quầng,.tab-btn.is-active);--ease-outđược-khai-báo, TOKEN_HANDOFF rỗng; hợp-đồng-.callout--ok/--danger. - Nguồn-Trakstar-Hire (#583, CAR-177): registry 122 sources = 117 EN + 5 RU · 117 adapters — ghim-host jsapi.recruiterbox.com, bước-đi-offset với-các-điểm-dừng-ngắn/rỗng/lặp, các-phần-từng-phần được-giữ, gắn-thẻ-
trakstarTruncated; cổng-đếm ×5 + help §17 ×19. - Host-pool-quét (#579, CAR-178): tới-32-công-ty đồng-thời, chặn-trần-10-mỗi-host (mẫu-hình-keyed-limiter-của-upstream) — snapshot giống-từng-byte-với-lượt-chạy-tuần-tự (cổng-mock-thời-gian-đỏ-trước).
- Undo + chốt-bảo-vệ-chưa-lưu của-CV-Studio (#582, CAR-179): stack-undo-có-trần (30) phủ-lên-kết-quả-lượt-chạy-AI với-
Cmd/Ctrl+Z-an-toàn-cho-layout-không-QWERTY, chốt-bảo-vệ-chưa-lưu-khi-rời-route (dò-dirty-trực-tiếp, confirm/rewind/beforeunload), i18n ×19. - Các-bản-sửa-nhà-cung-cấp-upstream được-kiểm-thử ×17 (một-phần-của-CAR-176); phần-tóm-tắt-remote-QA nêu-tên-các-nguồn-quét-trượt + in-
tok ~Nmỗi-lượt-eval (#567, đã-có-từ-v1.261.2 — observability được-dùng-cho-việc-sàng-lọc-của-bản-phát-hành-này).
Ghi chú
- Accent giờ-là-blue (quan-niệm-Lovable): hành-động-chính/trạng-thái-hoạt-động/vòng-focus theo-
--cv3-accent; màu-đỏ-được-dành-riêng-cho-danger (.btn-danger,toast.error, chữ-danger). Coral chỉ-còn-sống-sót-trong-tài-sản-logo-PNG (quyết-định-của-chủ-sở-hữu). - Mật-độ: hàng-bảng ≈32px / điều-khiển 30px / chip 24px — ngoại-lệ-khoảng-cách-WCAG 2.5.8 được-ghi-chép; canary-44px-của-v1.26.1 được-viết-lại-lên-hợp-đồng-token.
- CodeQL: cả-10-cảnh-báo-còn-mở được-đóng (4 FP được-loại-có-lý-do: các-lớp-được-ghi-chép-llmRateLimit/atomicWrite; 6 được-sửa-tại-nguồn).
- Tests 6655 → 6734 trên-nhánh-phát-hành; không-hành-vi-nguồn-quét nào thay-đổi ngoài-nguồn-Trakstar-mới.
[1.261.2] — 2026-10-28
Bản-patch-ổn-định + hoàn-thiện: cache-geocode sống-sót-crash-giữa-lúc-ghi (CAR-173), UI.md render-phần-tiếp-nối-bullet và-các-danh-sách-lồng-nhau, các-lỗ-rò-khóa-trong-văn-bản-render của-các-bundle-help được-đóng ×17, evaluate nhận-trần-token-theo-locale cho-ta (CAR-174), chrome-RTL phản-chiếu qua-các-logical-property (85-phát-hiện), các-capture-bản-đồ được-khung-lại ×19 và-các-cluster-bản-đồ đỗ-tương-phản-trên-dark — cùng-giai-đoạn-đầu-tiên-của-tích-hợp-thiết-kế-Lovable (tệp-thụ-động tokens-v3.css), backfill-docs (review-release + specs) và-các-ngoại-lệ-coverage-CI-node.
Đã sửa
- Mất-dữ-liệu-ghi-vỡ-của-cache-geocode (CAR-173, #562): cả-hai-lộ-trình-flush (insert-flush-debounce, exit-flush) ghi-
.cache/geocode.jsonbằng-một-writeFileSync-trần — truncate-then-write — nên-crash, OOM hoặc-SIGKILL giữa-lúc-ghi để-lại-một-tệp-vỡ và-JSON.parsecủa-lượt-boot-sau ném-lỗi, âm-thầm vứt-bỏ toàn-bộ-cache-bền-vững (vài-tuần-ngân-sách-Nominatim), không-chỉ-của-ngày-hôm-đó. Cả-hai-điểm-ghi giờ-đi-qua-file-lock.mjs::atomicWrite(tệp-tạm-cùng-thư-mục → rename → unlink-khi-thất-bại) — cùng-hợp-đồng-mà-FULL-R1/FULL-M1 áp cho-pipeline.md,cv.md,profile.yml,career-plan, đầu-vào-batch và-memory. Bản-thân-cơ-chế-flush-CAR-142 (insert-flush-debounce, exit-flush, shutdown-có-giới-hạn) được-kiểm-chứng-nguyên-vẹn-theo-phương-pháp-đỏ-trước: kiểm-thử (a)/(b) khóa-việc-chèn-đến-tệp trong-cửa-sổ-GEOCODE_SAVE_MSvà-tệp-vẫn-là-JSON-hợp-lệ; (c) là-một-cổng-cơ-chế cùng-các-lượt-chạy-hành-vi của-cả-hai-lộ-trình-flush khẳng-định-không-có-rác-tạm và-một-tệp-đọc-được. - Tiếp-nối-dòng-danh-sách-của-UI.md (#563): bộ-xử-lý-danh-sách chỉ-tiêu-thụ-các-dòng-
-/*-liên-tục, nên-một-dòng-tiếp-nối-thụt-lề sau-một-bullet rơi-ra-khỏi-<ul>-được-phát-ra và-lượt-đoạn-văn-bỏ-qua-chunk — phần-tiếp-nối rò-ra-thành-văn-thô với-các-marker-**/backtick-nghiêng (~95-lượt-văn-lơ-lửng mỗi-locale trên-các-bundle-help; en.md 95, ru.md 104). Một-dòng-tiếp-nối — khoảng-trắng-dẫn-đầu, không-phải-block-mới (heading, bullet, placeholder-fence-bọc-NUL, dòng-trống) — giờ-nối-vào-<li>-trước-đó thành-văn-bản-ghép-bằng-<br/>, với-inline()chạy-theo-từng-dòng nên-các-marker-nhấn-mạnh không-bao-giờ-bắt-cặp-xuyên-nhịp-ghép; cổng-bảo-vệ-placeholder-fence là-kiểm-tra-ký-tự-đầu-NUL, không-phải-khớp-token-trần. Các-bullet---lồng-nhau, danh-sách-đánh-số, fence-bên-trong-danh-sách và-heading-bên-trong-danh-sách vẫn-là-khoảng-trống-được-ghi-nhận-riêng (đợt-docs-tiếp-theo). - Rò-khóa-trong-văn-bản-render-của-help ×17 (#561): remote-QA phát-hiện 85-khóa-i18n-thô hiện-ra-trong-help-được-render (nguyên-nhân-gốc được-chứng-minh-bằng-repro: cùng-sự-tiêu-thụ-bullet-một-dòng-của-UI.md — một-dòng-tiếp-nối-được-xuống-dòng phát-ra-thành-văn-thô giữ-nguyên-backtick; các-phần-help-v1.260/261 viết-bullet-nhiều-dòng). 163-bullet được-gỡ-nếp-về-một-dòng trên-17-locale — chỉ-chạm-khoảng-trắng, không-sờ-một-từ-dịch-nào (đã-đối-chiếu-cũ-với-mới). Cổng-mới-
tests/help-rendered-keys.test.mjsrender-mỗi-bundle qua-chuỗi-thật (stripGithubOnlyBlocks+UI.md-nạp-bằng-vm) và-trượt-nếu-bất-kỳ-trong-1,711-khóa nào xuất-hiện-trong-văn-bản; đỏ-trước trên-17-locale → xanh. Công-cụ-repro nằm-trong-repo:scripts/remote-qa/help-render-scan.mjs(vm) +help-render-crosscheck.mjs(DOM-thật). - Remote-QA khẳng-định-hợp-đồng-palette-CAR-122-của-Ctrl+K (#561):
prod-regression.mjsgiờ-mong-đợi-palette-lệnh-sau-Ctrl+K (.nav-v2-palette[role=dialog]+ focus-trong-nav-v2-input) HOẶC-focus-tìm-kiếm-legacy-là-phương-án-dự-phòng, thay-vì-im-lặng-chấp-nhận-một-trong-hai; unit-tests/remote-qa-ctrl-k.test.mjskhóa-6-kịch-bản-trên-một-DOM-giả, đỏ-trước-0/6 → 6/6. - Khung-capture-bản-đồ ×19 (#560): báo-cáo-của-chủ-sở-hữu-trên-
images/job-map-en.png— nửa-hộp-tìm-kiếm-của-topbar + một-h1-bị-cắt-ở-đỉnh, một-dải-xám-của-danh-sách-bên-ở-mép-phải, một-cluster-marker-bị-khung-cắt-gần-London và-một-đường-ngang-trắng-băng-qua-bản-đồ-ở-~2/3-độ-cao.capture-map-screenshots.mjsgiờ-chờ-hàng-đợi-geocode-rút-cạn (located + noLoc === total, không-phải-bộ-đếm-N/N — các-hàng-Remote-về-mặt-cấu-trúc-không-có-địa-điểm nên-lượt-chờ-cũ-không-bao-giờ-kết-thúc), ẩn-header.topbarvà-#notif-drawercho-ảnh, cắt-đúng-hộp-.job-map-page(không-có-panel-bị-mép-khung-cắt), zoom-lùi-hai-bước nên-không-cluster-nào-ngồi-nửa-cắt, ghim-độ-cao-bản-đồ và-chụp-một-ảnh-viewport-thuần (captureBeyondViewporttái-lấy-mẫu-lớp-tile-được-composite và-vẽ-các-dải-trắng-ở-ranh-giới-hàng-tile), và-căn-bộ-chứa-bản-đồ-theo-số-nguyên. Cả-19-capture-job-map được-chụp-lại. - Bong-bóng-cluster-bản-đồ — tương-phản-dark-theme + vừa-nhãn (#572): quét-chủ-sở-hữu-P2/P3 — các-vành-cluster-trên-dark từng-ngồi-trên-nền-trắng-cố-định (1.83:1); vành-giờ-lấy-
var(--paper)với-chữ-số-palette-score (đo-được-4.98:1+, nền-đầy 9.53:1; band-thấp-nhất-về-mặt-toán-học-không-tô-màu-được-trên-dark và-giữ-6.1:1-qua-một-lộ-trình-data-dim-trung-thực), và-nhãn-relatedvừa-với-bong-bóng-của-nó (font-fit-bằng-rAF, chữ-số-không-bao-giờ-bị-thu-nhỏ). - Chuyển-ngôn-ngữ-#/scan — re-arm-skeleton (follow-up-#534, agent-đang-chạy, đổ-bộ-trước-tag): nối-tiếp-bản-sửa-của-chủ-sở-hữu-trong-v1.261.0 (#534) — các-skeleton-được-re-arm-trên-một-lượt-vẽ-lại-chuyển-ngôn-ngữ-không-còn-sống-sót-qua-một-lượt-lấy-lại-đã-hoàn-tất.
- Lệch-docs (CAR-139, agent-đang-chạy, đổ-bộ-trước-tag): các-bộ-đếm-README-×19, HANDOFF-×19 và-sự-thật-CONVENTIONS được-đồng-bộ-với-trạng-thái-registry/kiểm-thử-sống.
Thêm mới
- Review-release + backfill-spec (docs, #559/#558):
docs/reviews/REVIEW-2026-10-28-v1.261.1.md(đợt-v1.261.0/v1.261.1 được-rà-soát-đối-với-các-spec-của-nó) và-backfill-spec-SDD-cho-cùng-đợt — phần-đuôi-BACKLOG-giờ-nêu-khoảng-trống-còn-lại (kiểm-thử-dành-riêng-cho-sources/habr.mjs). - Quét-sâu-RTL (#571): harness-AR-đi-39-route-×-LTR-đối-với-RTL (phản-chiếu-trục-X, tràn, bị-cắt, chữ-ký-text-align) — 85-phát-hiện-được-sửa: chrome-cố-định (toast, sidebar, drawer + dấu-×-đóng-của-nó, docs-FAB, usage-HUD, skip-link) chuyển-sang-
inset-inline-*/border-inline-*, các-bảng-sang-text-align: start/endtrên-17-tệp-view-+-2-lib, quy-tắc-chung-[dir=rtl] text-align:rightbị-loại-bỏ (nó-đấu-lại-việc-căn-giữa-cột-sao-của-scan), việc-cô-lập-cột-score-CAR-58 chuyển-lên-span-ltrNum. - Harness-a11y-bàn-phím (#570):
tests/playwright-a11y-keyboard.mjsđi-11-route (thứ-tự/bẫy-Tab, chỉ-báo-focus, overlay-Escape, Enter/Space) — 0-lỗi-sản-phẩm; phạm-vi-hồi-quy là-mới. - Quét-chưa-dịch-i18n (#565): 36-giá-trị-giống-en được-dịch-×9-locale (các-
*.rolePh, các-khóa-config, manifesto-ta) + một-cổng-quét-allowlist-đã-đóng; audit-i18n-site (cvstart.org) (#568): 20-khóa-×-18-locale được-dịch (cả-khối-demo.*/stats.t.*/showcase.tab*là-tiếng-Anh-ở-mọi-nơi), 1-khóa-chết-bị-loại-×19. - Quan-sát-remote-QA (CAR-175, #567): phần-tóm-tắt-nêu-tên-các-nguồn-quét-trượt (
stderr samples, redact-trước-khi-cắt) và-in-tok ~Ntừ-usage-của-nhà-cung-cấp; logic-nằm-trong-một-summary-parts.mjs-thuần-với-một-cổng-phát-hiện-lệch. - Danh-sách-marker-lồng-của-UI.md (một-cấp, #564): các-bullet-
-render-thành-<ul>-lồng (an-toàn-placeholder-fence) — 2-lượt-văn-lơ-lửng-cuối-cùng-mỗi-locale-biến-mất. - Tích-hợp-thiết-kế-Lovable — giai-đoạn-1 (#566) / giai-đoạn-2 (nhánh, đổ-bộ-trước-tag):
public/css/tokens-v3.cssport-nguyên-vẹn-khái-niệm-Lovable (các-mặt-oklch-0–3, các-cặp-ink-được-ghi-chú-AA, họ-accent, ok/warn/danger/info/neutral-mềm+ink, band-score-A–G-×2-theme, mật-độ-+-focus-+-bóng); giai-đoạn-2-kích-hoạt-nó-trên-các-tên-token-hiện-có (accent-tách-blue/danger, band-score-+-callouts-trên-token-cv3) với-các-cổng-tương-phản/vai-trò/dark-được-cập-nhật. - Trần-token-đánh-giá-theo-locale (CAR-174, #569):
evalMaxTokens(lang)— ta/hi-xin-32768 (ba-client-SDK-bị-kẹp-lại-ở-16384; cả-hai-lớp-được-sửa), cùng-một-ngân-sách-khối-lượng-Tamil-trong-prompt (≤5-câu-mỗi-block, ≤900-từ) — báo-cáo-ta-của-remote-QA-v1.261.1-bị-cắt-ở-trần-output-token (thiếu-Block-B–G-+-SCORE_SUMMARY). - Đuổi-tiếp-các-bản-sửa-thật-CodeQL: công-cụ-render-QA-mới-thay-việc-tự-xử-lý-entity-bằng-các-lượt-tách-cấu-trúc-+-
htmlToText({cap: Infinity}); các-khẳng-định-redact-ghim-kết-quả-mặt-nạ-chính-xác; các-hằng-không-dùng-của-harness-RTL-bị-loại. - Chính-sách-ngoại-lệ-coverage-cho-sai-lệch-CI-node (habr #558, states #561):
sources/habr.mjs(nhánh-ma-trận-node-CI-87.23-so-với-local-≥89) và-states.mjs(CI-86.49-so-với-local-≥89) gia-nhập-các-ngoại-lệ-trong-scripts/coverage-baseline.json— các-tệp-mà-độ-phủ-nhánh-đo-trên-CI-về-mặt-cấu-trúc-thấp-hơn-sàn-local-do-sai-lệch-bản-node được-ngoại-lệ-thay-vì-hạ-cổng-cả-thể-xuống.
Ghi chú
- Hợp-đồng-Ctrl+K (CAR-122): chord mở-palette-lệnh — nó KHÔNG focus-trực-tiếp vào-hộp-tìm-kiếm; hộp-tìm-kiếm được-focus từ-palette. Regression-prod remote-QA giờ khẳng-định chính xác điều này (#561).
- Gỡ-false-positive-CodeQL ×5: các-cảnh-báo-
js/missing-rate-limiting-trên-main-đang-chờ-token-security_events— hành-động-operator, không-phải-thay-đổi-code. - Đổ-bộ-sau-lượt-cắt-nhánh: #561/#562/#563/#564/#565/#566/#567/#569/#570/#571/#572 đều-đã-merge-vào-main; các-agent-#534-skeleton-và-CAR-139-merge-trước-tag. Danh-sách-marker-lồng-sau-một-cấp-và-hình-học-view-nặng-inline-vẫn-là-các-khoảng-trống-được-ghi-nhận.
- Kiểm-thử-6609-trên-nhánh-release (+15-kể-từ-v1.261.1; ~13-nữa-từ-#561-khi-merge — 2-tệp-cổng-mới); các-kiểm-thử-đỏ-duy-nhất-trước-fan-out-là-các-cổng-parity-CHANGELOG-×19 (fan-out-locale-là-bước-tiếp-theo-của-orchestrator); không-chạm-nguồn-quét-nào (registry 121 = 116 EN + 5 RU · 116 adapter).
[1.261.1] — 2026-10-28
Bản-patch-client-sau-QA-trên-prod: một-bản-sửa-sập-P1 cho-#/two-pager, Ctrl+K hoạt-động trên-các-bố-cục-bàn-phím-không-QWERTY, đợt-di-động-390px (tràn-docs-assistant, chip-bản-đồ-chồng-lấn, một-harness-39-route), hoàn-tất-CAR-137 (lỗi-cụ-thể, v2empty ×5, gợi-ý ×13 + các-trang-mode) và-CAR-140 đổ-bộ-các-ảnh-chụp-màn-hình-v2-thật ở-mọi-nơi.
Đã sửa
- two-pager TDZ (CAR-170, P1, #554):
Cannot access 'previewTimer' before initialization— trình-soạn-thảo-thẻ-đã-lưu kích-hoạt-onChangetrong-lúc-đang-dựng, với-mỗi-chip-được-khôi-phục, trong-khi-vòng-lặp-dựng đứng-về-mặt-từ-vựng phía-trên-let previewTimer, nên-toàn-bộ-lượt-render-#/two-pagersập (không-có-h1, ×19-locale). Bộ-lập-lịch + lượt-gắn-kết giờ-nằm-phía-trên-vòng-lặp; một-kiểm-thử-hành-vi chạy-chính-module-view-thật — lỗi-prod-chính-xác trước-bản-sửa, một-trang-được-render sau-đó — cộng-với-một-cổng-phát-hiện-lệch-thứ-tự-từ-vựng. - Ctrl+K trên-các-bố-cục-bàn-phím-không-QWERTY (CAR-172, #554): cả-hai-bộ-xử-lý-chord chỉ-khớp-theo-
e.key— trên-một-bố-cục-Nga, chord đến-dưới-dạng-key='л' code='KeyK'và-không-làm-gì-cả. Giờ khớp-bằng-e.code === 'KeyK'trong-nav-v2.js và-app.js; tái-tạo-trên-trình-duyệt-thật với-một-chord-‘л’/KeyK-tổng-hợp. Hợp-đồng-CAR-122 được-nêu-lại (xem-Ghi-chú). - Tràn-docs-assistant-390px (CAR-172, #554): các-chip-khởi-đầu-CAR-136 là-
.btn(nowrap,flex-shrink: 0) — một-mục-418px-không-thể-ngắt-đoạn đã-đẩy-#/docs-assistantquá-khung-hình-390px thêm-56px; mẫu-thu-nhỏ-CAR-146 (trong-v2-llm.css, các-cổng-CSS-800-LOC-không-đụng-tới) đưa-nó-về-0. - Chip-bản-đồ-chồng-lấn @390 (#552): trên-một-khung-hình-390px, các-chip-meta-của-bản-đồ chồng-lấn-lên-hàng-CTA (map.css).
- CAR-137 — lỗi-cụ-thể + v2empty ×5 (#550): năm-bộ-fallback-lỗi-chung-chung (‘Error’ / ‘failed’) trở-thành-các-khóa-cụ-thể-có-hành-động — thất-bại-POST-đánh-giá, luồng-auto-pipeline-không-có-sự-kiện-kết-thúc, lượt-thêm-scan→pipeline, lượt-tải-cụm-repost, hoàn-tác-pipeline; năm-trạng-thái-rỗng-phẳng-cuối-cùng (
#/reports,#/usage,#/portals,#/activity,#/dashboard) gia-nhập-mẫu-v2empty-CAR-124 (lời-giải-thích + ví-dụ-aria-hidden-có-thẻ + hành-động-nối-sẵn; 15-khóa-v2empty.*-mới, bốn-khóa-một-dòng-đã-chết bị-loại-bỏ) — tất-cả ×19-bộ-từ-điển, snapshot được-tái-tạo. - CAR-137 — HelpHint ×13 + kit-trang-mode (#550): gợi-ý-«?»-theo-ngữ-cảnh giờ-đứng trên-mọi-H1-trang-còn-lại (pipeline, reports, dashboard, cv, portals, usage, activity, assessments, map, health, docs-assistant, settings) và-trên-cả-8-trang-mode qua-kit (mỗi-cấu-hình-MODES mang-một-
hintKey, được-render qua-HelpHint.title).
Thêm mới
- Harness-Mobile-390 (#552): một-lượt-quét-Playwright qua-mọi-route-SPA (31-trang-chuẩn + 8-trang-mode = 39-hash) ở-390×844 với-một-corpus-được-gieo-sẵn — kiểm-tra-tràn-ngang-theo-từng-route (scrollWidth so-với-clientWidth, dung-sai-1px, nêu-tên-phần-tử-rộng-nhất) cộng-một-kiểm-tra-chạm-CTA (không-sticky-bar/drawer/FAB nào che-một-CTA-chính); tùy-chọn, bỏ-qua-duyên-dáng khi-không-có-binary-trình-duyệt, không-cần-mạng.
- Bộ-capture-v2-mới ×48 (CAR-140-giai-đoạn-A, #551): các-ảnh-chụp-màn-hình-UI-v2-thật từ-một-fixture-CI-isolated-được-gieo-sẵn — dashboard ×19 + job-map ×19 (job-map-ta xuất-hiện-lần-đầu, job-map-vi mới) + scan/pipeline/tracker/reports × en/ru — cung-cấp-cho-README, help và-trang-landing.
- Ảnh-chụp-màn-hình-thật trên-cvstart.org (CAR-140-giai-đoạn-B, #553): các-slot-dành-sẵn-của-CAR-140 không-còn-nữa — trang-landing hiển-thị chính-các-bản-capture-v2-thật (phần-trưng-bày-job-map + các-hàng-ảnh-chụp, trên-cả-19-locale-landing).
- Gợi-ý-CAR-137 (#550): 21-khóa-đã-dịch-mới ×19 (
help.hint.*×20 + các-hintKey-trang-mode) — giờ-mỗi-trang tự-giải-thích ngay-tại-chỗ-của-mình.
Ghi chú
- Hợp-đồng-Ctrl+K (CAR-122): chord mở-palette-lệnh — nó KHÔNG focus-trực-tiếp vào-hộp-tìm-kiếm; hộp-tìm-kiếm được-focus từ-palette. Dòng-checklist-QA-v1.261.0 «Ctrl+K фокусит поиск» bị-thay-thế; prompt-QA-v1.261.1 mang-bản-kiểm-tra-đã-cập-nhật.
- Các-bản-sửa-thật-CodeQL (#547): 4-cảnh-báo được-đóng (vòng-lặp-khóa-literal của-content.mjs được-đưa-về-dạng-cấu-trúc, một-lượt-quét-lint) — đã-đổ-bộ-sau-phát-hành trên-main-của-v1.261.0 trước-bản-patch-này; nêu-ở-đây để-đầy-đủ.
- Kiểm-thử 6582 (+51); trình-duyệt 171–172 đỗ / 0 trượt / 1 bỏ-qua-tùy-chọn; harness-mobile-390 chạy-riêng-lẻ (
node tests/playwright-mobile-390.mjs). Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter).
[1.261.0] — 2026-10-28
Đợt-rà-soát-toàn-diện đã-hoàn-tất (mọi-phát-hiện-HIGH-và-MEDIUM đều-đổ-bộ), bản-sửa-chuyển-ngôn-ngữ được-chủ-sở-hữu-báo-cáo, các-bản-sửa-chất-lượng-đánh-giá, lượt-fan-out help ×18, trang-landing-v2-của-cvstart.org — cùng-4-spec-SDD/OpenSpec ghi-lại-đợt-này. Mọi-bản-sửa đều-đổ-bộ qua-một-fix-forward-đỏ→xanh và-một-vòng-rà-soát-ngữ-cảnh-mới của-GLM-5.3-Flash.
Bảo mật
- FULL-R1 — cổng-CSRF-cho-các-acting-GET + khóa-các-lượt-ghi-pipeline-nguyên-tử (#519): cổng-
Sec-Fetch-Site/Origin/Referer trên-/api/stream/*,/api/run/*,/api/geocode(xuất-khẩu-ACTING_GET, cổng-phủ-tĩnh); mọi-lượt-read-modify-write trên-data/pipeline.md/data/last-scan.jsonchạy-dưới-withFileLock+atomicWrite-mới (tệp-tạm-cùng-thư-mục → rename → unlink-khi-thất-bại). - FULL-R2 — cụm-SSRF-trong-các-nguồn-quét (#514): rss.mjs ép-https và-từ-chối-địa-chỉ-private; ~25-nguồn-gọi-
fetchImpl-trực-tiếp → các-transport-được-bảo-vệ; các-mirror được-ghim; xác-thực-chuyển-hướng cho-habr/hh/geekjob/getmatch;delay(ms, signal)-dùng-chung. - FULL-R4 — làm-hỏng-văn-bản-của-
stripDangerousMarkdown(#513/#518): việc-lược-scheme chỉ-diễn-ra trong-ngữ-cảnh-liên-kết/thuộc-tính; các-entity được-giải-mã trên-một-bản-sao-chỉ-dùng-cho-việc-phát-hiện («JavaScript: React, Node» và-«R&D» sống-sót). - FULL-M2 — gia-cố-transport (#520):
safeGettôn-trọng-timeoutMskèm-signal-của-bên-gọi (bộ-điều-khiển-bridge);guardResolvedHostthất-bại-về-CHẾ-ĐỘ-ĐÓNG khi-lỗi-DNS. #525 bổ-sung: lược-bỏ-các-header-credential trên-các-redirect-liên-origin, gỡ-listener-transport trên-mọi-đường-settle, và-một-bản-sửa-sập-do-signal-đã-bị-hủy-từ-trước. - FULL-M4 — logo/batch (#523): logo ghim-magic-bytes trên-MỌI-đường-dẫn (một-
image/png-nói-dối không-thể-giấu-SVG-bên-trong), kẹp-content-type-về-image/*ngay-tại-lúc-lưu, cache-riêng + nosniff; batch:--parallelbị-kẹp-trong-khoảng-1–8,--min-scoređược-xác-thực, BATCH_BUSY single-flight,llmRateLimittrên-các-lượt-sửa-config/batch.
Thêm mới
- CAR-147 — trần-thời-gian-đánh-giá-theo-locale (#524):
evalTimeoutMs(lang)— ta/hi nhận-480 s thay-vì-300 s (các-chữ-Indic tokenize-ra-vài-token-trên-mỗi-âm-tiết; bức-tường-cũ sinh-502 + báo-cáo-rỗng); client-remote-QA chờ-540 s. - CAR-133 — landing-v2-trên-cvstart.org (#532): hero-parallax-được-cổng-bởi-reduced-motion, một-demo-SIMULATED-dán-nhãn-rõ-ràng cho-luồng-scan→evaluate→tracker, các-mục-scroll-reveal với-các-số-đếm-được-xác-minh-trực-tiếp, các-slot-dành-sẵn-cho-ảnh-chụp-màn-hình-CAR-140.
- CAR-135 — help viết-lại cho-UI-v2, lượt-fan-out ×18 hoàn-tất (#533, #540, #541, #542): cả-19-tệp-help mô-tả-shell-v2 (nav-gập-được, palette-Cmd/Ctrl+K, skeleton, các-trạng-thái-rỗng-ví-dụ+hành-động, chrome-quét-v2, pipeline-nhóm+hoàn-tác, reports-v2, kanban); các-nhãn-UI trích-khóa-i18n của-chúng; câu-121-nguồn-quét sống-từ-registry.
- Các-spec (SDD/OpenSpec) (#535): backfill-đợt-hai-oct27 + ba-spec-tiếp-nối (fan-out-help, các-bàn-giao-lượt-ghi, các-bất-biến-chuyển-ngôn-ngữ).
Đã sửa
- Chuyển-ngôn-ngữ không-còn-làm-trống-#/scan (#534) — được-chủ-sở-hữu-báo-cáo: trạng-thái-quét-cấp-view (kết-quả, chip-bộ-lọc) giờ-nằm-ở-cấp-module; một-harness-Playwright-hành-vi với-một-lượt-lấy-lại-trễ-4 s (đỏ-trên-hình-thạng-cũ).
- CAR-148/149 — báo-cáo-ru «thiếu-Block G» (#530): prompt đã-dạy-ba-bản-đồ-A–G-mâu-thuẫn-nhau; skeleton + danh-sách + ví-dụ giờ khớp-với-oferta.md (G = Posting Legitimacy); cổng-phát-hiện-lệch-hành-vi.
- CAR-150 — hoàn-tác-pipeline giữ-metadata-comp (#537): DELETE trả-lời
comp, POST chấp-nhậncomp-tùy-chọn-có-cổng, view mang-{token, comp}qua-mọi-nhánh-fallback. - FULL-M3 — các-nguồn-chết báo-bảng-trung-thực (#522): getro/mycareersfuture/meituan/mokahr/glints ném-lỗi trên-trang-1-dạng-sai (một-API-chết không-còn-đọc-như-«khỏe-mạnh, 0-việc-làm»);
pinnedOverrideghim-các-override-company.apicủa-18-adapter. - FULL-M5 — một-cascade-nhà-cung-cấp-duy-nhất (#521): routes/llm.mjs đi-qua-
runActiveProvider(+cachePrefix, signal); chặn-đón-tiến-trình-con-Gemini; các-hợp-đồng-phản-hồi giống-hệt-byte. - FULL-M1 — các-lượt-ghi-tệp-dùng-chung được-khóa (#526, #539):
runTrackedScript+ danh-sách-TRACKER_MUTATING; các-lượt-spawn-outcome/followup giữ-khóa; tracker.mjs ghi-qua-atomicWrite; các-lượt-lưu-PUT khóa+nguyên-tử. - FULL-M6 — hợp-nhất-server + client (#531, #536, #525): dotenv-null-proto + từ-chối-
__proto__; isPrivateOrLoopback nhận-thêm-NAT64/6to4/benchmark/reserved; cache-mtime-cho-env-config; GC-slot-thật-cho-file-lock; safeGet-timeout+signal; cổng-DNS fail-closed; SSE ×4 →API.postStream; các-lib-focus/nhãn/trạng-thái; clipboard được-await; tông-màu-Hired-trên-dashboard. - R3 — lệch-token-CSS (#527):
--accentđược-giải-quyết (các-vòng-focus-của-bản-đồ đã-chết-lặng-lẽ); 11-thời-lượng-lệch-token được-gộp; cổng-phát-hiện-lệch. - R4 — các-nơi-còn-trễ-khi-tải (#538): preview-của-assessments/mode-page/pipeline render-skeleton-CAR-112.
- Đợt-CodeQL + CI (#517, bản-sửa-#539): các-import-không-dùng, cổng-ACTING_GET import-biểu-thức-chính-thức, đoạn-lifecycle được-đặt-neo-lại.
Ghi chú
- Cố-ý-không-làm trong-v1.261.0: ghim-DNS-tại-lúc-kết-nối (cần-undici — nằm-ngoài-deps, được-ghi-là-phần-dư-lại); các-ảnh-chụp-màn-hình-CAR-140 (cần-UI-v2-đã-triển-khai); CAR-137/138/141 (lượt-docs-kế-tiếp); lớp-
js/missing-rate-limitingcủa-CodeQL là-một-false-positive-đã-được-ghi-chép (bộ-giới-hạn-tùy-chỉnh không-được-công-nhận). - Fan-out-help ×18 của-v1.261.0: đợt-1-es/de bỏ-sót-lời-chú-mở-đầu và-một-delta-của-thẻ-«Công ty đang hoạt động» (de đã-tự-đổ-bộ-phần-mở-đầu-của-mình; es nhận-một-tiếp-nối-một-dòng).
[1.260.0] — 2026-10-26
Đợt-gia-cố-sau-rà-soát, tám-lượt-merge (#491–#498) từ-các-vòng-rà-soát-opus-5-5 và-rà-soát-AI trên-đội-agent-v1.259.0: chuẩn-hóa-lương, giới-hạn-phạm-vi-ngày-báo-cáo, độ-bền-geocode, bust-cache-bundle r2+r3, bản-sửa-tràn-#/deep — cùng-hai-lượt-UI-v2 (pipeline, reports). Mọi-bản-sửa đều-đổ-bộ qua-một-fix-forward-đỏ→xanh.
Đã sửa
- Chuẩn-hóa-lượt-so-sánh-lương (CAR-143 rev-2): các-dấu-chu-kỳ chỉ-được-nhận-diện khi-đứng-sát-con-số mà-chúng-thuộc-về — «6 month contract, $120k» không-còn-bị-nhân-×12-quy-năm, và-các-dạng-chu-kỳ-chỉ-gắn-sát của-RU/ES («за месяц» đứng-cạnh-con-số) thắng-mọi-từ-đi-ngang-không-liên-quan; họ-ký-hiệu
$/¥được-nhận-diện nhưng không-được-ánh-xạ trừ-khi-một-mã-ISO-tường-minh cùng-đứng-trên-dòng (đô-la AUD/CA/SG không-còn-bị-tính-thành-USD, dạng-¥-RMB nhận-một-lưu-ý-tường-minh thay-vì-một-lượt-đổi-JPY-lệch-tới-hơn-20×); các-con-số-trần 19xx/20xx luôn-là-năm; các-con-số-trong-khoảng thừa-hưởng-chu-kỳ-của-vế-kia;minimumvàtarget_rangecủa-profile không-bao-giờ-được-nối-thành-một-khoảng. - Giới-hạn-phạm-vi-của-
fixReportDate(CAR-144 rev-2): lượt-sửa-ngày-ghim-phía-server chỉ-áp-dụng cho-phần-mở-đầu trước-tiêu-đề-##-đầu-tiên (một-báo-cáo mở-đầu-ngay-bằng-tiêu-đề-H2 nhận-no-op-bảo-thủ — ngày-cũ chấp-nhận-được, ngày-bịa thì-không); trong-phần-mở-đầu: một-ứng-viên-duy-nhất được-sửa, nếu-không-thì-một-**Date:**-in-đậm-duy-nhất, nếu-không-thì-không-sửa-gì-cả (hai-ứng-viên-in-đậm hoặc-hai-ứng-viên-trần viết-lại-không-cái nào). Cổng-nhãn-PDF của-FIX-5 giờ đọc-bộ-từ-điển-lắp-ráp-thật — một-locale-thiếu ném-lỗi thay-vì-lặng-lẽ-đỗ trên-fallback-tiếng-Anh. - Chip-vị-trí-Habr + độ-bền-geocode (CAR-142 rev-2): một-chip-meta-Habr chỉ-trở-thành-một-thành-phố khi-có-bằng-chứng-cấu-trúc (một-liên-kết-bộ-lọc-thành-phố hoặc-một-biểu-tượng-vị-trí) — thông-báo-chuyển-địa («Возможна релокация») và-các-loại-hình-việc-làm không-bao-giờ-giả-mạo-thành-vị-trí; cache-geocode giờ sống-sót qua-lần-khởi-động-lại (flush tại
beforeExit/exit/SIGTERM+SIGINT kèm-gửi-lại-tín-hiệu, cờ-dirty chỉ-được-xóa sau-khi-lượt-ghi-hoàn-tất), tắt-máy-có-giới-hạn (chốt-vòng-thoát, bộ-đếm-thế-hệ, LRU-theo-mức-mới), và-một-ngân-sách-geocode-đã-cạn trả-lời 503 + Retry-After thay-vì-502-chung-chung. - Bust-cache-bundle (CAR-145 r2+r3): shell-trang dẫn
/js/bundle.js?v=<content-hash>— bất-biến-khi-khớp, no-store-khi-lệch — giết-cửa-sổ-5-phút của-lượt-triển-khai, nơi-một-shell-mới đi-cặp-với-một-bundle-cũ-được-cache. Hash và-luồng-đọc dùng-chung-một-bộ-mô-tả-tệp (không-có-lượt-đọc-bị-vỡ-nửa-giữa); một-lượt-đọc-ngắn trả-lời null thay-vì-một-hash-dự-phòng-từ-stat mà-có-thể-đầu-độc-cả-một-lượt-triển-khai;make-bundleviết-identity cùng-các-bản-đồng-hành-.br/.gz qua-một-tệp-tạm-đầu-chấm + rename, nên-một-build-bị-giết không-thể-phục-vụ-byte-viết-dở cũng-như-không-thể-rò-tệp-tạm của-nó. - Tràn-#/deep (CAR-146): một-bản-tóm-tắt-nghiên-cứu-sâu-đã-lưu mà-chỉ-riêng-tên-tệp đã-vượt-khung-hình-điện-thoại không-còn-đẩy-
#/deepvượt-390px — thẻ-chặn-tại-dòng-của-nó, tiêu-đề-xuống-dòng, ngày-giữ-một-dòng; lượt-quét-khung-hình-hẹp giờ đi-qua-#/deepvới-một-fixture-quá-dài-được-gieo-sẵn (phát-hiện-duy-nhất của-hai-lượt-chạy-remote-QA, đã-đóng). - Gia-cố-Pipeline-v2 (CAR-116 review): xóa-có-xác-nhận và-hoàn-tác-được (kèm-lời-văn-hoàn-tác-trung-thực), không-bịa-nhà-tuyển-dụng trong-các-thẻ, id-dòng-FNV-1a, số-đếm-hàng-loạt-thật, và-một-chốt-chống-tái-vào trên-các-thao-tác-hàng-loạt.
Thêm mới
- Pipeline v2 (CAR-116): các-thẻ-phong-phú-hơn, một-view-nhóm, và-loại-bỏ-hàng-loạt-kèm-hoàn-tác; 17-khóa-
pipe.*-mới đổ-bộ-kèm-bản-dịch-sẵn trên-cả-19-bộ-từ-điển. - Reports v2 (CAR-118): tìm-kiếm-trực-tiếp với-các-bộ-lọc-dải-điểm/tính-hợp-lệ/công-ty/ngày, các-header-sắp-xếp-được (
aria-sort), một-view-thẻ-lưu-được-trạng-thái với-các-nút-hành-động-theo-dải, một-biểu-đồ-điểm-bấm-để-lọc, và-lượt-render-thống-nhất «Company — Role» / «x.x/5» (window.ReportOps); 31-khóa-rep2.*-mới đổ-bộ-kèm-bản-dịch-sẵn trên-cả-19-bộ-từ-điển.
Ghi chú
- Mọi-bản-sửa đến-qua-một-vòng-rà-soát kèm-bằng-chứng-đỏ→xanh; hai-phát-hiện-HIGH của-rà-soát-AI trên-r2-bundle-đầu-tiên (hash-đọc-ngắn, tính-nguyên-tử-các-bản-đồng-hành) được-đóng bởi-r3, và-các-vòng-CAR-143/CAR-144/CAR-142 mỗi-vòng đều-tái-xác-minh-các-phát-hiện-còn-mở của-vòng-tiền-nhiệm.
- Cố-ý-không-làm: view-cụm-bản-đồ vẫn-ở-CAR-125 (đang-xếp-hàng); khôi-phục-metadata-pipeline-phía-server là-một-ticket-riêng; không-bản-sửa-hồi-cố nào cho-nội-dung-đã-lưu dưới-các-trạng-thái-v1.259.0-trước-rev-2.
- Kiểm-thử 5988 (+165). Trình-duyệt 152 đỗ / 0 trượt / 1 bỏ-qua-tùy-chọn. Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter); 48-khóa-i18n-mới đổ-bộ cùng-lượt-fan-out-×19 của-chúng ngay-trong-chính-các-PR-tính-năng.
[1.259.0] — 2026-10-25
Đợt-phát-hành-thứ-hai-của-đội-agent, sáu-bản-sửa: ngày-báo-cáo được-ghim-phía-server, geocoder-bản-đồ cache và-đọc-các-thành-phố-RU, help ×18 trích-các-nhãn-nút-bút-đã-bản-dịch-hóa, các-câu-UI ngừng-trộn-ngôn-ngữ, các-lượt-so-sánh-lương được-tính-phía-server — và-bundle-JS được-phát-hành-sẵn-nén (tải-lạnh 3.1 MB → 598 KB).
Đã sửa
- Ngày-báo-cáo-bịa (CAR-101): prompt-đánh-giá giờ ghim-ngày-hôm-nay-phía-server (“trường Date: PHẢI chính-xác là
— chép-nguyên-văn; không-bao-giờ-bịa”), và fixReportDateviết-lại-một-ngày-lệch thành-hôm-nay tại-mọi-điểm-chấp-nhận (nhánh-Anthropic, tiến-trình-con-Gemini, phần-đuôi-tương-thích-OpenAI, /api/deep, auto-pipeline) kèm-một-cảnh-báo + bản-ghi-hoạt-động — một-lượt-sửa-chữa, không-bao-giờ-là-một-lượt-từ-chối. 349/789 báo-cáo-trên-máy-chủ-thật mang-ngày-bịa; các-báo-cáo-mới không-thể-nữa. - Geocoding-bản-đồ (CAR-105): các-chuỗi-thành-phố-Cyrillic của-các-dòng hh.ru/Habr giờ đến-được-bộ-geocoder; một-cache-có-giới-hạn-bền-vững (
data/geocode-cache.json, withFileLock) nghĩa-là một-thành-phố-đã-giải-tỏa không-bao-giờ gọi-nhà-cung-cấp-lần-hai; các-lời-gọi-geocode được-phân-bổ-ngân-sách-theo-mỗi-yêu-cầu để-bản-đồ lấp-đầy-từng-bước thay-vì-chặn-13.9 s. - UI-trộn-ngôn-ngữ (CAR-108): 23-rò-rỉ-theo-khóa được-sửa trên-17-trong-19-bộ-từ-điển (85-giá-trị) — «все matching», «только remote», «Открыть Scan», phễu-«Evaluated → Applied…» và-nhiều-hơn-nữa trở-thành-các-câu-đầy-đủ-đã-bản-dịch-hóa tái-sử-dụng-từ-vựng-sản-phẩm riêng-của-mỗi-locale.
i18n-no-latin-leaksđược-mở-rộng với-bảng-mảnh + probe-phễu (đỏ→xanh). - Lật-phán-quyết-tiền-tệ (CAR-109): lượt-so-sánh-lương được-tính-phía-server trong
comp-compare.mjsvà-nhúng-theo-một-dạng-quy-chuẩn (Candidate minimum: … per YEAR (raw: …)so-vớiJD offer: …); dạng-hàng-tháng ×12, k/к/тыс/萬 và-dạng-dấu-phẩy-thập-phân được-chuẩn-hóa trước-khi-so-sánh; một-lượt-chuyển-đổi-không-chắc-chắn không-bao-giờ một-mình lật-phán-quyết (case-zh-TW «€80–100k ниже минимума» đã-chết). Mô-hình không-bao-giờ-tự-nhân. - Nhãn-nút-bút help ×18 (CAR-107): các-bundle-help-đã-bản-dịch-hóa trích-các-nhãn-tiếng-Anh («⚡ Run live», «Save», «Scan now») mà-UI không-còn-hiển-thị — 263-lượt-thay-thế trên-18-locale được-ánh-xạ từ-mã-nguồn-các-view; trợ-lý-docs thừa-hưởng-bản-sửa-này.
Thêm mới
- Bundle-sẵn-nén + tải-lạnh-cache-được (CAR-104):
make-bundle.mjsphát-sinhbundle.js.br(brotli q11) +.gzvào-lúc-phát-hành; một-middleware-phạm-vi-bundle đàm-phán br > gz vớiVary: Accept-Encoding,public, max-age=300, must-revalidate+ ETag/304; được-bảo-vệ-theo-độ-tươi (một-bản-đồng-hành không-bao-giờ phục-vụ thứ-cũ-hơn-bundle-identity), các-lượt-lấy-artifact-trực-tiếp trả-về-404, CSP-giống-hệt-byte. Tải-lạnh: 3.1 MB → ~0.6 MB trên-đường-truyền (−80%); các-lượt-ghé-thăm-lặp-lại trong-5-phút truyền ≈0 bytes.
Ghi chú
- Tất-cả-các-bản-sửa đến-từ-đội-agent kèm-bằng-chứng-đỏ→xanh (13 + 28 + 1 + 30 + 7 case-mới trên-các-suite-của-chúng) và-được-rà-soát-làm-tròn (CodeQL #579/#580/#584 được-sửa trong-code — các-stub-URL được-parse qua
new URL().host, một-chuỗi-prompt-chết đã-bị-loại-bỏ). - Các-con-số-backfill-điểm của-v1.258.0 giờ được-ghi trong-CAR-129 (
updated: 22,reportScoreless: 159). - Cố-ý-không-làm: không-sửa-ngày-hồi-cố cho-349-báo-cáo-lịch-sử (một-backfill sẽ-là-thao-tác-được-chủ-sở-hữu-chấp-thuận), không-view-cụm-trên-bản-đồ (CAR-125 vẫn-xếp-hàng-phía-sau-bản-sửa-geocode này).
- Kiểm-thử 5823 (+74). Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter); không-có-khóa-i18n nào (CAR-108 chỉ-sửa-giá-trị-của-các-khóa-hiện-có).
[1.258.0] — 2026-10-25
Sáu-bản-sửa-của-đội-agent trong-một-đợt-phát-hành: bộ-đếm-công-ty của-#/scan ngừng-trộn-hai-vũ-trụ, nghiên-cứu-sâu đòi-buộc-nguồn-dẫn, lỗi-biểu-mẫu làm-sáng-cá-trường, các-trạng-thái-tải nhận-skeleton và-h1-tức-thời, và-các-lượt-đánh-giá cache phần-tiền-tố-prompt 37k-token của-chúng.
Đã sửa
- Bộ-đếm-«Công ty đang hoạt động» của-#/scan (CAR-100): tử-số đếm-các-công-ty-phân-biệt trên-TẤT-CẢ-các-dòng-kết-quả (1554 trên-máy-chủ-thật — riêng-hh.ru đã-đóng-góp-hàng-trăm) trong-khi-mẫu-số đếm-các-công-ty-tracked-có-hỗ-trợ-API (~90) — hai-vũ-trụ trong-một-phân-số. Phương-án-ghép-cặp-(a): tử-số giờ đếm-các-công-ty trong-các-dòng mà-lượt-quét-tracked-có-hỗ-trợ-API tự-nó đã-lấy-về (khớp bằng
_entry ?? company; các-dòng-nhà-tuyển-dụng hh.ru/telegram rơi-ra ngoài); bộ-dự-phòng-trước-quét được-chuyển vào cùng-vũ-trụ (nó có-thể-hiện «104/90»). - Bịa-đặt trong-nghiên-cứu-sâu (CAR-110): prompt-deep giờ mang-một-hợp-đồng-ràng-buộc-cứng — mọi-kiến-định-sự-thật kết-thúc bằng
[source: domain.com](không-nêu-được-tên → không-nói-ra; bịa-một-marker còn-tệ hơn-viết “unknown”), các-sự-thật không-rõ được-viếtunknown, và-báo-cáo BẮT-BUỘC kết-thúc bằng-một-mục## Data freshness. Các-mỏ-neo-độ-mới: ngày-UTC-hôm-nay + một-trường-url-của-công-ty-tùy-chọn trênPOST /api/deep(có-giới-hạn, không-bao-giờ được-lấy-về-phía-server). - Lỗi-biểu-mẫu làm-sáng-cá-trường (CAR-130): một-POST-thất-bại đánh-dấu trường-biểu-mẫu-đầu-tiên
aria-invalid+.is-errorvà-tập-trung vào-nó (WCAG 3.3.1); xóa-đi-khi-chỉnh-sửa. Gợi-ý-lỗi-mạng nhận-biết-hình-thức-triển-khai — loopback giữ-gợi-ý-lệnh-dev, một-origin-đã-triển-khai nhận-«Máy chủ không phản hồi» thay-vì-lời-khuyênbash web-ui/bin/start.md(banner-kết-nối cũng-mang-cùng-lời-khuyên-ghim-cứng ấy). - Các-trạng-thái-tải (CAR-112): #/map và-#/tracker render-h1 của-chúng ngay-lập-tức (đích-tập-trung-của-router chỉ-tồn-tại sau-khi-dữ-liệu-đến) và-một-helper-skeleton-dùng-chung (
Skeleton.rows, các-hàng-shimmer-aria-hidden bên-trong-một-vùng-role="status"tái-sử-dụngcommon.loading) thay-thế văn-bản-«Đang tải…»-trần-trụi trên-tracker, kết-quả-quét và-khung-map;prefers-reduced-motiondừng-hiệu-nhấp-nháy. - Cache-prompt-của-trang-đánh-giá (CAR-111):
buildEvaluationPromptPartstách prompt ~37k-token thành-một-phần-tiền-tố-bền-byte (CV + profile + các-tệp-mode + hướng-dẫn) và-phần-đuôi-JD; đường-Anthropic gửi[prefix + cache_control: ephemeral] + [JD]— phần-tiền-tố được-tính-tiền theo-mức-giá-đọc-cache (rẻ hơn ≈10×) ở-mọi-lời-gọi sau-lời-gọi-đầu-tiên. Phần-tiền-tố-thiếu/không-khớp fail-open về-yêu-cầu-cũ-giống-hệt-byte; cascade-tương-thích-OpenAI không-bị-động-đến (caching-phía-server ở-đó).
Ghi chú
- Cả-sáu-bản-sửa đến-từ-đội-agent kèm-bằng-chứng-đỏ→xanh (5 + 7 + 7 + 7 + 8 case-mới) và-các-vòng-rà-soát; các-cảnh-báo-CodeQL-đầu-tiên của-CAR-111 (#579/#580) được-sửa-ngay-trong-code — stub-kiểm-thử parse-host-của-URL thay-vì-khớp-chuỗi-con, và-một-chuỗi-prompt-đầy-đủ-không-dùng-đến đã-bị-loại-bỏ.
- Backfill-điểm đã-chạy trên-máy-chủ-thật (endpoint v1.256.0, được-chủ-sở-hữu-chấp-thuận):
updated: 22,missingReport: 0,reportScoreless: 159— 159 dòng-không-có-điểm trỏ-về-các-báo-cáo mà-header ra-đời trước-khối-máy hoặc-mang-định-dạng-điểm-không-parse-được; chỉ-hồi-được bằng-đánh-giá-lại hoặc-một-lượt-parser-rộng-hơn (được-ghi trong-CAR-129). - Cố-ý-không-làm: không-đổi-nulls-last cho-cột-commute (một-quirk-
Infinity-khi-giảm-dần có-từ-trước), không-tính-lại-giá-hồi-cố cho-các-dòng-usage cũ, không-highlight-kiểu-.is-errorcho-các-biểu-mẫu-bộ-lọc-quét (CAR-130 giới-hạn ở-helper-submit-dùng-chung của-mode-page + gợi-ý-api.js). - Kiểm-thử 5749 (+36). Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter); không-có-khóa-i18n nào (gợi-ý CAR-130 tái-sử-dụng
conn.down; vùng-skeleton tái-sử-dụngcommon.loading).
[1.257.0] — 2026-10-25
Hai-bản-sửa-của-đội-agent: trợ-lý-docs trong-ứng giờ hiểu chữ-Devanagari và-tiếng-Tamil, và-trang-usage cho-thấy Hermes thực-tế tốn-bao-nhiêu.
Đã sửa
- Truy-hồi-của-trợ-lý-docs cho hi/ta (CAR-103): lớp-ký-tự-từ của-bộ-tokenizer-từ-khóa docs-assistant là
[\p{L}\p{N}\u30fc]+— không-có-dấu-kết-hợp. Mỗi-matra-Devanagari (ा ै ्…) và-mỗi-dấu-nguyên-âm-Tamil (ே ை ்…) cắt-một-từ thành-các-mảnh; quy-tắc-độ-dài bỏ-các-mảnh-ngắn (một-truy-vấn-tiếng-Hindi khớp 0 mục) và-các-từ-dài-hơn bị-chặt-đầu thành-rác va-chạm với-các-mục-không-liên-quan. Lớp-ký-tự giờ giữ\p{M}; đường-bigram-CJK không-bị-động-đến. Truy-vấn-hi «मैं स्कैन कैसे चलाऊं?» và-ta «ஸ்கேன் எப்படி இயக்குவது?» truy-hồi đúng-các-mục từ-các-bundle-đóng-gói-sẵn. - Chi-phí-usage của-Hermes (CAR-106):
normalizeUsage()gộp-usage-của-nhà-cung-cấp xuống{in, out}và-bỏ-lặng-lẽ trường-costdo-gateway-báo —#/usagehiện $0.0000 trên 9.5 M token Hermes (hàng-bảng-giá của-nó là 0/0). Hình-thạng-bản-ghi-usage có-thêm trường-tùy-chọncost?tương-thích-ngược; bộ-tổng-hợp ưu-tiên chi-phí-do-nhà-cung-cấp-báo của-từng-bản-ghi và-chỉ-hạ-về-ước-tính-từ-bảng-giá khi-trường-vắng-mặt; các-giá-trị-rác/âm bị-bỏ, không-bao-giờ-bị-bịa.
Ghi chú
- Cả-hai-bản-sửa đến-từ-đội-agent kèm-bằng-chứng-đỏ→xanh (3 + 5 case mới; 14/14 và-10/10 xanh; các-case-lân-cận 78/78 và-61/61). Các-PR-đầu (#470/#471) mang-một-base-worktree-lỗi-thời xung-đột với v1.256.0-vừa-được-squash-merge — bị-thay-thế bằng-các-cherry-pick-sạch (#472/#473).
- Cố-ý-không-làm: không-tính-lại-giá-hồi-cố cho-các-dòng-
data/llm-usage.jsonllịch-sử (chúng-không-mang-trường-chi-phí; chỉ-các-bản-ghi-mới được-hưởng). - Kiểm-thử 5713 (+8: docs-assistant ×3, usage ×5). Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter); không-có-khóa-i18n nào.
[1.256.0] — 2026-10-25
Chất-lượng-dữ-liệu-tracker: vị-trí không-bao-giờ-được-ghi thành-công-ty, một-bảng-việc-làm không-bao-giờ-được-ghi thành-nhà-tuyển-dụng, các-dòng-không-có-điểm ngừng-nổi-lên-đầu — và-một-endpoint-một-lần-chạy backfill các-điểm-còn-thiếu từ-chính-các-báo-cáo.
Thêm mới
- Backfill-điểm (CAR-129):
POST /api/tracker/backfill-scoresđiền ô Score của-các-dòng mà-báo-cáo-liên-kết mang-một-điểm-parse-được (181 dòng-đã-đánh-giá có-báo-cáo nhưng-không-có-điểm). Các-dòng-đã-có-điểm, các-sentinel-tường-minh (N/A), các-dòng-không-có-báo-cáo và-các-báo-cáo-không-có-điểm không-bao-giờ-bị-động-đến; chỉ ô Score được-viết-lại, dưới-khóa-tệp; hình-thạng-điểm được-xác-thực ngay-tại-điểm-ghi và-chuẩn-hóa theo-quy-ước-X.X/5của-tracker; lượt-chạy là-idempotent và-trả-về{ok, updated, missingReport, reportScoreless}.
Đã sửa
- Vị-trí không-bao-giờ-là-công-ty (CAR-128):
guessCompanyRolecoi-bên-TRÁI của-một-dòng-tiêu-đề-có-dấu-gạch là-công-ty, nhưng-các-bảng viết-cả-hai-thứ-tự — “Senior Frontend Engineer - Grafana Labs” bị-ghi chức-danh THÀNH-công-ty (13 dòng: Grafana, CircleCI…). Một-heuristic-từ-khóa-chức-danh có-biên-từ giờ chọn-bên-chức-danh, và-một-loại-hình-việc-làm không-bao-giờ-trở-thành-nhà-tuyển-dụng (“Senior Engineer - Remote (EU)” không-ghi-gì-cả thay-vì-ghi “Remote (EU)”). - Một-bảng-việc-làm không-bao-giờ-là-nhà-tuyển-dụng (CAR-127): bộ-dự-phòng-slug-tên-miền ghi-các-dòng-hh.ru là-“hh” (120 dòng). Các-slug-
hh/habrgia-nhập danh-sách-không-phải-nhà-tuyển-dụng; suy-diễn-nhà-tuyển-dụng-giữa-câu (“в компании X”, “X ищет”) giờ cũng chạy cho-các-host-bảng-việc-làm (hh.ru/kz/uz/by, habr.com) — nơi-văn-bản-trang nêu-tên-nhà-tuyển-dụng-thật. Nguyên-nhân-gốc được-tìm-thấy trên-quá-trình: các-\b/\w-ASCII trong-các-mẫu-suy-diễn ấy chưa-bao-giờ khớp-chữ-Cyrillic — chết-lặng-lẽ từ-v1.248.4; lookbehind-Unicode và-các-lớp-\p{L}thay-thế chúng. - Các-dòng-không-có-điểm xếp-cuối (CAR-129): sắp-xếp-điểm của-tracker dùng-sentinel-
-1, nên-với-sắp-xếp-tăng-dần-mặc-định mọi-dòng-không-có-điểm nổi-lên-trước mọi-dòng-có-điểm. Giá-trị-null giờ xếp-cuối ở-cả-hai-hướng (bộ-LỌC-điểm giữ--1của-nó — “không-có-điểm trượt-một-bộ-lọc ≥4” là-ngữ-nghĩa-đúng ở-đó).
Ghi chú
- Các-dòng-lịch-sử KHÔNG-được-di-cư bởi-bản-phát-hành-này: các-bản-sửa-parser áp-dụng cho-các-lượt-đánh-giá-mới; điểm có-thể-lấy-lại qua-endpoint-backfill, trong-khi 120-ô-nhà-tuyển-dụng-“hh” cần-đánh-giá-lại, chứ-không-phải-một-lần-viết-lại.
- Một-vòng-rà-soát-opus-5-5 được-gộp-vào: mẫu-“X ищет” không-có-mỏ-neo đã-bị-loại trước-khi-phát-hành (bất-kỳ-cụm-viết-hoa nào trước-động-từ đều-sẽ-bị-ghi là-nhà-tuyển-dụng — bất-biến-không-bịa), các-mỏ-neo-“В…”-đầu-câu được-thêm, và-bộ-viết-backfill kiểm-tra-lại-ô-đích (các-dòng-
#-trùng tồn-tại sau-các-sửa-tay), giữ-nguyên-số-cột của-một-dòng-ngắn-bị-hỏng-bằng-tay, và-dừng ở-dòng-không-phải-bảng-đầu-tiên. Dấu-chấm bên-trong-một-tên-có-dấu-chấm (“Сбер. IT”) không-thể-phân-biệt với-dấu-chấm-câu cho-mỏ-neo-“в компании” — tiền-tố-bảo-thủ (“Сбер”) được-ghi; mẫu-neo-động-từ bắt-được-dạng-đầy-đủ. - Cố-ý-không-làm: không-trích-bộ-so-sánh từ-
tracker.jsra-một-lib-kiểm-thử-được (cổng-source-static giữ-nguyên; được-ghi trong-CAR-129 như-một-tiếp-nối), không-đổi-nulls-last cho-cột-commute (một-quirk-Infinity-khi-giảm-dần có-từ-trước), không-di-cư-dữ-liệu cho-các-dòng-“hh”. - Kiểm-thử 5705 (+10: 5-identity trong-
auto-pipeline-jd-gate, 2 cho-CAR-128, cổng-sắp-xếp-CAR-129, 4-backfill kể-cả-việc-ghim-đường-dẫn-địch — trừ-các-case-v1.248.x-bị-thay-thế). Không-chạm-nguồn-quét nào (registry 121 = 116 EN + 5 RU · 116 adapter); không-có-khóa-i18n nào.
career-ops-ui v1.267.1 · page 1/10 · mirror of the project changelog for cvstart.org