変更履歴

GitHub

すべての注目すべき変更をリリースごとに記録しています。同じファイルがリポジトリに収録されており、19言語すべてに翻訳されています。

[1.267.1] — 2026-11-04

修正

  • リリーストレイン修復(v1.267.0 の CI ゲート) — PROJECT-CONTEXT のテストカウントチェーンは v1.267.0 のヘッドでこれ以上断裂しません(eval grader がマッチする矢印形式)、QA プロンプトは再整理され(リリースごとにライブプロンプト 1 件、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

追加

  • 新しいスキャンソース 4 つ — GermanTechJobs、Darwinbox、Keka、ApplicantPro/isolved(レジストリ 125 → 129 = 124 EN + 5 RU · 124 アダプタ) — career-ops @ 7d8feb6d(上流 87 コミット)対応の第 2 parent-sync ウェーブ。GermanTechJobs(#6346):germantechjobs.de/rss のボード全体 RSS(1 リクエストで約 626 件);雇用主は title の最後の " @ " セグメント — これを含まない title は、ボード名義で登録される代わりに破棄されます;明示的な provider: 選択のみ。Darwinbox(#6416):<tenant>.darwinbox.in 配下の認証不要の alljobs JSON、企業 id は careers URL から取得、(50/ページ、max_pages 20/200 の)ページネーション POST ウォークで、短ページの停止判定はソース自身の行数から読み取ります。Keka(#6199):2 リクエスト — フィード UUID をスクリプトが指し示す redirect:'manual' の careers シェル(未知のテナントは TenantNotFound.html へ 302 し、名前付き 404 として読まれる)の後、オープン中の在庫全体を 1 つの embed-jobs 配列として取得。ApplicantPro / isolved(#6252):ブートストラップから数値の domainId を取得し、次に {success, data:{jobs, jobCount}};jobCount > rows ならリストが不完全であることを警告;オプトインの applicantpro: { fetchDetails: true } で 250 ms ペーシングの JSON-LD エンリッチ。
  • ETag によるボードレスポンス再利用(#6105) — 1 スキャン内で、直近 15 分以内に取得したボードレスポンスはそのまま再利用され、それより古いものは If-None-Match で再検証(304 ならボディを保持);キャッシュキーはメソッド + URL + 認証ヘッダー + ボディをカバーし、重なる読み取りは in-flight の promise に集約、CAREER_OPS_HTTP_CACHE=0 / _TTL_MS で上書きできます。スキャン実行ごとのメモリ内保持(web-ui には on-disk キャッシュ契約がない)— 偏差として記録済み。

修正

  • 4 つのボードの日付(#6274) — remoteok、remotive、workingnomads、IBM が公開日を出力するようになり、「Posted within」フィルタがこれらのボードで機能します;remotive のタイムゾーンなしタイムスタンプは UTC 正規化され(マシンごとの age バグが実際に発生していました)、IBM の _source は実際に dcdate を要求します。
  • portals.yml のスペルミスされたキーは拒否されます(#6107) — EN スキャンは、これまでのように titel_filter: を黙って無視する代わりに、どのフェッチよりも前に名前付きエラーを throw します(ファイル + キー + 最近傍キーの候補、Levenshtein ≤ 2)。
  • getro は古い featured ピンの先へ歩き続けます(#6406) — ピン留めされた期限切れ求人は依然として破棄されますが、もはやページネーションを終端させません;ウォークは実際の短いページで終わります。

メモ

  • 意図的に見送り:RU スキャナの seen-filter は言語非対応のままで、その portals パース経路はスペルミスキーゲートを実行しません(ハンドオフはウェーブスペックに記録 — RU ボードはまだ言語ごとの行を出力しないため);remoteok はオフセット付きの date 文字列のまま UTC 正規化しません(ライブの形状は決定的です)。Tests 7096 → 7243;Playwright 173 pass / 0 fail / 1 opt-in skip;レジストリ 129 = 124 EN + 5 RU · 124 アダプタ(全カウントゲートを生レジストリから再生成)。

[1.266.0] — 2026-11-01

追加

  • Personio の言語バージョンが互いに食い合わなくなりました(CAR-223:parent #4789 + #5044 + #5285) — 先送りされていたスタックを独自のリリースとして実行。スキャン側(#4789):scan_history.dedup_include_language: true(厳密なオプトイン — OFF はバイト単位で同一)により、seen-history バリアント機構(languageFormsFromUrl / recordUrlVariant / isUnseenLanguageVersion)を通じて一つの求人の言語バージョンが重複排除を生き延びます;正規キーは language/lang/locale パラメータを剥がします。preferred_languages(#5285):求人のバージョン行を優先順に並べます(安定、同順はプロバイダ順)— スイッチとは独立(OFF は優先バージョンを保持、ON はすべてのバージョンをその順で保持)、validate-portals の移植版 validatePreferredLanguages 付き。personio fan-out(#5044):careers ページは ?language=en の強制なしで取得され(テナント自身の ?language=xx は尊重)、language + ?language=<code> URL 付きで言語バージョンごとに 1 行を出力;dedupIncludeLanguage は言語ごとのフェッチを追加(上限 5、ペーシングあり);/xml と job-link のフォールバックは変更なし。recruitee も同じ language 出力 + preferred_languages(opts またはエントリ)を得ます。共有ヘルパーは server/lib/language-preferences.mjs にあります。

メモ

  • ハンドオフを記録、意図的に見送り:RU スキャナの seen-filter は言語非対応のままで、RU ボードはまだ言語ごとの行を出力しません;クライアントの url-key.js ミラーと portals ルートの検証配線は未着手のままです。Tests 7096 → 7203;レジストリ変更なし:125 = 120 EN + 5 RU · 120 アダプタ。

[1.265.0] — 2026-11-01

追加

  • 新しいスキャンソース 2 つ — Apple と Bulldogjob(レジストリ 123 → 125 = 120 EN + 5 RU · 120 アダプタ) — career-ops @ fe857ecf 対応の parent-sync ウェーブ。Apple(jobs.apple.com、#5496 + #6196):サイトは利用可能な JSON API のない React Router SSR アプリのため、通常の検索ルートのハイドレーション blob(window.__staticRouterHydrationData)を読みます;ディスカバリーはエントリ駆動(apple.queries の関連度順テキスト軸 + apple.teams のスラグ軸、デフォルトなし — どちらもないエントリは throw)、ページは max_pages(既定 2、上限 50)で制限され 200 ms のペーシング、URL の各セグメントはサロゲート安全にエンコード、Apple が PIPE 表示した求人は snippet に「talent pipeline の可能性」ヒントを載せます — これでフィルタはしません。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 によるページ毎リトライ;最初のページ失敗は throw、以降のページ失敗は収集分を保持してページを名指しし、エントリ自身の上限で満了ページのときだけ «raise max_pages» 警告を出します。

修正

  • justjoin は lastPublishedAt で求人を dating(#6254) — 候補者 API の publishedAt は雇用主が更新するたび前進し、ボードの大部分が今日の日付を帯びて max_posting_age_days が数週間前の求人を通していました;現在はより早い公開日が優先され、欠落・パース不能ならフォールバックします。
  • jobvite は一つの posting URL を共有する行を折りたたみます(#6127) — 公開フィードは同一 detail URL に対して都市ごとに <job> 行を返します;パーサーは最初の都市だけ残し残りを重複として数えていました。現在は兄弟行はロケーションだけ寄与し、feed 順に · で結合、最初の title/date は保持、remote は結合後のロケーションで再評価されます。
  • Liveness: UltiPro ラン(#6090) — UKG には求人ごとの JSON エンドポイントがなく、クローズ済みにも 200 を返すため、クローズ済みの UltiPro 求人 57 件すべてが uncertain と読まれていました。詳細ページはレコードを埋め込みます:OpportunityIsClosed true/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 で運搬)。Tests 7096 → 7135(+39);Playwright 173 pass / 0 fail / 1 opt-in skip;coverage gate ≥ 98/89;レジストリ 125 = 120 EN + 5 RU · 120 アダプタ(全カウントゲートを生レジストリから再生成)。

[1.264.3] — 2026-11-01

修正

  • レートリミット強化波 (レビューLOW №1–3、REVIEW-2026-10-31-v1.264.1より) — writeRateLimit() (express-rate-limit@7.5.1、60 req/min ルート×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)、高コスト経路 (/api/evaluate、/api/deep、/api/auto-pipeline) ではLLMバケットの手前に3個をスタック、そして素の登録33個を配線 (CV/profile/modesエディター、すべてのトラッカー書き込み、pipeline POST/restore/DELETE、jds、7個の/api/run/*は1回のループ編集で、posting-guard、Playwright-PDFインライン、portals toggle/health/track、discover、reports、export/docx、two-pager、career-plan、memory、および3個のDELETEルート)。/api/apply-helperは素のままallowlistに残ります (純粋なローカル計算、ピン留め済み); 16個の純LLMルートは設計どおり条件付きLLMバケットを保ちます。完全性トリップワイヤ (tests/rate-limit-coverage.test.mjs、素のまま27個の状態で赤ファースト) は、将来の未スロットルのミューテーティング登録があればCIを失敗させます。
  • TRUST_PROXYオプトイン + 検証の再武装 (レビューLOW №1–2) — app.set('trust proxy', N)はTRUST_PROXY環境変数のホップ数を尊重します (真偽値trueは決して使いません — それは攻撃者制御のXFF左端をキーにしてしまいます); デフォルトでは未設定なので、ループバックは文書化済みのソケットキーによるルートごとの劣化を保ちます。validate: falseは狙いを絞ったwriteValidateConfig()になります: xForwardedForHeaderだけがオプトアウトされ (trust proxyなしではCaddyのXFFは設計どおり無視されます)、trustProxyを含む他のすべての検証は再び声高になり、将来のtrust proxy: true設定ミスは沈黙の代わりにERR_ERL_PERMISSIVE_TRUST_PROXYとして表面化します。カスタムkeyGeneratorは意図的に削除されました: express-rate-limitはプロキシ検証をデフォルトのキージェネレーターに結びつけており、ルートごとの分離は変わりません (ファクトリ呼び出しごとに1つのMemoryStore)。
  • cvstart.orgのコピー・フィードバックが2 sで元に戻ります (CAR-141) — 「Скопировано ✓」状態が受け入れ基準どおりの2 s間保持されるようになりました (以前は1.5 s)。赤ファーストのピンはtests/site-copy-feedback.test.mjs。これでエージェント修正可能なCAR-141基準は完結します; デモ動画のリフレッシュはオーナー側の見送りのままです (決定 2026-11-01)。

変更

  • ヘルプバンドルが19言語と言います (×19) — §19「Localizing the app」と§32「Run it from OpenWorker」の文はもう2ロケール遅れません: すべてのバンドルが19と言い、தமிழ்とTiếng Việtをそれぞれの列挙スタイルで載せ (arは綴り出した「التسع عشرة」を使います)、vi.md §32自身の「cả-17」の残骸も修正されました。構造ゲート (33 H2 / 125+ H3) はバイト単位で安定。
  • 状態衛生 — AGENTS.mdはv1.264.2 / 7082テストを述べます (以前はv1.86.x / 1566); PLAN.mdはリリース1–7をShippedとマークし、出荷列車の段落はdocs ×19と言います; StatsBar.astroのコメントはfacts.adaptersが実際に保持するものを記述するようになりました (123 = sources合計、消費者のために歴史的キー名は維持); i18n.jsのヘッダーは19言語と言います; v1.264.2 QAプロンプトは真のカバレッジ (98.45/90.05) とPlaywrightの算術 (176 = 174ハーネス + 1 opt-inスキップ + 2スクリプトレベルスイート) を載せます。

メモ

  • 意図的に見送った項目: 記録されたポートリストに沿ったparent-sync波はBACKLOGに残ります — フォークはまず上流a9476866を超えて同期しなければなりません (ポートリストの10コミットのうち7つはまだローカル親ツリーにありません; IBM/UltiPro/Bulldogjob/appleはS–Mでスコープ済み、personio言語重複排除は独自のリリースに先送り)。CAR-141のデモ動画の再収録はオーナーが意識的に見送っています (「видео не надо пока」、2026-11-01)。
  • テスト 7082 → 7096 (+9 カバレッジトリップワイヤ + 5 trust-proxy); Playwright 173 合格 / 0 失敗 / 1 opt-in スキップ (既存ケース内に+2 シェブロンピン); カバレッジ 98.46 行 / 90.10 分岐; evals 14/0/1skip; レジストリ変更なし: 123 sources = 118 EN + 5 RU · 118 adapters。

[1.264.2] — 2026-11-01

修正

  • サイドバーのグループヘッダーも切り詰め契約に参加 (CAR-219) — グループトグルのラベル (.nav-v2-toggle > span) が省略記号で切り詰められ、CAR-203のナビ項目と同じsyncLabelTitles()機構を通じてローカライズ済みツールチップを運ぶようになります; シェブロンは決して縮まず、トグルはクリック可能なままで、RTLも保たれます。赤ファーストのピンは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でライブ出荷しました。
  • バックログ + レビュー衛生 (CAR-221/222) — 「port when merged upstream」の6項目が完結します: 上流PRは7つすべてマージ済み、4項目はすでにポーティング済み、2項目は親側です。docs/reviews/REVIEW-2026-10-31-v1.264.1.mdが到着し (HIGH 0 / MED 0、LOWフォローアップ3件は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 (デモ動画) はオーナーのままです。
  • テスト 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ミラーには手を入れていません; 赤ファーストのピンはtests/nav-v2.test.mjs。
  • すべてのロケールに1つの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によるロケール対応のトークン予算 (16384 / 32768) は、唯一のロケールごとの分岐のままです。

変更

  • cvstart.org FAQが正確なソース数を載せます (CAR-217) — {sources} job-board sources: {sourcesEn} international boards plus {sourcesRu} Russian onesがfacts.jsonから置換されます。これはライブレジストリ (123 = 118 EN + 5 RU) から生成されるので、数字がドリフトすることは決してありません; 旧~{adapters}文言のままのロケールはadaptersRounded経由で丸め続けます。ENコピーのアップグレードが同乗します (meta.helpDesc、helpTeaser.c1.desc、faq.a2はコマンドメニュー、undo付きのグループ化パイプライン、カンバントラッカーを名指しします)。

メモ

  • 意図的に見送った項目: サイトi18nコピーのアップグレード (meta.helpDesc / helpTeaser.c1.desc / faq.a2) はこのリリースではEN限定のままです — 他のロケールは、次のドキュメント波まで正しいがやや丸い文言を保ちます (翻訳済みの箇所ではfaq.a7が正確カウントのプレースホルダーを得ます)。CAR-141 (デモ動画) はオーナーのままです; 役目を終えたcar136/m141ブランチは削除され、そのアイデアはLinearタスクに記録されています (タグarchive/car136-m141で復元可能)。
  • テスト 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配列スポーン)。成功すると行はその場で更新され (トーンクラス + タブ件数、フォーカス維持); 失敗すると元に戻りトーストを出します。リレーが扱えない行 — 手作業で編集された不明なステータス、バックフィルSentinel # — は読み取り専用バッジを保ちます (route-review LOW修正; レビュアー: HIGH/MEDの指摘なし)。
  • すべてのAIページにサーバー警告を表示 — evaluate、deep、auto-pipeline (ページ と モーダル)、career-plan、market、cv-studio (humanize + tailor)は、サーバーのwarnings配列 (出力トークン切り詰め、言語ドリフト、日付修正)をbadge-warn帯 (role="status")として描画するようになりました; auto-pipelineモーダルはdoneフレームの警告をもう落としません。新しいキーllm.truncatedNotice ×19。
  • カバレッジ波 (+111テスト) — routes/map.mjs 100/94.9、geocode.mjs 96.3/92.9、content.mjs 99/84.9、networking.mjs 96.4/89.1、sources/habr.mjs 100/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エラーエンベロープ (status: 500入りのHTTP-200) はAPI自身のテキストでthrowします; ページネーションはレコードオフセットを歩きます (以前はページインデックスでした — ページが静かに重複し、数百ではなく約52件); ウォークはAPIのディープオフセット失敗領域 (offset × limit ≥ 10000) の手前で止まります。ライブのエンドツーエンド検証済み。
  • habr — タイトル/会社名はエンティティデコードの後にタグ除去されます (hh.mjsパリティ): カードタイトル内の&lt;script&gt;が生きたマークアップとしてスキャン行に届くことはもうありません; タイトル内の正当な>>は生き残ります。
  • PUT /api/profile (rawパス) — 空でないfull_nameを持たないcandidate:ブロックは拒否されます。フィールドマージ経路と同じラインです (以前はfull_name: nullを永続化していました)。
  • ヒントの正直さ — .docをCVアップロードのacceptリストとcv.uploadHint ×19から削除 (パーサーは一度もサポートしていませんでした); config.openaiModelHint ×19はgpt-5を名指しします (サーバーはすべての*-codex idをそれにマッピングします); config.anthropicModelHint ×19とAnthropicデフォルトは親のティアを映します — デフォルトclaude-sonnet-5-5、プレミアムclaude-opus-5-5。
  • Claude Codeドキュメントリンク → code.claude.com (旧docs.anthropic.com/en/docs/claude-code URLはlinksゲートでTypeErrorを出します)。
  • help ×19: 行デンシティの箇条書きは消え (トグルはv1.263.0でUIを去りました)、18家族の壊れた**bold**スパンが修復されました — 加えてレンダラー漏れクラスが×19で修正 (すべてのテーブル後段落の後の2つ目の空行; ボールドセルから出ていくパイプ文字): 全19ヘルプバンドルでレンダー上のリテラル**は0。

メモ

  • Anthropicデフォルトモデルが変わりました — claude-sonnet-5-5 (親のスタンダードティア)。旧サイレントデフォルト (claude-sonnet-4-6) に依存していたデプロイは自動的にアップグレードされます — オプトアウトするには.envでANTHROPIC_MODELを固定してください。
  • 意図的に見送った項目: 設計上開いたままの2つのLOWレビュー指摘 (インラインセレクトはカンバンのmovesReady劣化をミラーしません — すべての失敗で正直なトーストを出すのが選ばれた挙動です; code: 'timeout'分岐は30 s超のテストではなくfake-writer契約がカバーし続けます)。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 opt-in スキップ) · カバレッジ 98.5 % 行 / 90.1 % 分岐 · レジストリ変更なし: 123 sources = 118 EN + 5 RU · 118 adapters。

[1.263.0] — 2026-10-30

追加

  • モーションポリッシュ層 — 新しいmotion.css(アプリの最後のシート): モーダル/ポップオーバーの出現(scale .97 + フェード、130–180 ms)、トーストのスプリングイン + ソフトな退出状態、テーマトグル押下スプリング、チップ/タブ押下scale(.97)、スタッガーインフラ(50 msステップ、上限12)、.page-enterルート遷移フェード(ルーター)、チップ/タブのフォーカスハロー遷移。すべてのルールはprefers-reduced-motionセーフです(動きはnoneに落ち、opacity/colorは維持)。
  • タッチの正しさ — 68個のホバーリフトルールが無防備でした: タッチデバイスはタップの後、張り付いた「持ち上がった」カードを保持していました。すべてのtransformホバーは@media (hover:hover)でゲートされるようになり(motion.cssニュートラライザー)、カードリフトは本当にインタラクティブなカードにのみ適用されます(.card:has(a)、a.card、button.card、[role=button].card) — 静的カードでの偽アフォーダンスはもうありません。
  • A11y: すべてのコントロールがプログラム上の名前を持ちます。 新しいA11yDumpヘルパーが16個のreadonly LLM出力ダンプすべてに名前を付けます; プレースホルダーのみだった12個のフィールド(CV Studio ×6、config ×2、scan検索、trackerスコアセレクト、outcomeノート、planエディター、auto URL、バグレポート)にaria-labelが付きました; a11y-form-wiresゲートはこれをクラス全体で強制するようになりました(名称なし26サイト → 現在0 + 理由を文書化したallowlist)。

修正

  • #/scan: スティッキーテーブルヘッダーは、スクロールで下に入った後もトップバーの検索の上に描画されなくなります(zがトップバーと等しく、後のDOMが勝っていました — 現在はトークン派生でその下に); 「Зарплата от/до」入力が通常サイズに戻りました(.v2-scan-bar .input flexルールがポップオーバーのcolumn flexに漏れ、flex-basis 200 pxをHEIGHTとして設定していました — 現在は>スコープ + ポップオーバーガード); デンシティトグルボタンはオーナーの決定で削除されました(配管は維持、i18nキーは×19で削除)。
  • deploy workflow強化(F1–F6): provider入力はすべてのシェル結合の前に文字セット検証されます; hermes診断は値をredactします(3つのシンクすべてで大文字小文字を区別しないキーフィルター + 値マスキング + 80文字切り詰め、?token=もマスキング); hermesステップはinputs.app_dirを尊重します; public_urlはhttpsゲート; アンチダウングレードガードには6つの実行可能ピンがあります(デフォルトなし、ガードはDeployの前に実行、厳格なrefs正規表現)。
  • レビュー末尾、赤ファースト: CSVインポートのバックスラッシュラウンドトリップ(再インポートが再びdedupされます)、cv-voiceヘッドストリップ4827 ms → 13 ms、statedYearsMinの遅延計算、posting-guardキャプチャTOCTOU、MiniMax CNワイルドカード、deelトークンスキップ、インポートピッカーは読み込み前にサイズガード。インポートモーダル: navガード装備、cancelでファイル入力を除去、ガード付きの重複読み込み、reduceによるnum。
  • オーナーUXバッチ: ダッシュボードヒーローの垂直リズム(インラインレベルの子が1つのラインボックスに接着); help TOCの−8 pxアクティブ行シフト(行ごとのインラインガター + 数字列); モバイルドロワー(見える✕閉じる、scrollTopリセット、幻の–paperフェードは.has-hudにゲート); docs-assistantページが回答内の長いURLでオーバーフローしなくなります(グリッド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)、バナー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ターゲット、inset 12); ダッシュボード「Application statuses」(応募ステータス)の空状態はv2-emptyパターンに従います; stats「?」ヒントにディバイダー + 44 pxターゲット; career-planのInputタブが結果がどこに着地するか説明します; help §1マークダウン(壊れたボールドスパン18個)。

変更

  • アクセントブルー → クリムゾンレッド(オーナー要望、ロゴ整合、hue 15) — cv3トークン5個 × テーマブロック3個; docs-assistantチャットバブルテキストは--accent-inkに乗ります(リテラル#fffで、ダークで2.39:1); fundedウォッシュは--accent-softに乗ります。Dangerはhue 25で固有の処理を保ちます。
  • ドキュメント: READMEテスティングテーブル数 ×17(v1.248期のドリフト)、help §1 + マークダウンスパン18個、help fr/it/ta «118»、ベンダー価格CHECKED_ON 2026-10-30、HANDOFF/CONTEXT/TRACEABILITYの事実。

メモ

  • 意図的に見送った項目: スケルトンスイープの再作業は外します(car112コントラクトが現在のフェードをそのまま固定); テーマトグルアイコンのクロスフェードはdisplayスワップのまま(テーマトグルPlaywrightコントラクトがそれを観察); .btn:active scaleは複製しませんでした(app.cssが所有); モーションスタッガーはインフラのみ — ダッシュボードタイルは後で採用; help ×19の散文(デンシティ言及、§1マークダウン、«118»)は次のファンアウトに乗ります。
  • フルremote-QAエビデンス: v1.262.4でjaスポットグリーン(376 s / A–G ✓); en/itはトークン密度期の早い段階でグリーン。

テスト 6869 → 6905 (+36) · Playwright 176 · カバレッジ 98.4 % 行 / 89.9 % 分岐 · レジストリ変更なし: 123 sources = 118 EN + 5 RU · 118 adapters。

[1.262.4] — 2026-10-30

修正

  • jaがトークン密度の高い評価ロケールに加わる (ja → 32768トークン上限 + 480 sクロック)。prod v1.262.3での5ロケール・スポット再ランが、その夜の4件の502 · 300 s · 0 chタイムアウトを一時的なものと決定論的なものに切り分けました: ar(250 s)、ko(291 s)、zh-CN(259 s)は再ランに合格し、ruの一回限りの言語ドリフトは再発しませんでした — しかしjaはゼロ出力のまま標準上限に2回ぶつかりました(フル×19ラン40981578549とスポット41012725839)。it/plと同じ形状クラスです。赤ファーストのピン: evalMaxTokens('ja') = 32768、evalTimeoutMs('ja') = 480_000、他のロケールは300 sを保ちます。

メモ

  • 意図的に単一目的のパッチです: ja 修正がこのリリースに載る唯一の変更で — それ以外は何も載せません。その夜の証拠では、ar/ko/zh-CNは標準上限に留まります(合格; その夜の失敗はプロバイダ負荷による一時的なものでした)、ruのドリフトは一回限りの生成フレークでした。

テスト 6868 → 6869 (+1) · Playwright 176 · レジストリ変更なし: 123 sources = 118 EN + 5 RU · 118 adapters。

[1.262.3] — 2026-10-30

修正

  • plがトークン密度の高い評価ロケールに加わる (pl → 32768トークン上限 + 480 sクロック)。prod v1.262.1でのフルremote-QAが、ポーランド語評価が標準上限で死んでいるのを捕捉しました — 502 · openrouter · 300 s · 0 ch — そしてv1.262.2と共にディスパッチされたスポット再ランがそれを正確に再現しました(ラン40960568766と40968958062): 18/19ロケールがA–Gに合格し、itはトークン密度の480 sクロック内の302 sで終わり、plはゼロ出力で2回壁にぶつかりました。決定論的タイムアウトであってフレークではありません — v1.262.1でitを動かしたのと同じ形状クラスです。赤ファーストのピン: evalMaxTokens('pl') = 32768、evalTimeoutMs('pl') = 480_000、18の標準ロケールは300 sを保ちます。

メモ

  • 意図的に単一目的のパッチです: pl 修正がこのリリースに載る唯一の変更で — それ以外は何も載せません; v1.262.2のレビュー末尾コンテンツは別途出荷されました。

テスト 6867 → 6868 (+1)· Playwright 176 · レジストリ変更なし: 123 sources = 118 EN + 5 RU · 118 adapters。

[1.262.2] — 2026-10-30

修正

  • ウェーブレビューの末尾 — 7件の低深刻度の指摘、すべて赤ファースト。 CSVインポートのバックスラッシュのラウンドトリップ: セル内の\は書き込み時に二重化され、読み戻しでも二重のままでした — そのため同じCSVを再インポートするとcompany+roleのdedupが外れ、重複行が作れる状態でした — リーダーは分割後に\\をアンエスケープするようになりました(書き込み→読み込みのラウンドトリップはロスレス、再インポートはdedupされます)。cv-voiceの<head>除去は閉じられていないタグに対して二次計算量でした — ルートが上限とする64 KB入力で4827 ms → 13 ms。statedYearsMinはyears_minが設定されていなくても全ソースの全ジョブに対して完全な年数パーサーを実行していました — 現在は遅延評価になり、大規模スキャンごとの数秒のCPUが消えました。readdirとstatSyncの間で削除されたキャプチャがposting-guardのリスティングをクラッシュさせていました(TOCTOU — 消えたファイルはスキップされます)。MiniMax CNのデフォルトはapi.minimax.cnと完全一致のみをマッチしていました — あらゆる*.minimax.cnベースURLがCNモデルを得るようになります。16進参照でないDeelの$トークンがリテラルとしてスニペットへ漏れなくなります。インポートピッカーはfile.text()の前にfile.sizeをチェックします — 512 KBのサーバー上限は、ブラウザが巨大かもしれないファイルをパースし終えた後でしか413を返していませんでした — ローカライズされたimport.tooLargeトースト ×19付き。
  • deploy workflowの強化(workflowsレビューF1–F6)。 providerは文字セット検証なしでリモートシェルに補間される唯一の入力でした — 値の中の'がクォートから抜け出し、prod上で任意のコードを実行できました; あらゆる結合の前に^[A-Za-z0-9_-]+$で許可リスト化され、キーガードのgrepはもう誤って合格できません。hermes診断ステップは生のjournalctl + unitダンプを公開ログへ出力していました; そのフィルターは大文字の*_API_KEY=を見逃し、何もマスクしていませんでした — 共通の大文字小文字を区別しないredact + 値マスキング + 80文字切り詰めが3つのシンクすべてに付き、?token=クエリ文字列もマスクされます。hermesステップはinputs.app_dirを無視し、/opt/career-ops/src/.envをハードコードしていました。public_urlはhttpsチェックなしでcurlへ渡っていました(先頭の-によるオプションインジェクション)。そしてアンチダウングレードガード — v1.238.0インシデントの修正 — には実行可能なゲートがありませんでした: ci-workflowsに6つの新しいピン(refsはデフォルトを持たない、ガードはDeployの前に走る、厳格なrefs正規表現)。
  • インポートモーダルの末尾(SPAレビュー)。 モーダルはoutcomeモーダルと同じnav guardを装備します — ナビゲーションで離れても、別のビューの上に孤立したまま残らなくなります。隠しファイル入力はchangeだけでなくcancelでも除去されます — 繰り返しのクローズがもうdocument.bodyに入力をリークしません。plan.duplicatesはプレビュー内でガード付きフォームを通して読まれます。トラッカーのnum割り当てはMath.max(...spread)の代わりにreduceを使います — spreadは約10万行で引数上限に達します。

変更

  • ドキュメント: ヘルプガイドの«118 EN adapters»箇条書きがfr/it/taでもカウントを運ぶようになりました(他の15ロケールはすでに持っていました)。cvstart.orgのベンダー価格を公式価格ページに対して再検証 — 4つすべて変更なし、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 ✓ · ライブLLM 18/19ロケールA–G ✓ — plが単一の502 · 300 s · 0 chプロバイダタイムアウトに遭遇(トークン密度領域ではない; スポット再ランはこのリリースに乗ります)。

テスト 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

イタリア語評価パッチ: OpenRouter期にitのレポートがSCORE_SUMMARYブロックの直前で切れているのが捕捉され、itがトークン密度の高いロケール(32768トークン上限+480秒クロック)に加わりました — さらに、診断を可能にしたプロバイダ切り替えツールがdeploy workflowに登場します。

修正

  • SCORE_SUMMARYの前で切られたit評価(CAR-190の末尾): remote-QA 40928864980(クレジット補充後の初回ラン)— it評価は264秒走り、16,384の上限でtok ~15635、15,045文字で返ってきました: ブロックA–Gは無傷、---SCORE_SUMMARY---が消滅。v1.261.1(CAR-174)でtaに上限をもたらしたのと同じ形状クラスです。itはTOKEN_DENSE_EVAL_LOCALESに加わります(ta, hi → ta, hi, it): 32,768トークンの予算と480秒クロックの両方が適用され、/api/evaluate+auto-pipelineはllm.mjsの唯一の真実の源に留まります。
  • ブロックなしのenレポート — 一回限りの生成フレーク: 同じランで、単一のen評価が言語は正しいのにブロックA–Gが一つもない状態で返ってきました; 狙いを定めた再ランはクリーンにパス(21,091文字、A–G ✓)。トークン密度セットには追加しません — 一つのフレークは履歴ではありません。

追加

  • Deploy workflow: mode=hermesとmode=provider(CAR-190の運用末尾): mode=hermesはHermesゲートウェイを再起動し、完全な診断を表示します(シークレットを除去したunitファイル、リスナーの前後、sudoジャーナル、ポートごとのプローブ、アプリ自身のHERMES_BASE_URLビュー、OpenRouterクレジット残高); mode=providerはキー存在ガード付きでLLM_PROVIDERを切り替え(対象プロバイダの*_API_KEYが無い場合は拒否)、アプリを再起動します — Hermesのクレジットが途中で尽きたとき、prodはこうしてopenrouterへ移行しました。deploy-mode refガードはmode=deployに対してのみ検証されるため、recon/verifyのディスパッチも再び機能します(v1.261.3期の必須インプット変更がそれを沈黙させていました)。

メモ

  • 意図的に見送った項目: enはトークン密度セットに追加しません — ブロックなしレポート1件は生成フレークであって、ボリューム履歴ではありません。
  • 意図的に見送った項目: taの強化言語ディレクティブはitには拡張しません — イタリア語で言語ドリフトは観測されていません。
  • 意図的に見送った項目: 新しいUI-v2デモ動画の収録はオーナーに残ります(CAR-141) — ランディングはいずれにせよyoutube-nocookie.com経由で埋め込みます。
  • テストはリリースブランチで6841 → 6841。

[1.262.0] — 2026-10-29

アップストリーム機能のマイナー: Deel求人ボードがスキャナに加わり(レジストリ 123)、別トラッカーのCSVを#/trackerへ直接インポート、posting-guardのJD整合性チェックとCVボイスチェックがリレー/リントとして着地、スキャナが経験年数フィルタを獲得、Applyボタンがさらに7言語で「ない」とは読まれなくなります — 加えてMiniMaxの引退済みデフォルトモデルが置き換えられ、リポストがソースをまたいで捏造されなくなります。

追加

  • Deel求人ボードソース(CAR-184): レジストリ 123 sources = 118 EN + 5 RU · 118 adapters — jobs.deel.com/<slug>のテナントボードを自動検出(Klarnaなど); Next.jsのflightペイロードが在庫全体を1リクエストで運んできます(タイトル、勤務地、勤務形態、日付、説明)、許可されていない/api/パスには決して触れず、別の場所で採用ページを公開しているテナントが返すリダイレクトをソースは名指しで拒否; 報酬は意図的にマッピングしません(支払い間隔のない金額は推測でしかないため); カウントゲート ×5 + ヘルプ §17 ×19。
  • トラッカーCSVインポート(CAR-181): dry-runプレビューとロックされたcommit付きのPOST /api/tracker/import-csv — RFC-4180のクォート、ISO/日が先/月名の各日付形式、外部トラッカーのステージを正規ステートへ畳み込み(未知のステージはEvaluatedとして注記付きで着地し、決して捨てられません)、markdownリンクのセルかNotes列から読んだ正規化済み投稿URLによるdedup、上限は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チェックリストは6つの不変条件に増え、i18n ×19。
  • 経験年数スキャンフィルタ(CAR-180): jd-yearsパーサ(65の言い回し、確信が持てないときは決して落としません)が投稿の説明に書かれた最低年数を読み取り、portalsの新オプションyears_min:が要件を満たさない投稿をskipped_experienceとしてスキップし(URLを固定することのない観測用の履歴ステータスです)、yearsMinは将来のUIに向けてスキャンスナップショットに乗ります。
  • さらに7言語の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に置き換えられます; ベースURLはベンダ固定(ベンダ以外のホストは実行時に拒否され、キーがそこへ届くことはありません); 設定ヒント ×19 が新しいデフォルトを明記します。
  • リポストは同一ソースを要求(CAR-186): LinkedInと雇用主のGreenhouseに掲載された同一ロールは、もうリポストとして報告されません — クラスタはsourceHost()で分割され、これは既知サイトでのみ地域サブドメインを畳み(de.linkedin.com ≡ www.linkedin.com、ただしca.example.comは別のまま)、Greenhouseのホスト別名を1ソースへ畳み、末尾のドットを取り除きます。
  • タミル語評価の言語ドリフト(CAR-183): 強化されたタミル語ディレクティブが、ボリューム予算の隣(CAR-174のスロット)にあるプロンプト末尾の揮発領域に座りました — v1.261.2で見られた断続的なドリフトの後、remote-QAレポートは再びタミル語で着地します。

メモ

  • 意図的に見送った項目: posting-guardリレーはfail-softで出荷 — フォークはまだ親プロジェクトのposting-guard.mjsを持っていません(アップストリームPR #6146はまだオープン)。親プロジェクトの同期が届くまで、エンドポイントは{available:false, reason:"script-not-found"}を返します。
  • 意図的に見送った項目: yearsMinはこのリリースでは#/scanのUIチップとしては出ません — フィールドはスナップショットに乗り、フィルタはportals設定専用です。
  • 意図的に見送った項目: アップストリームのmodes/reportsにおけるMachine Summary変更(#6161/#6160/#6157)はポートされていません — web-uiのミラーとしてではなく、デプロイされた親プロジェクトと共に届きます。
  • テストはリリースブランチで6734 → 6841; スキャナのdedupキーには手を触れていません(URL正規化の振る舞いは変わっていません)。

[1.261.3] — 2026-10-28

デザイン完成パッチ: Lovableデザインフェーズ3(密度 + コーラルの完全引退)、スキャンホストプール(32社、ホストあたり10社)、アップストリームのプロバイダ位置情報修正6件、Trakstar Hireソース(レジストリ122)、CV Studioのアンドゥ + 未保存ガード — さらにファイナルリグレッションP3修正とドキュメントパリティ。

修正

  • マップクラスタの「related」ラベル 3.16:1 → 4.68:1(両テーマ): ライトの--map-score-midを#567b75へ暗くしました(提案されていた#5f7f7aは実測4.37しか出ず — もう1段暗くする必要がありました); ダーク側はすでに4.98:1で、変更なし。赤ファーストでmap-cluster-visualに固定。
  • skip-linkのフォーカスリング: 最後に残っていたリテラルの#ff385cアウトライン → var(--accent-c) — これで78個すべてのフォーカスリングがアクセントトークンに従います。
  • .tab-btn.is-activeのアクセントトポロジー (#584、フェーズ3): このコントロールは3つのカラーファミリーを混在させていました(コーラルのウォッシュ + dangerテキスト + ブルーのボーダー); 現在は単一のaccent-softペアです。
  • アップストリームプロバイダの位置情報修正 ×5(#580、CAR-176): workdayのFully Remoteフラグ(場所ではない)、workableのテレコミューティング展開 + 都市がない場合のみ州、successfactorsの末尾カンマ、leverのremoteの単語境界、icimsのLocation接頭辞付きラベル。
  • http-json: 使い切ったタイムアウトでのリトライなし(#580) — デッドラインによるアボートは両方のリトライヘルパーで非一時的です(アップストリームは、あるAshbyボードで30s×リトライにより約94秒を計測)。
  • ドキュメントパリティ(#587): HANDOFF/CONVENTIONS/READMEに残っていた17/18時代のカウント(ukは欠けていたЛокалізаціяセクションを取得; §履歴を§32/§33まで拡張 — 33 H2の計算を検証済み)。

追加

  • Lovableデザインフェーズ3(#584): 密度トークンが稼働 — テーブル行 ≈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 sources = 117 EN + 5 RU · 117 adapters — ホスト固定のjsapi.recruiterbox.com、短い/空の/繰り返しページで停止するオフセット走査、部分結果を保持、trakstarTruncatedタグ付け; カウントゲート ×5 + ヘルプ §17 ×19。
  • スキャンホストプール(#579、CAR-178): 最大32社を同時に、ホストあたり10社で上限(アップストリームのキー付きリミッタパターン) — スナップショットは逐次実行とバイト単位で同一(赤ファーストのタイミングモックゲート)。
  • CV Studioのアンドゥ + 未保存ガード(#582、CAR-179): AI実行結果に対する有界アンドゥスタック(30)、非QWERTYセーフのCmd/Ctrl+Z、ルート離脱時の未保存変更ガード(ライブプローブのダーティ判定、confirm/rewind/beforeunload)、i18n ×19。
  • アップストリームプロバイダ修正を×17でテスト(CAR-176の一部); remote-QAサマリーが失敗しているスキャンソースを名指し + evalごとのtok ~N(#567、v1.261.2で既に着地 — 今回のリリースのトリアージではこの可観測性を使用)。

メモ

  • アクセントはブルーに(Lovableコンセプト): プライマリアクション/アクティブ状態/フォーカスリングは--cv3-accentに従います; レッドはdanger専用です(.btn-danger、toast.error、dangerテキスト)。コーラルはロゴPNGアセットにのみ残ります(オーナーの判断)。
  • 密度: テーブル行 ≈32px / コントロール30px / チップ24px — WCAG 2.5.8のスペーシング例外は文書化済み; v1.26.1の44pxカナリアはトークン契約上に書き直されました。
  • CodeQL: オープンなアラート10件すべてをクローズ(4件は根拠付きでFP却下: llmRateLimit/atomicWriteは文書化済みクラス; 6件はソースで修正)。
  • テストはリリースブランチで6655 → 6734; 新しいTrakstarソース以外にスキャナソースの動作変更はありません。

[1.261.2] — 2026-10-28

安定性と仕上げのパッチ: ジオコードキャッシュが書き込み途中のクラッシュを生き延び(CAR-173)、UI.mdが箇条書きの継続行とネストしたリストを描画し、ヘルプバンドルの描画テキストへのキーリークが×17でクローズされ、evaluateにta向けロケール別トークン上限が付与され(CAR-174)、RTLクロームが論理プロパティでミラーされ(85件の指摘)、マップキャプチャが×19で撮り直され、マップクラスタがダークテーマのコントラストを通過 — さらにLovableデザイン統合のフェーズ1(受動的なtokens-v3.cssシート)、ドキュメントのバックフィル(リリースレビュー + スペック)、CIノードのカバレッジ免除。

修正

  • ジオコードキャッシュの断片化書き込み損失(CAR-173、#562): 両方のフラッシュパス(デバウンス付き挿入フラッシュ、終了時フラッシュ)は.cache/geocode.jsonを素のwriteFileSyncで書いていました — 切り詰めてから書く方式 — ため、書き込み途中のクラッシュ、OOM、SIGKILLが断片化したファイルを残し、次回起動時のJSON.parseが例外を投げて、その日の分だけでなく永続キャッシュ全体(数週間分のNominatimバジェット)を黙って破棄していました。両方の書き込み箇所がfile-lock.mjs::atomicWrite(同一ディレクトリのテンポラリ → リネーム → 失敗時のunlink)を経由するようになりました — 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先頭文字で判定します。ネストした -箇条書き、番号付きリスト、リスト内のフェンス、リスト内の見出しは、文書化済みの別ギャップのままです(次のdocs波)。
  • ヘルプの描画テキストへのキーリーク ×17(#561): remote-QAが、描画されたヘルプに85個の生のi18nキーが見えることを発見しました(根本原因は再現実証済み: 同じUI.mdの単一行箇条書き消費 — 折り返された継続行が生テキストとして放出され、バッククォートがリテラルのまま残る; v1.260/261のヘルプセクションは複数行の箇条書きを書いていました)。163個の箇条書きを17ロケール全体で1行に展開 — 空白のみの変更で、翻訳された語は1語も触れていません(旧対新で検証)。新しいゲート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へのオーナー報告 — 上部にトップバー検索の半分と切れたh1、右端にサイドリストの灰色の断片、ロンドン付近でフレームに切られたマーカークラスタ、高さ約2/3の位置でマップを横切る白い水平線。capture-map-screenshots.mjsはジオコードキューの排出自体を待つようになりました(located + noLoc === total、N/Nカウンタではなく — Remote行は構造的に位置情報を持たないため、旧待機は決して完了できませんでした)、ショットのためにheader.topbarと#notif-drawerを隠し、正確な.job-map-pageボックスでクリップし(パネルがフレーム端で切れなくなる)、クラスタが半分切れないよう2ステップズームアウトし、マップの高さを固定し、通常のビューポートスクリーンショットを撮ります(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フォローアップ、エージェント着地中、タグ前に着地): v1.261.0のオーナー修正(#534)のフォローアップ — 言語切り替えの再描画で再武装されたスケルトンは、完了したリフェッチを生き延びなくなります。
  • ドキュメントドリフト(CAR-139、エージェント着地中、タグ前に着地): 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を削除(スキャンの星カラムの中央揃えと衝突していた)、CAR-58のスコアカラム分離をltrNumスパン上へ移動。
  • キーボードa11yハーネス(#570): tests/playwright-a11y-keyboard.mjsが11ルートを歩行(Tab順序/トラップ、フォーカスインジケータ、Escapeオーバーレイ、Enter/Space)— 本番欠陥0; リグレッションカバレッジが新規。
  • i18n未翻訳スイープ(#565): 36個のenと同一の値を×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のネストしたマーカーリスト(1レベル、#564): -箇条書きがネストした<ul>として描画されます(フェンスプレースホルダーセーフ)— ロケールあたり残っていた2件の取り残された文章走査が消えました。
  • Lovableデザイン統合 — フェーズ1(#566)/ フェーズ2(ブランチ、タグ前に着地): public/css/tokens-v3.cssがLovableコンセプトをそのまま移植(oklchサーフェス 0–3、AA注記付きインクペア、アクセントファミリー、ok/warn/danger/info/neutralのソフト+インク、スコアバンド A–G ×2テーマ、密度 + フォーカス + シャドウ); フェーズ2は既存のトークン名の上で有効化します(アクセントはblue/dangerに分離、スコアバンド + コールアウトはcv3トークン上)、コントラスト/ロール/ダークの各ゲートを更新。
  • evaluateのロケール別トークン上限(CAR-174、#569): evalMaxTokens(lang) — ta/hiは32768を要求(3つのSDKクライアントが16384で再クランプしていました; 両レイヤーを修正)、さらにプロンプトにタミル語の分量バジェット(ブロックあたり≤5文、≤900語)— v1.261.1のremote-QA taレポートは出力トークン上限で切れていました(Block B–G + SCORE_SUMMARYが欠落)。
  • CodeQL実修正のフォロースルー: 新しいQAレンダリングツールリングが手書きのエンティティ処理を構造化スプリットパス + htmlToText({cap: Infinity})へ置き換え; リダクションアサーションがマスク済み出力を正確に固定; RTLハーネスの未使用定数を削除。
  • CIノード変動に対するカバレッジ免除ポリシー(habr #558、states #561): sources/habr.mjs(CIノードマトリクスのブランチ 87.23 対ローカル ≥89)とstates.mjs(CI 86.49 対ローカル ≥89)がscripts/coverage-baseline.jsonの免除に加わります — ノードバージョン変動によりCI実測のブランチカバレッジが構造的にローカルのフロアを下回るファイルは、ゲート全体を引き下げる代わりに免除されます。

メモ

  • Ctrl+Kの契約(CAR-122): このキーコンボはコマンドパレットを開きます — 検索ボックスを直接フォーカスするものではありません; 検索はパレットからフォーカスされます。remote-QAの本番リグレッションがまさにこれを検証するようになりました(#561)。
  • CodeQLのFP却下 ×5: main上のjs/missing-rate-limitingアラートはsecurity_eventsトークンを待機中 — オペレータのアクションであり、コード変更ではありません。
  • ブランチカット後に着地: #561/#562/#563/#564/#565/#566/#567/#569/#570/#571/#572はすべてmainへマージ済み; #534スケルトンとCAR-139のエージェントはタグ前にマージします。1レベル超のネストマーカーリストとインライン多用のビュージオメトリは文書化済みギャップのままです。
  • テスト 6609(リリースブランチ上、v1.261.1から+15; マージ時に#561からさらに約13 — 新規ゲートファイル2本); fan-out前の赤テストはCHANGELOG ×19パリティゲートのみ(ロケールfan-outはオーケストレータの次ステップ); スキャナソースへの変更なし(レジストリ 121 = 116 EN + 5 RU · 116アダプタ)。

[1.261.1] — 2026-10-28

本番QAからのクライアントパッチ: #/two-pagerのP1クラッシュ修正、非QWERTYレイアウトで動くようになったCtrl+K、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ロケール)。スケジューラとバインディングはループの上に移動; 振る舞いテストは実際のビューモジュールを実行します — 修正前は本番と同一のエラー、修正後はレンダリングされたページ — さらに字義的順序のドリフトゲートを追加。
  • 非QWERTYレイアウトでのCtrl+K(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のアイテム1つが#/docs-assistantを390pxビューポートより56px先まで押し出していました; CAR-146のシュリンクパターン(v2-llm.css内、800-LOC CSSゲートは無変更)で0に。
  • マップチップの重なり @390(#552): 390pxビューポートでマップのメタチップがCTA行に重なっていました(map.css)。
  • CAR-137 — 具体的なエラー + v2empty ×5(#550): 5つの汎用エラーフォールバック(«Error» / «failed»)が具体的で対処可能なキーになりました — evaluate POSTの失敗、終端イベントのないauto-pipelineストリーム、scan→pipelineへの追加、リポストクラスタの読み込み、パイプラインのundo; 最後の5つのフラットな空状態(#/reports、#/usage、#/portals、#/activity、#/dashboard)がCAR-124のv2emptyパターンに加わります(説明 + aria-hiddenタグ付きの例 + 事前配線されたアクション; v2empty.*の新キー15件、死んだ1行キー4件を削除)— すべて×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): シードされたコーパスで、390×844の全SPAルート(正規31 + モードページ8 = 39ハッシュ)をスイープするPlaywrightテスト — ルートごとの横オーバーフロー検査(scrollWidth vs clientWidth、1pxの許容、最も幅の広い要素を名指し)に加えて、CTAヒット検査(スティッキーバー/ドロワー/FABがプライマリCTAを覆さない); オプトイン、ブラウザバイナリがなければ控えめにスキップ、ネットワーク不要。
  • 新しいv2キャプチャ ×48(CAR-140フェーズA、#551): シードされたCI分離フィクスチャからの本物のv2 UIスクリーンショット — dashboard ×19 + job-map ×19(job-map-taが初登場、job-map-viが新規)+ scan/pipeline/tracker/reports × en/ru — README、ヘルプ、ランディングへ供給。
  • cvstart.orgの本物のスクリーンショット(CAR-140フェーズ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

v1.261.0のフルレビューの波が完了(すべてのHIGH + MEDIUM指摘が着地)、オーナー報告の言語切り替え修正、評価品質の修正、ヘルプ×18 fan-out、cvstart.orgランディングv2 — さらにこの波を記録する4つのSDD/OpenSpecスペック。すべての修正は、赤→緑のfix-forwardとGLM-5.3-Flashによるフレッシュコンテキストレビューを通って着地しました。

セキュリティ

  • FULL-R1 — CSRF acting-GETゲート + ロック付きアトミックなパイプライン書き込み(#519): /api/stream/*、/api/run/*、/api/geocodeにSec-Fetch-Site/Origin/Refererゲート(エクスポートされたACTING_GET、静的カバレッジゲート)。data/pipeline.md / data/last-scan.jsonのすべての読み-変更-書き込みがwithFileLock + 新しいatomicWriteの下に入ります(同一ディレクトリのテンポラリ → リネーム → 失敗時のunlink)。
  • FULL-R2 — ソースにおけるSSRFクラスタ(#514): rss.mjsはhttps + プライベートアドレス拒否に; 素のfetchImplの約25ソース → ガード付きトランスポートへ; ミラーをピン留め; habr/hh/geekjob/getmatchのリダイレクト検証; 共有のdelay(ms, signal)。
  • FULL-R4 — stripDangerousMarkdownによる文章の破壊(#513/#518): スキーム除外はリンク/属性コンテキストでのみ実行; エンティティは検出専用のコピーへデコード(«JavaScript: React, Node»と«R&D»は生き残ります)。
  • FULL-M2 — トランスポートのハードニング(#520): safeGetは呼び出し元のシグナルと共にtimeoutMsを尊重します(ブリッジコントローラ); guardResolvedHostはDNSエラーでfail-closedします。#525は、クロスオリジンリダイレクトでのクレデンシャルヘッダー除去、すべてのsettleパスでのトランスポートリスナーのdetach、事前中断済みシグナルでのクラッシュ修正を追加します。
  • FULL-M4 — ロゴ/バッチ(#523): ロゴはすべてのパスでマジックバイトを検証し(偽のimage/pngがSVGを運ぶことはできません)、保存時にcontent-typeをimage/*へ制限、プライベートキャッシュ + nosniff; バッチ: --parallelは1–8へクランプ、--min-scoreを検証、BATCH_BUSYのsingle-flight、config/batchミューテーションへのllmRateLimit。

追加

  • CAR-147 — ロケール対応の評価タイムアウト上限(#524): evalTimeoutMs(lang) — ta/hiは300秒の代わりに480秒を得ます(インド系文字は音節ごとに複数トークンへトークン化されるため、旧上限では502 + 空レポートが出ていました); remote-QAクライアントは540秒待ちます。
  • CAR-133 — cvstart.orgランディングv2(#532): reduced-motionでゲートされたパララックスヒーロー、scan→evaluate→trackerフローの明確にラベル付けされたSIMULATEDデモ、ライブ検証済みカウント付きのスクロールリビールセクション、CAR-140スクリーンショットのプレースホルダースロット。
  • CAR-135 — UI v2向けにヘルプを書き直し、×18 fan-out完了(#533, #540, #541, #542): 19のヘルプファイルすべてがv2シェルを説明します(折りたたみ可能なナビ、Cmd/Ctrl+Kパレット、スケルトン、例+アクション付きの空状態、スキャンv2クローム、パイプラインのグループ化+undo、レポートv2、カンバン); UIラベルは自分のi18nキーを引用します; 121ソースの文はレジストリから供給されます。
  • スペック(SDD/OpenSpec)(#535): 10月27日のwave-twoバックフィル + v1.261.0の波を記録する3つの先行スペック(ヘルプfan-out、書き込みハンドオフ、言語切り替えの不変条件)。

修正

  • 言語切り替えが#/scanを空白化しなくなる(#534) — オーナー報告: ビューのローカルスキャン状態(結果、ファセットチップ)はモジュールレベルになりました; 4秒の遅延リフェッチ付きの振る舞いPlaywrightハーネス(旧形状では赤)。
  • CAR-148/149 — ruレポートの«Block Gの欠落»(#530): プロンプトは3つの矛盾するA–Gマップを教えていました; スケルトン + リスト + 例がoferta.mdと一致するようになりました(G = Posting Legitimacy); 振る舞いドリフトゲート。
  • CAR-150 — パイプラインのundoがcompメタデータを保持(#537): DELETEはcompを返答し、POSTはゲート付きオプショナルのcompを受け入れ、ビューはすべてのフォールバック分岐で{token, comp}を運びます。
  • FULL-M3 — 死んだソースが正直なボードを報告(#522): getro/mycareersfuture/meituan/mokahr/glintsは不正なページ1でthrowします(死んだAPIがもはや«健全、0件»と読めることはありません); pinnedOverrideが18のアダプタのcompany.apiオーバーライドをピン留めします。
  • FULL-M5 — 1つのプロバイダカスケード(#521): routes/llm.mjsがrunActiveProvider経由に(+cachePrefix、シグナル); Geminiサブプロセスのインターセプト; レスポンス契約はバイト同一。
  • FULL-M1 — 共有ファイル書き込みのロック(#526, #539): runTrackedScript + TRACKER_MUTATINGロスター; outcome/followupのspawnはロックを保持します; tracker.mjsはatomicWrite経由で書き込みます; PUTの保存はロック+アトミック。
  • FULL-M6 — サーバー + クライアントの統合(#531, #536, #525): dotenvのnullプロトタイプ + __proto__拒否; isPrivateOrLoopbackのNAT64/6to4/benchmark/reserved対応; env-configのmtimeキャッシュ; file-lockの実スロットGC; safeGetのtimeout+signal; DNSガードのfail-closed; SSE ×4 → API.postStream; フォーカス/ラベル/ステータスlib; クリップボードのawait; ダッシュボードのHired着色。
  • R3 — CSSトークンのドリフト(#527): --accentを解決(マップのフォーカスリングは静かに死んでいました); トークン外のduration 11件を吸収; ドリフトゲート。
  • R4 — ローディングの取り残し(#538): assessments/mode-page/パイプラインプレビューがCAR-112のスケルトンを描画します。
  • CodeQL + CIバッチ(#517、#539修正): 未使用インポート、ACTING_GETゲートが実際の正規表現をインポート、ライフサイクルスライスの再アンカー。

メモ

  • 意図的に見送ったもの: 接続時のDNSピン留め(undiciが必要 — 依存の外、文書化済みの残存); CAR-140のスクリーンショット(デプロイ済みのv2 UIが必要); CAR-137/138/141(次のドキュメントパス); js/missing-rate-limitingのCodeQLクラスは文書化された誤検知(カスタムリミッタはクレジットされません)。
  • ヘルプ×18 fan-out: es/deのwave-1はイントロノートとActive Companiesカードの差分をスキップしました(deは自身のイントロを着地済み; esは1行のフォローアップを受け取ります)。

[1.260.0] — 2026-10-26

レビューハードニングの列車 — v1.259.0のフリートへのopus-5-5とAIレビューラウンドからの8つのマージ(#491–#498): 給与の正規化、レポート日付のスコープ、ジオコードの堅牢化、バンドルのキャッシュバスティング r2+r3、ディープのオーバーフロー修正 — さらに2つのUI v2(パイプライン、レポート)。すべての修正は赤→緑のfix-forwardで着地しました。

修正

  • 給与比較の正規化(CAR-143 rev-2): 期間マーカーは、それが属する数値の近くでのみ認識されるようになります — «6 month contract, $120k»はもはや×12で年額化されず、数値に直接付くRU/ESの期間形式(«за месяц»が数値の隣)は、たまたま近くにある単語に勝ちます。$/¥記号ファミリーは認識されますが、明示的なISOコードが同じ行にない限りマップされません(AUD/CA/SGドルはもうUSDとして計上されず、¥のRMB形式は約20倍ずれたJPY換算の代わりに明示的な注意書きを受け取ります)。裸の19xx/20xxの数値は常に年です。範囲の数値は相手側の期間を引き継ぎます。プロファイルのminimumとtarget_rangeが1つの範囲に接合されることは決してありません。
  • fixReportDateのスコープ(CAR-144 rev-2): サーバー固定の日付訂正は、最初の## 見出しより前のプリアンブルにのみ適用されます(H2タイトルのレポートは保守的なno-opを受け取ります — 古い日付は許容されますが、捏造された日付は許容されません)。プリアンブル内では: 一意な候補は訂正され、なければ一意な太字**Date:**が訂正され、それもなければ何もしません(太字が2つ、またはプレーンが2つある候補はどれも書き換えません)。FIX-5のPDFラベルゲートは実際に組み立てられた辞書を読むようになり — 欠落したロケールは、英語フォールバックで静かに通過する代わりに例外を投げます。
  • Habrの所在地チップ + ジオコードの堅牢化(CAR-142 rev-2): Habrのメタチップは、構造的証拠(都市フィルタへのリンクまたは所在地アイコン)があるときにのみ都市になります — リロケーション告知(«Возможна релокация»)と雇用形態が所在地になりすますことは決してありません。ジオコードキャッシュは再起動を生き延びるようになり(beforeExit/exit/SIGTERM+SIGINTでのフラッシュ、再送出付き。ダーティフラグは書き込みが着地して初めてクリア)、シャットダウンは有界になりました(exitループのラッチ、世代カウンタ、直近使用のLRU)、使い果たされたジオコード予算は汎用の502の代わりに503 + Retry-Afterで応答します。
  • バンドルのキャッシュバスティング(CAR-145 r2+r3): シェルは/js/bundle.js?v=<content-hash>を参照します — マッチすればimmutable、不一致ならno-store — 新しいシェルがキャッシュされた古いバンドルと組になる5分間のデプロイ窓を葬ります。ハッシュとストリームは1つのファイルディスクリプタを共有します(読みの断裂なし)。短い読みは、デプロイ全体を汚染しかねないstatフォールバックハッシュではなくnullを返します。make-bundleはドット接頭のテンポラリ + リネーム経由でアイデンティティと.br/.gzコンパニオンを書き込むため、途中で殺されたビルドが半分書かれたバイトを配信することも、テンポラリファイルを漏らすこともありません。
  • ディープのオーバーフロー(CAR-146): ファイル名だけでスマートフォンのビューポートを超える保存済みリサーチブリーフが、#/deepを390px超に押し広げることはもうありません — カードは自分の行で止まり、タイトルは折り返し、日付は1行に留まります。ナロービューポートスイープは、過長なシードフィクスチャで#/deepを巡るようになりました(2回のremote-QA実行の唯一の指摘、クローズ)。
  • パイプライン v2のハードニング(CAR-116レビュー): 削除には確認と取り消しが付き(正直なundoコピー)、カードにホスト企業の捏造はなく、行idはFNV-1a、一括カウントは正確に、一括操作には再入ガードが付きます。

追加

  • パイプライン v2(CAR-116): 豊富になったカード、グループ化ビュー、取り消し付きの一括破棄。17の新しいpipe.*キーが、19の辞書すべてで翻訳済みのまま出荷されました。
  • レポート v2(CAR-118): スコア帯/正当性/企業/日付フィルタ付きのライブ検索、ソート可能なヘッダー(aria-sort)、帯ごとのアクションボタンを持つ永続カードビュー、クリックでフィルタできるスコアヒストグラム、統一された«Company — Role» / «x.x/5»レンダリング(window.ReportOps)。31のrep2.*キーが、19の辞書すべてで翻訳済みのまま出荷されました。

メモ

  • すべての修正は、赤→緑の証拠付きのレビューラウンドを通ってきました。最初のバンドル r2に対するAIレビューの2つのHIGH指摘(短い読みのハッシュ、コンパニオンの原子性)はr3でクローズされ、CAR-143/CAR-144/CAR-142のラウンドはそれぞれ前ラウンドの未解決指摘を再検証しました。
  • 意図的に見送ったもの: マップのクラスタービューはCAR-125のまま(キュー済み)。サーバー側のパイプラインメタデータ復元は別チケット。rev-2以前のv1.259.0の状態で保存されたコンテンツへの遡及修正はなし。
  • テスト5988(+165)。ブラウザスイート 152合格 / 0失敗 / 1オプトインスキップ。スキャナーソースには触れていません(レジストリ 121 = 116 EN + 5 RU · 116アダプタ)。48の新しいi18nキーは、機能PR自体の中で×19のfan-outと共に着地しました。

[1.259.0] — 2026-10-25

エージェントフリートによる2本目の列車、6つの修正: レポートの日付はサーバー側で固定され、マップのジオコーダはキャッシュしてRUの都市を読み取り、ヘルプ×18はローカライズされたボタンラベルを引用し、UIの文は言語の混在をやめ、給与比較はサーバー側で計算されるようになります — そしてJSバンドルはプリコンプレスされて出荷されます(コールドロード 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はこの修正を継承します。

追加

  • プリコンプレスバンドル + キャッシュ可能なコールドロード(CAR-104): make-bundle.mjsはリリース時にbundle.js.br(brotli q11) + .gzを出力します。バンドルスコープのミドルウェアはVary: Accept-Encoding付きでbr > gzをネゴシエートし、public, max-age=300, must-revalidate + ETag/304を返します。鮮度ガード付き(コンパニオンが非圧縮の元バンドルより古いものを配信することは決してない)、成果物への直接フェッチは404、CSPはバイト同一。コールドロード: 3.1 MB → 転送量は約0.6 MB(−80%)。5分以内の再訪問は≈0バイトを転送します。

メモ

  • すべての修正はエージェントフリートからのもので、赤→緑の証拠(各スイートにわたる新規13 + 28 + 1 + 30 + 7ケース)とレビューラウンド付きです(CodeQL #579/#580/#584はコードで修正 — スタブURLはnew URL().hostでパース、デッドなプロンプト文字列は1件削除)。
  • 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

エージェントフリート由来の6つの修正を1本のリリースに: #/scanの企業カウンターは母集団の混在をやめ、ディープリサーチは出典を要求し、フォームエラーは該当フィールドを照らし、ローディング状態はスケルトンと即時のh1を手に入れ、評価は37kトークンのプロンプトプレフィックスをキャッシュします。

修正

  • #/scan «アクティブな会社»カウンター(CAR-100): 分子はすべての結果行にわたる重複なしの企業を数え(本番では1554 — hh.ruだけで数百)、分母はAPI対応の追跡企業(約90)を数えていました — 1つの分数に2つの母集団。組み合わせ(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)。編集すると解除されます。ネットワークエラーのヒントはデプロイ状況を考慮するようになります — ループバックは開発コマンドのヒントを保持し、デプロイ済みオリジンは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トークンのプロンプトを、バイト安定のプレフィックス(CV + プロファイル + モードファイル + 命令)とJDテールに分割します。Anthropicパスは[prefix + cache_control: ephemeral] + [JD]を送信し — プレフィックスは最初の呼び出し以降のすべての呼び出しでキャッシュ読み取りレート(≈10×安い)で課金されます。プレフィックスの欠落や不一致の場合は、バイト同一の旧リクエストへフェイルオープンします。OpenAI互換カスケードは手つかずです(そちらはサーバー側でキャッシング)。

メモ

  • 6つの修正はすべてエージェントフリートからのもので、赤→緑の証拠(新規5 + 7 + 7 + 7 + 8ケース)とレビューラウンド付きです。最初のCAR-111のCodeQLアラート(#579/#580)はコードで修正されました — テストスタブは部分文字列マッチの代わりにURLホストをパースし、デッドな全プロンプト文字列は削除されました。
  • スコアバックフィルを本番で実行(v1.256.0のエンドポイント、オーナー承認済み): updated: 22、missingReport: 0、reportScoreless: 159 — 159のスコアなし行は、ヘッダーがマシンブロックより前のレポートか、パース不能なスコア形式を持つレポートを指しています。復旧できるのは再評価か、より広いパーサーパスのみです(CAR-129に記録)。
  • 意図的に見送ったもの: commute列のnulls-last変更はなし(既存の降順時Infinityになる癖)、旧使用量レコードの遡及的な再価格付けはなし、スキャンフィルターフォームへの.is-error方式のハイライトはなし(CAR-130は共有mode-pageサブミットヘルパー + api.jsヒントにスコープ)。
  • テスト5749(+36)。スキャナーソースには触れていません(レジストリ 121 = 116 EN + 5 RU · 116アダプタ)。i18nキーもなし(CAR-130のヒントはconn.downを再利用、スケルトン領域はcommon.loadingを再利用)。

career-ops-ui v1.267.1 · page 1/10 · mirror of the project changelog for cvstart.org