更新日誌
GitHub每一項重大變更,逐版記錄。同一份檔案隨儲存庫發布,並已翻譯為全部 19 種語言。
[1.267.1] — 2026-11-04
修復
- 發布列車修復(v1.267.0 的 CI 關卡) — PROJECT-CONTEXT 的測試計數鏈不再於 v1.267.0 頭部斷裂(eval grader 匹配的箭頭格式),QA 提示詞重新組織(每個 release 一個活提示詞,v1.266.0 已封存),逐檔案覆蓋率抬到 98/90 ratchet 之上:applicantpro 的 salary 渲染器移除一個不可達的 fallthrough(salaryRangeOf 可證明只產出 undefined、{min}、{max} 或 {min,max}),單邊 ≥/≤ 分支現經 fetch 流程釘住,board-response-cache 套件釘住 no-store 繞過、呼叫方對未儲存板提供的 304、以及 MAX_ENTRIES 驅逐。
- 測試:即時計數為 7395(v1.266.0/1.267.0 波次的套件包含的規格比早期筆記記錄的更多——鏈重新錨定到實測底線:波次後 7392,本修補 +3 個門控測試);覆蓋率 98.51 行 / 90.35 分支。
備註
-
v1.267.0 標籤保留指向紅色合併提交——不重新指向(伺服器拒絕重新指向的標籤);v1.267.1 是部署載體。
-
v1.267.0 列車的補丁修復:CI 關卡全綠,程式碼樹無實質變更。
[1.267.0] — 2026-11-04
新增
- 四個新的掃描來源 — GermanTechJobs、Darwinbox、Keka、ApplicantPro/isolved(註冊表 125 → 129 = 124 EN + 5 RU · 124 adapters) — 針對 career-ops @
7d8feb6d(87 個 upstream 提交)的第二波 parent-sync 浪潮。GermanTechJobs(#6346):germantechjobs.de/rss的全站 RSS(單一請求約 626 筆項目);雇主取自標題的最後一個" @ "段 — 標題缺該段的職缺直接丟棄,絕不歸到板名下;僅限顯式provider:選用。Darwinbox(#6416):<tenant>.darwinbox.in背後免認證的alljobsJSON,公司 id 來自招募頁 URL,分頁 POST 遍歷(50/頁,max_pages20/200),短頁停止點讀自來源自身的列數。Keka(#6199):兩個請求 — 一個以redirect:'manual'取得的招募頁外殼,其腳本指名 feed UUID(未知租戶 302 到TenantNotFound.html,讀作具名 404),接著以單一 embed-jobs 陣列取回全部在招職缺。ApplicantPro / isolved(#6252):從 bootstrap 取得數字型domainId,再取{success, data:{jobs, jobCount}};jobCount > rows時警告列表不完整;可選的applicantpro: { fetchDetails: true }以 250 ms 節流經 JSON-LD 補充細節。 - ETag 板回應重用(#6105) — 同一次掃描內,15 分鐘內取得的板回應原樣重用,較舊的以
If-None-Match重新驗證(304 時保留原 body);快取鍵涵蓋 method + URL + 憑證標頭 + body,重疊的讀取合併到進行中的 promise,CAREER_OPS_HTTP_CACHE=0/_TTL_MS可覆蓋此行為。快取存在於每輪掃描的記憶體內(web-ui 沒有磁碟快取契約)— 已記錄為一處偏離。
修復
- 四個板補上日期(#6274) — remoteok、remotive、workingnomads 與 IBM 現在都輸出發布日期,「Posted within」過濾器在這些板上生效;remotive 的 naive 時間戳以 UTC 正規化(其因機器而異的時效計算 bug 是真實在線上發生的),IBM 的
_source實際請求dcdate。 - 拼錯的 portals.yml 鍵會被拒絕(#6107) — EN 掃描現在在任何 fetch 之前就擲出具名錯誤(檔案 + 鍵 + 最接近鍵的建議,Levenshtein ≤ 2),而非默默忽略
titel_filter:。 - getro 繼續走過舊的 featured 釘選(#6406) — 釘選的過時職缺仍被丟棄,但不再終止分頁;遍歷在真正的短頁上結束。
備註
- 有意未做:RU 掃描器的已見過濾器不具語言感知,其 portals 解析路徑也不執行拼錯鍵關卡(交接記錄在浪潮規格中 — 目前尚無 RU 板輸出按語言區分的列);remoteok 保留帶時區位移的日期字串而不做 UTC 正規化(其 live shape 是確定性的)。測試 7096 → 7243;Playwright 173 pass / 0 fail / 1 opt-in skip;註冊表 129 = 124 EN + 5 RU · 124 adapters(全部計數關卡由活註冊表再生)。
[1.266.0] — 2026-11-01
新增
- Personio 語言版本不再互相吞併(CAR-223:parent #4789 + #5044 + #5285) — 先前延後的整組變更,此次以獨立發布執行。掃描側(#4789):
scan_history.dedup_include_language: true(嚴格 opt-in — 關閉時逐位元組相同)讓同一職缺的語言版本透過已見歷史的變體機制(languageFormsFromUrl/recordUrlVariant/isUnseenLanguageVersion)在去重中存活;canonical 鍵會剝除language/lang/locale參數。preferred_languages(#5285):把職缺的版本列按偏好優先排序(穩定排序;平手時按 provider 順序)— 與該開關無關(關閉時保留偏好版本,開啟時按該順序保留每個版本),並附validatePreferredLanguages(validate-portals 的移植)。personio fan-out(#5044):招募頁的取得不再強制帶?language=en(租戶自身的?language=xx會被尊重),並為每個語言版本輸出一列,帶language+?language=<code>的 URL;dedupIncludeLanguage會追加按語言的取得(上限 5,帶節流);/xml 與職缺連結的回退路徑不變。recruitee 獲得相同的language輸出 +preferred_languages(來自 opts 或條目)。共用輔助函式位於server/lib/language-preferences.mjs。
備註
- 已記錄交接、有意未做:RU 掃描器的已見過濾器不具語言感知,且目前尚無 RU 板輸出按語言區分的列;用戶端
url-key.js鏡像與 portals 路由的驗證接線仍待完成。測試 7096 → 7203;註冊表不變 125 = 120 EN + 5 RU · 120 adapters。
[1.265.0] — 2026-11-01
新增
- 兩個新的掃描來源 — Apple 與 Bulldogjob(註冊表 123 → 125 = 120 EN + 5 RU · 120 adapters) — 針對 career-ops @
fe857ecf的 parent-sync 浪潮。Apple(jobs.apple.com,#5496 + #6196):站點是 React Router SSR 應用且沒有可用的 JSON API,因此來源讀取普通搜尋路由的水合資料塊(window.__staticRouterHydrationData);發現由條目驅動(apple.queries按相關性排序的文字軸 +apple.teams團隊 slug 軸,無預設值 — 二者皆缺的條目會擲錯),頁數由max_pages限制(預設 2,上限 50),頁間 200 ms 節流,URL 每個段都做防孤立代理編碼,被 Apple 標為 PIPE 的職缺在 snippet 中帶「可能是人才儲備庫」提示 — 不據此過濾。Bulldogjob(bulldogjob.pl,#6253):波蘭技術板同樣沒有 JSON API — 列表頁內嵌__NEXT_DATA__(50/頁,totalCount);條目的careers_url是使用者在站點上建構的搜尋(過濾器在路徑裡),每個請求都帶顯式/page,N,遍歷在短頁、報告的 total 或max_pages(預設 25,上限 100)處停止,部分板會帶截斷標記。 - IBM 分頁重構(#6273) — 固定的 600 筆遍歷改為
max_pages(預設 20,上限 300,條目可覆蓋),頁間 200 ms 節流,逐頁經fetchJsonWithRetry重試;第一頁失敗即擲錯,後續頁失敗保留已收集並點名頁碼,只有在自己上限處仍是整頁時才警告「raise max_pages」。
修復
- justjoin 以
lastPublishedAt計算職缺日期(#6254) — 候選人 API 的publishedAt在雇主每次重新整理時前移,導致大部分板都帶今天的日期,max_posting_age_days放行了數週前的舊職缺;現在以較早的發布日期為準,缺失或無法解析時回退。 - jobvite 摺疊共享同一 posting URL 的列(#6127) — 公共 feed 會為同一個 detail URL 每個城市回傳一列
<job>;解析器此前保留第一個城市、其餘被掃描器當作重複。現在兄弟列只貢獻地點,按 feed 順序以·連接,保留首個標題/日期,remote 依據合併後的地點重新判定。 - Liveness:新增 UltiPro 執行級(#6090) — UKG 沒有按職缺的 JSON 端點且對已關閉職缺也回傳 200,因此全部 57 條已關閉的 UltiPro 職缺讀作 uncertain。詳情頁內嵌記錄:
OpportunityIsClosedtrue/false → expired/active,「opportunity unavailable」提示 → expired,其餘交給瀏覽器。Built In 的「Sorry, this job was removed」橫幅成為 hard-expired(#6336) — 頁面保留完整 JD 與 APPLY 控制項;現在橫幅勝出,而沒有「sorry」的兄弟「Job removed」徽章不符。
備註
- 有意未做:jobvite 修復中 parent 側 scan.mjs 地點編譯器的那一半(web-ui 將 USPS 編譯器記錄為 no-port),以及父專案為 Apple PIPE 提示設定的
note欄位(web-ui 的 job shape 沒有note;它隨snippet攜帶)。測試 7096 → 7135(+39);Playwright 173 pass / 0 fail / 1 opt-in skip;coverage gate ≥ 98/89;註冊表 125 = 120 EN + 5 RU · 120 adapters(全部計數關卡由活註冊表再生)。
[1.264.3] — 2026-11-01
修復
- 限流強化浪潮(
REVIEW-2026-10-31-v1.264.1的 LOW №1–3) —writeRateLimit()(express-rate-limit@7.5.1,60 req/min route×IP,429 JSON + Retry-After)現已覆蓋全部 47 個變更型端點(此前僅 2 個):替換 9 個作用域錯位的llmRateLimit守衛(/api/config— 會重寫.env!、PUT /api/batch、/api/batch/merge、outcome、followup/seed、assessments、stats/snapshot、mock-interview/save、networking/save),在最昂貴的路徑上於 LLM 桶之前堆疊 3 個(/api/evaluate、/api/deep、/api/auto-pipeline),並為 33 個裸註冊接線(CV/profile/modes 編輯器、tracker 的全部寫入、pipeline POST/restore/DELETE、jds、7×/api/run/*一處迴圈修改、posting-guard、Playwright-PDF inline、portals toggle/health/track、discover、reports、export/docx、two-pager、career-plan、memory 以及三條 DELETE 路由)。/api/apply-helper保持在 allowlist 中不限流(純本地運算,已固定);16 條純 LLM 路由按設計保留條件性 LLM 桶。完備性 tripwire(tests/rate-limit-coverage.test.mjs,以 27 個裸註冊 red-first 起步)會在未來出現任何未限流的變更型註冊時讓 CI 失敗。 TRUST_PROXY可選啟用 + 重新武裝的驗證(LOW №1–2) —app.set('trust proxy', N)接受 env 的 hop-count(絕不為布林true— 否則將按攻擊者可控的 XFF 左端建構鍵);預設不設置,loopback 保留按套接字取鍵的既定退化。validate: false改為定向的writeValidateConfig():僅關閉xForwardedForHeader(無 trust proxy 時忽略 Caddy 的 XFF 正是設計);其餘驗證 — 包括trustProxy— 重新發聲,因此未來trust proxy: true的誤配置會以ERR_ERL_PERMISSIVE_TRUST_PROXY顯現而非沉默。自訂keyGenerator被有意移除:express-rate-limit 將其代理驗證綁定到預設鍵產生器,且按路由隔離不變(每次工廠呼叫一個MemoryStore)。- cvstart.org 複製回饋保持 2 秒(CAR-141) — 「Скопировано ✓」狀態現按驗收標準保持 2 秒(此前 1.5 秒),red-first 固定於
tests/site-copy-feedback.test.mjs。這關閉了 CAR-141 最後一個可由代理修復的標準;示範影片的重錄由所有者決定推遲。
變更
- 說明文件宣告 19 種語言(×19) — §19 «Localizing the app» 與 §32 «Run it from OpenWorker» 的句子不再落後兩種語言:每個 bundle 現在寫 19,並按各檔案自己的列舉風格加入 தமிழ் 與 Tiếng Việt(ar 採用拼寫的「التسع عشرة」),
vi.md§32 自身的「cả-17」殘餘也已修正。結構關卡(33 H2 / 125+ H3)位元組穩定。 - 狀態衛生 —
AGENTS.md註明 v1.264.2 / 7082 tests(此前 v1.86.x / 1566);PLAN.md將交付 1–7 標記為 Shipped,其列車段落寫 docs ×19;StatsBar.astro的註解描述facts.adapters真正保存的內容(123 = 來源總數,歷史鍵名為消費者保留);i18n.js標頭寫 19 種語言;QA 提示 v1.264.2 載有真實覆蓋率(98.45/90.05)和 Playwright 算術(176 = 174 harness + 1 opt-in skip + 2 個腳本級套件)。
備註
- 有意未做:按已記錄的 port-list 進行的 parent-sync 浪潮仍留在 BACKLOG — fork 必須先同步過 upstream
a9476866(列表 10 個提交中有 7 個尚不在父專案本地樹中;IBM/UltiPro/Bulldogjob/apple 規模 S–M,personio language-dedup 推遲至其獨立交付)。CAR-141 示範影片的重錄由所有者有意推遲(«видео не надо пока»,2026-11-01)。 - 測試 7082 → 7096(+9 覆蓋率 tripwire + 5 trust-proxy);Playwright 173 pass / 0 fail / 1 opt-in skip(在既有案例內 +2 個 chevron 固定);coverage 98.46 line / 90.10 branch;evals 14/0/1skip;註冊表不變 123 = 118 EN + 5 RU · 118 adapters。
[1.264.2] — 2026-11-01
修復
- 側邊欄群組標題加入截斷契約(CAR-219) — 群組切換標籤(
.nav-v2-toggle > span)現在以省略號截斷,並透過與 CAR-203 導覽項目相同的syncLabelTitles()機制攜帶本地化的工具提示;chevron 永不縮小、切換保持可點擊、RTL 維持成立。red-first 釘選在tests/nav-v2.test.mjs(+1 → 7082 個測試)。
變更
- cvstart.org 文案以全部 19 個語言出貨(CAR-220) —
meta.helpDesc、helpTeaser.c1.desc與faq.a2在每個網站語系都有翻譯(v1.264.1 中它們按設計僅限 EN);GitHub Pages 已把升級後的文案線上發佈到 cvstart.org。 - Backlog + 審查衛生(CAR-221/222) — 六個「待上游合併後移植」項目結案:全部七個上游 PR 已合併,四個項目早已移植,兩個屬父專案端。
docs/reviews/REVIEW-2026-10-31-v1.264.1.md落地(0 HIGH / 0 MED,三個 LOW 後續記錄在 BACKLOG),且 parent-sync 移植清單已記錄在案(6 PORT / 3 VERIFY / apple 來源缺口;上游尾部 118 個提交 @ VERSION 1.38.0)。
備註
- 變更日誌鏡像蓋章修復(
92a05fcf)隨本標籤同行:cvstart.org 上每個分頁鏡像現在都攜帶生成它的發行版本,所以site-build-after-fanout評分器終於執行其真實邏輯而不是跳過。 - 刻意不做:節流其餘的變更性 POST(審查 LOW №3)與 trust-proxy 桶耦合 — 記錄在 BACKLOG,留給下一波加固。CAR-141(示範影片)仍屬負責人。
- Tests 7081 → 7082(+1 CAR-219 釘選);Playwright 176;註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.264.1] — 2026-10-31
修復
- 側邊欄膠囊優雅地截斷過長的本地化標籤(CAR-203) — 導覽標籤 span 現在是名正言順的 flex 成員(
v2-nav.css中的min-width: 0+overflow: hidden+text-overflow: ellipsis+nowrap),且nav-v2.js的syncLabelTitles()透過同一個data-i18n鍵把本地化標籤鏡射進工具提示(零個新 i18n 鍵)— 長長的「Профинансированные компании」重新可以透過懸停讀取,而不是被該列的overflow: hidden硬性裁掉。44 px 的觸控目標、啟用著色與 RTL 鏡射都不動;red-first 釘選在tests/nav-v2.test.mjs。 - 每個語系統一 480 s 評估上限(CAR-218) — remote-QA v1.264.0 在
es與zh-CN上抓到瞬時的502 · 300 s · 0 ch評估(抽測重跑通過了,但那道牆是真實的)。EVAL_TIMEOUT_MS現在是480_000,且evalTimeoutMs(lang)無條件回傳它 —GEMINI_EVAL_TIMEOUT_MS與 auto-pipeline 一併繼承。CAR-174 的語系感知 token 預算(16384 / 32768)仍是唯一的逐語系切分。
變更
- cvstart.org FAQ 攜帶精確的來源計數(CAR-217) —
{sources} job-board sources: {sourcesEn} international boards plus {sourcesRu} Russian ones由facts.json替換,而facts.json是從線上註冊表生成(123 = 118 EN + 5 RU),所以數字永不漂移;仍停在舊~{adapters}措辭的語系繼續透過adaptersRounded四捨五入。EN 文案升級順帶而來(meta.helpDesc、helpTeaser.c1.desc、faq.a2點名指令選單、帶復原的分組 pipeline 與 kanban 追蹤器)。
備註
- 刻意不做:本版本的網站 i18n 文案升級(
meta.helpDesc/helpTeaser.c1.desc/faq.a2)僅限 EN — 其他語系在下一波文件浪潮前維持正確但較圓潤的措辭(已翻譯者的faq.a7獲得精確計數佔位符)。CAR-141(示範影片)仍屬負責人;被取代的car136/m141分支已刪除,其想法記錄在 Linear 任務上(可透過標籤archive/car136-m141找回)。 - Tests 7041 → 7081(CAR-203 釘選 + CAR-218 釘選重寫);Playwright 176;註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.264.0] — 2026-10-31
新增
- 追蹤器列內狀態編輯 —
#/tracker每列的狀態徽章現在是一個緊湊的<select>,列出規範階段(來自GET /api/tracker/stages,絕非硬編碼白名單)。POST /api/tracker/status在applications.md鎖下中繼父專案的正式set-status.mjs(經states.mjs做狀態白名單、--dry-run/--note透傳、帶淨化細節的 fail-soft 502、argv 陣列 spawn)。成功就地更新該列(tone 類別 + 分頁計數、焦點保留);失敗則還原並彈出 toast。中繼無法處理的列 — 手工改出來的未知狀態、回填哨兵編號#— 保留唯讀徽章(route-review 的 LOW 修復;審查者:無 HIGH/MED 發現)。 - 伺服器警告浮現於每個 AI 頁面 —
evaluate、deep、auto-pipeline(頁面與彈窗)、career-plan、market、cv-studio(humanize + tailor)現在把伺服器的warnings陣列(輸出 token 截斷、語言漂移、日期修正)渲染為badge-warn橫帶(role="status");auto-pipeline 彈窗不再丟棄 done 幀的警告。新鍵llm.truncatedNotice×19。 - 覆蓋率浪潮(+111 個測試) —
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.mjs×3 與tests/sources-habr.test.mjs);分支地板維持 ≥ 90 %。 - Linear CAR-191…216 結案包(
docs/reviews/2026-10-30-linear-car191-216-closure-bundle.md)— 給負責人的即貼即用結案文件,附每個 CAR 的提交 SHA 與證據評論。
修復
- Trudvsem 掃描源 — 空頁(
results: {},也包括「越過末尾」)不再殺死整個掃描(乾淨的零列);API 錯誤信封(HTTP-200 帶status: 500)以 API 自己的文字拋出;分頁改走逐筆記錄的 offset(原本是頁索引 — 頁面被默默重複,只有約 52 個職缺而非數百個);行走會停在 API 的深 offset 失效區之前(offset × limit ≥ 10000)。已通過線上端到端驗證。 - habr — 標題/公司在實體解碼之後才剝除標籤(與 hh.mjs 對齊):卡片標題中的
<script>不再能以活體標記抵達掃描列;標題中合法的>>得以存活。 - PUT /api/profile(原始路徑) — 缺少非空
full_name的candidate:區塊會被拒絕,與欄位合併路徑同一陣線(過去會把full_name: null持久化)。 - 提示的真實性 —
.doc從 CV 上傳接受清單與cv.uploadHint×19 中移除(解析器從未支援過它);config.openaiModelHint×19 點名gpt-5(伺服器把任何*-codexid 對映到它);config.anthropicModelHint×19 與 Anthropic 預設現在鏡像父專案的層級 — 預設claude-sonnet-5-5、premiumclaude-opus-5-5。 - Claude Code 文件連結 →
code.claude.com(舊的docs.anthropic.com/en/docs/claude-codeURL 在連結閘中拋 TypeError)。 - help ×19:行密度項目已消失(該切換於 v1.263.0 離開 UI),並修復 18 組斷裂的
**粗體**span 家族 — 另外修復 ×19 的渲染器洩漏類(每個表格-後接段落之後的第二個空行;豎線符號移出粗體儲存格):全部 19 份 help 捆包渲染中零個字面**。
備註
- Anthropic 預設模型已變更為
claude-sonnet-5-5(父專案的標準層級)。依賴舊的沉默預設(claude-sonnet-4-6)的部署會自動升級 — 在.env釘住ANTHROPIC_MODEL即可退出。 - 刻意不做:兩個 LOW 級審查小瑕疵刻意留白(行內下拉不鏡像 kanban 的
movesReady降級 — 每次失敗都誠實彈 toast 是選定的行為;code: 'timeout'分支仍由 fake-writer 契約覆蓋,而非 >30 s 的測試)。CAR-141(示範影片)仍屬負責人。 - help ×19 在 v1.263.0 出貨後於
main上獲得了發行後文字巡檢(移除密度項目、修復渲染器洩漏類)— 本版本是第一個攜帶它的標籤。 - 本標籤還包含:證據信心晶片基礎(報告解析器 + 檢視徽章)、fix-report-links 執行器(
POST /api/runners/report-links,#/health上的「修復」卡片)以及含用量記錄的批次成本估算/確認——在分支切出與打標籤之間進入 main。
Tests 6905 → 7041 (+136) · Playwright 176(173 通過 / 1 自願略過) · 覆蓋率 98.5 % 行 / 90.1 % 分支 · 註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.263.0] — 2026-10-30
新增
- 動效打磨層 — 新的
motion.css(app 的最後一張樣式表):modal/popover 進場(縮放 .97 + 淡入,130–180 ms)、toast 彈簧進場 + 柔和離場狀態、主題切換按壓彈簧、chip/tab 按壓 scale(.97)、stagger 基礎設施(50 ms 步進、上限 12)、路由切換的.page-enter淡入(router)、chip/tab 的 focus-halo 過渡。每條規則都對prefers-reduced-motion安全(位移降為 none,透明度/顏色保持)。 - 觸控正確性 — 68 條 hover-lift 規則過去未加防護:觸控裝置在點按後會留下一張「被抬起」卡住的卡片。所有 transform hover 現在都以
@media (hover:hover)加閘(motion.css 中和器),且卡片抬升只套用在真正可互動的卡片(.card:has(a)、a.card、button.card、[role=button].card)— 靜態卡片不再出現假的互動暗示。 - 無障礙:每個控制項都有程式化名稱。 新的
A11yDump輔助器為全部 16 個唯讀 LLM 輸出傾印命名;12 個只有 placeholder 的欄位(CV Studio ×6、config ×2、scan 搜尋、tracker 分數下拉、outcome 備註、計畫編輯器、auto URL、bug report)取得aria-label;a11y-form-wires閘門現在對整個類別強制執行(原本 26 處未命名,現在 0 + 帶有記錄在案理由的允許清單)。
修復
- #/scan:捲動到下方後,表格的黏性表頭不再繪製在頂欄搜尋之上(z 值原本與頂欄相等、較晚的 DOM 取勝 — 現在以 token 推導並置於其下);「Зарплата от/до」兩個輸入框恢復正常尺寸(
.v2-scan-bar .input的 flex 規則漏進 popover 的縱向 flex,把 flex-basis 200 px 當成高度 — 現在以>限定範圍 + popover 防護);密度切換按鈕依負責人決定移除(管線保留、i18n 鍵移除 ×19)。 - 部署工作流程強化(F1–F6):
provider輸入在任何 shell 拼接之前先做字元集驗證;hermes 診斷遮蔽數值(不分大小寫的鍵過濾 + 數值遮罩 + 三個輸出口一律 80 字元截斷,?token=也一併遮蔽);hermes 步驟尊重inputs.app_dir;public_url 加 https 閘;防降級守衛有 6 個可執行釘樁(無預設值、守衛先於 Deploy 的順序、嚴格的 refs regex)。 - 審查尾巴,紅測先行:CSV 匯入的反斜線往返(重新匯入再次去重)、cv-voice 頭部剝除 4827→13 ms、
statedYearsMin惰性計算、posting-guard 擷取的 TOCTOU、MiniMax CN 萬用字元、跳過 deel 記號、匯入選擇器在讀取前先做尺寸防護。匯入視窗:武裝 nav-guard、取消時移除檔案輸入、有防護地讀取重複項、num改用 reduce。 - 負責人 UX 批次:dashboard hero 的垂直節奏(inline 層級的子元素黏合成一個行盒);help TOC −8 px 的作用列位移(每列內嵌槽溝 + 數字欄);行動版抽屜(可見的 ✕ 關閉鈕、scrollTop 重置、幽靈 –paper 淡入限定在
.has-hud);docs-assistant 頁面在答案含長 URL 時不再溢出(grid 的min-width鏈 +overflow-wrap: anywhere);「Недавние」獲得解釋(提示)+ 可清除;career-plan 的 Save 在載入失敗後重新待命;evaluate 的 URL 預填不再對貼上佔位符燒掉一次 LLM 呼叫;auto-pipeline 的 Enter 尊重 IME 組字。 - 對比(WCAG 稽核,296 對):docs-fab 漸層 2.43 → 6.4:1、toast.success → ok-soft 對(1.75 → AA dark)、banner 的 btn-dark 翻轉為
--ink、scan-logbtn/reposts-badge/fab-chip/close 的淺色變體,以及表單控制項邊框提升到 3:1(--cv3-input-line,WCAG 1.4.11 — 原本 1.2:1)。 - 視覺巡掃:tracker 空狀態改為全寬卡片(原本在 390 寬度被 760 px 表格裁切);scan 主控台行改為刪節號而非半截裁切;浮動聊天 FAB 在 390 寬度不再覆蓋內容(44 px 目標、內縮 12);dashboard「Application statuses」空狀態遵循 v2-empty 模式;stats「?」提示獲得分隔線 + 44 px 目標;career-plan Input 分頁說明結果落在何處;help §1 的 markdown(18 個斷裂的粗體 span)。
變更
- 強調色由藍 → 深紅(負責人要求、與 logo 一致、hue 15) — 5 個 cv3 token × 3 個主題區塊;
docs-assistant聊天泡泡文字走--accent-ink(原本是字面 #fff,dark 下 2.39:1);funded 洗色走--accent-soft。Danger 維持 hue 25 與其自己的處理。 - 文件:README 測試表數量 ×17(v1.248 年代的漂移)、help §1 + 18 個 markdown span、help fr/it/ta「118」、供應商價格 CHECKED_ON 2026-10-30、HANDOFF/CONTEXT/TRACEABILITY 事實。
備註
- 刻意不做:骨架屏掃描重做留在門外(car112 契約逐字釘住目前的淡入);主題切換圖示的交叉淡出維持
display切換(主題切換 Playwright 契約在觀察它);.btn:active縮放未重複實作(app.css 擁有它);動效 stagger 只是基礎設施 — dashboard 卡片稍後才採用;help ×19 的散文(密度提及、§1 markdown、「118」)搭下一波 fan-out。 - 完整 remote-QA 證據:v1.262.4 上 ja 針對性執行 green(376 s / A–G ✓);en/it 更早就在 token-dense 年代轉 green。
Tests 6869 → 6905 (+36) · Playwright 176 · 覆蓋率 98.4 % 行 / 89.9 % 分支 · 註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.262.4] — 2026-10-30
修復
ja加入 token-dense 評估語言(ja→ 32768-token 上限 + 480 s 時鐘)。prod v1.262.3 的 5 語言針對性重跑把當晚四個502 · 300 s · 0 ch逾時分成暫時性與確定性兩類:ar(250 s)、ko(291 s)與zh-CN(259 s)通過了各自的重跑,ru的一次性語言漂移沒有再現 — 但ja兩次撞上標準上限、輸出為零(完整 ×19 執行 40981578549 與針對性執行 41012725839)。與it/pl相同的形態類別。紅測先行釘樁:evalMaxTokens('ja') = 32768、evalTimeoutMs('ja') = 480_000,其他語言維持 300 s。
備註
- 刻意單一目的修補:
ja修正是此版本攜帶的唯一變更 — 不搭載任何其他內容。基於今晚的證據,ar/ko/zh-CN維持標準上限(它們通過;當晚的失敗是 provider 負載的暫時性問題),而ru的漂移是一次性的生成閃失。
Tests 6868 → 6869 (+1) · Playwright 176 · 註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.262.3] — 2026-10-30
pl token-dense 修補:prod v1.262.1 的完整 remote-QA 兩次抓到波蘭語評估在標準 300 s 上限處死亡 — 502 · 0 ch(完整 ×19 執行 40960568766 與 v1.262.2 的針對性重跑 40968958062),而 18/19 語言通過 A–G;pl 現在以 32768-token 上限與 480 s 時鐘加入 ta/hi/it,紅測先行釘樁(evalMaxTokens、evalTimeoutMs)。與 v1.262.1 中 it 相同的形態類別。Tests 6867 → 6868。
修復
pl加入 token-dense 評估語言(pl→ 32768-token 上限 + 480 s 時鐘)。prod v1.262.1 的完整 remote-QA 抓到波蘭語評估在標準上限處死亡 —502 · openrouter · 300 s · 0 ch— 隨 v1.262.2 派發的針對性重跑精確重現了它(執行 40960568766 與 40968958062):18/19 語言通過 A–G,it在 token-dense 的 480 s 時鐘內以 302 s 完成,而pl兩次撞牆、輸出為零。一次確定性的逾時,不是閃失 — 與 v1.262.1 中讓it入列的是同一形態類別。紅測先行釘樁:evalMaxTokens('pl') = 32768、evalTimeoutMs('pl') = 480_000,18 個標準語言維持 300 s。
備註
- 刻意單一目的修補:
pl修正是此版本攜帶的唯一變更 — 不搭載任何其他內容;v1.262.2 的審查尾巴內容已另行出貨。 - 發佈分支上 Tests 6867 → 6868 (+1) · Playwright 176 · 註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.262.2] — 2026-10-30
修復
- 波次審查尾巴 — 7 項低嚴重度發現,每一項都紅測先行。 CSV 匯入的反斜線往返:儲存格中的
\寫入時被翻倍、讀回時仍是翻倍的,因此重新匯入同一份 CSV 會錯過公司+職缺去重,並可能產生重複列 — 讀取器現在會在切分後還原\\(寫入→讀取往返無損,重新匯入即去重)。cv-voice 的<head>剝除在未閉合標籤上是二次方複雜度 — 在路由上限的 64 KB 輸入上從 4827 毫秒降到 13 毫秒。statedYearsMin即使在未設定years_min時也對每個來源的每個職缺執行完整年資解析器 — 現在改為惰性求值,大型掃描動輒數秒的 CPU 時間消失。readdir 與 statSync 之間被刪除的擷取檔曾使 posting-guard 清單崩潰(TOCTOU — 消失的檔案現予跳過)。MiniMax CN 預設值過去只精確匹配api.minimax.cn— 現在任何*.minimax.cnbase URL 都取得 CN 模型。Deel 中非十六進位引用的$記號不再以字面值洩入摘要。匯入選擇器在file.text()之前先檢查file.size— 512 KB 伺服器上限過去要等瀏覽器解析完可能巨大的檔案後才回 413 — 並帶有本地化的import.tooLargetoast ×19。 - Deploy workflow 強化(workflows 審查 F1–F6)。
provider是唯一未經字元集驗證就內插進遠端 shell 的輸入 — 值中的一個'會掙脫引號並在 prod 上執行任意程式碼;現在在任何拼接之前先以^[A-Za-z0-9_-]+$白名單驗證,金鑰守衛的 grep 也不再誤判通過。hermes 診斷步驟把原始 journalctl + unit 傾印印進公開日誌;其過濾器漏掉大寫的*_API_KEY=且什麼都沒遮蔽 — 現在三個輸出端共用不分大小寫的遮蔽 + 值遮罩 + 80 字元截斷,?token=查詢字串也一併遮蔽。hermes 步驟過去忽略inputs.app_dir、硬編碼/opt/career-ops/src/.env。public_url未經 https 檢查就直接進 curl(可藉前置-進行選項注入)。而防降級守衛 — v1.238.0 事故的修復 — 一直沒有可執行的閘門:ci-workflows 新增六道釘樁(refs 無預設值、守衛在 Deploy 之前執行、嚴格的 refs 正則)。 - 匯入對話框尾巴(SPA 審查)。 對話框佈下與 outcome 對話框相同的 nav guard — 離開頁面不再讓它孤懸在另一個檢視之上。隱藏的檔案輸入現在在
cancel時移除,而非只在change時 — 反覆取消不再把輸入元素洩漏進 document.body。plan.duplicates在預覽中改經守衛形式讀取。追蹤器num分配改用reduce而非Math.max(...spread)— spread 在約 10 萬列處會撞上引數上限。
變更
- 文件:說明指南的「118 EN adapters」條目在 fr/it/ta 中補上數量(其餘 15 個語言已有)。cvstart.org 上的供應商價格對照官方定價頁重新核實 — 四項全部未變,CHECKED_ON → 2026-10-30。發佈後的漂移巡檢修正了 README ×19、CONTEXT.md、CLAUDE.md 與 SDD 手冊中 42 處過期的數量/版本行(109/104 年代與 v1.262.0 年代的殘留)。
備註
- 刻意不處理:cv-studio 原生的
window.confirm(CAR-179 年代)保留 — 轉換成UI.confirm是後續工作,不是修補項;<mark title>套語工具提示維持僅工具提示(可接受的 a11y 底線);remote-qa.yml保留cancel-in-progress: true— 重新派發本就意在取代執行中的迴歸。 - prod v1.262.1 的完整 remote-QA:routes ×19 ✓ · site ×19 ✓ · links ✓ · live LLM 18/19 語言 A–G ✓ —
pl撞上一次502 · 300 s · 0 ch供應商逾時(不屬 token-dense 範疇;針對性重跑隨本次發佈出貨)。 - 發佈分支上的測試為 6841 → 6867(6864 pass / 0 fail / 3 skip,較 v1.262.1 +26)· Playwright 176 · 覆蓋率 98.42 % 行 / 89.94 % 分支 · 註冊表未變:123 sources = 118 EN + 5 RU · 118 adapters。
[1.262.1] — 2026-10-29
義大利語評估修補:it 加入 token-dense 語言(32768 token 上限 + 480 秒時鐘)— OpenRouter 時代抓到它的報告正好在 SCORE_SUMMARY 區塊前被切斷,而讓診斷成為可能的供應商切換工具也隨 deploy workflow 出貨。
修復
it評估在 SCORE_SUMMARY 前被切斷(CAR-190 尾巴):remote-QA 40928864980(補足額度後的首次執行)— 一次it評估跑了 264 秒、回來 15 045 字元、在 16 384 上限處tok ~15635:A–G 區塊完整,---SCORE_SUMMARY---消失。與讓ta在 v1.261.1 拿到上限(CAR-174)的是同一形態類別。it加入TOKEN_DENSE_EVAL_LOCALES(ta、hi→ta、hi、it):32 768 token 預算與 480 秒時鐘現在都適用,且/api/evaluate+ auto-pipeline 仍以llm.mjs為單一事實來源。- en 無區塊報告 — 單次生成閃失:同一次執行見到一份
en評估,語言正確卻完全沒有 A–G 區塊;針對性重跑乾淨通過(21 091 字元,A–G ✓)。未加入 token-dense 集合 — 一次閃失不是歷史。
新增
- Deploy workflow:
mode=hermes與mode=provider(CAR-190 維運尾巴):mode=hermes重啟 Hermes 閘道並印出完整診斷(去除機密的 unit 檔、監聽器前後對照、sudo journal、逐埠探測、應用自身的HERMES_BASE_URL視角、OpenRouter 額度餘額);mode=provider帶金鑰存在性守衛切換LLM_PROVIDER(目標供應商缺*_API_KEY時拒絕)並重啟應用 — Hermes 額度中途耗盡時,prod 就是這樣搬到openrouter的。deploy 模式的 ref 守衛僅對mode=deploy驗證,因此 recon/verify 派發恢復運作(v1.261.3 年代的必填輸入變更曾讓它們靜默)。
備註
- 刻意不處理:
en未加入 token-dense 集合 — 一次無區塊報告是生成閃失,不是數量歷史。 - 刻意不處理:ta 強化語言指令未擴及
it— 未觀察到義大利語的語言漂移。 - 刻意不處理:錄製新的 UI-v2 示範影片仍由擁有者負責(CAR-141)— 落地頁現在無論如何都透過
youtube-nocookie.com內嵌。 - 發佈分支上的測試為 6841 → 6841。
[1.262.0] — 2026-10-29
上游功能 minor:Deel 職缺看板加入掃描器(登錄表 123)、其他追蹤器的 CSV 以乾跑預覽直接匯入 #/tracker、posting-guard 完整性檢查與 CV 語氣檢查以轉發/規則檢查的形式落地、掃描器學會年資篩選,且 Apply 按鈕再懂七種語言 — 加上替換 MiniMax 已退役的預設模型,以及跨來源不再虛構 repost。
新增
- Deel 職缺看板來源(CAR-184):登錄表 123 來源 = 118 EN + 5 RU · 118 配接器 — 自動偵測
jobs.deel.com/<slug>租戶看板(Klarna 等公司);Next.js flight 承載在一次請求中攜帶整份清單(職稱、地點、工作型態、日期、描述),被禁止的/api/路徑絕不觸碰,把職缺放在別處的租戶會以重新導向回應,來源點名拒絕該導向,而薪資刻意不映射(沒有給薪區間的金額只能是猜測);計數閘 ×5 + 說明 §17 ×19。 - 追蹤器 CSV 匯入(CAR-181):
POST /api/tracker/import-csv,附乾跑預覽與上鎖的提交 — RFC-4180 引號、ISO / 日在前 / 月份名稱等日期格式、外部追蹤器的階段經 canonical 狀態摺疊(未知階段落為 Evaluated 並附註記,絕不丟棄)、以正規化的職缺 URL 去重(讀自 markdown 連結儲存格或 Notes 欄位)、上限 512 KB / 2000 列;#/tracker新增 Import CSV 按鈕與預覽對話框,i18n ×19。 - Posting guard 轉發(CAR-182):
POST /api/runners/posting-guard— 父專案的確定性、零 LLM JD 完整性閘,以報告編號經jds/擷取前綴規則(有無補零、以整數比較)或明確的消毒路徑解析;子程序只取得 argv、30 秒上限與 fail-soft 契約;#/reports/:slug上的「Posting guard」動作會呈現檢查結果,i18n ×19。 - CV 語氣檢查(CAR-188):27 個履歷套語(
passionate about、proven track record、leveraged、spearheaded、delve…)加上破折號啟發式(2022–2024 這類年份區間不是訊號;20–30%是),以唯讀的POST /api/cv-studio/voice-check與#/cv-studio卡片呈現,精確標出相符處;Tailor 檢查清單擴充為六項不變量;i18n ×19。 - 年資掃描篩選(CAR-180):jd-years 解析器(65 種表述,不確定時絕不丟棄)從職缺描述讀出明示的最低年資,新的
years_min:portals 選項以skipped_experience略過資歷不足的職缺(一個觀察用的歷史狀態,永不釘住 URL),而yearsMin隨掃描快照保存,供未來 UI 使用。 - 七種語言的 Apply 控制項(CAR-185/189):越南語
Nộp đơn ứng tuyển、保加利亞語Кандидатствай/Кандидатстване/Външно кандидатстване(名詞錨定到標籤開頭 — 建議文章連結不是 Apply)、荷蘭語Solliciteer/Solliciteren、西班牙語¡Apúntame!/Postularse(標籤,而非動詞 — FAQ 連結不再造成干擾)、中文申请职位/投递(錨定到整個控制項)— 這些看板上的在職職缺不再被讀成no_apply_control。
修復
- MiniMax 預設模型(CAR-187):已退役的
MiniMax-Text-01預設由api.minimax.io上的MiniMax-M3.1-Flash與api.minimax.cn上的MiniMax-M3取代;base URL 固定於供應商網域(非供應商主機在執行期被拒絕,金鑰永遠到不了那裡);設定提示 ×19 點名新預設。 - 重新刊登需要相同來源(CAR-186):同一職位同時出現在 LinkedIn 與雇主的 Greenhouse 上,不再被回報為 repost — 叢集現在以
sourceHost()切分,只在已知網站上摺疊區域子網域(de.linkedin.com≡www.linkedin.com,但ca.example.com保持獨立)、把 Greenhouse 主機別名摺成單一來源,並去除尾隨的點。 - 坦米爾語評估的語言漂移(CAR-183):強化版的坦米爾語指令現在位於易變的提示尾段、緊鄰用量預算(CAR-174 的位置)— v1.261.2 見到的間歇性漂移之後,remote-QA 報告重新落在坦米爾語。
備註
- 刻意不處理:posting-guard 轉發以 fail-soft 出貨 — fork 尚未攜帶父專案的
posting-guard.mjs(upstream PR #6146 仍開啟中),端點因此回應{available:false, reason:"script-not-found"},直到一次父專案同步把它帶來。 - 刻意不處理:
yearsMin本次發佈沒有做成#/scan的 UI 晶片 — 欄位隨快照出貨,篩選僅能透過 portals 設定。 - 刻意不處理:上游 modes/reports 的 Machine Summary 變更(#6161/#6160/#6157)未移植 — 它們會隨部署的父專案到來,而非以 web-ui 鏡像的形式。
- 發佈分支上的測試為 6734 → 6841;掃描器的去重鍵未動(URL 正規化行為沒有改變)。
[1.261.3] — 2026-10-28
設計收尾修補:Lovable 設計第三階段(密度 + 珊瑚色全面退役)、掃描主機池(32 家公司、每主機上限 10 家)、六項上游提供者位置修復、Trakstar Hire 來源(註冊表 122)、CV Studio 復原 + 未儲存防護 — 另有最終迴歸 P3 修復與文件平價。
修復
- 地圖叢集 «related» 標籤 3.16:1 → 4.68:1(雙主題):淺色主題的
--map-score-mid加深為#567b75(建議的#5f7f7a實測僅 4.37 — 需要再深一階);深色側本已 4.98:1,未動。已在map-cluster-visual以紅色先行釘住。 - Skip-link 焦點環:最後一處字面
#ff385c外框 →var(--accent-c)— 全部 78 個焦點環現在都跟隨強調色 token。 .tab-btn.is-active的強調色拓撲(#584,第三階段):該控制項原本混用三個色彩家族(珊瑚色淡底 + danger 文字 + 藍色邊框);現在是單一的 accent-soft 配對。- 上游提供者位置修復 ×5(#580,CAR-176):workday 的
Fully Remote旗標(不是地名)、workable 的 telecommuting 展開 + 僅在無城市時才標示州名、successfactors 的尾隨逗號、lever 的 remote 字詞邊界、icims 的Location前綴標籤。 - http-json:逾時耗盡後不再重試(#580) — 期限中止在兩個重試輔助函式中都屬非暫時性(上游實測某個 Ashby 看板在 30 秒 × 重試下耗了約 94 秒)。
- 文件平價(#587):HANDOFF/CONVENTIONS/README 中最後幾處 17/18 時代的計數(uk 補上缺失的 Локалізація 章節;§ 歷史延伸至 §32/§33 — 33 個 H2 的算術已驗證)。
新增
- Lovable 設計第三階段(#584):密度 token 上線 — 表格列約 32px、控制項 30px、晶片 24px(WCAG 2.5.8 間距例外);所有殘留的珊瑚色 rgba 全數改為 cv3 配對(
.dash-hero、.badge-bad、光暈、.tab-btn.is-active);宣告--ease-out,TOKEN_HANDOFF 清空;訂下.callout--ok/--danger契約。 - Trakstar Hire 來源(#583,CAR-177):註冊表 122 來源 = 117 EN + 5 RU · 117 配接器 — 主機固定為 jsapi.recruiterbox.com、以偏移量走訪、遇短頁/空頁/重複頁即停、保留部分結果、加上
trakstarTruncated標記;計數閘 ×5 + 說明 §17 ×19。 - 掃描主機池(#579,CAR-178):最多 32 家公司並行、每個主機上限 10 家(上游的 keyed-limiter 模式)— 快照與循序執行位元組完全一致(紅色先行的計時模擬閘門)。
- CV Studio 復原 + 未儲存防護(#582,CAR-179):對 AI 執行結果提供有界(30 步)的復原堆疊,
Cmd/Ctrl+Z在非 QWERTY 佈局上同樣可用;離開路由時的未儲存變更防護(live-probe 判定髒狀態、confirm/rewind/beforeunload),i18n ×19。 - 上游提供者修復的測試 ×17(CAR-176 的一部分);remote-QA 摘要會點名失敗的掃描來源 + 每次評估印出
tok ~N(#567,v1.261.2 已落地 — 本次發佈的分流排查用的就是這套可觀測性)。
備註
- 強調色現在是藍色(Lovable 概念):主要動作/作用中狀態/焦點環跟隨
--cv3-accent;紅色保留給危險操作(.btn-danger、toast.error、危險文字)。珊瑚色僅存於標誌 PNG 素材(擁有者的決定)。 - 密度:表格列約 32px / 控制項 30px / 晶片 24px — WCAG 2.5.8 間距例外已記載;v1.26.1 的 44px canary 改寫為 token 契約。
- CodeQL:10 個未結警報全數關閉(4 個附理由豁免為誤報:llmRateLimit/atomicWrite 屬已記載類別;6 個在原始碼層修復)。
- 發佈分支上的測試為 6655 → 6734;除新的 Trakstar 來源外,未改變任何掃描器來源行為。
[1.261.2] — 2026-10-28
穩定性 + 打磨修補:geocode 快取挺過寫入中途的當機(CAR-173)、UI.md 渲染項目符號的接續行與巢狀清單、說明套件渲染文字的鍵外洩全數封堵 ×17、evaluate 取得按語系的 token 上限(ta 適用,CAR-174)、RTL 介面元素改以邏輯屬性鏡像(85 項發現)、地圖截圖重新取景 ×19,且地圖叢集通過深色主題對比 — 另有 Lovable 設計整合的第一階段(被動載入的 tokens-v3.css 樣式表)、文件回補(發佈評審 + 規格),以及 CI-node 涵蓋率豁免。
修復
- geocode 快取的撕裂寫入損失(CAR-173,#562):兩條寫回路徑(防抖的插入寫回、退出寫回)原本都以裸的
writeFileSync寫.cache/geocode.json— 先截斷再寫入 — 因此寫入中途的當機、OOM 或 SIGKILL 會留下撕裂的檔案,下次啟動的JSON.parse擲出例外,默默丟棄整份持久化快取(數週的 Nominatim 配額),而不只是當天的。兩處寫入點現在都走file-lock.mjs::atomicWrite(同目錄暫存檔 → 重新命名 → 失敗時解除連結)— 與 FULL-R1/FULL-M1 施加於pipeline.md、cv.md、profile.yml、career-plan、批次輸入與 memory 的同一契約。CAR-142 的寫回機制本身(防抖插入寫回、退出寫回、有界關機)已紅色先行驗證完好:測試 (a)/(b) 鎖定插入會在GEOCODE_SAVE_MS時間窗內抵達檔案、且內容始終為合法 JSON;(c) 則是一道機制閘門,外加兩條寫回路徑的行為面執行,斷言沒有暫存殘留、檔案可解析。 - UI.md 清單接續行(#563):清單處理器原本只吞下連續的
-/*行,因此項目符號後縮排的接續行會掉出所產出的<ul>,而段落處理又跳過該區塊 — 接續行以帶有字面**/反引號標記的原始散文外洩(跨說明套件每個語系約 95 處懸空片段;en.md 95、ru.md 104)。接續行 — 有前導空白、且不屬於新區塊(標題、項目符號、NUL 包裹的圍欄佔位符、空行)— 現在會以<br/>串接文字併入前一個<li>,並逐行執行inline(),強調標記絕不跨越接縫配對;圍欄佔位符防護改以 NUL 首字元判定,而非裸 token 比對。巢狀-項目符號、編號清單、清單內的圍欄與清單內的標題,仍是已記載的另一項缺口(下一波文件浪潮)。 - 說明套件渲染文字的鍵外洩 ×17(#561):remote-QA 在渲染後的說明中發現 85 個裸露的 i18n 鍵(根因已透過重現證實:同一個 UI.md 單行項目符號消費問題 — 折行後的接續行以原始文字輸出時,反引號保持字面;v1.260/261 的說明章節寫的是多行項目符號)。163 條項目符號在 17 個語系攤平為單行 — 只動了空白,未觸碰任何一個譯詞(新舊對照已驗證)。新閘門
tests/help-rendered-keys.test.mjs透過真實鏈路(stripGithubOnlyBlocks+ vm 載入的UI.md)渲染每一份套件,1,711 個鍵中任何一個出現在文字裡即失敗;17 個語系紅色先行 → 轉綠。重現工具隨庫出貨:scripts/remote-qa/help-render-scan.mjs(vm)+help-render-crosscheck.mjs(真實 DOM)。 - remote-QA 的 Ctrl+K 斷言 CAR-122 面板契約(#561):
prod-regression.mjs現在要求 Ctrl+K 之後出現命令面板(.nav-v2-palette[role=dialog]+ 焦點落在nav-v2-input),或以舊版搜尋聚焦作為回退,而非默默接受任一種;單元測試tests/remote-qa-ctrl-k.test.mjs在模擬 DOM 上鎖定 6 個情境,紅色先行 0/6 → 6/6。 - 地圖截圖取景 ×19(#560):擁有者回報
images/job-map-en.png— 頂部有半截 topbar 搜尋 + 被切斷的 h1、右緣有一條側邊清單的灰色細條、倫敦附近有一個被框緣切到的標記叢集,以及一條橫貫地圖約 2/3 高度處的白線。capture-map-screenshots.mjs現在等待 geocode 佇列排空(located + noLoc === total,而非 N/N 計數器 — Remote 列在結構上就沒有位置,舊的等待永遠等不完)、截圖時隱藏header.topbar與#notif-drawer、精確裁切.job-map-page的框(沒有任何面板被框緣切到)、縮小兩級讓沒有叢集處於半切狀態、釘住地圖高度並拍一般視窗截圖(captureBeyondViewport會對合成後的圖磚層重新取樣、在圖磚列邊界畫出白條),並將地圖容器整數對齊。19 張 job-map 截圖全部重拍。 - 地圖叢集氣泡 — 深色主題對比 + 標籤貼合(#572):擁有者巡檢 P2/P3 — 深色主題的叢集外環原本壓在固定白色填充上(1.83:1);外環現在採
var(--paper)搭配分數色盤數字(實測 4.98:1 以上、實心 9.53:1;最低帶在深色下數學上無法著色,改以誠實的data-dim路徑保住 6.1:1),related標籤則貼合其氣泡(rAF 字體貼合,數字永不縮小)。 - #/scan 語言切換 — 骨架重新裝填(#534 後續,代理執行中,將在打 tag 前落地):v1.261.0 擁有者修復(#534)的後續 — 語言切換重繪時重新裝填的骨架,不再於完成的重新抓取之後殘留。
- 文件漂移(CAR-139,代理執行中,將在打 tag 前落地):README ×19 計數器、HANDOFF ×19、CONVENTIONS 的事實已與現行註冊表/測試狀態重新同步。
新增
- 發佈評審 + 規格回補(docs,#559/#558):
docs/reviews/REVIEW-2026-10-28-v1.261.1.md(對照其規格評審 v1.261.0/v1.261.1 浪潮)與同一浪潮的 SDD 規格回補 — BACKLOG 尾端現在點名剩餘缺口(sources/habr.mjs的專屬測試)。 - RTL 深度巡檢(#571):AR 巡檢走訪 39 條路由 × LTR 對 RTL(X 鏡像、溢位、裁切、text-align 特徵)— 85 項發現已修復:固定定位的介面元素(toast、側欄、抽屜與其關閉 ×、docs-FAB、usage-HUD、skip-link)改用
inset-inline-*/border-inline-*,17 個檢視檔 + 2 個函式庫的表格改用text-align: start/end,移除一刀切的[dir=rtl] text-align:right(它與 scan 星號欄的置中相牴觸),CAR-58 的分數欄隔離改掛到ltrNumspan 上。 - 鍵盤無障礙巡檢(#570):
tests/playwright-a11y-keyboard.mjs走訪 11 條路由(Tab 順序/陷阱、焦點指示器、Escape 關閉覆蓋層、Enter/Space)— 0 個正式環境缺陷;迴歸涵蓋為新增。 - i18n 未翻譯清掃(#565):36 個與英文相同的值已翻譯 ×9 語系(
*.rolePh、config 鍵、ta 宣言)+ 一道封閉允許清單式清掃防護;網站(cvstart.org)i18n 稽核(#568):20 個鍵 × 18 語系已翻譯(整個demo.*/stats.t.*/showcase.tab*區塊到處都是英文)、移除 1 個死去鍵 ×19。 - remote-QA 可觀測性(CAR-175,#567):摘要會點名失敗的掃描來源(
stderr samples、先遮蔽再截斷),並依提供者用量印出tok ~N;邏輯位於純粹的summary-parts.mjs,附一道漂移閘門。 - UI.md 巢狀標記清單(一層,#564):
-項目符號渲染為巢狀<ul>(圍欄佔位符安全)— 每個語系最後 2 處懸空散文片段消失。 - Lovable 設計整合 — 階段 1(#566)/ 階段 2(分支上,將在打 tag 前落地):
public/css/tokens-v3.css原樣移植 Lovable 概念(oklch 表面 0–3、標註 AA 的墨水配對、強調色家族、ok/warn/danger/info/neutral 的柔色+墨水、分數帶 A–G ×2 主題、密度 + 焦點 + 陰影);階段 2 將它掛上既有 token 名稱啟用(強調色拆分 blue/danger、分數帶 + callout 改用 cv3 token),對比/角色/深色閘門同步更新。 - evaluate 按語系的 token 上限(CAR-174,#569):
evalMaxTokens(lang)— ta/hi 要求 32768(三個 SDK 客戶端原本會在 16384 重新夾限;兩層皆已修復),提示詞另附 Tamil 篇幅預算(每區塊 ≤5 句、≤900 字)— v1.261.1 remote-QA 的 ta 報告曾在輸出 token 上限處被截斷(缺 Block B–G + SCORE_SUMMARY)。 - CodeQL 真實修復的後續貫徹:新的 QA 渲染工具以結構化拆分段落 +
htmlToText({cap: Infinity})取代手搓的實體處理;遮蔽斷言釘住確切的遮罩輸出;RTL 巡檢中未使用的常數已移除。 - CI-node 變異下的涵蓋率豁免政策(habr #558、states #561):
sources/habr.mjs(CI node-matrix 分支涵蓋 87.23,本機 ≥89)與states.mjs(CI 86.49,本機 ≥89)加入scripts/coverage-baseline.json的豁免清單 — 因 node 版本變異而使 CI 實測分支涵蓋率結構性低於本地下限的檔案予以豁免,而不是把整道閘門的棘輪往下調。
備註
- Ctrl+K 契約(CAR-122):組合鍵開啟的是命令面板 — 它並不直接聚焦搜尋框;搜尋是從面板內聚焦。remote-QA 的正式環境迴歸現在斷言的正是這一點(#561)。
- CodeQL 誤報豁免 ×5:main 上
js/missing-rate-limiting的警報仍在等security_eventstoken — 屬營運者動作,不是程式碼變更。 - 分支切出後落地:#561/#562/#563/#564/#565/#566/#567/#569/#570/#571/#572 已全數併入 main;#534 骨架與 CAR-139 的代理將在打 tag 前併入。超過一層的巢狀標記清單,以及行內元素密集的檢視幾何,仍是已記載的缺口。
- 發佈分支上的測試為 6609(自 v1.261.1 起 +15;#561 併入時另帶來約 +13 — 2 個新閘門檔);展開前唯一的紅測試是 CHANGELOG ×19 平價閘門(語系展開是協調者的下一步);未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器)。
[1.261.1] — 2026-10-28
prod-QA 客戶端修補:#/two-pager 的 P1 當機修復、Ctrl+K 在非 QWERTY 鍵盤佈局上恢復可用、390px 行動浪潮(docs-assistant 溢位、地圖晶片重疊、39 條路由的巡檢)、CAR-137 收尾(具體錯誤、v2empty ×5、提示 ×13 + 模式頁),以及 CAR-140 讓真實的 v2 截圖在各處落地。
修復
- two-pager TDZ(CAR-170,P1,#554):
Cannot access 'previewTimer' before initialization— 已儲存標籤的編輯器在建構期間就對每個還原的晶片觸發onChange,而建構迴圈在詞法順序上位於let previewTimer之上,於是整個#/two-pager渲染當機(沒有 h1,×19 語系)。排程器 + 綁定現已移到迴圈之上;一支行為面測試直接執行真實的檢視模組 — 修復前重現確切的正式環境錯誤、修復後渲染出頁面 — 另加一道詞法順序漂移閘門。 - Ctrl+K 在非 QWERTY 鍵盤佈局上(CAR-172,#554):兩個組合鍵處理器原本只比對
e.key— 在俄語佈局下組合鍵以key='л' code='KeyK'抵達,因此毫無作用。nav-v2.js 與 app.js 改以e.code === 'KeyK'比對;並在真實瀏覽器中以合成的 ‘л’/KeyK 組合鍵重現。CAR-122 契約已重述(見備註)。 - docs-assistant 390px 溢位(CAR-172,#554):CAR-136 的入門晶片是
.btn(nowrap、flex-shrink: 0)— 一個不可折行的 418px 項目把#/docs-assistant推出 390px 視窗外 56px;CAR-146 的收縮模式(位於 v2-llm.css,800-LOC CSS 閘門未動)把它歸零。 - 地圖晶片在 390px 下重疊(#552):在 390px 視窗上,地圖的中繼晶片與 CTA 列重疊(map.css)。
- CAR-137 — 具體錯誤 + v2empty ×5(#550):五個籠統的錯誤回退(‘Error’ / ‘failed’)換成具體可行動的鍵 — evaluate POST 失敗、auto-pipeline 串流缺少終止事件、scan→pipeline 加入、repost 叢集載入、pipeline 復原;最後五個平淡的空狀態(
#/reports、#/usage、#/portals、#/activity、#/dashboard)加入 CAR-124 的 v2empty 模式(說明 + 標記 aria-hidden 的範例 + 預先接線的動作;15 個新的v2empty.*鍵、移除四個死去的一行式鍵)— 全部 ×19 字典,快照重新產生。 - CAR-137 — HelpHint ×13 + 模式頁套件(#550):情境式 «?» 提示現在坐落於其餘每個頁面的 H1 上(pipeline、reports、dashboard、cv、portals、usage、activity、assessments、map、health、docs-assistant、settings),並透過套件覆蓋 8 個模式頁(每筆 MODES 設定攜帶一個
hintKey,經HelpHint.title渲染)。
新增
- Mobile-390 巡檢(#552):以 Playwright 走訪每條 SPA 路由(31 個規範路由 + 8 個模式頁 = 39 個 hash),在 390×844 下搭配植入的語料 — 逐路由的水平溢位檢查(scrollWidth 對 clientWidth、1px 容差、點名最寬的元兇)外加 CTA 命中檢查(任何吸附列/抽屜/FAB 都不得遮住主要 CTA);選擇性執行、無瀏覽器二進位檔時優雅跳過、無網路。
- 全新 v2 截圖 ×48(CAR-140 phase A,#551):來自植入式 CI 隔離 fixture 的真實 v2 UI 截圖 — dashboard ×19 + job-map ×19(job-map-ta 首次出現、job-map-vi 新增)+ scan/pipeline/tracker/reports × en/ru — 供 README、說明與落地頁取用。
- cvstart.org 真實截圖(CAR-140 phase B,#553):CAR-140 的預留位已成歷史 — 落地頁展示實際的 v2 截圖(job-map 展示區 + 截圖列,×19 個落地頁語系)。
- CAR-137 提示(#550):21 個新的已翻譯鍵 ×19(
help.hint.*×20 + 模式頁的hintKey)— 每個頁面現在都能就地自我說明。
備註
- Ctrl+K 契約(CAR-122):組合鍵開啟的是命令面板 — 它並不直接聚焦搜尋框;搜尋是從面板內聚焦。v1.261.0 QA 清單中的 «Ctrl+K фокусит поиск» 一行已被取代;v1.261.1 的 QA 提示攜帶更新後的檢查。
- CodeQL 真實修復(#547):關閉 4 個警報(content.mjs 的字面量鍵迭代改為結構化、lint 清掃)— 在本修補之前已於發佈後落在 v1.261.0 的 main 上;為完整性一併列出。
- 測試 6582(+51);瀏覽器套件 171–172 通過 / 0 失敗 / 1 選擇性跳過;mobile-390 巡檢可獨立執行(
node tests/playwright-mobile-390.mjs)。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器)。
[1.261.0] — 2026-10-28
完整評審浪潮收官(所有 HIGH + MEDIUM 發現全數落地)、擁有者回報的語言切換修復、評估品質修復、說明 ×18 展開、cvstart.org 落地頁 v2 — 另有 4 份記錄這波浪潮的 SDD/OpenSpec 規格。每一項修復都以紅→綠的 fix-forward 與一次 GLM-5.3-Flash 全新上下文評審落地。
安全
- FULL-R1 — CSRF acting-GET 閘門 + 上鎖的原子 pipeline 寫入(#519):
/api/stream/*、/api/run/*、/api/geocode上的Sec-Fetch-Site/Origin/Referer 閘門(匯出ACTING_GET、靜態覆蓋閘門);data/pipeline.md/data/last-scan.json的每一處讀取-修改-寫入都在withFileLock底下,搭配新的atomicWrite(同目錄暫存檔 → rename → 失敗即 unlink)。 - FULL-R2 — 來源中的 SSRF 叢集(#514):rss.mjs 改為 https 並拒絕私有位址;約 25 個裸
fetchImpl來源改走受守衛的傳輸層;鏡射來源釘選主機;habr/hh/geekjob/getmatch 加入重新導向驗證;共用的delay(ms, signal)。 - FULL-R4 — stripDangerousMarkdown 的散文損毀(#513/#518):scheme 剝除只在連結/屬性語境執行;實體解碼改在僅供偵測的副本上進行(«JavaScript: React, Node» 與 «R&D» 得以存活)。
- FULL-M2 — 傳輸層強化(#520):
safeGet遵循timeoutMs並接受呼叫端的 signal(bridge 控制器);guardResolvedHost在 DNS 錯誤時 fail-CLOSED。#525 再補上跨來源重新導向時剝除憑證標頭、每一條 settle 路徑都卸除傳輸監聽器,以及預先中止 signal 的當機修復。 - FULL-M4 — logo/batch(#523):logo 在每一條路徑上都釘住 magic bytes(謊報的
image/png不再能攜帶 SVG)、在儲存時把 content-type 收斂到image/*、私有快取 + nosniff;batch:--parallel收斂到 1–8、--min-score經過驗證、BATCH_BUSY single-flight、config/batch 的變更加上llmRateLimit。
新增
- CAR-147 — 語系感知的評估上限(#524):
evalTimeoutMs(lang)— ta/hi 改為 480 秒而非 300 秒(印度系文字每個音節會切成多個 token;舊的時限只會產出 502 與空報告);remote-QA 客戶端等待 540 秒。 - CAR-133 — cvstart.org 落地頁 v2(#532):受 reduced-motion 節制的視差 hero、一個明確標示為「模擬」的 scan→evaluate→tracker 流程展示、帶即時驗證計數的 scroll-reveal 區塊、CAR-140 截圖預留位。
- CAR-135 — 為 UI v2 重寫說明,×18 展開完成(#533、#540、#541、#542):全部 19 份說明檔描述 v2 外殼(可收合導覽、Cmd/Ctrl+K 面板、骨架、範例+動作的空狀態、scan v2 介面、pipeline 分組+復原、reports v2、看板);UI 標籤引用各自的 i18n 鍵;121 個來源的句子直接取自註冊表。
- SDD/OpenSpec 規格(#535):oct27 wave-two 補記 + 三份前瞻規格(說明展開、寫入交接、語言切換不變量)。
修復
- 語言切換不再清空 #/scan(#534) — 擁有者回報:檢視本地的掃描狀態(結果、facet 晶片)現在是 module-level;行為面的 Playwright 測試附 4 秒延遲重新抓取(在舊結構上呈紅)。
- CAR-148/149 — ru 報告 «缺少 Block G»(#530):提示曾教了三份互相矛盾的 A–G 映射;骨架 + 清單 + 範例現在與 oferta.md 一致(G = Posting Legitimacy);行為漂移閘門。
- CAR-150 — pipeline 復原保留 comp 中繼資料(#537):DELETE 回應
comp、POST 接受受閘門管控的選用comp,檢視在所有回退分支中都攜帶{token, comp}。 - FULL-M3 — 死來源回報誠實的看板(#522):getro/mycareersfuture/meituan/mokahr/glints 在格式錯誤的 page-1 上直接拋出(死的 API 不再被讀成 «健康,0 個職缺»);
pinnedOverride釘住 18 個配接器的company.api覆寫。 - FULL-M5 — 單一供應方串接(#521):routes/llm.mjs 改走
runActiveProvider(+cachePrefix、signal);Gemini 子程序攔截;回應契約逐位元組相同。 - FULL-M1 — 共用檔案寫入上鎖(#526、#539):
runTrackedScript+TRACKER_MUTATING名單;outcome/followup 的 spawn 持有鎖;tracker.mjs 經atomicWrite寫入;PUT 儲存改為鎖定+原子。 - FULL-M6 — 伺服器 + 客戶端整合(#531、#536、#525):dotenv 空值原型 + 拒絕
__proto__;isPrivateOrLoopback 涵蓋 NAT64/6to4/benchmark/保留位址;env-config mtime 快取;file-lock 真正的槽位 GC;safeGet timeout+signal;DNS 守衛 fail-closed;SSE ×4 →API.postStream;焦點/標籤/狀態共用程式庫;clipboard 改為等待完成;儀表板 Hired 著色。 - R3 — CSS token 漂移(#527):
--accent已解析(地圖焦點環一直默默失效);11 個偏離 token 的時長收編;漂移閘門。 - R4 — 載入遺漏(#538):assessments/mode-page/pipeline 預覽改渲染 CAR-112 骨架。
- CodeQL + CI 批次(#517、#539 修復):未使用的 import、ACTING_GET 閘門改為 import 真正的正則、lifecycle 切片重新錨定。
備註
- 刻意不做:連線當下的 DNS 釘選(需要 undici — 不在相依之內,殘餘風險已記錄);CAR-140 截圖(需要已部署的 v2 UI);CAR-137/138/141(下一輪文件);
js/missing-rate-limiting這一 CodeQL 類別是已記錄的誤報(自訂 limiter 未被採計)。 - 說明 ×18 展開:es/de 的 wave-1 跳過了導論註記與活動公司卡片的差異(de 已補上自己的導論;es 會以一行後續跟進)。
[1.260.0] — 2026-10-26
評審強化列車,八次合併(#491–#498)落在 v1.259.0 艦隊之上,出自 opus-5-5 與 AI 評審輪:薪資正規化、報告日期範圍限定、地理編碼穩健性、bundle 快取破壞 r2+r3、deep 溢位修復 — 外加兩個 UI v2(pipeline、reports)。每一項修復都以紅→綠的 fix-forward 落地。
修復
- 薪資比較正規化(CAR-143 rev-2):期間標記只在其所屬數字附近才會被辨識 — «6 month contract, $120k» 不再被年化 ×12,而僅以緊貼形式出現的 RU/ES 期間寫法(數字旁的 «за месяц»)壓過偶然出現的詞語;
$/¥符號家族會被辨識,但除非同一行有明確的 ISO 代碼,否則不予映射(AUD/CA/SG dollars 不再被當成 USD 計價;¥ RMB 的形態會得到明確的告註,而不是偏差約 20 倍的 JPY 換算);裸的 19xx/20xx 數字一律視為年份;區間數字繼承配對方的期間;設定檔的minimum與target_range絕不被拼接成單一區間。 - fixReportDate 的適用範圍(CAR-144 rev-2):由伺服器端釘住的日期修正只套用於第一個
##標題之前的序言(標題即 H2 的報告得到保守的無操作 — 日期過舊可以接受,捏造的日期則不行);序言之內:有唯一候選則修正,否則找唯一的粗體**Date:**,再否則什麼都不動(兩個粗體或兩個純文字候選一律不改寫)。FIX-5 PDF 標籤閘門現在讀取真正組裝好的字典 — 缺少的語系會直接拋出錯誤,而不是靠英文回退默默通過。 - Habr 地點標籤 + 地理編碼穩健性(CAR-142 rev-2):Habr 的 meta 標籤只有在具備結構性證據(城市篩選連結或地點圖示)時才會變成城市 — 搬遷通知(«Возможна релокация»)與僱用型態絕不會冒充地點;地理編碼快取現在能在重啟後存活(在
beforeExit/exit/SIGTERM+SIGINT 時沖寫快取並重新拋出訊號,dirty 旗標只在寫入落地後清除),關閉流程有邊界(exit 迴圈閂鎖、世代計數器、recency LRU),而耗盡的地理編碼預算會以 503 + Retry-After 回應,而不是籠統的 502。 - Bundle 快取破壞(CAR-145 r2+r3):外殼改為引用
/js/bundle.js?v=<content-hash>— 相符時 immutable、不相符時 no-store — 終結了新外殼配上快取舊 bundle 的 5 分鐘部署窗口。雜湊與串流共用同一個檔案描述子(不會有撕裂讀取);短讀取回答 null,而不是可能毒化整次部署的 stat 回退雜湊;make-bundle以點前綴的暫存檔 + rename 寫入識別資訊與 .br/.gz 伴隨檔案,因此被中斷的建置既無法提供寫到一半的位元組,也不會洩漏其暫存檔。 - Deep 溢位(CAR-146):一份光是檔名就超過手機視窗寬度的已儲存研究簡報,再也無法把
#/deep撐過 390px — 卡片在其列內封頂、標題換行、日期維持單行;窄視窗巡檢現在會以一支超長的植入 fixture 走訪#/deep(兩次 remote-QA 執行的唯一發現,已結案)。 - Pipeline v2 強化(CAR-116 評審):刪除需要確認且可復原(復原文案誠實)、卡片不再虛構主機公司、FNV-1a 列 id、真實的批次計數,以及批次操作上的重入防護。
新增
- Pipeline v2(CAR-116):豐富化的卡片、分組檢視,以及可復原的批次捨棄;17 個新的
pipe.*鍵已翻譯,隨全部 19 個字典出貨。 - Reports v2(CAR-118):即時搜尋,搭配分數區間/合法性/公司/日期篩選器、可排序表頭(
aria-sort)、具每區間動作按鈕的持久化卡片檢視、可點擊即篩選的分數直方圖,以及統一的 «Company — Role» / «x.x/5» 呈現(window.ReportOps);31 個rep2.*鍵已翻譯,隨全部 19 個字典出貨。
備註
- 每一項修復都經過附紅→綠證據的評審輪;第一輪 bundle r2 的兩個 AI 評審 HIGH 發現(短讀取雜湊、伴隨檔案原子性)由 r3 結案,而 CAR-143/CAR-144/CAR-142 各輪也都重新驗證了其前一輪的未決發現。
- 刻意不做:地圖叢集檢視仍留在 CAR-125(排隊中);伺服器端的 pipeline 中繼資料還原是另一張票;不對以 rev-2 之前的 v1.259.0 狀態儲存的內容做追溯性修復。
- 測試 5988(+165)。瀏覽器套件 152 通過 / 0 失敗 / 1 選擇性跳過。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器);48 個新的 i18n 鍵連同其 ×19 展開在功能 PR 內一併落地。
[1.259.0] — 2026-10-25
第二趟 agent 艦隊列車,六項修復:報告日期由伺服器端釘住、地圖地理編碼器快取並讀取俄語城市、說明 ×18 引用本地化的按鈕標籤、UI 句子不再混雜語言、薪資比較改為伺服器端計算 — 而 JS bundle 以預先壓縮形式出貨(冷載入 3.1 MB → 598 KB)。
修復
- 捏造的報告日期(CAR-101):評估提示現在於伺服器端釘住今天的日期(「Date: 欄位必須完全等於
— 逐字複製,絕不捏造」),且 fixReportDate會在每一個接受點(Anthropic 分支、Gemini 子程序、OpenAI 相容尾段、/api/deep、auto-pipeline)把漂移的日期改寫為今天,並附上警告 + 活動記錄 — 這是修正,絕不是拒絕。正式環境有 349/789 篇報告帶著捏造的日期;新的不會再有。 - 地圖地理編碼(CAR-105):hh.ru/Habr 列的西里爾字母城市字串現在能送達地理編碼器;一個持久且有界的快取(
data/geocode-cache.json,withFileLock)讓已解析的城市絕不會向供應商重複請求;地理編碼呼叫按每個請求編列預算,地圖因此漸進填入,而不是阻塞 13.9 秒。 - 混合語言的 UI(CAR-108):19 個字典中的 17 個修復了 23 個鍵值洩漏(85 個值)— «все matching»、«только remote»、«Открыть Scan»、漏斗 «Evaluated → Applied…» 等等,全部換成完整的本地化句子,重用各語言自己的產品詞彙。
i18n-no-latin-leaks擴充了片段表 + 漏斗探針(紅→綠)。 - 幣別判決翻轉(CAR-109):薪資比較改為在伺服器端的
comp-compare.mjs中計算,並以規範形式嵌入(Candidate minimum: … per YEAR (raw: …)對照JD offer: …);月薪 ×12、k/к/тыс/萬 與小數逗號等格式在比較前正規化;不確定的換算絕不會單憑自身翻轉判決(zh-TW 的 «€80–100k ниже минимума» 案例已死)。模型絕不做乘法。 - 說明 ×18 按鈕標籤(CAR-107):本地化說明包引用了 UI 已不再顯示的英文標籤(«⚡ Run live»、«Save»、«Scan now»)— 從檢視原始碼映射出、橫跨 18 個語言的 263 處替換;docs-assistant 一併繼承此修復。
新增
- 預先壓縮的 bundle + 可快取的冷載入(CAR-104):
make-bundle.mjs在發佈時產出bundle.js.br(brotli q11)+.gz;一個 bundle 專屬的 middleware 以Vary: Accept-Encoding、public, max-age=300, must-revalidate+ ETag/304 協商 br > gz;帶新鮮度防護(伴隨檔案絕不會提供比本體 bundle 更舊的內容)、直接抓取產物回傳 404、CSP 逐位元組相同。冷載入:3.1 MB → ~0.6 MB 傳輸量(−80%);5 分鐘內的重複造訪傳輸 ≈0 位元組。
備註
- 所有修復皆來自 agent 艦隊,附紅→綠證據(各測試套件共 13 + 28 + 1 + 30 + 7 個新案例),並經評審輪修整(CodeQL #579/#580/#584 直接在程式碼中修掉 — 測試 stub 的 URL 改以
new URL().host解析,一個已無用的提示字串移除)。 - v1.258.0 的分數回填數字現已記錄於 CAR-129(
updated: 22、reportScoreless: 159)。 - 刻意不做:不為 349 篇歷史報告做追溯性日期修正(回填屬於需擁有者核准的維運操作)、不做地圖叢集檢視(CAR-125 繼續排在這項地理編碼修復之後)。
- 測試 5823(+74)。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器);無 i18n 鍵(CAR-108 僅修改既有鍵的值)。
[1.258.0] — 2026-10-25
agent 艦隊的六項修復,一趟發佈列車:#/scan 的公司計數器不再混合兩個世界、深度研究必須註明來源、表單錯誤讓欄位亮起、載入狀態迎來骨架與即時的 h1,而評估則快取其 37k-token 的提示前綴。
修復
- #/scan 的 «活動公司» 計數器(CAR-100):分子統計的是所有結果列中的不重複公司數(正式環境為 1554 — 光是 hh.ru 就貢獻了數百家),分母統計的卻是 API 支援的追蹤公司數(約 90)— 兩個不同的世界混進了同一個分數。配對選項 (a):分子現在只統計 API 支援的追蹤掃描自行抓回的列之中的公司(以
_entry ?? company配對;hh.ru/telegram 的雇主列會被剔除);掃描前的回退也移進了同一個世界(它可能顯示 «104/90»)。 - 深度研究的捏造(CAR-110):deep 提示現在帶有硬性契約 — 每一項事實陳述都以
[source: domain.com]結尾(叫不出來源名稱就不要陳述;捏造標記比寫下「unknown」更糟),未知的事實一律寫成unknown,且報告必須以## Data freshness章節作結。新鮮度錨點:今天的 UTC 日期,加上POST /api/deep上可選的公司url(有邊界,伺服器端絕不會去抓取)。 - 表單錯誤標亮欄位(CAR-130):POST 失敗時,第一個表單欄位會被標上
aria-invalid+.is-error並取得焦點(WCAG 3.3.1);編輯時即清除。網路錯誤提示現在能分辨部署型態 — loopback 保留開發指令提示,已部署的來源則顯示「伺服器沒有回應」而不是bash web-ui/bin/start.md的建議(連線橫幅原本也有同樣的寫死內容)。 - 載入狀態(CAR-112):#/map 與 #/tracker 即時渲染 h1(路由器的焦點目標在資料抵達之前並不存在),並以共用的骨架輔助(
Skeleton.rows—role="status"區域內的 aria-hidden 微光列,重用common.loading)取代 tracker、掃描結果與地圖外殼上光禿禿的「載入中…」文字;prefers-reduced-motion會停止脈動。 - 評估提示快取(CAR-111):
buildEvaluationPromptParts把約 37k-token 的提示切為位元組穩定的前綴(CV + 設定檔 + mode 檔案 + 指令)與 JD 尾段;Anthropic 路徑送出[prefix + cache_control: ephemeral] + [JD]— 首次呼叫之後,前綴每次都以快取讀取費率計價(≈10× 更便宜)。前綴缺失或不相符時,開放式退回與舊請求逐位元組相同的請求;OpenAI 相容的串聯不受影響(那邊是伺服器端快取)。
備註
- 六項修復皆來自 agent 艦隊,附紅→綠證據(5 + 7 + 7 + 7 + 8 個新案例)與評審輪;CAR-111 最早的 CodeQL 警示(#579/#580)直接在程式碼中修掉 — 測試 stub 改為解析 URL 主機而非子字串比對,一個已無用的完整提示字串也一併移除。
- 分數回填已在正式環境執行(v1.256.0 端點,經擁有者同意):
updated: 22、missingReport: 0、reportScoreless: 159— 159 筆無分數列指向的報告,其標頭早於機器區塊,或帶有無法解析的分數格式;只能靠重新評估或更寬的解析器通道取回(已記錄於 CAR-129)。 - 刻意不做:不更動通勤欄的 nulls-last(既有的
Infinity-on-desc 怪癖)、不對舊用量記錄做追溯性重新計價、不為掃描篩選表單加上.is-error式的標亮(CAR-130 的範圍限定於共用的 mode 頁面送出輔助 + api.js 提示)。 - 測試 5749(+36)。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器);無 i18n 鍵(CAR-130 的提示重用
conn.down;骨架區域重用common.loading)。
[1.257.0] — 2026-10-25
兩項 agent 艦隊修復:應用程式內的說明助理現在能理解天城文與坦米爾文,用量頁面也會顯示 Hermes 實際的成本。
修復
- hi/ta 的說明助理檢索(CAR-103):
docs-assistant關鍵字分詞器的字元類別是[\p{L}\p{N}\u30fc]+— 不含組合記號。每個天城文 matra(ा ै ्…)與坦米爾文母音符號(ே ை ்…)都會把一個詞切成碎片;長度規則丟棄短碎片(一則印地語查詢比對到 0 個章節),較長的詞則被砍去字首、變成與不相關章節誤撞的垃圾。字元類別現在保留\p{M};CJK bigram 路徑不受影響。hi 的 «मैं स्कैन कैसे चलाऊं?» 與 ta 的 «ஸ்கேன் எப்படி இயக்குவது?» 現在能從隨版本出貨的說明包中檢索到正確的章節。 - Hermes 的用量成本(CAR-106):
normalizeUsage()把供應商用量壓縮成{in, out},並默默丟棄了閘道器回報的cost—#/usage在 9.5 M 個 Hermes 權杖上顯示 $0.0000(它在定價表中的那一列是 0/0)。用量記錄的結構新增一個可選且向下相容的cost?;彙總器優先採用每筆記錄中供應商回報的成本,僅在缺失時才退回定價表估算;垃圾/負值一律丟棄,絕不捏造。
備註
- 兩項修復皆來自 agent 艦隊,並附紅→綠證據(3 + 5 個新案例;14/14 與 10/10 全綠;鄰近測試 78/78 與 61/61)。最早的兩個 PR(#470/#471)帶著過期的 worktree 基底,與已 squash 合併的 v1.256.0 衝突 — 由乾淨的 cherry-pick(#472/#473)取代。
- 刻意不做:不對歷史的
data/llm-usage.jsonl列做追溯性重新計價(它們不帶 cost 欄位;只有新記錄受益)。 - 測試 5713(+8:docs-assistant ×3、usage ×5)。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器);無 i18n 鍵。
[1.256.0] — 2026-10-25
追蹤器資料品質:職稱絕不會被記錄成公司、職缺看板絕不會被記錄成雇主、未評分列不再浮現在最前面 — 並新增一個一次性端點,直接從報告本身回填缺失的分數。
新增
- 分數回填(CAR-129):
POST /api/tracker/backfill-scores為連結報告帶有可解析分數的列填入 Score 儲存格(181 個已評估列有報告卻無分數)。已評分列、明確哨兵值(N/A)、無報告的列與無分數的報告一律不動;只在檔案鎖下改寫 Score 儲存格;分數形狀在寫入點驗證並規範化為追蹤器的X.X/5慣例;執行是冪等的,並回傳{ok, updated, missingReport, reportScoreless}。
修復
- 職稱絕不會是公司(CAR-128):
guessCompanyRole把破折號標題行的左側當成公司,但看板兩種順序都會寫 — «Senior Frontend Engineer - Grafana Labs» 就把職稱當成公司記錄了(13 列:Grafana、CircleCI…)。現在改以帶詞邊界的職稱關鍵字啟發式挑選職稱那一側,且僱用型態絕不會變成雇主(«Senior Engineer - Remote (EU)» 什麼都不記錄,而不是記錄成 «Remote (EU)»)。 - 職缺看板絕不會是雇主(CAR-127):網域 slug 回退把 hh.ru 的列記錄為 «hh»(120 列)。
hh/habrslug 加入非雇主清單;句中雇主推斷(«в компании X»、«X ищет»)現在也對職缺看板主機(hh.ru/kz/uz/by、habr.com)執行 — 這些頁面的文字會寫出真實雇主。過程中找到的根本原因:那些推斷模式中的 ASCII\b/\w從頭到尾匹配不了西里爾字母 — 自 v1.248.4 起便默默失效;改以 Unicode lookbehind 與\p{L}類別取代。 - 未評分列排最後(CAR-129):追蹤器的分數排序使用
-1哨兵值,因此在預設升冪排序下,每一列未評分列都排在所有已評分列之前。Null 現在在兩個方向都排最後(分數「篩選器」保留其-1— 「未評分未過 ≥4 篩選」在該處是正確語義)。
備註
- 本版本「不」遷移歷史列:解析器修復只適用於新評估;分數可透過回填端點取回,而那 120 個 «hh» 雇主儲存格需要的是重新評估,而非改寫。
- 併入一輪 opus-5-5 評審:無錨點的 «X ищет» 模式在發布前被移除(動詞前任何大寫開頭的字串都會被記錄成雇主 — 這違反無虛構不變量),加入句首 «В…» 錨點;回填寫入器會重新檢查目標儲存格(手動編輯後存在重複的
#列)、保留手寫殘缺短列的欄數,並在第一個非表格行處停止。帶點名稱中的點(«Сбер. IT»)對 «в компании» 錨點而言與句點無法區分 — 記錄保守的前綴(«Сбер»);動詞錨定的模式則能捕捉完整形式。 - 刻意不做:不把比較器從
tracker.js抽取成可單元測試的函式庫(來源靜態閘門保留;已記錄於 CAR-129 作為後續)、不調整通勤欄的 nulls-last(既有的Infinity-on-desc 怪癖)、不為 «hh» 列做資料遷移。 - 測試 5705(+10:
auto-pipeline-jd-gate中 5 個 identity 案例、2 個 CAR-128、CAR-129 排序閘門、4 個回填(含 hostile-path 釘選)— 減去被替換的 v1.248.x 案例)。未觸碰任何掃描器來源(註冊表 121 = 116 EN + 5 RU · 116 配接器);無 i18n 鍵。
[1.255.2] — 2026-10-24
來自線上迴歸與一次正式環境崩潰報告的三項使用者可見修復:#/scan 渲染崩潰、失明的越南語語言檢查,以及反覆出現的 zh-TW 摘要區塊丟失。
修復
- #/scan 崩潰(CAR-99):自 v1.253.0 起的計數閘門再生在
FALLBACK_SOURCES字面量的每個條目後都多寫了一個逗號 — 共 120 個陣列空洞。掃描檢視中的new Set(FALLBACK_SOURCES.map((s) => s.value))因此裝著undefined,公司分類器的id.length在每次頁面渲染時都拋出TypeError: Cannot read properties of undefined (reading 'length')(正式環境由 logbuf 捕捉)。空洞已移除,新增一道閘門(4 個規格,紅測試驗證)會執行該檔案,並對配接器 id Set 中的任何空洞、不可用條目或undefined判為失敗 — 只看文字的漂移閘門看不見這一類問題。 - 失明的 vi 語言檢查(CAR-97):越南語是拉丁文字,線上 QA 停用詞表中沒有它的條目,因此「vi 停用詞」統計到的是英文命中,一篇越南語回答被讀成
report not in vi(線上迴歸:vi 2、en 2)。越南語現在擁有自己的十個功能詞詞表 — 純 vi 報告通過,英文報告仍然失敗。 - zh-TW 遺失 SCORE_SUMMARY 區塊(CAR-98):收尾語言提醒只說機器格式不得翻譯,從未說明摘要區塊必須存在 — 一篇簡短的 zh-TW 報告(5,983 字元)帶有 A–G 各區塊卻完全省略了該區塊(v1.239.2 等級的復發)。開頭的指令與收尾提醒現在都聲明該區塊為強制,缺少它報告即無效。
備註
- 本版本刻意不更動任何掃描器來源、註冊表計數(121 = 116 EN + 5 RU · 116 配接器)或供應商接線 — 它是純修復版本,因此計數閘門原封不動。
- 測試 5695(+9:
car99-fallback-holes×4、car97-vi-lang-check×4、CAR-98 提示語不變式 ×1)。瀏覽器 143/143。vi/zh-TW 的線上複檢隨部署後迴歸進行。
[1.255.1] — 2026-10-24
兩輪評審修復:越南語的 Opus 評審(9 項發現)與 CAR-91/92 修復的第二輪評審(5 個必修項)— 兩輪均以紅→綠測試收尾。
修復
- vi 語言評審輪(CAR-88 後續):洩漏進
project.subtitle/project.roleHint的韓文字母(신)已修正為độ khớp tín hiệu,並新增一道閘門 — vi 值中只要出現 EN 詞典未攜帶的任何 CJK/Kana 字元即告失敗;docs/help/vi.md 中六個含空格的 markdown URL(what-is career-ops、apply for a job、set up playwright等另外三個)已加連字號改為真實的指南 slug,並新增 URL 不得含空格的閘門。 - 評估標題邊界(CAR-92 r2 H1):
&、.、/、'現在是區塊字母左邊界中的組成字元 —## Q&A、## Plan B、## Ph.D. requirement、## E-commerce不再被登記為區塊 A/B/D/E;裸的行尾終結符只在區塊詞 token(Block/блок/블록/…)之後才被接受;ASCII-已退出拼字終結符類別,E-commerce/ई-मेल標題因此得以存活。 - 烏克蘭/俄文字母編號報告(CAR-92 r2 H2):А Б В Г Д Є Ж 序列偵測器現在是共用輔助函式;當它在某個標題層級找到 3 個以上序列字母時,該層級即成為切割器的參考層級 — 帶字母的
### A.子節不再使報告在區塊 Б 處被截斷。 - 攜帶列生命週期(CAR-92 r2 M1):失敗來源攜入下一次掃描的列現在會蓋上
carriedSince戳記,在 30 天後或連續攜帶 5 次後移除,並附加在新鮮列之後,而不是永遠默默重新累積。 - **Gemini synthesis 分母 + 合法性(CAR-92 r2 M2)**與子進程 body-score 路徑(M3):改由 findings 檔案讀取,均以紅色測試先行修復。
- 冷載 bundle 漂移閘門已為 vi 詞典更新(90 個 script 標籤 / 87 個可打包),其未使用的測試綁定已移除(CodeQL 572)。
備註
- 評審指出的 README.vi「Latest」橫幅配接器計數措辭位於前一版本橫幅內,且已與 EN README 逐位元組一致 — 為維持 EN↔vi 一致性而保持原樣(已記錄於 commit 正文)。
- 測試總數 5686(+26:
eval-validate-opus-r2、scanner-carryover-r2、vi 閘門斷言)。註冊表不變:121 來源 = 116 EN + 5 RU · 116 配接器。
[1.255.0] — 2026-10-24
越南語(Tiếng Việt)成為第19個介面語言 — 一個與 EN 完全對齊的 1525 鍵詞典、vi/vi-VN 偵測、完整說明包、README 與 CHANGELOG 鏡像、cvstart.org 落地頁整合,以及語言切換器中的 🇻🇳。
新增
- 越南語(
vi) — 1525/1525 鍵,與en完全對齊;detect()接受vi與vi-VN;越南語為 LTR(不加入RTL_LANGS)。‘Pipeline’ 維持 ‘Pipeline’ — 標準技術外來詞,已列入白名單。 - 完整 docs/help/vi.md(33 H2 / 125 H3),外加 README.vi.md 與 CHANGELOG.vi.md 鏡像,以及
prompts.mjs中的越南語鷹架字串(LOCALE_NAMES+SCAFFOLD_STRINGS)— 越南語 LLM 輸出開箱即用。 - cvstart.org 落地頁越南語版 —
site/src/i18n/vi.json、sitemap 的 locale 項目與dashboard-vi.png截圖;語言切換器新增 🇻🇳(19 個位置)。 - 列舉閘門 18 → 19 — LANGS、detect 探針、i18n 稽核、changelog 對齊、README 翻譯區塊、locale 掃描 — 外加 red-first 的
tests/i18n-vi-locale.test.mjs(139 行)。
備註
- cvstart.org 落地頁新增 vi — 對 ta 前例的一次有意偏離(該版本刻意維持落地頁為 17 種);已記錄於發布規格。
- vi 是拉丁文字,不適用 no-latin-leaks 閘門(它守護非拉丁語言);拉丁技術詞彙在此是常態。
- 測試下限:5634 → 5642(1 項跳過 = 可選的版面截圖瀏覽器測試,未變)。
[1.254.0] — 2026-10-24
來自最大模型評審輪的強化版本:掃描器快照不再遺失列,LLM 層的 11 個不變量違規已修復,23 個 SPA 必修項落地,Paylocity ATS 加入掃描器 — 註冊表現在提供 121 個來源(116 EN + 5 RU)與 116 個配接器。
新增
- Paylocity ATS(父 #5687):按租戶的
recruiting.paylocity.com板塊,死板塊 302 → JobNotFound 映射為 404 使檢疫退場該條目,max_jobs上限與截斷標誌。註冊表:121 來源 = 116 EN + 5 RU · 116 配接器;計數閘重新生成。
修復
- 掃描器快照安全(R-12):什麼都不嘗試的掃描現在保留快照(
nothing scanned);整體替換會攜帶失敗來源的舊列 — 按條目蓋章 — 重新通過當前過濾器,只落入filtered。 - LLM 層 11 個不變量:語言指令打開並關閉 deep/mode 提示;Gemini 子進程轉發
--lang、非零退出 → 502、不向客戶端漏 stderr、300 秒逾時並記錄 usage;manual fallback 攜帶職缺 URL;/api/mode浮現截斷;spend tier 不再被客戶端覆蓋;客戶端斷線中止進行中的供應商呼叫;重複標題切割器不再摧毀有效報告;score/legitimacy 提取器與驗證器一致;烏克蘭序列和阿拉伯語 و 的假接受收緊。 - 對修復本身的 Opus 5-5 評審輪(8 個必修):切割器的多字母註冊、更寬的標題終結符、Gemini 子進程中止佈線、按條目蓋章的攜帶歸屬、攜帶列重過當前過濾器、按不同字母數定的參考層級。
- 23 個 SPA 必修:sourcing 視圖(單頁 pager append、pipeline 列鍵盤、saved-search 過濾器恢復、source select 重置、config 預設值回退、監聽器洩漏、SSE 終態關閉、掃描 runner teardown、裸 fetch、失敗載入看起來像空、window 衝突、焦點保留)與 assist 視圖(失效的 help 深鏈、help 監聽器洩漏、two-pager 空白覆蓋的重新武裝、付費執行的 single-flight、靜默流結束、永久轉圈的錯誤路徑、失敗過濾器的幽靈列、docs-fab 重複 + 語言)。
備註
- 整個回合都經受 Opus 5-5 最大嚴格度的評審 — 合併前的移植(21 項發現、13 項修復)和修復本身的事後評審(8 個必修、全部帶紅→綠測試落地於此)。
- 測試底線:5262 → 5634(來源、掃描器、LLM 層與 SPA 共 372 個新規格)。
[1.253.1] — 2026-10-24
最大模型評審的兩項 HIGH 安全發現已修復:IPv6 字面量 URL 不再繞過掃描器的 SSRF 守衛,CV markdown 的轉義正則也不再二次回溯。
修復
- IPv6 字面量繞過 SSRF 守衛(
http-json.mjs):括號 IPv6 字面量使dns.lookup拋異常、守衛 fail-open。現在去括號後經isIP直接分類 — 無 DNS、無 fail-open。 - CV markdown 轉義的 ReDoS(
security.mjs):模式二次回溯 —<+ ~10萬空格耗時 ~16 秒;現在用扁平有界類 ~1 毫秒。舊有轉義全部保留。
備註
- 兩處修復均帶紅→綠回歸測試(3 個新 IPv6 用例 + 時間邊界的 ReDoS;共 5511 測試,+7)。
- 掃描器源檔不受影響 — 守衛位於兩個掃描器共用的傳輸層。
[1.253.0] — 2026-10-24
十個新的職缺來源加入掃描器 — Atlassian、BWI、Computrabajo、Dover、Google、Kalibrr、Magneto365、Platsbanken、Tech in Asia 和 Zoho Recruit — 註冊表現在提供 120 個來源(115 EN + 5 RU)與 115 個配接器,且角色匹配器不再把僅差一個短大寫代碼的職缺名稱當作同一職缺。
新增
- 10 個來源移植自父 1.38.0,各帶 fetch-walk 配接器與 CI 隔離套件(假 fetchImpl、零網路):Atlassian(單一免認證 JSON 源、iCIMS URL、https+icims.com allowlist)、BWI(JSON-LD ItemList、JSON.parse 優先)、Computrabajo(拉美、實體解碼、西語 «remoto» 識別 remote)、Dover(按租戶 DRF 分頁、
Remote (International)渲染、UUID 驗證板塊)、Google Careers(按短語首頁、卡片雇主優先、查詢間去重)、Kalibrr(SEA 聚合、feed id 作列 id)、Magneto365(拉美、固定翻頁節奏)、Platsbanken(瑞典 JobTech API、按關鍵字視窗)、Tech in Asia(從網站建置發現 Algolia 金鑰)、Zoho Recruit(隱藏輸入板塊、受限 detail 增强、僅 ISO-4217 幣別解析)。 - 註冊表計數:120 來源 = 115 EN + 5 RU · 115 配接器;五個計數閘從活註冊表再生成;
#/scan下拉回退、cvstart.org 來源連結與 help §17 ×18 跟隨。
修復
- 角色匹配器(#5688 移植):僅差一個短大寫代碼的職缺名稱(«HR BP» vs «HR GP»、«AWS» vs «GCP»、包括混合文字)不再被模糊匹配為同一職缺;代碼從原始標題讀取並排除噪音詞,守衛放在 Jaccard 比率之前。
- 移植通過了最嚴格的 Opus 5-5 評審(21 項發現):標記漂移時的靜默空板塊改為 throw(google/bwi),預中止的掃描 throw 而非返回
[],拉美爬蟲的 decode-then-strip 順序(strip-then-decode XSS 形態),atlassian 列 URL 的 https+allowlist,拒絕連接埠的主機斷言,後段頁面 parse 移入 try(部分結果存活),以及測試誠實度(預算精確斷言、強制契約如實釘死)。13 項已修,[spec] 尾巴單獨追蹤。
備註
- 五個 RU 來源保持 web-ui 專屬(上游無配接器 — 有意為之);每個 EN 來源都有配接器。
- 覆蓋率棘輪:六個最大的移植檔案提升至 ≥95 % branch(27 個新用例);防禦性死代碼餘項按檔案記錄。
- 新來源透過 portals.yml 的
provider: <slug>選擇 — 對現有配置無任何變化。
[1.252.1] — 2026-10-17
Wiki 的版本橫幅現在由腳本把關而非手動掃描 — v1.252.0 回歸只能靠人工發現 — 且 locale 指令明確覆蓋個人資料的 language.output 和職缺發布語言。
新增
scripts/wiki-banner-check.mjs— 回歸所要求的閘門:讀取 wiki 克隆中的每個Home*.md,將橫幅與package.json及註冊表的即時計數器(入口註冊表的 scanner adapters — 105,而非橫幅裡過期的 109;server/lib/routes/的 route modules;CHANGELOG 集合的 UI locales)比對。橫幅正則按形狀而非詞語實現語言無關:本地化的 Home 頁面翻譯了標籤和計數器(«Текущий релиз»、«Aktuel udgivelse»、«адаптеров сканера»、«enhedstests»),其數字比英文頁(5245)偏離得更遠(5177)。--tests N接收剛執行的test:ci列印的數字;--check-only禁止隱式克隆以便離線使用。離線夾具測試在tests/wiki-banner-check.test.mjs。
修復
- Wiki Home ×18 橫幅重新同步(隨本版本一起推送):v1.252.0 的掃描只換徽章和連結,從不碰橫幅行,也沒有任何機械手段標記它。上面的閘門使其成為發布阻塞檢查。
- Locale 指令確定語言優先級(
buildLocaleDirective):«This UI locale overrides the profile’slanguage.outputsetting and the job posting’s own language»。父端自己的規則 6 要求用language.output寫作 — 沒有優先級句子時,模型按 locale 不一致地解決兩條矛盾指令,這正是 v1.252.0 語言欄的散亂。由tests/locale-directive-language-output.test.mjs以指令文本釘死(17 個非 EN locale + 空 EN)。
備註
- ta evaluate 形態觀察(§3,盯着):v1.252.0 的首次實況執行產出了 48 336 字元、無 Block G、無 SCORE_SUMMARY 的 evaluate — 是循環形態,不是語言形態(CAR-70 是語言)。下個版本再犯,就單開 Linear issue,與 CAR-70 分開。
- 按 FIX-提示:父端保持唯讀;覆蓋完全活在 UI 指令裡。
[1.252.0] — 2026-10-17
父分支已與 career-ops-hq/career-ops 同步 — 上游 264 個提交,父版本 1.36.0 → 1.37.0 — 兩處 fork 差異均獲保留,部署將執行中的父版本重新固定到該基線。
新增
- 越南語(vi)市場模式來自上游(
modes/vi/、tuyen-dung/ung-tuyen):BHXH/BHYT/BHTN、thử việc、lương tháng 13、trợ cấp thôi việc — 父模式表中的第 21 個市場。 - Tech in Asia 板塊提供者(上游):讀取 techinasia.com 招聘 UI 自己查詢的公開 Algolia
job_postings索引 — SEA 初創公司板塊,抽樣時約 300 條在招職缺,其中 273 條在印尼。金鑰每次執行都從網站建置重新發現,雇主自己的應徵連結優先於板塊頁面,且刻意不附加薪資(索引的薪資欄位是旗標,不是金額)。 - 新增八份 Block G 發布合法性信號文件(
modes/oferta-signals/08–17):福利/僱傭術語國家不匹配、第三方平台位置標籤不匹配、仲介牌照、移民身分要求越權、管轄區禁止內容、pay-transparency 區間寬度、最低工資律師問題、AI 篩選揭露、定期契約揭露、搬遷購買力。
更改
- 隨基線上車的父端強化:story-provenance 檢查按單位和句子工作,並把
user-cannot-confirm數字擋在談判、ATS 和面試輸出之外;CV fact-gate 在每個渲染器上執行並讀取改寫和結構化聲明;LaTeX 在寫入前拒絕過期的提取槽位;follow-ups 關閉時跳過 launchd 掃描;update-system 把本地編輯掃描保持在 argv 限制內。 - 叉的分叉差異在合併中存活:
providers/telegram.mjs(僅叉有的解析器,ADR-0001)和telegram-channel.mjs中的 Unicode 環視LOCATIONISH_RE(ADR-0002)。板塊文件現在列出上游改進的telegram-channel行、僅叉有的telegram行、Tech in Asia,以及提升至 20 → 100 的 Tencent 預設max_pages。
備註
- 本版本無 SPA 行為變化:這是文件列車加父版本重新固定。部署現在執行父 1.37.0;規範狀態表不受父版本增量影響 — 追蹤器狀態渲染與之前完全一致。
- 上游合併解決了兩個衝突:
docs/SUPPORTED_JOB_BOARDS.md(兩行 telegram 均保留)和test-all.mjs(上游基於 walkTree 的copyDirSync吸收了叉的.git巢狀檢出手動守衛;匯入列表為聯集)。
[1.251.1] — 2026-10-12
地圖的專業篩選現在只匹配角色的特有詞 — 資歷和泛型職位名詞不再自行匹配職缺 — 且 remote-qa 將形狀與語言分離,語言漂移不會標紅 A–G。
修復
- 專業篩選只保留區分性 token:«Senior PHP Developer» 曾透過共用的 Senior/Developer 匹配到 «Senior Java Developer»。匹配器只保留區分性 token(PHP、Go、Platform、SRE、Backend…);沒有區分性 token 的角色(«Software Engineer»)回退到整短語匹配。詞邊界保留:«Go» 永不匹配 «Golang»/«Google»。
- remote-qa 分離形狀與語言:A–G 僅按塊/SCORE_SUMMARY/looping 代碼判定;
report not in <locale>漂移移到自己的標誌和 warnings 欄(表格補上缺失的第 4 欄;代碼按行儲存)。 - 地圖工具列在 390px 為真正的 50/50(58/42 分割使搜尋框只剩 124px 並截斷佔位符),死代碼
.job-map-job-selectCSS 規則刪除。 - CodeQL 552 — design-qa 測試中未使用的
OVERLAYS變數已刪除。
備註
- 英里仍由所有者推遲。ta 語言漂移保留為 hermes 後端的已記錄限制(各次執行散文佔比 2–26%;A–G 保持):remote-qa 將其報告為預期發現。泛型 token 清單刻意保持最小 — 擴充只需每個語言一行。
[1.251.0] — 2026-10-12
地圖的下拉現在按設定中的專業方向篩選(config/profile.yml → target_roles.primary):選擇 «Product Manager» 或 «Backend Engineer (Go / PHP)» 後,地圖只保留標題帶有該角色詞語的職缺。v1.250.0 的職缺列表定位器已移除 — 那是錯誤的工具(所有者修正)。
新增
- 專業方向篩選:下拉列出設定中的專業方向(target_roles.primary);選擇一個後,只保留標題帶有該角色區分詞的職缺(詞邊界、不分大小寫 — «Go» 不會匹配 «Google»);Reset 恢復全部。
- 移除 v1.250.0 的職缺列表定位器 — 替代:按專業方向篩選,而非職缺列表(所有者修正)。
更改
- Two mobile-map height specs: the floor moves 600 -> 540 px (the toolbar takes ~90 px of the viewport).
- 英里仍由所有者推遲。匹配刻意僅按標題(使用設定中的詞):對公司名或描述匹配會把無關職缺拉進專業方向。未配置角色之外的職缺在 «All» 下仍然可見。
[1.250.0] — 2026-10-12
地圖頁面變得可用:地圖上方的職位定位器飛向任意可見職位並開啟其預覽卡(包括桌面端),文字搜尋按公司或職位收窄地圖 — 兩者都能在重新載入後保留。
新增
- 職位定位器:地圖上方的下拉列出可見(通過篩選)的職位,按公司+職位排序;選擇後飛向圓點並開啟其預覽卡 — 桌面端同樣。
- 文字搜尋:按公司+職位子字串收窄地圖(不分大小寫比對;輸入框保留輸入的大小寫),存入 map-prefs,Reset 清除。
- FAB 不再遮擋
#/map的版權標示(所有寬度)。
修復
- 兩個行動裝置地圖高度 spec:下限調整為 540px(工具列佔視口約 90px)。
備註
- 英里推遲到下一版本。4 個新 i18n 鍵進入全部 18 個字典,組裝快照重新生成。定位器總是開啟預覽(導航會違背其目的);圓點透過 __job 反向引用定位 — 非 L.Circle 已佔用的 _point。
[1.249.0] — 2026-10-11
職缺地圖現在以相關性為先:平靜的藍綠色到灰色刻度突顯最佳職缺,評分和車程篩選會保留;行動版使用全高地圖並支援點按預覽,Tracker 也共用車程篩選和排序。
career-ops-ui v1.267.1 · page 1/9 · mirror of the project changelog for cvstart.org