変更履歴
GitHubすべての注目すべき変更をリリースごとに記録しています。同じファイルがリポジトリに収録されており、19言語すべてに翻訳されています。
[1.257.0] — 2026-10-25
エージェントフリートによる2つの修正: アプリ内ヘルプアシスタントがデーヴァナーガリー文字とタミル文字を理解できるようになり、使用量ページがHermesの実際のコストを表示するようになります。
修正
- hi/taヘルプアシスタントの検索(CAR-103): docs-assistantのキーワードトークナイザーの単語クラスは
[\p{L}\p{N}\u30fc]+で、結合記号を含んでいませんでした。デーヴァナーガリーのマートラー(ा ै ्…)とタミル語の母音記号(ே ை ்…)はどれも単語を断片に切り刻み、長さルールは短い断片を落とし(ヒンディー語のクエリは0セクションにマッチ)、長い単語は頭を削ぎ落とされて無関係なセクションと衝突する無意味な断片になっていました。クラスは\p{M}を保持するようになり、CJKバイグラムのパスは手つかずです。hi «मैं स्कैन कैसे चलाऊं?»とta «ஸ்கேன் எப்படி இயக்குவது?»は、同梱のバンドルから正しいセクションを取得できるようになりました。 - Hermesの使用コスト(CAR-106):
normalizeUsage()はプロバイダの使用量を{in, out}に潰し、ゲートウェイが報告するcostを静かに落としていました — その結果、#/usageは9.5 MのHermesトークンに対して$0.0000と表示していました(価格表の該当行は0/0)。使用量レコードの形状は後方互換のオプショナルなcost?を獲得します。アグリゲータはレコードごとにプロバイダ報告のコストを優先し、存在しない場合にのみ価格表の推定値へフォールバックします。不正な値や負の値は破棄され、捏造されることはありません。
メモ
- 両方の修正はエージェントフリートからのもので、赤→緑の証拠付きです(新規3 + 5ケース、14/14と10/10が緑、隣接テストは78/78と61/61)。最初のPR(#470/#471)は、スクワッシュマージ済みのv1.256.0と衝突する古いワークツリーベースを運んでいたため、クリーンなチェリーピック(#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): ドメインスラッグのフォールバックはhh.ruの行を«hh»として登録していました(120行)。
hh/habrスラッグが「雇用主ではない」リストに加わります。文途中の雇用主推論(«в компании X»、«X ищет»)は、求人ボードのホスト(hh.ru/kz/uz/by、habr.com)でも実行されるようになります — ページテキストが実際の雇用主を名指している場所です。作業中に根本原因も判明しました: これらの推論パターンのASCII\b/\wはキリル文字にまったくマッチしていませんでした — v1.248.4以降、静かに死んでいたのです。Unicodeルックビハインドと\p{L}クラスがそれらを置き換えます。 - スコアなし行は最後にソート(CAR-129): トラッカーのスコアソートは
-1センチネルを使っていたため、デフォルトの昇順ソートでは、スコアなしのすべての行がスコアありの行より先に浮上していました。Nullは両方向で最後にソートされるようになります(スコアのFILTERは-1を保持します — 「スコアなしは≥4のフィルタに不合格」というのはそちらでは正しいセマンティクスです)。
メモ
- 過去の行はこのリリースでは移行されません: パーサー修正は新しい評価に適用され、スコアはバックフィルエンドポイントで復旧できますが、120の«hh»雇用主セルは書き換えではなく再評価を必要とします。
- opus-5-5のレビューラウンドが折り込まれています: アンカーなしの«X ищет»パターンは出荷前に削除されました(動詞の前にある大文字始まりの語の並びは何でも雇用主として登録されていたでしょう — no-fabrication不変条件)、文頭の«В…»アンカーが追加され、バックフィルのライターは対象セルを再チェックし(手動編集後には重複した
#行が存在し得ます)、手作業で壊れた短い行の列数を保持し、最初のテーブル外の行で停止します。ドット入りの名前(«Сбер. IT»)の中のドットは、«в компании»アンカーにとって文末のドットと区別がつきません — 保守的な接頭辞(«Сбер»)が登録され、動詞アンカー付きのパターンが完全な形を捉えます。 - 意図的に見送ったもの:
tracker.jsからユニットテスト可能なlibへのコンパレータ抽出はなし(ソース静的ゲートは維持、CAR-129にフォローアップとして記録)、commute列のnulls-last変更はなし(既存の降順時Infinityになる癖)、«hh»行のデータ移行はなし。 - テスト5705(+10:
auto-pipeline-jd-gateのidentity 5件、CAR-128 2件、CAR-129ソートゲート1件、敵対的パスのピンを含むバックフィル4件 — 置き換えられたv1.248.xのケースを差し引いた数)。スキャナーソースには触れていません(レジストリ 121 = 116 EN + 5 RU · 116アダプタ)。i18nキーもなし。
[1.255.2] — 2026-10-24
ライブ回帰と本番クラッシュ報告から生まれた、ユーザーに見える3つの修正: #/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セット内のundefinedがあれば失敗します — テキストのみのドリフトゲートにはこのクラスは見えませんでした。 - vi言語チェックの盲点(CAR-97): ベトナム語はラテン文字で、ライブQAのストップワードテーブルにエントリがなかったため、「viストップワード」は英語のヒットを数え、ベトナム語の回答が
report not in viと判定されていました(ライブ回帰: vi 2、en 2)。ベトナム語に専用の10語の機能語テーブルができました — 純ベトナム語のレポートは合格し、英語のレポートは引き続き不合格です。 - 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
2つのレビュー修正ラウンド: ベトナム語ロケールへのOpusレビュー(9指摘)と、CAR-91/92修正のセカンドパスレビュー(必須5件) — どちらも赤→緑テストでクローズ。
修正
- viロケール レビューラウンド(CAR-88 フォローアップ):
project.subtitle/project.roleHintに漏れ込んでいたハングル字形(신)を修正(độ khớp tín hiệu)。EN辞書が持たないCJK/カナ字形がviの値に現れると失敗するゲートを追加。docs/help/vi.md のスペース入りの6つのマークダウンURL(what-is career-ops、apply for a job、set up playwrightなど3つ)を実際のガイドスラッグにハイフン付けし、URL内スペースを禁じるゲートも追加。 - 評価ヘディング境界 (CAR-92 r2 H1):
&、.、/、'がブロック文字の左境界で単語文字になりました —## Q&A、## Plan B、## Ph.D. requirement、## E-commerceはもはやブロックA/B/D/Eとして登録されません。行末ターミネータ単独はブロック語トークン(Block/блок/블록/…)の後でのみ受理され、ASCIIの-はスペル表記ターミネータクラスから外れたためE-commerce/ई-मेलのヘディングが生き残ります。 - ウクライナ/ロシア数字レポート (CAR-92 r2 H2): А Б В Г Д Є Ж シーケンス検出器は共有ヘルパーになりました。ヘディングレベルで3つ以上のシーケンス文字を見つけると、そのレベルがカッターの参照レベルになります — 文字付きの
### A.サブセクションがブロックБでレポートを切り捨てることはなくなります。 - 持ち越し行のライフサイクル (CAR-92 r2 M1): 失敗したソースが次のスキャンへ持ち込む行は
carriedSinceでスタンプされ、30日または5回連続の持ち越しでドロップされ、新鮮な行の後に追加されます — 永遠に静かに再蓄積することはありません。 - Gemini synthesis の分母 + 正当性 (CAR-92 r2 M2) とサブプロセスのボディスコア経路 (M3): findingsファイルから読み取り、赤テストで修正。
- コールドロード バンドル ドリフト ゲートをvi辞書向けに更新(90 scriptタグ / 87 bundlable)、未使用のテストバインディングを削除(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番目のUIロケールとして登場 — 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、サイトマップのロケール項目、dashboard-vi.pngのスクリーンショット。言語スイッチャーに🇻🇳を追加(19枠)。 - 列挙ゲート 18 → 19 — LANGS、detectプローブ、i18n監査、チェンジログのパリティ、README翻訳ブロック、ロケールスイープ — さらに赤から始まる
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 must-fix が着地し、Paylocity ATS がスキャナーに加わります — レジストリは 116 アダプタとともに 121 ソース(EN 115 + RU 5)を提供します。
追加
- Paylocity ATS(親 #5687):テナント別
recruiting.paylocity.comボード、死んだボードの 302 → JobNotFound を 404 にマッピングして検疫がエントリを引退させ、max_jobs上限と切断フラグ。レジストリ:121 ソース = 116 EN + 5 RU · 116 アダプタ;カウントゲート再生成。
修正
- スキャナー スナップショット安全 (R-12): 何も試みないスキャンはスナップショットを KEEP(
nothing scanned)し、全体置換は失敗ソースの旧行を — エントリ別スタンプで — 現行フィルタを再通過させてfilteredのみに着地させます。 - LLM レイヤ 11 不変違反: deep/mode プロンプトを開けて閉じる言語ディレクティブ; Gemini サブプロセスの
--lang転送、非ゼロ終了 → 502、stderr 非露出、300 秒、usage 記録; URL を運ぶ manual フォールバック;/api/modeで truncation 表示; spend tier はクライアントから変更不可; クライアント切断が実行中のプロバイダ呼び出しをアボート; 繰り返しヘディング カッターが有効なレポートを破壊しない; score/legitimacy 抽出器とバリデータの一致; ウクライナ シーケンスとアラビア語 وの誤受理をタイトニング。 - 修正そのものへの Opus 5-5 レビュー ラウンド (必須 8件): カッターの多文字登録、より広いヘディング ターミネータ、Gemini サブプロセスのアボート配線、エントリ スタンプのキャリーオーバー属性、キャリー行の現行フィルタ再通過、異文字数による参照レベル。
- SPA must-fix 23件: sourcing ビュー(単一ページ ページャの append、pipeline 行キーボード、saved-search フィルタ復元、ソース select リセット、config デフォルト戻し、リスナー漏れ、SSE ターミナル時 close、スキャン ランナー teardown、素の fetch、失敗が空に見える族、ウィンドウ衝突、フォーカス保存)とアシスト ビュー(死んだ 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
最大モデルのレビューによる2件の HIGH セキュリティ指摘を修正しました: IPv6 リテラル URL はスキャナーの SSRF ガードをもうバイパスせず、CV マークダウンのエスケープ正規表現も二乗的にバックトラックしなくなります。
修正
- IPv6 リテラルが SSRF ガードをバイパス (
http-json.mjs): 角括弧付き IPv6 リテラルがdns.lookupを投げさせ、ガードがフェールオープンしていました。今は括弧を外しisIPで直接分類 — DNS なし、フェールオープンなし。 - CV マークダウン エスケープの ReDoS (
security.mjs): パターンが二乗バックトラック —<+ ~100k スペースに ~16秒。今はフラットな有界クラスで ~1ms。以前エスケープされるものはすべて引き続きエスケープされます。
メモ
- 両修正とも赤→緑の回帰テスト付き(IPv6 新規 3ケース + 時間境界付き ReDoS; 合計 5511 テスト、+7)。
- スキャナーのソースファイルは影響なし — ガードは両スキャナーが通る共有トランスポートにあります。
[1.253.0] — 2026-10-24
10の新しい求人ソースがスキャナーに加わります — Atlassian、BWI、Computrabajo、Dover、Google、Kalibrr、Magneto365、Platsbanken、Tech in Asia、Zoho Recruit — レジストリは 115 アダプタとともに 120 ソース(EN 115 + RU 5)を提供し、ロールマッチャーは短い大文字コードのみが異なる役職を同一求人としてマッチしなくなります。
追加
- 10ソースを親 1.38.0 から移植、各フェッチウォーク adapter と CI 孤立スイート(フェイク fetchImpl、ネットワークゼロ): Atlassian(単一無認証 JSON フィード、iCIMS URL、https+icims.com allowlist)、BWI(JSON-LD ItemList、JSON.parse 先行)、Computrabajo(LATAM、エンティティ デコード、スペイン語 «remoto»=remote)、Dover(テナント別 DRF ページネーション、
Remote (International)描写、UUID 検証ボード)、Google Careers(フレーズ別 first page、カードの雇用主が勝つ、クエリ間 dedup)、Kalibrr(SEA アグリゲータ、フィード id を行 id に)、Magneto365(LATAM、固定インターページ ペーシング)、Platsbanken(スウェーデン JobTech API、キーワード別ウィンドウ)、Tech in Asia(サイト ビルドから Algolia キーを発見)、Zoho Recruit(hidden-input ボード、限定 detail エンリッチ、通貨は ISO-4217 のみ)。 - レジストリ カウント: 120 ソース = 115 EN + 5 RU · 115 アダプタ; 5つのカウントゲートをライブ レジストリから再生成;
#/scanドロップダウン フォールバック、cvstart.org のソース リンク、help §17 ×18 が追従。
修正
- ロールマッチャー (#5688 ポート): 短い大文字コードのみが異なる役職(«HR BP» vs «HR GP»、«AWS» vs «GCP»、混在スクリプト含む)を、ファジーマッチで同一求人としてまとめなくなりました; コードはノイズ語を除外して生の役職から読まれ、ガードは Jaccard 比の直前に置かれます。
- ポートは最大厳格な Opus 5-5 レビューを生き延びました (21件の指摘): マークアップドリフト時の静かな空ボードで throw (google/bwi)、事前中断されたスキャンは
[]ではなく throw、LATAM スクレイパーの decode-then-strip 順 (strip-then-decode XSS 形)、atlassian 行 URL の https+allowlist、ポートを拒否するホスト断言、後半ページの parse を try 内へ (部分が生き残る)、テスト誠実さ (予算を正確にカウント、強制契約を正直に固定)。13件を修正; [spec] テールは別途追跡。
メモ
- 5つの RU ソースは web-ui 専用のまま(上流アダプタなし — 意図的); すべての EN ソースにはアダプタがあります。
- カバレッジ ラチェット: 大きい 6ポートを ≥95 % branch へ引き上げ(新規 27ケース); 防御的デッドコードの残りはファイルごとに文書化。
- 新ソースは portals.yml の
provider: <slug>で選択 — 既存設定には何も変わりません。
[1.252.1] — 2026-10-17
Wiki のリリースバナーは手動スイープではなくスクリプトで検証されるようになりました — v1.252.0 の回帰は手動でしか捕捉できませんでした — さらにロケールディレクティブはプロフィールの language.output と求人言語を明示的に上書きします。
追加
scripts/wiki-banner-check.mjs— 回帰が求めていたゲート: wiki クローンの各Home*.mdを読み、バナーをpackage.jsonとレジストリのライブカウンター(ポータルレジストリの scanner adapters — バナーの古い 109 ではなく 105;server/lib/routes/の route modules; CHANGELOG セットの UI locales)と比較します。バナー正規表現は語ではなく形状で言語非依存です: ローカライズされた Home ページはラベルとカウンターを翻訳しており(«Текущий релиз»、«Aktuel udgivelse»、«адаптеров сканера»、«enhedstests»)、その数値は EN ページ(5245)よりさらに逸脱していました(5177)。--tests Nは実行直後のtest:ciが出力した数を受け取り、--check-onlyはオフライン用に暗黙クローンを禁止します。オフラインのフィクスチャテストはtests/wiki-banner-check.test.mjs。
修正
- Wiki の Home ×18 バナーが再び同期されます (このリリースと共にプッシュ): v1.252.0 のスイープはバッジとリンクだけを替え、バナー行は替えず、それを機械的に知らせるものもありませんでした。上記のゲートがこれをリリースブロック検査にします。
- ロケールディレクティブが言語の優先順位を確定します (
buildLocaleDirective): «This UI locale overrides the profile’slanguage.outputsetting and the job posting’s own language». 親自身のルール 6 はlanguage.outputでの執筆を命じます — 優先文がなければモデルは二つの矛盾する指示をロケールごとに不均整に解決していて、それが v1.252.0 の言語列のばらつきでした。tests/locale-directive-language-output.test.mjsがディレクティブテキスト(非 EN 17 ロケール + 空 EN)で固定します。
メモ
- ta evaluate の形状観察 (§3、 watch): v1.252.0 の最初のライブ実行は Block G も SCORE_SUMMARY もない 48 336 文字の evaluate を出しました — ループ形状であり言語形状ではありません(CAR-70 は言語)。次のリリースで再発すれば CAR-70 とは別の Linear 課題にします。
- FIX-PROMPT どおり: 親は読み取り専用のまま、上書きは entirely UI ディレクティブの中に住みます。
[1.252.0] — 2026-10-17
親フォークを career-ops-hq/career-ops と同期しました — アップストリーム 264コミット、親 1.36.0 → 1.37.0 — フォークの両 divergences は守られ、デプロイは実行中の親をそのベースに再固定します。
追加
- ベトナム(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 投稿正当性シグナル文書を8件追加(
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 lookaroundLOCATIONISH_RE(ADR-0002)。ボード文書はアップストリームの改良版telegram-channel行、フォーク専用telegram行、Tech in Asia、そして 20 → 100 に引き上げられた Tencent の既定max_pagesを列挙します。
メモ
- このリリースに SPA の動作変更はありません: ドキュメント列車と親の再固定です。デプロイは親 1.37.0 で実行; 正規ステータス表は親の差分の影響を受けず、トラッカーのステータスは以前どおり描画されます。
- アップストリームのマージで 2 つの競合を解消:
docs/SUPPORTED_JOB_BOARDS.md(両 telegram 行を維持)とtest-all.mjs(アップストリームの walkTree ベースcopyDirSyncがフォークの.gitネスト・チェックアウト手動ガードを包含; インポートリストは和集合)。
[1.251.1] — 2026-10-12
マップの専門フィルターは役割の識別語のみをマッチします — 年齢や一般的な職業名はそれだけでは求人に一致しなくなり — remote-qaは形状と言語を分離し、ドリフトがA–Gを赤くしません。
修正
- 専門フィルターは識別トークンだけを一致させます: «Senior PHP Developer»が共有する Senior/Developer で «Senior Java Developer» まで一致していました。マッチャーは識別トークン(PHP, Go, Platform, SRE, Backend…)のみを残し、識別トークンのない役割(«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 は期待される finding として報告します。汎用トークン リストは意図的に最小 — 拡張は言語あたり1行。
[1.251.0] — 2026-10-12
マップの select が設定の専門分野でフィルタリングします(config/profile.yml → target_roles.primary):「Product Manager」や「Backend Engineer (Go / PHP)」を選ぶと、その役割の言葉をタイトルに持つ求人だけが残ります。v1.250.0 の求人リストロケーターは削除 — 誤ったツールでした(オーナー修正)。
追加
- 専門分野フィルター: select が設定の専門分野(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
マップページが実用的に:地図上のジョブロケーターが表示中の求人へフライしてピークを開き(デスクトップも含む)、テキスト検索が会社名や役職でマップを絞り込みます — どちらもリロード後も保持されます。
追加
- ジョブロケーター: マップ上の select が表示中の求人を会社+役職順に列挙; 選ぶと円へ飛びピークを開きます — デスクトップでも。
- テキスト検索: 会社+役職でマップを絞り、map-prefs に保存、Reset で消えます。
- FAB は
#/mapの帰属を覆いません(全幅)。
修正
- モバイルマップの高さ2仕様:下限を540pxに(ツールバーがビューポートの約90pxを占有)。
メモ
- マイルは次リリースへ先送り。i18n キー4個が18辞書に入り、組み立てスナップショットを再生成。ロケーターは常にピークを開きます(移動しては目的を果たさない);円は __job 逆参照で特定 — L.Circle が所有する _point ではありません。
[1.249.0] — 2026-10-11
求人マップが関連度優先になりました。落ち着いた青緑→灰色の段階で有力求人を強調し、スコアと通勤フィルターを保存します。モバイルは全高マップとタップによるプレビューに対応し、トラッカーでも通勤の絞り込みと並べ替えを共有します。
[1.248.8] — 2026-10-11
親パリティ:フォークと web-ui はアップストリームの 115 コミット差分に同期 — 新しい PageUp ソース、トラッカー URL セルをマークダウンリンクとして解析、Assessment ステート — さらに ta/ja 言語作業:ループするレポートは切断して名前を付け、見出しスケルトンが A–G を安定させ、スクリプト占有率は散文のみを読みます。
追加
修正
- 新しい PageUp ソース(EN アダプタ 105 / ソース 110);トラッカー URL セルをマークダウンリンクとして解析(href が重複排除キー);Assessment 状態は states.yml 経由で到達。
- ループ報告は切断して名前を付けます(
report looping (block B repeated))、非英語用の見出しスケルトン## A) … ## G)。 - スクリプト占有率は散文のみ(表、SCORE_SUMMARY、コード、URL は除外)— ラテン表を含む日本語レポートはもう揺らぎません。
- /api/evaluate は
report not in <locale>警告を追加し、remote-qa はコードを列として出力します。
-
[1.248.7] — 2026-10-11
レポートヘッダーの役割は、# <役割> — <会社> を仮定する代わりに親の実際の規約 # Evaluation: {会社} — {役割} を読みます — トラッカーが「Evaluation: <会社>」を役割として持つことはなくなります。言語違いのレポートは黙って保存される代わりに警告し、H1 前のモデルのおしゃべりは保存されるレポートから取り除かれます。
修正
- ローカライズされたラベルを先に除去(
Evaluation:、Оценка вакансии:など16変形);ラベル後のCompany — Role→ 役割は右側。ラベルなしならRole — Company→ 左側。会社を名乗る部分が決め、役割は会社やラベル語と同じになりません — フォールバックは清掃済みの投稿行。 - cleanup-plan は行の N を合算(
— N dirty-URL line(s))、ファイルを数えません — ダーティURL5行のファイルは 1 ではなく 5。 - 言語違いのレポートは警告:プロンプトは言語指示で開き・閉じ(レポート全体、表を含む)、パイプラインは保存されたレポートの言語を検査 — ドリフトは
report not in <locale>警告として表面化します。 - H1 前のモデルのおしゃべりなし — レポートは見出し行から始まります。
メモ
- 未移植・未変更(v1.248.6 回帰で検証済み): embed-fetch、投稿の行構造(«Компания : X»)、«## Rejected» の重複排除、fetch 前のドメインルート拒否、recon/link-check の正直さ、cleanup モード。言語検証は警告です — (内容 A–G + スコアが検証済みの)レポートは保存され、オペレーターはドリフトを見て再評価できます。
[1.248.6] — 2026-10-10
回帰後のテレグラムチェーン仕上げ:実際の投稿は行構造を保ち(「Компания : X」ラベルと役割行が実際にある場所で見つかる)、トラッカーの役割は生の投稿行ではなくレポートヘッダーから来て、運用サーフェス(recon、cleanup-plan、link-check)は主張することを報告します。
修正
- t.me 投稿が1行に粘着しなくなります:タグ除去の前に
<br>が改行になり、数値HTMLエンティティもデコードされます。会社ラベルのパターンはコロンの前の空白も受け付けます。 - トラッカーの役割はレポートヘッダーから(H1
# <役割> — <会社>);フォールバック行はハッシュタグ・絵文字なし・80文字以下に清掃されます。 ## Rejectedは重複しません:セクションは一度だけ作られ、各拒否はその中に行を追加します。- ドメインルートはリクエストの前に拒否されます — ゴミURLは何もコストをかけません。
- Recon は契約シグナルを計算します(配備済みコードの
markPipelineRejectedを確認);マーク数が0を二度 print しません。 - cleanup-plan はカテゴリ別の数値を報告します(移動対象の t-role、dirty-URL 行、test-row 行)— 成功行自身を数えていた単一の
grep -cの代わり。 - link-check は github.com の 5xx を未検証として扱います — ボットウォールの内側で、壊れたリンクではありません。
メモ
- 未移植・未変更(v1.248.5 回帰で検証済み): embed-fetch 本体、パイプライン・スキップ契約、_setLookup オフラインテスト、uk 序数の受容、役割フィルターの単語境界、cleanup-apply モード。cleanup-plan のカテゴリ別集計はクリーンアップスクリプト自身の出力ラベルを読みます — ラベル改名はカウンタを静かに壊します。
[1.248.5] — 2026-10-10
回帰後の強化:t.me の単一投稿エントリが投稿テキスト自体を取得するようになり(embed 形式)、拒否されたエントリはサーバー側で評価タイマーのプールから外れ、ウクライナ語レポートのネイティブなブロック番号付けが受け入れられます — さらに、密かにライブネットワークを使用していた 1 つのテストが永久にオフラインになります。
修正
- t.me エントリがついに評価されます:単一投稿ページはプレーンな HTML でチャンネルヘッダーのみを提供するため(約 0.2KB — «View in Telegram» だけ)、モデルは空の説明を受け取り、すべての Telegram エントリが評価で死んでいました。フェッチは現在、
t.me/<チャンネル>/<id>(およびt.me/s/…フィード形式)を embed 形式(?embed=1&mode=tme)に書き換えます — 同一ホスト、SSRF 検証は変更なし — そして.tgme_widget_message_textから投稿を読み取ります(フォールバック:og:description)。ウィジェットテキストがない場合 → LLM トークンを消費する前にフェッチステップで拒否されます(telegram post has no text、rejected: true)。 - 評価タイマーが拒否されたエントリに対して再び支払うのを止めます(サーバー側契約):拒否されたエントリは現在
data/pipeline.mdでマークされます — その行は URL フェンスを離れ、短い理由とともに## Rejectedセクションに入ります(冪等、決して重複しません)。タイマーはフェンスからベア URL を取得するため、マークされたエントリは自然にスキップされます — タイマースクリプトの内部に依存しません。Recon はスクリプトを grep する代わりにpipeline rejected marks: N+honours rejected: yes (server-side)を出力します。 - ウクライナ語レポートが A–G 検証に再び合格します:uk モデルは独自のアルファベット順(А Б В Г Д Є Ж)でブロックに番号を付け、lookalike パスは А/В/Е のみをカウントしていました — 正確にブロック C、D、F、G がプロダクションで欠落していました(2/2 再現)。バリデーターは現在、見出しが順番に現れるときウクライナ語序数シーケンスを受け入れます(ar のアブジャド、hi のデーヴァナーガリーと同じ規律)、そしてすべてのロケールの評価プロンプトはラテン文字
A–Gを明示的に要求します。 - 役割キーワードゲートが部分文字列ではなく単語で作動します:
linkedin.com/とx.com/のルートは、lead/itがページの無関係な UI テキストの中に生きていたためゲートを通過していました。キーワードは Unicode 単語境界でマッチし、ドメインルート(パスのない URL)は LLM 呼び出しの前に拒否されます。 - 単体テストがライブネットワークを必要としなくなります:no-hints テスト(
tests/auto-pipeline-jd-gate.test.mjs)は HTTP トランスポートをスタブしましたが、依然として実際の DNS ルックアップを実行していました — ランナーに接続性があったため CI でのみグリーンでした。safe-fetch に_setLookup()フックが追加されました(テストでリゾルバ自体を交換可能;プロダクションコードは決してオーバーライドしません)、テストはオフラインで解決します。
追加
- deploy.yml に
cleanup-plan/cleanup-applyワークフローモード:プロダクションの QA ゴミクリーンアップ(post-qa-cleanup)がラップトップからの SSH なしでサーバー側で実行されます。ログは数字のみを含みます — ファイル名や行のプレビューはありません。ログは公開され、ファイル名に企業名が含まれるためです。Verify ステップはクリーンアップモードではスキップされます。
メモ
- 未移植:親の単語境界ロケーションコンパイラとUSPPS州テーブル(v1.248.1から文書化済み)。拒否エントリのスキップ契約はタイマースクリプトではなくサーバー側(data/pipeline.md のマーキング)にあります — そのスクリプトはリポジトリ外にあり、意図的に変更しません。
[1.248.4] — 2026-10-10
回帰ラウンドの続編:評価タイマーは名前のない Telegram ゴミをどんな状況でも保管できなくなり、QA クリーンアップは本物の Telegram 求人を削除しなくなり、地図の帰属表示が再び見え、ダッシュボードチップは ≥ 4.5:1 で読めます。
修正
- ロール解決チェーンがキリル文字の投稿で機能します:キーワードリストに разработчик/программист/инженер/аналитик/менеджер/руководитель/тимлид/лид/дизайнер/тестировщик/QA/архитектор/специалист/директор/DevOps/SRE が加わり(旧リストは EN のみ:実投稿 40 件中 0 件しかロールを得ませんでした)、レポートヘッダーを参照し(
parseReportHeader— モデルはロールを H1 に書きます)、投稿の最初の意味ある行が最後の手段です。 - 身元ゲートが LLM 呼び出しの前に移動しました:会社もロールの手がかりもないエントリーは fetch ステップで失敗し(
rejected: true)、どうせ拒否される評価にトークンを燃やしません。 t.me/s/<channel>/<id>が会社を「S」と名付けることはなくなりました — プレビューセグメントはスキップされ、両リンク形式がチャンネルに解決されます。- Telegram 投稿の「Компания: X」自己ラベルが尊重されます(メッセンジャーホストの文中「…в компании X」も)。
追加
- auto-pipeline の失敗は SSE エラーに
rejected: trueを載せます — サーバー側の評価タイマーはこのフラグで pipeline エントリーをスキップし、2 時間ごとの再試行をやめます。
メモ
- 未ポート:親の word-boundary ロケーションコンパイラと USPS テーブル(v1.248.1 から文書化)。
- README の「Translations」ブロックは単一の正規リストから生成され、CI にパリティテストが追加されました(ファイルごとに 17 リンク、自分は非リンク)— ar/pl/uk がブロックを獲得;
|/·区切り文字のドリフトは解消されました。
[1.248.3] — 2026-10-10
回帰ラウンドの続き:評価タイマーは名前のない Telegram ゴミをどんな状況でも保管できなくなり、QA クリーンアップは本物の Telegram 求人を削除しなくなり、地図の帰属表示が再び見え、ダッシュボードチップは ≥ 4.5:1 で読めます。
修正
- auto-pipeline は保存前に検証します:0–5 のスコアがない、または A–G ブロックが欠けたレポートは evaluate ステップで実行終了(SSE ペイロードに
rejected: true)— レポートファイルもトラッカー行も作られません。v1.248.2 の長さゲートを通過した t.me エントリーがその後さらに 2 件のゴミを生みましたが、今は名前のないエントリーはcompany/role not identifiableで拒否されます。 guessCompanyRoleがメッセンジャーホストから会社を捏造しなくなりました —t.me・telegram.me・vk.com・linkedin.com等は EMPTY_DOMAINS:Telegram 投稿はチャンネル名へフォールバックし、名前のないエントリーはunknown-roleとして保存されず拒否されます。post-qa-cleanupがヘッダースコアを先に読みます:auto-pipeline は保存前に SCORE_SUMMARY ブロックを切り取るため、旧の summary のみのチェックは保存済み Telegram 求人をすべてゴムと判定 — 本番の 41 件中 8 件はヘッダーにスコアがあり、--applyはそれらを削除するところでした。ヘッダースコア(parseReportHeader経由)が主信号、ブロックはフォールバック。dry-run はファイルごとの理由を印字します。- #/map で Leaflet の帰属表示が見えます — docs FAB が覆っていました(OSM ライセンス違反);コーナーを 96px 引き上げ。
- ダッシュボードチップが ≥ 4.5:1 —
dash-chipラベルと--manual版を--foggy-strongへ(以前は 4.31:1)。
追加
- auto-pipeline の失敗は SSE エラーに
rejected: trueを載せます — サーバー側の評価タイマーはこのフラグで pipeline エントリーをスキップし、2 時間ごとの再試行をやめます。
メモ
- ar/ja のドリフトは再実行で再現しませんでした(v1.248.2 参照)。
- 本番クリーンアップ自体はユーザーの明示的な「はい」を待っています(CAR-61c);この修正で、クリーンアップは本物の Telegram 求人を削除できなくなりました。
[1.248.2] — 2026-10-10
回帰ラウンド:評価タイマーは pipeline のゴミをもう「Last evaluation」にしません。SCORE の解析は実形式に耐え、トラッカーがついにあなたの言語を話します。
修正
- 空 JD のレポートは書かれません。 auto-pipeline の JD ゲートは LLM 呼び出し前に 50 → 200 文字へ引き上げ — プレースホルダーページ(
example.com/qa-v167-…)は…-t-role-<ts>.mdレポートではなく SSE エラー + コンソール警告で終わり、ダッシュボードが「Last evaluation」として表示していたもの(本番に 42 ファイル)を防ぎます。 - SCORE_SUMMARY の解析が実形式に耐えます:「4,2/5」「4.2 / 5」「4.2」「SCORE :」すべて有効。カンマ+1–2 桁は小数、3 桁は千区切り(旧コードは「4,200」を 4.2 と読み 0–5 ゲートを通過していました)。失敗時は
SCORE:行のみをログに出力 — レポート本文は出しません(CI ログは公開)。
追加
scripts/post-qa-cleanup.mjs:デフォルトは dry-run、--applyで自動バックアップ付き(*.bak-<ts>、レポートはqa/cleanup-backup-<ts>/へ移動):トラッカーの ZZ-QA-TEST 行、有効な SCORE のない*-t-role-*レポート、pipeline のexample.comエントリー。
メモ
- 回帰ラウンドの ar/ja ドリフトは再実行で再現しませんでした(両方 lang ✓ + A–G ✓)— language-check の ta エントリーと強化した SCORE パーサーは defense-in-depth として出荷。
- 本番クリーンアップはユーザーの明示的な「はい」を待ちます:まず dry-run プラン、その後に
--apply。
[1.248.1] — 2026-10-09
location_filter に親の always_allow と block_hard ティアが加わりました(CAR-60)— 複数国のロケーション文字列が兄弟ブロックを生き延び、明示的なハードブロックはもう救えません。
修正
always_allowはblockに勝ちます:block: [romania, poland, croatia]とalways_allow: [united kingdom]のとき、workable の統合セル「London, United Kingdom · Romania · Poland · Croatia」は通過 — ホームリージョンが選択肢にあるため(workable #4806 の消費者ケース、ついに親フォームで)。block_hardはalways_allowに勝ちます:文字列のどこかで always_allow に救われてはならない国レベルの語です。strict: trueはblock_hardを制限ティアとして数えます;docs/help の location_filter セクションに両ティアを ×18 で文書化。
メモ
- 今回は意図的に未ポート:親の単語境界付きロケーションキーワードコンパイラと USPS 州名テーブル(web-ui は部分一致を維持;テーブルは米国中心の設定向け — 必要なら CAR-60 へ)。workable 消費者テストの中間 allow-list 形式は、新しい親フォームと並ぶ第二の判定として残ります。
[1.248.0] — 2026-10-09
親パリティ:上流のプロバイダー/liveness 修正を5件ポート — API を移したボードは動作し続け、独立行のクローズバナーを見逃しません。
修正
- Gupy は API を
portal.gupy.ioに追従し、API が実際に読むフィルター名(workplaceType/type)を送信 — 旧複数形の名前は黙って無視されていました。countryは送信されず、設定された国は送信の代わりに警告を出します。Confidential 雇用主はラベル完全一致でドロップ(「Confidencial Seguros」は存続)し、max_pagesは 100 に上限 — API は offset 10,000 を超えると 400 を返すため、切り詰め警告は上限引き上げではなくキーワード絞り込みを提案します。 - Workable は複数国の求人の全ての国を保持:同じ求人 URL の兄弟は 1 行に折りたたまれ(「London, United Kingdom · Romania · Poland · Croatia」)、最初の国が勝つのではなくなりました。
- Liveness:独立行のバナーは上の行の一部ではありません — 求人下の「Sign in if you want to apply」/「Get notified when this position is filled」はクローズ節として読まれ、行をまたぐ本物の「until filled」は今までどおりアクティブと読まれます。
- Radancy はレガシーカードmarkupの兄弟
job-location要素を読みます(Barclays 系レイアウトは場所を</a>の後に置く)— 自分の場所を持たない行は隣から借りず空のままです。 - SmartRecruiters のフォールバック求人リンクは設定済みスラッグを保持 — 信頼できない
refのない求人は、表示名ではなくテナントのスラッグから公開 URL を合成します。
追加
- ノーポートを文書化:上流
_httpプロキシfetchImpl修正(web-ui にはプロキシ分岐がなく、ポートすると DNS-rebinding ガードの同一性チェックが無効化され、リポジトリが意図的に避ける undici 依存が追加されます);上流verify-ats(+226 行)とcv-facts(web-ui は独自の ATS スコアリングと CV パースを実装);親のダッシュボード Go TUI と CLI スクリプト;Teamtailor の import 並べ替え(表面的)。
メモ
- 既知のギャップをフォローアップへ:親の location フィルター
always_allowティア(workable の消費者テストはこれで UK ブロックを生き延びる)は web-ui に存在しません;ポートは同じ消費者判定を許可リストテストで表現しました。別変更として記録済み。
[1.247.0] — 2026-10-09
CAR-49…58 デザインスイープの尻尾が完了 — 残る minor/polish 所見のすべてと、前リリースが意図的に見送ったダークマップを含みます。
修正
- マップが本物のダークテーマを描画します。 ズーム/レイヤー/属性表示は v1.246.0 でダークになりましたが、今回タイルも追従:ダークモードは CSS 反転した OSM レイヤーを描画(ベンダーキー不要)、キー付き Carto-dark プリセットを
MAP_TILE_DARK_URLで利用可能(そのホストは CSPimg-srcに許可済み)。テーマ切替でレイヤーをライブ再マウント。 - 黄色 callout にダーク版ができました(
config・batch・hero 警告)— v1.246.0 のトークン機構を使用。過程で回帰も検出:.callout aが.btn-primaryを上書きしていたのを:not(.btn)でスコープ。 - Apply 情報カードの URL が単語途中で切れなくなりました。
- CV ヘッダーボタンは単一のアイコン体系(テキスト表記;📁/📄/💾 の絵文字混在を解消)。
- トラッカーのステータスタブの大小文字を統一 — sentence case、ロケール別の配慮付き(CJK/ar/hi/ta は性変化なし)。
- トップバーのアイコンを単一のストローク SVG セットに — 🔔/🌙/🩺 の絵文字混在を解消;テーマボタンの太陽/月は CSS で描画。
- ダッシュボードの Pipeline カードから不要なピンク強調を削除(リングは hover/focus のみ)。
- 保存検索の Delete が破壊的だと分かるように(
.btn-danger、中立ゴーストではなく)。 - pipeline プレビューに本物の空状態(タイトル + ヒント + CTA、トラッカー方式)。
- 時間/コスト メタを一つのパターンに:
UI.pageMetaが ⏱ + コストをビュー見出しの下に一行で描画(evaluate/deep/auto/mode-page/orientation)。 - Auto-pipeline から ✨ を除去 — アプリ唯一の装飾付き h1 が共通の左端に戻りました。
- Batch の docs URL をインラインリンク化。
- interview-digest / orientation にデザイン済み空状態(タイトル + ヒント + CTA)。
- career-plan の Export はプラン未作成時は無効、アクションは一行に。
- stats:重複していた「Market report」見出しを削除、地域プレースホルダも収まるように(×18 で短縮、固定幅)。
- Config が絶対パスを漏らさなくなりました — サーバー側
displayPath()が~/…またはファイル名のみ表示。 - LLM_PROVIDER ヘルパーは三行の短文に(×18 +
pre-line)、150 字の mono の壁から解消。 - プロフィール EMAIL カードはアドレスを一行で保持(省略記号;折り返しは ≤480px のみ)。
- Health のテキストが単語途中で折れなくなりました(「Run buttons」は完全なまま;overflow-wrap anywhere)。
- Help のインラインコードが RTL でも壊れません(LTR アイソレート、nowrap、スクロール可能)。
- Hero の「Live evals」ピルが ru/ar で衝突しなくなりました(flex-wrap、縮まないアイコン)。
追加
- ダークタイル プリセット(
MAP_TILE_DARK_URL+ attribution)をコード内で文書化;CSPimg-srcの追加で Carto ホストを許可。
メモ
- ダークタイルの既定は OSM の CSS 反転です — キーなし Carto はベースマップを API キーで閉じたため(リクエストで確認)、キー付きプリセットはオプトインで既定ではありません。
[1.246.0] — 2026-10-09
CAR-48 シニアデザイン通し検査のトップ10所見をすべて修正 — ブロッカーと7つの major を含みます。
修正
- Apply ダークモード: 情報カードのリンクが再び見えます。 カードがダークモードでも明色 surface を保ち、「Need Playwright? See …」リンクが ≈1.0:1 になっていました。テーマ対応の
.callout--info(surface/border/text/link トークン)でダーク時のリンクは ≈7.3:1 に。 - RTL が数値合成を反転しなくなりました。 スコアピル(「1.5 / 5」)、レポートのバンド(「≥ 4.5」「< 3.5」)、ダッシュボードの「/ 5.0」に方向アイソレーション(LTR span)を付与。ar 辞書は散文として良い箇所の数値レンジを言葉に置き換え。
- CV マークダウンは LTR のまま。 アラビア語でも textarea とプレビューは
dir="ltr"で描画され、周囲のクロムは RTL のまま。 - レポートの DATE 列は ISO 日付を二度と折り返しません(nowrap + 表形式数字)。
- サイドバーは USAGE HUD の上で終わります(スクロールポートの予約 + フェード)— 最後のナビ項目がパネルの下に潜らなくなりました。RTL もミラー。
- モバイル scan @390: 「Save search」が完全に見えます — コントロール行が折り返して縮み、ビューポート端でのクリップを解消。
- マップのコントロールがダークテーマに追従(ズーム・レイヤー・属性表示)。タイル自体は意図的に変更なし: タイル origin はサーバー側の CSP
img-srcで固定されています。 - チャット FAB がインタラクティブ要素を覆わなくなりました — ページのスクロールパディングがクリアランスを確保(Portals の Disable ボタン、Reports のスコアピル、two-pager 入力、Leaflet 属性表示)。
- アクティビティログが UI 言語で表示されます: 22 個のアクション slug を ×18 ロケールでローカライズ(未知のものは生 id にフォールバック)、フィルタチップも翻訳。TARGET 列は auto-pipeline が埋めるため残します。
- assessments のフォームに実ラベル(センテンスケース、
htmlFor/id結合)— プレースホルダ専用から改善。
メモ
- このリリースには含まれない: マップのダークタイル(CSP
img-srcの拡張が必要 — サーバー側の変更のため意図的にクライアント側では対応せず);黄色 callout のダーク版(config・batch)— トークン機構はフォローアップ向けに準備済み。
[1.245.0] — 2026-10-09
タミル語(தமிழ்)が18番目のUIロケールとして登場 — 17ロケールの波以降で初の新言語、キーは完全パリティ。
追加
- タミル語(
ta):1449/1449キー、enとの完全パリティ、プレースホルダの欠落なし、hi流のインド系テック表記規約(プロバイダ・モデル名・パス・コマンドはラテン文字のまま)。detect()はta、ta-IN、ta-LKを受付。タミル語はLTR(テストで固定)。 - docs/help/ta.md 完全版(H2 33 / H3 125、ソース件数はライブレジストリと照合、Hermesカナリアアンカー、YAMLを逐語収録)に加え、README.ta.md・CHANGELOG.ta.md のミラーも。
- 列挙ゲートを17 → 18へ: LANGS、detectプローブ、i18n監査、チェンジログパリティ、RTLガード、CIの
langs— これまでCIリストに欠けていたhiも同時に追加。
メモ
- cvstart.org のランディングは当面17ロケールのまま — ランディング翻訳は別タスク。サイトコンテンツ同期はすでに docs/help/ta.md と taチェンジログを配信しています。
report-header.jsの REPORT_LABELS は17のまま — タミル語レポートの解析は、親リポジトリのタミル語レポート生成とともに提供されます。
[1.244.2] — 2026-10-08
スキャンページのポリッシュ: ランチャー、ステータスバー、リポストパネル、フィルターが一貫したクロームとして再設計され — 結果テーブルはボード側データで引き伸ばされなくなりました。
修正
- 給与セルは金額レンジだけを表示。 一部のボードは給与フィールドに福利厚生の説明全文を入れており、6行のセルが各行を引き伸ばしていました — 表示セルは金額部分のみとし、全文はツールチップへ移動。
- タイトルが空の行は会社名を表示(なければ中立的なダッシュ)— 巨大な空白セルの代わりに。
- シニアリティバッジは固定幅コラムで折り返しません。
- スコアなしの行は薄い「◎ —」を表示 — two-pager 比較で一致するキーワードがなかったことをツールチップで説明(以前は何もなく、スコア付きの行の隣で壊れて見えました)。
追加
- クローム再設計: ランチャーカード(整列したコントロール行、支配的なプライマリボタン)、ステータスドット(アイドル/実行中/完了/エラー)付きのターミナルステータスバーは reduced-motion セーフ、リポストパネルは高さ上限とスティッキーヘッダー付き(1,560 クラスタで 155,000px のパネルを描画していました)、フィルターブロックは均一なレスポンシブグリッドと整列したフッター。
備考
- #/scan のその他の部分は v1.244.1 と同一です — 変更されたのはクロームのポリッシュと上記の4つの修正のみです。テスト 5045 → 5068 unit。
[1.244.1] — 2026-10-08
修正
- Scan icons announce real values. The boost/fit/score icons’ accessible names leaked the raw dict templates (“Fit: {band}”, “Boosted by {by}”) —
{band}/{by}/{score}are now substituted (band word, booster keyword, numeric score). [HIGH a11y, caught live in the v1.244.0 regression round] - Title pipes split correctly. A 4-segment title like «C++ | Rust | Go Developer | Onsite» no longer lifts “Go Developer” out as a “country” — the split demands the segment resolves to a real country (conservative
Countries.detectCountry). - Meta dates render for every row.
daysSinceaccepted date-only ISO, but the API serves full timestamps for ~83% of dated rows — those rows showed no date segment.
備考
- #/scan のその他の部分は v1.244.0 と同一です — 変更されたのは上記の3つの修正のみです。
- 意図的に未実施: URL ハッシュのフィルタ状態、キーボードでの行ナビゲーション、
5 lakhs INRの解析(既存のフォローアップ)。
[1.244.0] — 2026-10-08
スキャン結果が壁ではなくリストのように読めます: 1 求人 = 2 行、シグナルはアイコン、700 行のスキャンは 37,000 px のページの代わりにページ分割されたテーブルに。
修正
- 行の構造。 すべての求人は 2 行に収まる行として描画されます。1 行目はタイトル、2 行目は
company · location · source · date · work-type。ブーストバッジ、タイトル適合バンド、適合スコアは、ローカライズされたアクセシブルな名前とツールチップを持つアイコンになりました(スクリーンリーダーは単語の羅列ではなく «Соответствие: сильное» / “Fit: strong” を読み上げます)。信頼と移転のバッジも同じレールにまとめられました。シニアリティと給与はデスクトップ専用の補助カラムのままです。 - タイトルの衛生。 末尾の
| Germany | Remoteセグメントはタイトルから切り離されてメタ行に移動します — Unicode 対応で、末尾が実際のワークタイプのマーカーであり中間セグメントが地名の形をしている場合にのみ分割します(“C++ | Rust | Go Developer” のような正当なパイプは決して分割されません)。 - 横方向のはみ出しはもうありません。 固定テーブルレイアウト、
min-width: 0、省略記号付き 1 行のタイトル/メタ(全文はツールチップに): 1440 px でも 390 px でもページのオーバーフローもテーブル内部のスクロールもゼロ(以前はスマートフォン幅で 675 px はみ出していました)。 - ページネーション。 結果は 1 ページ 50 件で描画されます(25/50/100/200 から選択可)— 700 行のスキャンは ~37,000 px の代わりに ~4,600 px になり、DOM は 5,500+ の代わりに ~1,000 ノードを保持します。
追加
- レイアウト契約テスト: 2 行の行、アイコンのアクセシブルな名前(en + ru)、ページネーションのノード予算、タイトル適合の件数/順序ガードがブラウザスイートで実行されます — 再設計が黙って退行することはありません。
備考
- テスト 5036 → 5045(ユニット、ブラウザスイートにレイアウト契約を追加)、カバレッジ平均 98.14 % 行 / 89.34 % 分岐(下限 96/86)。
- スキャナーが見つけるもの、スコアリングの数式、
last-scan.jsonは手つかず — タイトル適合は注釈のままです。 - 本リリースに含まれない: URL ハッシュのフィルタ状態とキーボードでの行ナビゲーション(フォローアップ)。
5 lakhs INRの解析(既存の問題)。
[1.243.2] — 2026-10-08
修正
- デプロイ可能なリリースを v1.243.2 として切り出し。 v1.243.1 の git タグは公開後に打ち直され、サーバーの
git fetch --tagsは既存タグの上書きを正しく拒否します — そのため v1.243.1 は一度もデプロイ可能ではありませんでした。このタグは同一のツリー(v1.243.0 ベースのモーダル window-リスナー修正)とこのバージョンアップを含みます。他に変更はありません。公開済みの npm 1.243.1 ターボールにはすでに修正が含まれていました。
備考
- アプリのコードは v1.243.1 と同一 — 新しいデプロイ可能タグだけが追加(サーバーの
git fetch --tagsが打ち直された v1.243.1 を拒否しました)。 - 意図的に未実施: サーバー側タグの強制更新(公開済みタグは移動しません)。
[1.243.1] — 2026-10-08
修正
- 「結果を記録」モーダルがナビゲーションで実際に閉じるようになりました。 v1.243.0 のガードは
documentでhashchangeを待っていましたが、このイベントはそこでは発火しません — 修正は死んだまま届き、モーダルは次のビューをブロックし続けました(v1.243.1 回帰ラウンドで本番で発覚)。ガードはwindowで待つようにし、テストもそこでディスパッチし、壊れたコードに対して赤になることを確認しました。
[1.243.0] — 2026-10-08
ブラウザ層があなたの作業を守り、あなたの言語で語ります。未保存の編集を失わせず、失敗を黙って握りつぶさず、翻訳済み UI に黙って英語を混ぜることもなく、コントラストはどこでも AA です。
修正
- 未保存の編集は再レンダリング後も生き残ります。 CV エディタはダーティバッファを保持し、毎回のレンダリングで復元します — キャンセル、言語の切り替え、CV Studio への移動でも、破棄の代わりに確認プロンプトを出すようになりました。キャリアプランも同じ方法で生成済みテキストを保持します。Config/CV Studio/career-plan/memory/two-pager での読み込み失敗は、空欄でファイルを黙って上書きする代わりにエラーを表示し、保存を無効化します。
- 「結果の記録」モーダルはナビゲーションをまたいで生き残らなくなりました。
#/trackerで開いたまま別のビューをクリックすると、ページ全体を塞ぎ続けていました(v1.242.1 の two-stand リグレッションで発見)— 現在はルート変更で閉じます。スキャンビューの兄弟モーダルも、ナビゲーション時に SSE ストリームを停止しリスナーを解除します。 - 給与とキーワードの解析があらゆる文字体系を読みます。 キーワードチップは Unicode の単語境界を使います(キリル文字、
c++、.netが 0 行ではなく正しくフィルタ)。共有の給与パーサー 1 つで$182.9K - $240K、от 100 000 руб、100 тыс. руб.、50 000 Kč(以前は 50M USD)や範囲の意味($100-150K)が正しく解釈されます。必須条件の「Germany or Netherlands」が、マッチ済みと違反済みの両方として数えられなくなりました。 - ストリームはちょうど 1 回だけ確定します。 切断された SSE 接続はエラーを 2 回配信し、Generate ボタンが永久に無効のままになることがありました。すべての終端状態(done/error/close/throw、kill された子プロセスを含む)は 1 つの経路で確定し、ボタンを再度有効化します。auto-pipeline は最後のバッファ済みフレームを破棄せずにフラッシュします。
- 細い経路でのプライバシーと正確性。 バグレポートの本文は評価対象の求人 URL やレポートのスラッグをもう運びません。CV のプライバシーマスクは素の
linkedin.com/in/…リンクとすべて大文字の名前をマスクし、EU の日付を壊さなくなりました。国の解決は最長一致を取り、2 つの国名が並んでいる場合は推測を拒みます(「Cambridge, MA」はもう → UK になりません)。ファイル名でのダウンロードはキリル文字の名前を保持します。 - ルーターと a11y。 スキップリンクが
ontentに 404 しなくなりました。アクティブなナビ項目はaria-current="page"を持ちます。<main>は 1 つ、<nav>は 1 つ。Escape でモバイルドロワーを閉じます(閉じている間はタブ順序から確実に外れます)。scroll-padding-topが sticky バーの下でもフォーカスを見えるままにします。sticky バナーはトップバーを覆わなくなりました。 - 両テーマでコントラストは AA — ダークテーマのトーストは白背景に白文字(1.10:1)でした。
--rausch上のトースト、ボタン、バナー、リンクはテーマ不変のトークンを通じて解決されるようになり、計算結果を検証する WCAG コントラクトテスト(≥ 4.5:1)で守られています。 - このラウンドのその他すべて: evaluate は切り詰め警告を表示します。memory/config/two-pager は読み込み失敗時に Save を拒みます。scan は SSE を孤立させなくなりました。スキャン結果はずれた正規表現ではなくサーバーレジストリから API 対応ボードを分類します。トラッカーの「Proceed with Caution」は警告であり badge-red ではありません。stats はローカライズされたステータスを集計します。棒グラフは RTL でも正しく読めます。docs FAB はスマートフォンでコンテンツを覆わなくなりました。
GET /app.jsはインデックスシェルではなく 404 を返します。GET /api/runnersはアクションを列挙します。
追加
- デンマーク語が自動検出に加わりました —
da-DKのブラウザはデンマーク語 UI を得ます(辞書は完全だったのに検出が取りこぼしていました)。zh-Hant*は繁体字中国語にマッピングされます。cv-diagnostics(履歴書チェックリスト)は完全にローカライズされました(28 個のdiag.*キー × 17)。フィールド仕様のラベルを 26 個追加。死んだキーを 31 個削除。プロバイダー一覧はもう Hermes を「自動順の最後」と主張しません。docs-fab/メニューの aria-label もローカライズされました。
備考
- テスト 4812 → 5036(ユニット)、ブラウザ 118 + 新しいナビゲーション/コントラストの契約テスト、カバレッジ平均 98.15 % 行 / 89.34 % 分岐(下限 96/86)。
- 本リリースに含まれない:
#/scanの再設計(フェーズ4 — v1.244.0、仕様は草案済み)。専用のexport.docxFailed辞書キー(この失敗はcommon.errorを再利用)。5 lakhs INRは依然として 5 と解釈されます(既存の問題)。
[1.242.1] — 2026-10-08
修正
- リリースアーカイブに
node_modulesのシンボリックリンクが再び含まれなくなりました。 v1.242.0 の Git タグにはルートのnode_modulesシンボリックリンクとsite/node_modulesが含まれており(包括的なgit add -Aが末尾スラッシュ付きの ignore パターンをすり抜けました)、サーバーデプロイの tar 展開が失敗しました — デプロイは安全にロールバックし、本番は 1.241.1 のままでした。両シンボリックリンクは追跡から外し、ignore パターンを広げました。npm の tarball は影響ありません(パック時に npm はnode_modulesを除外します)。
備考
- アプリのコードは v1.242.0 と同一 — パッケージングのみ。ソース正確性の内容はこのデプロイで本番へ載ります(v1.242.0 は本番に届かず、tar 失敗でサーバーデプロイがロールバックしました)。
- 意図的に未実施: v1.242.0 の再タグ付け(npm は既に 1.242.0 を公開済み。レジストリの tarball はクリーン — パック時 npm は
node_modulesを除外します)。
[1.242.0] — 2026-10-07
スキャナーのデータ層が再び信頼できるものになりました。死んでいたソースが復活し、不正な応答はもう「0件のボード」として読まれず、敵対的なボードURLもスキャンをリダイレクトできません。
修正
- 死んでいたソースが復活。 justjoin(APIエンベロープが
{data, meta.next.cursor}に変更)はカーソルwalkでカタログ全体を読み、新しい給与フィールドに対応。nofluffjobs はsalaryCurrencyなしで 400 を返すようになっていました — 親の必須クエリを送り、結果をページング(pageTo)します。himalayas と jobicy は10万件超のうち最新约20件しか見ていませんでした — 両方ともカタログ全体を走査します(オフセット/カーソルページネーション、ページ上限付き)。 - 形状の正しくない200はページ1で例外を投げます。 約40ソースが不正な応答やチャレンジ回答を「0件」と読み、スキャンが静かに「成功」していました。新しい
server/lib/sources/_shape.mjsガード(requireArray/requireContainer/requireObject)が全ファミリーで失敗を可視化します。後続ページの失敗は収集済みページを保持し、ページネーションはフィルタ後ではなく生のページ長で停止します。 - SSRF: 部分一致のベンダー判定を解析済みの正確なホストピンに置き換え。 lever(
clever.comはlever.coを含む)、greenhouse(5ホスト + レガシーboards[.eu].greenhouse.ioパススラッグホスト)、ashby、smartrecruiters、workable、gem REST、ibm、arbeitsagentur、hecklerkoch(wwwのみ)、workingnomads(DNSガードを通過してhttp://169.254.169.254に到達可能でした)、remoteok、remotive、rss、successfactors。全体にredirect:'error'; 求人URLはピン留めされたホスト上のhttps:のみ(javascript:/data:/ 異ホストは除外)。 - 設定ミスの portals エントリー1つでスキャン全体が中断されることはもうありません。
resolveAdapterはアダプタの例外を捕捉し、detectApiは企業ごとにラップされ、投げるアダプタはnullを返します。comeet のフェッチエラーはログや隔離レコードに届く前に?token=を編集します。 - ページネーションと鮮度。 workday は100件超のテナントを走査(オフセットページ、
MAX_PAGES); telegram は最新の投稿を保持し?before=でページング(黙って最古を保持するのではなく); tencent はCount欠落でも走査を続行; taleo はフランス語の見出しテーブルを解析; avature は生ページ長で停止; UTC日付スタンプ(UTC以東の amazon の off-by-one、torre、workingnomads、trudvsem); HTMLエンティティのデコード(geekjob、getmatch、hh); mycareersfuture は完全な12フィールド形式を出力。 - リモート判定をタイト化。 arbeitsagentur、vdab、rippling、teamtailor: 契約パーセント(“Verpleegkundige (100%)”、
bundesweit)と “distributed”(“Distributed Systems Engineer”)はオンサイトを Remote とタグしなくなりました。
追加
tests/adapters-pin-coverage.test.mjsがピンが導入したホストピン分岐のカバレッジを完成させます。
備考
- テスト 4419 → 4812、ブラウザ 118。カバレッジ平均 98.15 % 行 / 89.36 % 分岐(ゲート下限 96 / 86)。
- このリリースには含まれない: 同じレビューラウンドのクライアント側の発見(フェーズ3 — views、libs、CSS/a11y、i18n);
sources/habr.mjsにはまだ専用テストファイルがない(ratchet免除)。
[1.241.1] — 2026-10-07
ライブ評価がすべてのロケールで最後まで動作し、求人マップは複数の所在地を並べた長い求人も配置し、デプロイが実行中のスキャンを止めることもなくなりました。
修正
- 評価がメソッド全体を参照します。 コンテキスト予算(144 KB)は、CV とプロファイルをインラインに展開すると
modes/oferta.mdの末尾をまだ切り落としていたため、すべてのライブ評価が最後のブロックを欠いていました。予算は 192 KB、プロンプトのソフト上限は 256 KB になり、llm-dispatch.mjsの 1 か所で定義されます。 - 選択した言語でのレポート。 言語の指示がプロンプトの末尾に加えて冒頭にも置かれるようになり、一般的な語(role、team、design など)はレポートの言語で書かれます。英語のまま残るのは名前、技術名、原文どおりの引用だけです。大半が英語になっていたヒンディー語と日本語のレポートを修正しました。
- 遅い評価が HTTP 502 で終わらなくなりました。 評価のタイムアウトは 300 秒です(これまではプロバイダーの既定値である 180 秒でした)。
- ヒンディー語のブロック文字。 A〜G の文字をデーヴァナーガリーで綴ったレポート(
## ए)、## बी)…## जी))を認識し、SCORE:は各地域の数字(३.८、٣٫٨、3.8)と小数点のカンマを受け付けます。 - 求人マップ:長い所在地。 「Berlin Office · Berlin · Germany · Bosnia · …」のようなセル(300 文字以上)が HTTP 400 で拒否され、その求人にマーカーが付かない問題がありました。現在は最初の実在する地名を使います(
·、;、|、/、改行で区切り、「Remote …」の区間、「(HQ)」、「Office」は読み飛ばします)。拒否されるのは 2000 文字を超えるクエリだけです。 - デプロイと毎時のスキャン。 デプロイはスキャンと自動評価のタイマーを保留し、実行中のものが終わるまで(最大 15 分)待ってから再起動し、ロールバックの場合も含め、必ずタイマーを再開します。
追加
- cvstart.org の求人マップ — 全 17 言語に加え、英語版とロシア語版の README にも掲載しました。
- 全言語の地図スクリーンショット:言語ごとに 1 枚(
scripts/capture-map-screenshots.mjs)。17 の README すべて、cvstart.org、ヘルプの新しい小節「地図の使い方」(§33、×17)に掲載。
備考
- テスト 4404 → 4419、ブラウザ 118。リモート QA(全ルート、サイト、リンク、17 ロケールのライブ LLM)は本番で green です。
- 本リリースの対象外:ストリーミング評価。300 秒のタイムアウトは引き続き厳格な上限です(遅いローカルモデルでは到達することがあります)。Hermes ブリッジも非ストリーミングのままです。
[1.241.0] — 2026-10-07
28 エージェントによるコードレビュー(検証済みの指摘 約 190 件)に基づく堅牢化リリース — セキュリティ、プロセスクラッシュ、データ損失のクラスを解消し、あわせて @bullitt186 が提供した求人マップを追加。
追加
- 求人マップ(
#/map) — パイプライン、直近のスキャン、トラッカーの求人を OpenStreetMap 上に表示します。ジオコーディングは識別可能な User-Agent を付けた Nominatim で行い、1 リクエスト/秒のキュー、バックオフ、ディスク上のキャッシュを備えます。Leaflet はこのサーバーから配信され(CDN なし)、CSP に加わるのはimg-srcのタイルオリジンだけです。@bullitt186 による提供(#381)。 - リクエストガード — サーバーは自分が配信していない
Host(DNS リバインディング)と、クロスサイトの書き込みおよび副作用のある GET(/api/stream/*、/api/run/*、/api/geocode)を拒否します。公開名を転送するリバースプロキシは、それをALLOWED_HOSTSに列挙します。デプロイのワークフローは公開 URL からその systemd ドロップインを書き出します。 - カバレッジゲート —
npm run test:coverage:gate(scripts/coverage-report.mjs)がファイルごとの行/分岐カバレッジを出力し、段階的に引き上げるベースラインを下回ると失敗します。
修正
- 不正なリクエストでサーバーが停止しなくなりました。 Express 4 は拒否された非同期ハンドラーを無視していたため、
/api/deep、/api/auto-pipeline、/api/career-plan、/api/trackerの型違いのフィールドや、/api/statsの NUL バイトでプロセスが終了していました。これらは JSON の 400 になり、その他の拒否はすべて 500 になります。 - 中断または失敗したスキャンが直前の結果を消さなくなりました。 スキャンが停止された場合やすべてのソースが失敗した場合も
last-scan.jsonは保持され、単一企業のスキャンは置き換えではなくマージします。portals.ymlの設定ミスのエントリが 1 件あっても、スキャン全体が中止されることはなくなりました。 - 評価がメソッド全体を参照します。 モードファイルは 16 KB で切り詰められていたため、
oferta.md(92 KB)はブロック C〜G を失っていました。ファイルごとの上限はモードが 128 KB、CV が 64 KB になり、切り詰めは報告されます。空の回答や途切れた回答は、空のレポートを書き込まず失敗します。 - SSRF: リダイレクトの各ホップをプライベートな宛先について再確認し、すべての DNS 応答を検査し、スキャンの期限は本文まで対象とし、
*_BASE_URLキーはベンダーのホストにのみ送られ(Hermes/Ollama はループバックまたは LAN)、pandoc は--sandboxで実行されます。 - イベントループの停止: 二次時間の正規表現 2 件(HTML の除去、markdown のサニタイズ)を線形のスキャナーに置き換えました。
- データ損失: パイプライン行を削除すると他の行の報酬が残ったままだった問題、URL 内の
$&がpipeline.mdを壊していた問題、模擬面接・ネットワーキング・ディープリサーチの保存が以前のファイルを上書きしていた問題、面接履歴が最後ではなく最初の 40 ターンを保持していた問題を修正しました。 - LLM 層: auto-pipeline とディープリサーチは共有ディスパッチを通じて
LLM_PROVIDERとすべてのプロバイダーに従い、使用量を記録し、切り詰めを報告します。Gemini の evaluate/test はレポートを保存しなくなり、OpenAI はmax_completion_tokensを使い、Codex 専用のOPENAI_MODELはgpt-5として送られ、求人票は信頼できないデータとして囲まれます。 - レポート、ディープ、インラインの PDF は
--skip-fact-checkを渡します(CV のファクトチェックが数字を含むレポートをすべてブロックしていました)。プロファイルのページ形式は上書きされなくなりました。 - スキャナー: 隔離は URL をキーとし(URL の再試行を修正)、実行内の重複排除は正規 URL で行い、空白のリスト項目はすべてに一致しなくなり、書き込みはアトミックになり、
skipped_*の履歴行は「既出」として扱われません。 - プロセス制御: SIGKILL へのエスカレーションが一度も発動していませんでした。バッチ実行は切断時にプロセスグループ全体を終了します。
- CI とリリース: CI は changelog-parity、ワークフロー、i18n のゲートを実行するようになりました。ワークフローの権限は最小権限になり、本番のシークレットは
production環境の下にのみ置かれ、npm パッケージはdocs/help/を同梱します。 - テスト: どのテストもネットワークや実際の親プロジェクトに触れなくなりました(明示的な
CAREER_OPS_ROOTは常に尊重されます)。コピーされたアルゴリズムは本番のコードに置き換えられました。
備考
- テスト 4056 → 4404、ブラウザ 118。サーバーのカバレッジベースライン: 行 96.7 %、分岐 86.3 %(
scripts/coverage-baseline.json)。 - 仕様は 1 つのフォルダー
docs/sdd/specs/にまとまりました。プログラム計画はdocs/sdd/PLAN.md、不変条件→ゲートのマトリクスはdocs/sdd/TRACEABILITY.mdです。 - 運用上の注意: リバースプロキシの背後では
ALLOWED_HOSTS=<public host>を設定してください。公開ホスト上の Ollama/Hermes のベース URL は拒否されるようになりました。
[1.240.0] — 2026-10-06
親プロジェクトとの同期 — career-ops main @ 62905981(VERSION 1.35.0、b39931e 以降の上流コミット 177 件)。新しいソース 6 件 — 103 → 109(英語 104 + ロシア語 5)— と、既存プロバイダー 8 件へ反映した修正、そして @bullitt186 が提供したチェックリスト形式のパイプライン。
追加
- 新しいソース 6 件 — 103 → 109(英語 104 + ロシア語 5)、英語アダプター 98 → 104。
- ADP Workforce Now(
workforcenow.adp.com、cid+ccId付き)— 実際に返された行数による$skipページネーション。jobRequisitionsもmetaもないレスポンスは、空のボードとして読まれず例外を投げます。オプトインの詳細取得(adpWorkforcenow.fetchDetails、既定 25、上限 100)。 - Gupy(
employability-portal.gupy.io)— ポータル全体のキーワード走査。新しい順で、since_daysで早期に打ち切ります。workplaceTypeは単数形の pt-BR 文字列として読むため、ハイブリッド求人が失われません。非公開のキャリアページは除外されます。 - JazzHR(
*.applytojob.com)— カードパーサーに素のアンカーへのフォールバックを備え、デザインが部分的に変わっても求人を取得できます。求人リンクがあるのにカードが 1 件も解析できなければ例外を投げ、本当に空のボードは[]を返します。 - Startup Jobs(
startup.jobs/feeds/jobs)— RSS、リクエスト 1 回。不正な本文、HTML、途切れた本文は[]を返さず例外を投げます(親のマージ後レビューの修正、08fe5d06)。アイテム照合の前に CDATA とコメントをマスクします。 - Taleo(
<tenant>.taleo.net、tre.taleo.netは拒否)— シェルの GET のあとsearchjobsの POST。ポータル ID のないシェルは非公開ボードとして例外を投げます。列は見出しで照合します。 - UKG Pro / UltiPro(
recruiting[N].ultipro.{com,ca})—Top=50+Skip。totalCountは停止条件として信用せず、ページ上限は 100(1500 で切り詰め)。オプトインの詳細ページは、文字列を認識する波括弧ウォークで解析します。
- ADP Workforce Now(
修正
- 親のチェックリスト形式のパイプライン — 上流の career-ops は
data/pipeline.mdを- [ ] url | …行からなる## Pending/## Processedセクションとして書き出しますが、UI はこれを保留 0 件と読み、親が決して見ないファイル末尾にフェンスを追記して書き込んでいました。parsePipeline、addPipelineUrl、removePipelineUrlはこの形を読み書きするようになりました(処理済みの行に対する重複排除も行い、報酬はラベル付きのnote: comp …セグメントとして記録)。フェンス形式は変わりません。@bullitt186 による提供(#380)。 - 国を所在地に折り込む — Ashby(主所在地の
address.postalAddress)、Breezy(country.name)、Recruitee(フラットなlocation)は、名前がその国をすでに単語全体として含んでいない限り国を付け足すため、英国が主、米国が副のリモート求人が所在地フィルターで除外されることはなくなりました。 - MokaHR — リージョンホスト
hire-r1.mokahr.comを受け付けるようになりました(許可リストはapp.mokahr.com+hire-r1.mokahr.comのみ)。API の POST と求人リンクはボード自身のホストを使い、帯域内のsuccess:falseは空のボードとして読まれず例外を投げます。 - Avature —
article--jobsカードを解析します(タイトルはヘッダーのアンカーから、所在地はicon-addressの span から)。 - SAP SuccessFactors —
/go/<Category>/<id>[/<offset>]/の保存済み検索 URL がテナントルートに解決されます。以前は…/tile-search-results/に当たり、タイルが 0 件のまま 200 を返していました。 - Deutsche Bahn — db.jobs は、描画できない求人を含む結果ページをすべて空白にします。走査は
pubExternalDate_tdtで並べ替えて 1 ページ 1000 件(最大 5 ページ)とし、生のヒットアンカー数で停止し、結果ヘッダーの欠落や未解析の求人リンクがあれば、短いボードを返さず例外を投げます。 - HigherEdJobs — HTTP 200 で返される Incapsula のチャレンジは、以前はアイテム 0 件と解析されて空のボードと読まれていました。現在は例外を投げます。
- テストが開発者のマシンで実際の親プロジェクトを読んでいました —
tests/reports-list-cache.test.mjsはCAREER_OPS_ROOTをcv.md/portals.ymlのない一時ディレクトリに設定していましたが、paths.mjsはそれを無視するため、ローカルでは親のレポートを数えてしまい(3 件ではなく 6 件)、隣に親のない CI は通っていました。
備考
- テスト 3782 → 4056。新しいスイート:
sources-adp-workforcenow、sources-gupy、sources-jazzhr、sources-startup-jobs、sources-taleo、sources-ultipro、sources-location-country-fold、sources-deutschebahn-blanked-page、sources-higheredjobs-challenge-page、さらに #380 のparsers-pipeline-checklist。 - 親: フォークは上流
mainに追いつきました(144 → 0 コミット遅れ)。ADR-0002 の 4 件の相違点が損なわれていないことを確認済みで、キリル文字のLOCATIONISH_REに対する上流のリバートは取り込まれていません。 - v1.239.0 で出荷済みのため繰り返しません: AppliTrack、NEOGOV、Red Rover、SchoolSpring、OCC Mundial、Greenhouse の埋め込みボード、Workday
myworkdaysite.com。
[1.239.4] — 2026-09-29
v1.239.3 のライブ回帰テストを受けたパッチ。
修正
- 韓国語と繁体字中国語の評価でスコアサマリーの欠落が報告されていました。 これらのレポートは 1 万〜1 万 1 千字に達し、サマリーは最後に来るため、出力上限 8192 トークンを超えていました。評価 (と自動パイプライン) は 16384 トークンまで許可するようになり、それでもプロバイダーが回答を切った場合は、欠けたブロックを並べる代わりに最初の警告でそう伝えます。
- ライブチェックが短いドイツ語の回答をドイツ語ではないと判定していました (ドイツ語のストップワード 3 語、英語 0 語)。箇条書きの回答ではストップワードが少ないことがあり、英語が 1 語もなければ 3 語で十分とするようにしました。
- テスト 3778 → 3782。
備考
- ディープリサーチとモードのルートは 8192 トークンの上限のままです。ライブ実行でその上限に達する回答はありません。
[1.239.3] — 2026-09-29
v1.239.2 のライブ回帰テストを受けたパッチ。
修正
- v1.239.2 で日本語とヒンディー語が直った後も、アラビア語の評価は A–G 検査に通りませんでした。 マスクした見出しの骨組み (ログにレポート本文は出ません) で原因が分かりました。アラビア語のレポートは、プロンプトの指示にかかわらず、ブロック文字をアブジャド順のアラビア文字で書きます。検査は、見出しの先頭付近に単独で置かれた أ ب ج د هـ و ز を A–G として受け入れるようになりました (キリル文字の似た文字をすでに受け入れているのと同じです)。アラビア語の単語の中の同じ文字は数えません。
- ライブチェックは A–G 検査が失敗したときにこのマスク済みの骨組みを出力し、次の事例をログから診断できるようにします。
- テスト 3776 → 3778。
備考
- v1.239.2 の注記では検査を緩めないとしていましたが、アラビア語については緩めました。3 回のライブ実行で、プロンプトだけではラテン文字を保てないことが分かったためです。
[1.239.2] — 2026-09-29
v1.239.1 のライブ回帰テストを受けたパッチ。
修正
- アラビア語の評価がブロック文字を翻訳し、日本語の評価がスコアサマリーを落としていました。 v1.239.1 ではプロンプトの最終行で言語だけを繰り返していました。その行で、各見出しのラテン文字 A–G と
---SCORE_SUMMARY---ブロック (マーカーとキーは英語) を翻訳しないこと、そして言語固有の文字で書くことも指示するようになりました。 - テスト 3775 → 3776。
備考
- レポート検査は翻訳された文字やマーカーを受け入れるようには緩めていません。形式の安定はプロンプト側で保ちます。
[1.239.1] — 2026-09-29
v1.239.0 のライブ回帰テストを受けたパッチ。
修正
- 日本語とウクライナ語の評価がほぼ英語で返っていました。 言語の指示がプロンプトの先頭にあり、その後に英語のプロジェクトファイルと求人票が数十 KB 続いていました。プロンプトの最終行で言語を改めて指定するようになりました。
- サーバーが別のスキャンを実行中のとき、ライブチェックがスキャン失敗と報告していました (デプロイ直後に再試行された毎時スキャン)。サーバーが 2 つ目のスキャンを断るのは正しい動作です。チェックは最大 30 分待って再試行するようになりました。
- テスト 3774 → 3775。
備考
- サーバーの同時スキャン 1 件の制限は緩めていません。2 つ目のスキャンは引き続き
SCAN_BUSYで断られます。変わったのはチェックだけです。
career-ops-ui v1.267.1 · page 2/10 · mirror of the project changelog for cvstart.org