変更履歴
GitHubすべての注目すべき変更をリリースごとに記録しています。同じファイルがリポジトリに収録されており、19言語すべてに翻訳されています。
[1.170.0] — 2026-08-13
追加 (LOW) — 長い AI 生成に正直な ETA ヒント(P4-ETA)。 重い生成(キャリアプラン ~40 秒、オリエンテーション / マーケット / ネットワーキング ~30 秒、ツーページャー ~20 秒)が所要時間の目安なく「生成中…」だけを表示していました。
追加
- 各長時間生成ボタンの隣に
⏱ ~N秒ヒントを表示(#/autoの ETA と同様)。共有.eta-hintスタイル + 汎用キー 2 つ(common.eta~{n}s、common.etaTitle)。
備考
- クライアントのみ。ルート/CSP/SSRF/書き込み変更なし。i18n キー +2 ×17(スナップショット 1219 → 1221)。
tests/generation-eta-hint.test.mjs(+2)。スイート: 2434 (+2)。
[1.169.0] — 2026-08-13
追加 (LOW) — インライン PDF プレビュー(D-5)。 GET /api/output/pdfs/:name が Content-Disposition: attachment を強制していたため、#/cv の「開く」リンクでも表示ではなくダウンロードされていました。
追加
?inline=1は同じ検証済みファイルをContent-Disposition: inlineで返し、新しいタブで 👁 プレビュー 表示します。デフォルト(パラメータなし)はダウンロードのまま。新規ルートなし、同じ名前ガード適用。#/cvの PDF 一覧の最初のボタンが 👁 プレビュー(ダウンロードの隣)に。cv.openPdfを「開く」→「プレビュー」×17。
備考
- CSP/SSRF の変更なし — 同じ
sanitizePathName。既存 i18n キー 1 件を ×17 で書き換え(スナップショット 1219)。tests/output-pdfs.test.mjs(+3)。スイート: 2432 (+3)。
[1.168.0] — 2026-08-13
修正 (LOW, a11y) — チェックボックス行が WCAG 2.5.8 の 24×24 最小ターゲットサイズを満たすように(D-2)。 #/scan・#/config・#/evaluate・#/cv-studio のチェックボックス/ラジオのラベルが ~22 px の帯でした。
修正
- 限定的なルール
label:has(> input[type="checkbox"/"radio"]) { min-height: 24px }が ≥24 px の帯を保証。min-heightのみ — ラベルは既に flex なのでずれなし。.apply-checklist(32 px)は既に準拠。
備考
- CSS のみ。動作/JS/i18n/ルート/CSP/SSRF/書き込み変更なし。
tests/checkbox-target-size.test.mjs(+1)。スイート: 2429 (+1)。
[1.167.0] — 2026-08-13
修正 (LOW、デザインシステム) — 隆起サーフェスがヘアラインと区別されるように(D-3)。 --panel-2 / --surface-elev1 がヘアライン --line / --border と同じ --slate に解決され、区別がありませんでした。
修正
- 専用のテーマ対応トークン
--elev(ライト#eef1f6/ ダーク#1e232e、両テーマで--slateと区別)が隆起サーフェスを担い、ヘアラインは--slateのまま。残る指摘(D-2、D-4、D-5、P4-ETA)はdocs/UX-ROADMAP.mdにバックログとして記載。
備考
- CSS トークンのみ。動作/JS/i18n/ルート/CSP/SSRF/書き込み変更なし。
tests/elevation-token.test.mjs(+2)。スイート: 2428 (+2)。
[1.166.0] — 2026-08-13
修正 (LOW) — ルーブリックの用語が正典ドキュメントと一致するように。 career-ops.org/docs は「5 つの評価次元に加えて総合的なグローバルスコア」と述べていますが、Web UI・cvstart.org・wiki はいずれも「6 次元ルーブリック」と表記していました(5 + 1 = 6 だが用語が不一致)。
修正
- ドキュメントの表現 — 「5 つの評価次元 + 総合スコア」 — を README ×17、cvstart.org サイト ×17、ヘルプガイド ×17、
docs/career-ops-canonical.md、wiki(Home ×17 + Features)に一貫適用。
備考
- ドキュメント/マーケティング文言のみ。コード/i18n キー/ルート/CSP/SSRF/書き込み変更なし。
tests/rubric-terminology.test.mjs(+2)。スイート: 2426 (+2)。
[1.165.0] — 2026-08-13
修正 (LOW) — 「Two-pager」の用語が各ロケール内で一貫するように。 アラビア語ではサイドバーがラテン文字の「Two-pager」を表示する一方、<h1> は完全に翻訳されていました — RTL ナビで唯一のラテン文字列でした。
修正
- 決定を適用: ロケールごとに
nav.twoPagerとtwoPager.titleが用語を一致させます(両方ラテンか両方翻訳)。アラビア語だけが割れていたため、ナビラベルを翻訳(「الصفحتان」)。新しいカナリアが再び割れると失敗します。
備考
- 文言のみ。ルート/CSP/SSRF/書き込み変更なし。i18n 値 1 件(ar)変更; 新規キーなし(スナップショット 1219)。
tests/two-pager-term-consistency.test.mjs(+2)。スイート: 2424 (+2)。
[1.164.0] — 2026-08-13
修正 (LOW) — トップバーの検索プレースホルダーがどのロケールでも溢れなくなりました。 「Find a company, role or URL…」は検索バーが縮むと切れ、「…or URL」の部分が見えませんでした。
修正
top.search(×17)を短い 「検索または URL を貼付」(全ロケールで 24 文字以下)にし、狭いバーでも収まり URL の案内を維持。index.htmlのフォールバックも一致し、aria-labelは完全な説明を保持。
備考
- 文言のみ。ルート/CSP/SSRF/書き込み変更なし。既存 i18n キー 1 件を ×17 で書き換え(新規なし; スナップショット 1219)。
tests/search-placeholder-fit.test.mjs(+2)。スイート: 2422 (+2)。
[1.163.0] — 2026-08-13
修正 (LOW) — アプリ内「ドキュメントに質問」がレポートの PDF 書き出しをカバーするように。 #/reports/:slug に 📄 Generate PDF があるのに、ガイドが扱っていないと答えていました。
修正
- 17 のヘルプバンドルすべての §10 Reports に 「レポートを PDF に書き出す」 H3 を追加(ボタンの場所、ファイルは
output/*.pdf、Playwright 必須、送信前に確認)。アシスタントの検索が Reports セクションを提示するように。
備考
- ドキュメント/ヘルプのみ。コード/ルート/CSP/SSRF/書き込みの変更なし。ヘルプゲート 112 → 113 H3(31 H2 は不変)。
tests/help-reports-pdf-section.test.mjs(+2)。スイート: 2420 (+2)。
[1.162.0] — 2026-08-13
修正 (MEDIUM) — ヘルプ “?” が ≥24×24 のポインターターゲットに (WCAG 2.5.8)。 .help-hint は各見出しで padding:0 の 18×18 px と最小基準未満でした。
修正
.help-hintのボックスが 24×24(測定対象)になり、見える円は 18px のまま — 中央の::beforeで描画され、グリフと<h1>のベースラインは不変。hover/アクティブ/フォーカス状態は円に追従、余白 6→3px で間隔維持。
備考
- CSS のみ。JS/i18n/ルート/CSP/SSRF/書き込みの変更なし。
tests/help-hint-target-size.test.mjs(+2)。スイート: 2418 (+2)。
[1.161.0] — 2026-08-13
修正 (MEDIUM) — #/reports が空白ではなく「スコア未検出」チップを表示します。 v1.159.0 のロケール対応パーサー後もスコアを解析できないレポートは空欄になり、失敗と区別できませんでした。
修正
- スコアセルが分岐: スコアあり → トーンピル; スコアなし →
.score-mutedチップ(「スコア未検出」×17)+「レポートを開いて…」ツールチップ。カードはキーボード操作可能なrole="link"のままで、日付も表示されます。 - 既存の中立トークンを再利用; 新色なし。
備考
- クライアントのみ。ルート/CSP/SSRF/書き込み変更なし。i18n キー +2 ×17(スナップショット 1217 → 1219)。スイート: 2416 (+3)。
[1.160.0] — 2026-08-13
修正 (HIGH) — プロバイダーの説明文が 7 プロバイダーの約束と矛盾しなくなりました。 #/config はライブ評価が「Anthropic または Gemini のキーを使う」、OpenAI キーは「Web UI では使われない」と記載し、ダッシュボードは「Anthropic-first scoring」と表示していました — 7 プロバイダーカスケード(v1.157.0)以降は誤り。
修正
config.providerModelNote(×17): ⚡ ライブ評価は 7 つのプロバイダーキー(Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub Models · Hermes)のいずれかでヘッドレス実行、と明記。誤った OpenAI 文を削除。dash.quick.evaluateSub(×17): プロバイダー中立(「0〜5 の適合スコア」)。Keys: N / 5→N / 7。
備考
- 文言のみ。ルート/CSP/SSRF/書き込みの変更なし。新規 i18n キーなし(スナップショット 1217)。スイート: 2413 (+3)。
[1.159.0] — 2026-08-13
修正 (HIGH) — レポートのメタデータが言語依存でなくなりました。 英語以外のロケールで生成されたレポートは #/reports でメタデータ帯が空(スコア/日付/正当性なし)になっていました。parseReportHeader が英語の太字ラベルしか認識しなかったためです。
修正
parseReportHeaderが言語不変の## Machine SummaryYAML ブロック(score:/legitimacy:/date:—auto-pipelineが既に読むソース)を解析します。優先順位:英語ラベル → Machine Summary → ロケールラベル(REPORT_LABELS、17 ロケール)。英語レポートはバイト単位で同一。- 数値解析の許容(
1.5/5、1,5/5、1.5 из 5、4.5 out of 5)。本文に日付がなければファイル mtime にフォールバック。
備考
- 読み取り/解析のみ。ルート・CSP・SSRF・親書き込みの変更なし。新規 i18n キーなし。スイート: 2410 (+8)。
[1.158.0] — 2026-08-12
修正 — 表示上の軽微なバグ2件(タブタイトルに漏れる «?» と、ランディングの誤ったプロバイダー数)。 表示のみで、動作・セキュリティ・データフローの変更なし。
修正
- HelpHint の «?» が
document.titleに漏れなくなりました。ルーターが未加工のh1.textContentからタブタイトルを生成し「Vacancy search?」と表示していました。router.js::focusNewViewは見出しを複製し.help-hintを除去してからテキストを読みます。画面上の «?» はそのままです。 - cvstart.org が «7» ではなく «17 AI providers» と表示していました。
Features.astroのsub()がカード別置換の前にすべての{n}をロケール数(17)へ書き換えていました。現在{n}はカード別に解決されます(プロバイダー → 7、言語 → 17)。
備考
- サーバー・ルート・CSP・SSRF・i18n キーの変更なし。スイート: 2402 テスト(+1)。
[1.157.0] — 2026-08-12
修正 — ライブ評価が Anthropic/Gemini だけでなく、設定済みの任意のプロバイダーで実行されるように。 OPENROUTER_API_KEY のみ設定したユーザーが誤って手動モードに強制されていました。
修正
- 根本原因: キー未設定の
LLM_PROVIDERピン(例:initのLLM_PROVIDER=claude)が行き止まりに。現在は設定済みプロバイダーの中で auto 順にフォールバックします(selectActiveProvider+ 2 つのディスパッチ)。 - クライアントのゲーティング(
#/deep+ mode-page ビュー)が古い Anthropic/Gemini プローブではなくwindow.ProviderStatus(/api/status/providers、7 種)を使用。文言を刷新(deep/eval × 17)+ ダッシュボードの「ライブ評価」バッジ +config.llmProviderHint。
備考
- セキュリティ変更なし。スイート:2401 件のテスト(+5)。
[1.156.0] — 2026-08-12
リファクタ — scan.js をサイズ上限内に分割(P-16)+ CodeQL 修正。 scan.js は 906 行でした。挙動を保つ 2 ファクトリを抽出し 648 行 に。P-15/P-16 のビュー分割ペアを完了。
変更
- 新規
scan/runner.js(スキャン実行エンジン)とscan/filters.js(フィルタ状態機械)をctx/refsバッグで抽出。scan.jsが両者を結線。
修正
- CodeQL
js/useless-assignment-to-local(#428)config/tab-controller.js:let n = i;→let n;。
備考
- 純粋なリファクタで挙動変更なし。ソースを読む 4 テストを付け替え。大きい 2 ビューとも 800 未満に(P-15/P-16 完了)。スイート:2396 件のテスト。
[1.155.0] — 2026-08-12
リファクタ — config.js をサイズ上限内に分割(P-15)。 config.js は 1030 行(800 行上限超過)でした。挙動を保つ 2 モジュールを抽出し 783 行 に。
変更
- 新規
config/field-specs.js(フィールドデータ + モデル一覧)とconfig/tab-controller.js(タブバーのファクトリ)を抽出。config.jsはそれらを参照し、描画ロジックは不変。
備考
- 純粋なリファクタで挙動変更なし。ソースを読む 6 テストを付け替え。
scan.js(906)は現状維持(既に一部分割済み。コアの結合が強く、機械的な分割はかえって悪化)。スイート:2396 件のテスト。
[1.154.0] — 2026-08-12
新ガイド — 「スタック全体をクラウドで動かす」。 career-ops 自体にはクラウド/サーバーの手引きがないため追加:親の career-ops パイプライン、この career-ops-ui ビューアー、AI エンジン(Claude Code 経由の Claude サブスクリプション、ローカル Hermes、または API キー)を常時稼働の小型サーバーに載せる手順。17 言語の ヘルプ §31、README セクション、Wiki ページとして提供。
追加
- ヘルプ §31「スタック全体をクラウドで動かす」(× 17)—— 3 つの構成要素、プロビジョニング + インストール、エンジン選択、安全な公開(HTTPS リバースプロキシ + 認証 + CSP/SSRF/XSS/秘密を残さない不変条件)。ヘルプは 31 H2 / 112 H3 に拡大。
- README — 「スタック全体をクラウドで動かす」節(× 17)+ Wiki の Cloud-Deployment ページ。
備考
- ドキュメントのみ — ルート・サーバー・クライアント変更なし、新規 i18n キーなし。ヘルプの 4 テストは 31 H2 / 112 H3 契約へ。スイート:2396 件のテスト(変更なし)。
[1.153.0] — 2026-08-12
Jobvite スキャナーを公開 XML フィードへ移行(親同期)。 親が Jobvite の JSON API を廃止(現在は 0 件)し、web-ui の source も同じ死んだエンドポイントを使っていたため、追跡中の Jobvite 企業が静かに空スキャンになっていました。親の修正(#2623)を移植:companyEId をキーにした公開テナント別 XML フィードを読みます。
修正
- source は廃止された JSON API を叩いて 0 件を返していました。現在は
https://app.jobvite.com/CompanyJobs/Xml.aspx?c={companyEId}を叩き、XML<result><job>…を解析します(CDATA + エンティティ、apply-urlよりdetail-urlを優先)。
変更
companyEId解決:(1) ポータルのcompany_eid:、(2) 明示api:のc=、(3) ボードページのディスカバリ。fetchText(http-json.mjs)が non-ok エラーに.location/.retryAfterを付与(読み取り専用・後方互換)。
備考
- セキュリティ — 2 ホスト(
jobs.jobvite.com、app.jobvite.com)をassertJobviteUrlで毎回ピン留め:https のみ、厳格な許可リスト、リダイレクト非追従。companyEIdは?c=の値のみ。source 数は不変。 - スイート:2396 件のテスト(+4)。
[1.152.0] — 2026-08-12
Hermes プロバイダー — 配線を完了 + ドキュメント最新化。 v1.151.0 の Hermes 統合のコードレビューで実際の欠陥 2 件と完成度項目 4 件を発見し、いずれも本リリースで修正。アプリ全体の LLM プロバイダー一覧を、全ドキュメント面と 17 言語で完全な 7 つに揃えました。
修正
#/configで Hermes を強制できなかった —LLM_PROVIDERドロップダウンが 6 プロバイダーしか並べず、HERMES_API_KEYを設定しても UI から Hermes を強制できませんでした。hermesを 8 番目の選択肢に追加し、新しいパリティテストがドロップダウンのLLM_PROVIDERSからのずれを防ぎます。- 短いセルフホスト鍵が黙って拒否されていた —
isUsableKeyの 20 文字下限はクラウド鍵向けで、hasHermesKeyは緩和した 8 文字下限を使います(Hermes ドキュメントの例は 19 文字)。
変更
- プロバイダー一覧を README(× 17)、アプリ内ヘルプ(× 17)、
config.llmProviderHint辞書(× 17)、docs/sddで完全な 7 つに正規化。hermesChatUrlはパスなしホストを補完し、手動フォールバック文言が Hermes を明記します。
備考
- セキュリティは不変 — 新規ルートや SSRF/CSP の変更なし。health/doctor に
HERMES_API_KEY行を追加。 - スイート:2392 件のテスト(+2)。
[1.151.0] — 2026-08-12
Hermes が接続済みの LLM プロバイダーに(Phase 5) — Phase 5 のスコーピングで、Nous Research の Hermes が OpenAI 互換の API Server(hermes gateway → POST /v1/chat/completions)を備えることを確認。career-ops-ui は OpenAI/Qwen と同様にローカルの Hermes 経由でライブ評価を実行します。アプリ設定 で HERMES_API_KEY を設定すると auto 順に加わります(最後)。ロードマップ最後の未解決項目 — Phase 5, Shape A — を完了。
追加
- Hermes LLM プロバイダー(Shape A) — 共有
runOpenAICompatibleクライアント上のrunHermes(server/lib/openai.mjs)、両方 のカスケード(llm-dispatch.mjs+routes/llm.mjs)にゲート、auto 順の末尾 +LLM_PROVIDER=hermesピン、/api/status/providers、llm-pricing.mjs。ユーザー設定可能なローカル base URL(既定http://127.0.0.1:8642/v1)へ Bearer 認証で到達 — ユーザー提供の求人 URL ではなく設定済みプロバイダーのエンドポイント(OpenRouter/Qwen と同様)なので SSRF ガードは通りません。 #/configフィールド —HERMES_API_KEY(秘密) +HERMES_BASE_URL+HERMES_MODEL(既定hermes-agent)、6 個の新しい i18n キー × 17 言語(スナップショット 1208 → 1214)。
変更
- スコーピングが解決:
docs/integrations/HERMES.md、アプリ内ヘルプ §30(× 17)、README ティーザー(× 14)、hermes-bridgeスキル、ロードマップが「計画中 / 未接続」から 接続済み(Shape A) に移行。Shape B(専用のエージェントランタイム relay)は不要でした。
補足
- セキュリティ: プロバイダーの fetch は設定済みエンドポイントで、他の OpenAI 互換プロバイダーと同カテゴリ — 新たな SSRF 面なし、CSP/サニタイザー変更なし。
HERMES_API_KEYはSECRET_KEY(決して出力しません)。 - テスト(CI 隔離、トランスポートスタブ):
tests/hermes-provider.test.mjs(+5);v1.146.0 の「Hermes 分岐なし」カナリアを、接続済みであると断言するよう 反転;プロバイダー面テストを 7 プロバイダー順に更新。 - スイート:2390 件のテスト(+5)。
[1.150.0] — 2026-08-12
一貫した空状態 (Phase 4の仕上げ) — 「まだ何もありません」パネルはすべて、いくつかのビューが魔法の 40px でインライン再宣言する代わりに、単一の共有 .empty スタイルで描画されるようになりました。小さな視覚的一貫性の修正で、#/activity・#/cv-studio・#/stats・#/usage の空状態が他のすべてと一致します(トークン化された48pxパディング + 破線ボーダー)。
変更
#/activity・#/cv-studio・#/stats・#/usageが空パネルのインラインstyle: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' }を削除 — 3つのプロパティはすべて共有の.emptyクラスが既に提供します(--space-7= 48px、中央揃え、淡色、破線ボーダー)。これでこの4つは他の約25個の.emptyパネルと同一に描画されます。- ビュー固有の正当な上書き(
#/dashboardwidth:100%、#/pipelineborder:none)はそのまま — 純粋に冗長な再宣言のみ削除。
補足
- クライアントのCSS利用の整理のみ — ルート/サーバー/i18nキー/CSSルールの変更なし(
.emptyクラス自体は不変);辞書スナップショット1208。ブラウザ検証(#/usageの空パネルが48pxパディング + 破線ボーダーで計算、コンソールエラー0)。 - 新しいカナリア
tests/empty-state-consistency.test.mjsが.emptyを唯一の真実の源として維持します。Phase 5(Hermesプロバイダー)は引き続きブロック中。 - スイート:2385件のテスト(+2:
tests/empty-state-consistency.test.mjs)。
[1.149.0] — 2026-08-12
ポータルを設定へ移動 (Phase 4) — #/portals は Sourcing の下ではなく、アプリ設定 の隣の Setup ナビゲーショングループに配置されました。v1.144.0以降これはソーシングの操作ではなく設定画面(追跡企業の有効/無効 + ATSのヘルスチェック)なので、ここが本来の場所です。ナビゲーションのみの変更で、ページとルートは不変です。
変更
#/portalsナビ項目 → Setup グループ(public/index.html)、アプリ設定 の直後に配置。Sourcing グループから削除(グループには Scan / Pipeline / Auto-pipeline / 資金調達企業 が残ります)。#/portalsルート、ビュー、nav.portalsラベルは不変 — サイドバー位置のみ移動。
補足
- ナビのマークアップのみ — ルート/ビュー/i18nキー/サーバー変更なし。ブラウザ検証(コンソールエラー0);
tests/portals-nav-placement.test.mjsで保護。 - スイート:2383件のテスト(+2:
tests/portals-nav-placement.test.mjs)。
[1.148.0] — 2026-08-12
見やすくなったスキャンフィルター (Phase 4) — フィルターパネルが整然としたグリッドに — #/scan のフィルターパネルが、幅バラバラの箱による不揃いなflex-wrapからレスポンシブグリッドになり、適用 / リセットのアクションは右寄せの独立した行に配置されました。フィルターも挙動も同じ — 読みやすさだけ向上。デザインの手直し(parent-syncなし)。
変更
#/scanフィルターパネル → レスポンシブグリッド —.scan-filtersはrepeat(auto-fill, minmax(180px, 1fr))の列と均一な間隔を持つdisplay: gridになり、ラベル付きの11個のフィルターがどの幅でも不揃いに折り返さず整った列に揃います。- 適用 / リセットのアクションはグリッド全幅の独立した行を占め、細い罫線で区切られ右寄せに。
scan.jsの旧・隠しラベルのハック + 内部flexラッパーを削除。
補足
- CSS + わずかなDOM整理のみ — フィルターのid(
#scan-filter-*、#scan-apply)とSR.render()の配線は不変なので、Playwrightのフローは無傷。新しいi18nキーなし。 - ブラウザ検証済み(コンソールエラー0);
tests/scan-filters-grid.test.mjsで保護。 - スイート:2381件のテスト(+3:
tests/scan-filters-grid.test.mjs)。
[1.147.0] — 2026-08-12
Hermes & Telegram — アプリ内ヘルプセクション + cvstart.org 面(Phase 5b・第2部) — Hermesドキュメント作業の2つ目にして最後の部分です:手順が17言語すべてでアプリ自身のヘルプガイド内に収まり、アプリ内ドキュメントアシスタントがそれを基にHermesの質問に答えます。引き続きドキュメントのみ — HermesのLLMプロバイダー経路は 計画中 / 未接続 のままです(Phase 5)。
追加
- アプリ内ヘルプ §30「Hermes & Telegram」× 17言語 — 新しいガイドセクション(Hermesとは + 2つの統合形態;クラウドサーバーでの実行;Hermes経由のTelegram + 「公開してはならないもの」ルール)。
#/helpからアクセス可能。docs-assistant/DocsFabのグラウンディングが自動的に取り込みます(どちらもdocs/help/<lang>.mdを読むため)。 - cvstart.org — Hermesガイドへのリンク。GitHubのドキュメントへ誘導。
変更
- ヘルプバンドルのゲートを 29 → 30 H2 / 105 → 108 H3 に引き上げ(
canonical-docs-coverage、help-ui、help-ru-config-section);§30がH3を3つ追加。
補足
- まだHermesを呼び出す処理はありません。 新しいカナリア
tests/help-hermes-section.test.mjsが、すべての言語に§30が言語非依存のアンカー(docs/integrations/HERMES.md、hermes-bridge、#/help、127.0.0.1、Telegram)とともに存在することを検証します。プロバイダーはPhase 5のAPI契約スパイクによって引き続きブロックされています。 - これでPhase 5bのドキュメント + スキル成果物が完了します;プロバイダー統合(Phase 5)は別個のブロック中の項目として残ります。
- スイート:2378件のテスト(+2:
tests/help-hermes-section.test.mjs)。
[1.146.0] — 2026-08-12
Hermesエージェント + Telegram — 統合ガイドとスキル(Phase 5b・第1部) — career-ops-uiをクラウドサーバーで動かし、そのイベント(完了したスキャン、新しいレポート、緊急のフォローアップ)をNous ResearchのHermesエージェント経由でTelegramに橋渡しできます。このリリースでは設計+デプロイのドキュメントとhermes-bridgeスキルを提供します。HermesのLLMプロバイダー経路は依然として計画中/未接続のままです(Phase 5のAPI契約スパイクに阻まれています)。意図的にコードより先にドキュメントを整えています。
追加
docs/integrations/HERMES.md— 詳細解説:2つの統合形態(OpenAI互換エンドポイント vs. エージェントランタイム)、クラウドサーバーへのデプロイ(reverse proxy+HTTPS+systemd、ヘッドレス機での読み取り専用のparent契約)、Hermes経由のTelegram連携、そして脅威モデルの「絶対に公開してはいけないもの」リスト(CV/給与/レポート本文/キーをチャンネルに出さない)。- READMEの
## Hermes agent + Telegramティーザー — 英語版READMEに短い案内とリンクを追加し、完全に翻訳された各言語のREADMEにも反映。 - ガイドを実行可能にする**
hermes-bridgeスキル**(.claude/skills/hermes-bridge/) — 前提条件+スコープゲートの確認(Node ≥ 18、キーの有無、SSRF安全な経路でのエンドポイント到達性)、秘密情報をディスク/ログに書き込まない、Hermesのエンドポイントを勝手に作り出したりプロバイダーが接続済みだと主張したりしない。 docs/architecture/OVERVIEW.mdのIntegrationsセクションがガイドにリンク。
補足
- まだHermesを呼び出す処理はありません。 カナリアテスト(
tests/hermes-docs.test.mjs)が「計画中/未接続」という正直な表示と、llm-dispatch.mjsにHermes/Nousの分岐が存在しないことを検証しています — つまり将来プロバイダーを接続する際は、同じ変更でドキュメント+ロードマップも更新する必要があります。 - v1.147.0へ延期(Phase 5b・第2部):アプリ内ヘルプの「Hermes & Telegram」H2 × 17言語、およびcvstart.orgのマーケティング面。
- スイート:2376件のテスト(+4:
tests/hermes-docs.test.mjs)。
[1.145.0] — 2026-08-12
役立つ統計(続き):再構築できるグラフ — #/stats の「目標職種トレンド」タブに グラフを作成 ウィジェットが追加:指標 × ディメンションを選ぶとライブで描き直します。ユーザーからのUX要望(parent-syncなし)。
追加
- 指標 × ディメンションの再構築グラフ — 指標(求人数 / 給与の中央値 / 平均給与)と ディメンション(国別 / 職種別)を選ぶと棒グラフが即座に描き直されます。給与系の指標は通貨+年/月切替に従い、求人数は単純なカウントです。
- 8個の新しいi18nキー × 17ロケール;スナップショット 1200 → 1208。
補足
- ブラウザで確認(コンソールエラー0)。スイート:2372 テスト(+2)。
[1.144.0] — 2026-08-12
設定とフィルター(フェーズ4・第1部):追跡ポータルの有効化/無効化 — #/portals から監視中の企業をオン/オフでき、スキャナーがそれを反映します。ユーザーからのUX要望(parent-syncなし)。
追加
#/portalsの企業ごとの有効化/無効化ボタン — ワンクリックでポータルをオフにでき(ENスキャナーは既にenabled: falseの企業をスキップするため、無効なポータルは以降のすべてのスキャンから外れます)、また再度オンにできます。楽観的トースト付き。POST /api/portals/toggle—portals.ymlの企業のenabledフラグを外科的に(パース検証付きで)切り替える明示的なユーザー書き込み(コメント・順序・その他のフィールドは保持)。5個の新しいi18nキー × 17ロケール;スナップショット 1195 → 1200。
補足
- スキャナーの変更はゼロ —
en-scanner.mjsは既にenabled !== falseでフィルタリング済み。スイート:2370 テスト(+3)。
[1.143.0] — 2026-08-12
わかりやすく(続き):主要ワークフロー画面の ? ヒント — ヘルプ ? が9つの主要な操作ページを全言語でカバーするようになりました。ユーザー報告のUX改善(parent-syncなし)。
追加
- さらに9つの画面タイトルに
?ヘルプヒント —#/scan,#/evaluate,#/cv-studio,#/tracker,#/config,#/deep,#/batch,#/auto,#/applyにインラインの?(HelpHint.title)が付き、翻訳済みの「何を/どう使う/何が得られる」ポップオーバーを開きます — v1.139.0 の CSP 安全なコンポーネントと同じです。 - 9個の新しいi18nキー × 17ロケール(
help.hint.scan/…/apply);スナップショット 1186 → 1195。
補足
- ブラウザで確認(コンソールエラー0)。スイート:2365 テスト(+1)。
[1.142.0] — 2026-08-12
修正:「Unknown」キャリア・アーキタイプの解消 — #/orientation が、時折「Unknown」と答えてそれに「注力せよ」と勧める代わりに、常に名前付きの8つのキャリアベクトルからランク付けするようになりました。ユーザー報告の修正(parent-syncなし)。
修正
#/orientation— AIプロンプトが集合外のアーキタイプを禁止。 モデルは正確に8つの名前付きベクトルから上位3つを選ぶ必要があり、「Unknown」「N/A」「データ不足」と答えたり新しいラベルを作ったりできません。履歴書が薄い場合でも、最も近い3つを低い確信度で挙げ、欠けている根拠を示します。
補足
- サーバープロンプトのみの変更(
buildOrientationPrompt)。i18n/スキーマ変更なし。スイート:2364 テスト(+1)。
[1.141.0] — 2026-08-12
役立つ統計(続き):資金調達企業の情報強化 — #/funded がより視覚的になりました:企業ロゴ、調達額チャート、ラウンド/金額/発見スコア/推奨アクションを含むカード。ユーザー報告のUX改善(parent-syncなし)。
変更
#/funded— 平坦な表 → カードグリッド。 直近に資金調達した各企業が、ロゴ(企業名から導出、失敗時は文字アバター)、ラウンド+金額チップ、親プロジェクトの発見スコアと推奨アクション、そして資金調達ニュースのリンク・日付を持つカードになりました。- 調達額の可視化 — 開示額による上位企業の横棒グラフ。“$120M”/“€1.5B” のような自由記述の金額を新しい
parseAmountで大きさに変換します。3個の新しいi18nキー × 17ロケール。
補足
- 依然として
GET /api/company-funded上の読み取り専用です。説明と給与レンジは資金調達フィードにありません。スイート:2363 テスト(+2)。
[1.140.0] — 2026-08-12
役立つ統計:より豊かな給与数値 — #/stats の「マイパイプライン」給与内訳に、(中央値だけでなく)平均、年間 ⇄ 月間切替、国別の最小・平均・中央値・最大表を追加しました。Phase 3 の最初の一片。ユーザー報告のUX改善(parent-syncなし)。
追加
- 平均給与 —
RoleStats.salaryStatsがminUsd/medianUsd/maxUsdに加えてavgUsdを返すようになりました。中央値は外れ値に強く、平均は偏りを示すため、両者は分布として読めます。 - 給与セクションの年間 ⇄ 月間切替と、国別の最小・平均・中央値・最大の表(通貨・期間セレクター連動)。8個の新しいi18nキー × 17ロケール。
補足
- 数値は依然として給与を解析できる求人からのみ算出され、USDに正規化されます(参考値)。スイート:2361 テスト(+1)。
[1.139.0] — 2026-08-12
わかりやすく:? ヘルプヒント — クリックすると「何をするか / どう動くか / 何が得られるか」をあなたの言語で説明する、再利用可能でCSP安全な ? ボタン。ユーザー報告のUX改善(parent-syncなし)。
追加
?ヘルプヒントのポップオーバー(window.HelpHint)— 見出し横の丸い?をクリックすると、テーマ対応でRTLミラーされた軽量ポップオーバーが開き、UI.md()で翻訳済みの説明を表示します。アクセシブル(role="tooltip"、aria-expanded、Escape/外側クリックで閉じ、フォーカス復帰)かつCSP安全です。#/statsの5つのタブと 8つのAI/分析ビューのタイトル(career-plan、オリエンテーション、two-pager、ネットワーキング、模擬面接、メモリ、funded、週次ダイジェスト)に?を追加 — 14個の新しいi18nキー × 17ロケール。
補足
- すべてのビューには既に1行の説明がありました。
?はより深い説明をオンデマンドで加え、空の状態も自己説明的にします。スイート:2360 テスト(+4)。
[1.138.0] — 2026-08-12
インターフェース言語での生成 — すべての AI 生成が UI で選択した言語で返るようになりました。加えてレビュー由来のテスト強化。ユーザー報告の UX 改善(parent-sync なし)。
変更
- AI 生成が UI 言語に従うようになりました。 インターフェースをロシア語・スペイン語・日本語などに設定すると、生成テキストが常に英語ではなくその言語で返ります。出力言語ディレクティブがすべての生成エンドポイント — キャリアプラン、オリエンテーション、市場レポート、模擬面接、ネットワーキングプラン、「ドキュメントに質問」、メモリノート提案、two-pager 下書き — に伝わります。コードと識別子は英語のまま(例:two-pager の YAML キー)で、散文・見出し・箇条書きのみ翻訳されます。
修正
- CSS カラーロール・ガード(
tests/css-role-tokens.test.mjs)— v1.137.0 のダークモード別名トークンが役割を反転しないことを検証する静的カナリア:テキスト役トークン(--fg/--danger/--ok/…)はbackgroundに、サーフェス役トークン(--card/--panel/--line/…)はテキストのcolorに決して使われない(全 CSS と SPA のインラインスタイル)。 UI.md()XSS ローダーの自己プローブ —api.jsからmd()を読み込むテストが抽出直後にmd('<script>…')を検査し、エスケープが欠けていれば例外を投げるため、将来の切り出しミスがセキュリティスイートを緑にせず大きく失敗します。#/career-planのスクロールガード — 生成後のscrollIntoViewはプレビューがまだドキュメントに接続されている場合にのみ実行されます。
補足
docs/UX-ROADMAP.mdを更新:?ヘルプヒント+ページ説明+空状態の作業は v1.139.0 へ。Nous Research / Hermes プロバイダ(クラウドサーバー+Telegram デプロイガイドと Hermes スキルを含む)は Phase 5 / 5b として追跡。- スイート:2356 テスト(+5)。
[1.137.0] — 2026-08-11
可読性・レンダリングの修正 — ダークモードのコントラスト、チャートのラベル、キャリアプランに関する修正です。ユーザー報告に基づく UX 対応です(parent-sync ではありません)。
修正
- 多数の画面でダークモードの白地に白文字・黒地に黒文字が発生する問題 — 複数のビューが参照していた15個の CSS カスタムプロパティ(
--fg、--panel、--panel-2、--ok、--danger、--card、…)が一度も宣言されておらず、ハードコードされたライト/ブラック値にフォールバックしていました:ライトモードでは問題ありませんでしたが、ダークモードでは判読不能でした(#/pipelineの概要チップ、#/statsのアクティブタブ、#/configの “Active / Keys” と “✓ set”、#/two-pagerの各セクション、#/mock-interviewの質問バブル、エラーテキスト)。現在は実際のテーマ対応トークンにエイリアスされ、テーマに自動追従するようになりました — 自動監査ツールによる検証で全29ビューにわたり WCAG-AA コントラスト違反ゼロ、#/configのアクティブタブは判読しやすいティント配色に変更されました。リグレッションガード(tests/dark-theme-tokens.test.mjs)がエイリアスを維持します。 #/statsのチャートラベルが単語の途中で切れていた問題(「Senior Backend Engineer」→「…Enginee」)— 現在は省略記号で切り詰められ、完全なラベルはホバー時のツールチップで確認できます。#/career-planが生成されたプランを Markdown の生テキストのまま表示していた問題 — 現在は整形済みの読みやすいテキストとして自動的にレンダリングされるようになりました(編集可能な Markdown はテキストエリアに残り、Preview で切り替えられます)。
補足
#/career-plan、#/two-pager、#/stats、週次面接ダイジェストは壊れているわけではありません — プランを生成する / データが揃うまでは空の状態を表示します。次はページ上のガイダンスと?ヘルプヒントをより明確にする予定です(docs/UX-ROADMAP.md)。
[1.136.0] — 2026-08-11
親 career-ops v1.26.x パリティ(v1.26.0 以降のメインライン)— 1つの新しい認証不要スキャンソースに加え、web-ui のミラーに向けた品質・堅牢性の改善が一連続きます。レジストリは 79 ソース = 74 EN + 5 RU(ALL_ADAPTERS 74)になりました。
追加
eightfold(Eightfold AI、#2684)— 認証不要のhttps://<tenant>.eightfold.ai/api/apply/v2/jobsAPI を介したタレントアクイジションボードで、*.eightfold.aiにホスト固定されています(ブランド化されたcareers.<company>.comの CNAME は意図的に拒否されます)。安全上限付きのページネーション、停止ボードの例外化、URL 重複排除を備えます。ソース + アダプター + CI分離型のテストスイートを追加し、#/scanの Source フィルターとランディングページに表示されます。
修正
- Unicode 対応の重複排除・役職キー(#2569 / #2587 / #2667)— 新しい共通
normalizeTextKey(NFKC、任意のスクリプトの文字・記号・数字を保持)がこれまでの ASCII 限定キーを置き換えました:detect-repostsは全角/句読点の企業表記の差異(「Acme, Inc.」≡「Acme Inc」)をクラスタリングできるようになり、非ラテン文字の異なる企業を誤って統合することもなくなりました。role-matcherは全角の職種名を正規化し、非ラテン文字の役職トークンを消去せずに保持するようになりました。 fetchJsonWithRetryが拒否されたリダイレクトをリトライしなくなりました(#2657)—redirect:'error'ガードが 3xx に遭遇するのは決定的な事象であるため、これはリトライ不可として扱われ、リトライ予算を消費せずに即座に失敗するようになりました。title_filter.positiveの AND グループ(#2552)— positive エントリ内の空白区切りの+は、順序を問わずすべての語がタイトルに含まれることを要求するようになりました。oraclecloudが番号付きテナントのアペックスドメインを受け付けるようになりましたoraclecloud1.com … oraclecloud99.com(#2683)— 範囲が定められたファミリー(先頭ゼロなし、2桁以下)であり、ワイルドカードのアペックスではありません。workableが堅牢化されました(#2675)— Cloudflare フロントのホストに対するリトライ、ブラウザ風ヘッダー、リクエストの直列化を追加しました。personioは XML フィードが無効化されている場合、何も返さない代わりに HTML スクレイピングにフォールバックするようになりました。statesの FALLBACK エイリアスが親と再同期されました(#2615)。
補足
- 未移植(web-ui にミラーされていない、または CLI 専用のため):reply-matcher(#2672)、jd-similarity(#2661)、jd-skill-gap(#2686)、スキャンの環境変数パス(#2568)/
--flag=valueパース(#2589)、および cover-letter / CV テンプレート / doctor / ollama / generate-pdf の変更。Web 側のjs-yaml/nanoidの HIGH アドバイザリは、web-ui v1.135.0 で既に修正済みです。
[1.135.0] — 2026-08-11
親 career-ops v1.26.0 パリティ — 5つの新しい認証不要スキャンソースに加え、web-ui がすでに持つ4つのボードに対する正確性の修正です。レジストリは 78 ソース = 73 EN + 5 RU(ALL_ADAPTERS 73)になりました。
追加
- 5つの新しいスキャンソース(それぞれソース + アダプター + CI分離型のテストスイートを備え、
#/scanの Source フィルターと cvstart.org のランディングページに表示されます):join(JOIN)—join.com/companies/<slug>の Next.js__NEXT_DATA__から企業の JOIN ボードを取得します(ホスト固定、ページ数上限あり)。getro(Getro)— 公開のapi.getro.comPOST API を通じて VC の「タレントネットワーク」ポートフォリオボードを取得し、新着順にページネーションされます。各求人はファンドではなくポートフォリオ企業に帰属します。consider(Consider)— 同一オリジンの POST による getconsider.com の VC ポートフォリオボードです。設定駆動のホストは構造的な SSRF ガードで固定されています(公開 HTTPS ホストのみ)。joinup(JOINUP)— スイスのボード joinup.ch から SSR された最新ページを読み取ります。スクレイパーが壊れた場合はフェイルクローズします。remotli(Remotli)— remotli.ch、スイス企業のリモート職(CHF 建て給与)です。企業自身の ATS 応募 URL を出力するため、クロス掲載が重複排除されます。
修正
- a16z Speedrun が一時的な不具合でボード全体を中断しなくなりました — ページ取得は共通の
fetchJsonWithRetryを経由するようになり(一時的な 429/5xx/タイムアウトのみを対象に上限付きリトライを行い、恒久的な 4xx ではリトライしません)、ページ予算も50件ページに合わせて再調整されました。 - arbeitsagentur が v6 Jobsuche API(
/pc/v6/jobs)に移行しました — 旧 v4 エンドポイントは 404 を返すようになっています。レスポンス形状の項目名が変更され、リモートフィルタリングはサーバー側で絞り込まれるようになりました。 - thehub が v2 の
jobsandfeaturedAPI に移行しました。行に掲載日が含まれないため、経過日数フィルターの対象外となります。 - hackernews は、自由テキスト検索の代わりに
author_whoishiringアカウントタグで Algolia の検索を絞り込むことで、毎月の「Who is hiring?」スレッドを確実に見つけられるようになりました。
補足
- 未移植(web-ui はすでに安全、リレー側で吸収済み、または CLI 専用のため):Unicode 対応の役職重複排除 / 企業マッチングキー(web-ui の再掲グルーピングはすでに単純な小文字化で企業をキー化しているため、非ラテン文字の異なる企業が誤って統合されることはありません);followup の却下レイテンシーシグナル + company-funded の微修正(読み取り専用でリレーされ、フェイルソフトです);スキャンの環境変数上書き可能なパスと
--flag=valueパース(web-ui はスキャナーをインプロセスで実行します);User-Agent 統合のリファクタリング(web-ui はすでに一元化済みです);および CLI 専用の項目(信頼できないコンテンツの一覧、oferta/offer-prep、doctor、カバーレター/CV テンプレートの変更)。
[1.134.1] — 2026-08-05
検証の堅牢化 — プロジェクト全体の監査で見つかった修正です。
修正
successfactorsがスキャン中の失敗で収集済みの求人を破棄しなくなりました(v1.134.0 のデッドボード例外化の移植で生じた回帰)— ページネーションループにtry/catchがなく、2ページ目以降(1ページ目は成功済み)での失敗が例外を投げてしまい、すでに収集済みのものすべてが失われていました。さらに、その失敗が404(範囲外のstartrowによる)だった場合、en-scannerは稼働中のテナントを何日も停止扱いとして隔離してしまっていました。今後はphenom/radancyと同様の挙動になります。0ページ目での失敗は今も例外を投げます(ボード停止)が、それ以降のページでの失敗は部分結果を保持します。#/scanのフィルターチップがキーボードで操作できるようになりました(WCAG 2.1.1)— ファセットチップ(および「クリア」チップ)はクリックハンドラーを持つ span 要素でしたが、tabindexや role がなく、キーボードユーザーやスクリーンリーダーユーザーが到達・切り替えできませんでした。現在はrole="button"、tabindex="0"、aria-pressedを備え、Enter/Space キーでも操作できます。- 3つのハードコードされた英語文字列がローカライズされました—
#/scanの信頼バッジのツールチップ、#/scanの移転列ヘッダー、#/dashboardのスコア列ヘッダーは、キーとして存在しない裸のリテラルだったため i18n パリティゲートから見えず、英語以外のすべてのロケールで英語のまま残っていました。現在はscan.trustTip+scan.col.reloc(新規2キー)と、既存のtrack.col.scoreの再利用になり、ソース静的ガード(tests/scan-chip-a11y.test.mjs)で固定されています。 - +3 テスト → スイート 2187。
[1.134.0] — 2026-08-05
親 career-ops v1.25.0 パリティ。
追加
- 新しいスキャンソース: getManfred(
manfred)— 給与が公開されているスペイン/EU圏のテック職を横断的に集めるボード全体フィードで、www.getmanfred.com/api/v2/public/offersから取得します(認証不要、ホスト固定 + HTTPS 限定、単一リクエストで全カタログを取得)。ソース + アダプター + CI 分離型のテストスイート(tests/sources-manfred.test.mjs)を追加。レジストリは 73 ソース = 68 EN + 5 RU(ALL_ADAPTERS68)になりました。#/scanの Source フィルターと cvstart.org のランディングページに表示されます。
修正
- a16z Speedrun フィードが50件で静かに打ち切られていた問題(#2404)— このフィードは1ページあたり50件が上限ですが、ソース側は
PER_PAGE = 100を要求していたため、1ページ目でページネーションが停止していました。50に修正しました。 - 稼働していないボードが「稼働しているが空」として読み取られる問題を修正(#2379)—
cryptocurrencyjobs、phenom、radancy、successfactors:リクエストが一件も解決しなかったフェッチ失敗はこれまで空のリストとして飲み込まれていましたが、今後は例外を投げるようになり(#/portalsのヘルスチェックとスキャンが実際の失敗として記録します)、1件以上成功した後のスキャン途中の失敗は部分結果を保持します。 - workable が公開ウィジェットAPIを使うようになりました(#5ab8425)—
apply.workable.com/api/v1/widget/accounts/<slug>に切り替えたことで、大規模アカウントの求人一覧を1リクエストで全件取得できるようになり、大規模アカウントが打ち切られなくなりました。
補足
- 未移植(CLI専用、または web-ui にミラーされていないもの):
detect-repostsの #2389 タイトルバケット化によるパフォーマンス改善;Unicode 対応の会社キー修正(web-ui 独自のトラッカー重複排除はすでに非ラテン文字に対応済みのため不要);scan --since;cv-facts;CV テンプレート/PDF 監査パス;doctor;モードの信頼できないコンテンツディレクティブ。
[1.133.1] — 2026-08-02
修正
#/funded(資金調達企業)が結果を表示するようになりました — 二つのバグにより、親のcompany-funded.mjsが完全な一覧を返しているときでも、テーブルには常に「資金調達企業なし」と表示されていました。(1) ビューは結果をres.candidatesから読み取っていましたが、親はcompaniesの下にそれらを送出します(各項目は{ company, amount, round, funding: { sources: [{ source, url, observed_date }] } }という形です)。クライアントは正しいキーを読み取り、実際のエビデンス形状にマッピングするようになりました。(2) 結果テーブルはセルを可変長引数としてUI.el('tr', {}, …)に渡していましたが、UI.el(tag, attrs, children)はchildrenを単一ノードまたは配列として受け取るため、最初の列(Company)しか描画されていませんでした — セルは配列として渡されるようになりました。実機ブラウザで検証済みです:4つのフィード全体で11社が Company / Funding signal / Source / Date の各列とともに描画され、エビデンスリンクも機能し、コンソールエラーはゼロです。結果が空のときも、ソースごとの診断情報が表示されるようになったため、静かなニュースの日とブロックされたフィードとを見分けられるようになりました。tests/parity-routes-v1133.test.mjsにリグレッションガードを追加しました:偽の親スクリプトが実際のcompanies出力形状を送出するようになりました(元のフィクスチャは誤ったcandidates形状を反映しており、これこそがこのバグがグリーンのまま出荷された理由です)。加えて、funded.jsがres.companiesを読み取り(res.candidatesは決して読み取らない)、テーブル行を配列の children で構築していることを検証するソース静的カナリアも追加しました(+1 → 2144)。
[1.133.0] — 2026-08-01
追加
- 資金調達企業ディスカバリー(
#/funded、親パリティ #2117) — 親 career-ops のcompany-funded.mjsをGET /api/company-funded経由でリレーする新しい読み取り専用ビューです。公開されホスト固定された資金調達フィード(TechCrunch、PR Newswire、The Guardian、Hacker News)から発見された、最近資金調達を行った企業のレビューファーストな一覧を表示します。このリレーはスクリプトを--json --dry-runで実行し(JSON を標準出力へ、ファイル書き込みなし)、ユーザー入力を--sourcesへ決して引き渡さず、レートリミットを備え、ユーザートリガー式です(マウント時ではなく Discover ボタンによって起動)。新しいルートモジュールserver/lib/routes/funded.mjs+public/js/views/funded.jsが Sourcing 配下に追加されました。 - 週次面接ダイジェスト(
#/interview-digest、親パリティ #2129/#2130) — 親のゼロ LLMweekly-digest.mjsをGET /api/interview/weekly-digest経由でリレーする新しい読み取り専用ビューです。面接セッションのメモを機械的に集約し、今週どの企業・どのラウンドで面接を行ったか、繰り返し登場するコンピテンシー、ベストエフォートで抽出した未解決のギャップを示します。オプションの?from=&to=範囲は両方とも有効なYYYY-MM-DDの場合にのみ引き渡され、範囲が空でも有効なavailable:trueダイジェストになります。server/lib/routes/interview.mjs+public/js/views/interview-digest.jsに追加され、Analytics 配下に置かれます。 - 両リレーとも、親スクリプトが存在しない場合(CI、スタンドアロンインストール)には既存の fail-soft な
available:falseコントラクトに従います。新規 i18n キー 26 個 ×17 ロケール、CI 分離型スイートtests/parity-routes-v1133.test.mjs(+5 → 2143)。
補足
- 親 career-ops は v1.24.0 以降、Next.js の web/ アプリに Follow-up Tracker ページ(#1422)とバックエンド PDF レンダリング(#2182)を追加しましたが、これらは移植していません — web-ui にはすでに独自のフォローアップリレーと PDF ランナーがあり、基盤となる
followup-cadence.mjsの堅牢化はシェルアウトリレー経由で自動的に取り込まれます。set-status.mjs/tracker-utils.mjsの変更は CLI 内部のものであり、ミラーしません。
[1.132.0] — 2026-07-31
変更
#/scanの結果描画サブシステムをpublic/js/lib/scan-results.jsに抽出(ファイルサイズ規約の負債解消 —public/js/views/scan.jsは約1254 LOCまで肥大化していました)。renderResults、buildChipRow、行/ファセットビルダー群、オプションペインター群、FALLBACK_SOURCESレジストリのミラーからなるこのサブシステムは、ビュー側が渡すコンテキストオブジェクトをクロージャで保持するwindow.ScanResults.create(ctx)ファクトリへ移動しました。挙動の変更は一切ありません — 各関数はそのまま移動し、クロージャ変数をctx.*に付け替えただけです。scan.jsは現在約906 LOCです(800-LOC目標に向けた2回目の抽出パスを予定)。- 新しいブラウザ内リグレッションゲート —
tests/playwright-scan-filters.mjsが既定のdata/last-scan.jsonをシードし、#/scanの全フィルターを駆動して行数を厳密に検証するため、この抽出は実ブラウザの挙動に対して検証されています。 - README バナーをスリム化 — バージョンごとの長大な「最新リリース」ナラティブの壁を廃止し、1行の要約 + 完全な変更履歴(本ファイル)へのリンクに置き換えました。
[1.131.2] — 2026-07-31
変更
app.cssを3つの順序付きスタイルシートに分割(ファイルサイズ規約の負債解消 — 単一ファイルが約1990 LOCまで肥大化しており、800-LOCのハード目標を大きく超えていました)。現在はapp.css(約672 LOC — アクセシビリティ、デザイントークン/テーマ、サイドバー、メイン、ボタン、コンテンツシェル)、components.css(約595 LOC — カード、グリッド、ページネーター、バッジ、テーブル、フォーム、ログ/コンソール、Markdown、言語スイッチャー、チップフィルター、接続バナー)、overlays.css(約737 LOC — トースト、通知ドロワー、モーダル、その他/レスポンシブ、[dir="rtl"]ミラー、docs-fab、usage-hud)の3つとなり、いずれもハード上限に収まっています。- 分割は連続的かつ順序どおりに行われているため、カスケードは分割前のファイルとバイト単位で完全に同一です。
index.htmlはこの3つを順序どおりの<link>として読み込みます。挙動・マークアップ・i18nの変更は一切ありません。 - CSSを検証するテストは、共有ヘルパー
tests/helpers/css.mjs::loadAppCss()経由で連結結果を読み込むようになりました。新規のtests/css-modularization.test.mjsが分割を固定します(ファイルの存在・各ファイルが800 LOC以下であること・index.htmlのリンク順序) → スイート 2138。ブラウザ上での検証も実施済みです: 3つのスタイルシートすべてが正しくパースされ、そのルールが適用されます。
- 分割は連続的かつ順序どおりに行われているため、カスケードは分割前のファイルとバイト単位で完全に同一です。
[1.131.1] — 2026-07-31
修正
- v1.130.0 の2つのソースにおけるアダプターのホスト固定の一貫性強化(コードレビュー対応、多層防御。有効な入力に対する挙動変更はありません):
a16z-speedrun-talentアダプターがapi:/a16z-speedrun-talent:のオーバーライドをbuildEndpointで再検証するようになりました(HTTPS 限定、厳密なホストspeedrun-talent-network.com)。検証に失敗した場合は正規フィードへフォールバックします —cryptocurrencyjobsアダプターとのパリティであり、ホスト外の値がフェッチ処理に到達することはもうありません(以前はフェッチ時点のassertSpeedrunUrlガードのみに依存していました)。厳密ホストチェックは、ガードとアダプターで共有される単一のエクスポート済みSPEEDRUN_TALENT_HOST_REになりました。cryptocurrencyjobsパーサー —cleanUrlがassertCryptocurrencyJobsUrlおよびアダプターのオーバーライドと同じ厳密一致のホストガードを使うようになりました(以前はendsWithで、サブドメインも許容していました)。パーサーが SSRF ガードより緩くなることはありません:sub.cryptocurrencyjobs.coのアイテムリンクは破棄されます。- +2 テスト → スイート 2135。
[1.131.0] — 2026-07-31
追加
#/trackerの CRM ステージタブボード(親 Web アプリの/pipelineビューを移植)。トラッカーのファネルチップバー+ステータスドロップダウンがステージタブ帯に置き換わりました。All タブに加え正規ステータスごとに 1 つずつのタブ — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — が並び、それぞれ全履歴のライブ件数を表示します。ゼロ件のステージも含むため、ファネル全体が常に見渡せます(CRM らしい見た目)。アクティブなタブがフィルタを駆動し、同じタブを再度クリックすると All に戻ります。行はスコアトーン・正当性・PDF・レポートの操作性をそのまま保持し、ロゴを有効にすると企業セルにブランドロゴが表示されるようになりました(デフォルトはオフ → 追加リクエストはゼロ)。- 新しい読み取り専用ルート
GET /api/tracker/stagesが、正規のファネル(順序付きラベル)+エイリアス畳み込みマップを返します。ソースはserver/lib/states.mjs(templates/states.yml、組み込みフォールバック付き)— これによりクライアントはステータスのホワイトリストを一切ハードコードしません。パラメータなしの従来のGET /api/trackerレスポンスは変更なし({ rows }のみ)。 - 新しい純粋関数でユニットテスト済みのクライアントライブラリ
public/js/lib/tracker-stages.jsが、行をサーバーのステージに振り分けます。余分な markdown 太字やローカライズ済みエイリアス(例:aplicado→Applied)も許容します。タブはアクセシブルです(role tablist/tab、aria-selected、44px 以上のヒット領域、各タブのアクセシブルネームに件数を含む)。新規 i18n キーなし。スイート 2133。
- 新しい読み取り専用ルート
[1.130.0] — 2026-07-31
追加
- 親 career-ops v1.24.0 から新スキャンソース2件を移植(インプロセス、新規依存なし;いずれも
#/scanの Source フィルターと cvstart.org のランディングページに表示されます):- a16z Speedrun(
a16z-speedrun-talent、#2231)— a16z Speedrun の タレントネットワーク ボード全体 JSON フィード。speedrun-talent-network.comにホスト固定、HTTPS 限定、0 始まりのページネーション(上限あり)、企業別のq/設定引き回し、fail-soft。 - Cryptocurrency Jobs(
cryptocurrencyjobs)— Web3 求人ボードcryptocurrencyjobs.coを、公開 RSS 2.0 フィード経由で取り込み(認証不要)。二段階の XML エンティティデコード、リモート限定の求人、タイトル末尾の"… at <Company>"から雇用主を抽出。 - レジストリ合計は 72 ソース(67 EN + 5 RU) になりました(
ALL_ADAPTERS= 英語圏ポータルアダプタ 67 件)。
- a16z Speedrun(
修正
echojobs— ハイブリッド勤務がリモートと区別されるように(親 #2258 に準拠)。大文字小文字を区別しないhybridマーカーが検出されると、Remoteに丸め込まれる代わりに"<City> · Hybrid"(都市名がない場合は単にHybrid)とworkplaceType: 'Hybrid'を返すようになりました。radancy— レガシー TalentBrew マークアップ + JSON 結果フラグメント転送(親 a3e6df9 に準拠)、注入可能なopts.fetchJsonでゲート。
補足
- 未移植 — CLI 専用の親機能。 career-ops v1.24.0 の大規模な CLI/モード面は web-ui の対象外のままです。web-ui はビューア+薄い書き込みスルーであり、モードホストではありません:コンプライアンス/管轄区域テーブル、連絡先電話帳 + vCard、面接トランスクリプトのデブリーフ/通話プラットフォーム検出、台帳の set-status、結果記録、二段階トリアージ、jd-similarity、バージョン管理された応募先 CV アーティファクトのスキーマ、doctor の Playwright-MCP 検出、
portals/fix-slugs.mjs。親のscan.mjsにあるスキャンオーケストレーションの変更 — Interamt.de の Playwright スキャナー、iCIMS リバース ATS のフルスイープ、国籍適格性によるリモートフィルター、DNS ルックアップのペーシング、StepStone のrltr重複排除、スキャン履歴の正規化された会社カラム — も対象外です:web-ui は EN/RU スキャナーをインプロセスで実行しており、scan.mjsへシェルアウトしません。 - すでに対応済み。
role-matcherのアクセント畳み込み修正(#2209)は v1.127.0 で移植済みのため、ここでは no-op です。
[1.129.1] — 2026-07-29
修正
- v1.128/v1.129 の web 移植への AI レビュー対応(すべて助言、根本修正):
job-facets.jsのレベル優先順位(明示的な修飾語がマネジメント語に勝つ —Senior Engineering Manager→senior、以前はlead);states.mjsのフォールバックがピン留めされなくなった(成功読み取りはメモ化、フォールバックはキャッシュせず返す — 起動時に一時的に不在の親は次回再読込)+ 存在するが不正なファイルでconsole.warn;score-tone.js— スコアなしの行は中立(muted)で赤ではない;domainFromName()は/api/logoの前に非 ASCII スラッグをスキップ;+tests/states.test.mjsの分離ガード。+4 テスト → 2073。
[1.129.0] — 2026-07-29
追加
#/scanレベルファセット + 経過カラム — v1.128.0 のjob-facets.jsライブラリがスキャン UI に接続されました(以前はロジックのみ)。新しい レベル ドロップダウンが各求人タイトルを lead/staff/senior/mid/junior/intern に分類(JobFacets.seniorityFromTitle)し、結果に実在するものから自動生成します(Country ファセットと同様);レベル語のないタイトルは常に通過。保存検索・リセット・適用に保持されます。結果テーブルに レベル バッジ列と無トークンの 経過 列(今日/N日、JobFacets.daysSince)が追加されます。i18n キー 12 個 ×17、+3 テスト → 2069。
[1.128.0] — 2026-07-29
追加
- 親プロジェクト自身の Web アプリ(
../web/, Next.js)から 4 つの解決策を移植 — バニラ JS/ESM で再実装、新規依存なし:(1)server/lib/states.mjsがtemplates/states.ymlをトラッカーのステータス語彙の唯一の情報源としてライブ読み取り(CI フォールバック付き)— 毎リリースの手動ホワイトリスト再同期を廃止;POST はエイリアス(スペイン語/レガシー)を正規ラベルへ畳み込み、GET のファネルは正規ステータスでバケット;(2)ATS ホスト行の会社ロゴ —domainFromName()(約 90 ブランド→ドメイン);(3)score-tone.js— 4 段階スコアトーン(≥4.2/3.8/3.0 + 文字フォールバック);(4)job-facets.js— seniority/source/days ファセット。+21 テスト。
補足
- 未移植(概念のみ):親のエージェント的アクション層(
actions/registry.ts+api/assistant/route.ts)—docs-fabをコパイロット化する際の設計図。新規ソースなし(レジストリ 70)、i18n/help 変更なし。
[1.127.0] — 2026-07-29
追加
- 3 つの新スキャンソース(career-ops v1.23.0 パリティ) — レジストリは 70 アダプター(65 EN + 5 RU) に: Flowxtra(無認証の全体アグリゲーター)、VDAB(フランダース公共雇用サービスのキーワード API)、iCIMS(
careers-<tenant>.icims.comポータル、jibeapplyとは別)。さらに Cursor が CLI ロスターに復帰(parent #2115):cli-detectがcursorも検出(10 ツール)し、help/README/config ×17 にロスターを復元。
修正
- agenticjobs を HTML スクレイピングから REST API へ(#2167);Greenhouse は
location.nameが勤務形態のみのとき/officesから都市を復元(#2104);role-matcher パリティ(#1933/#2164/#2009: MTS 接頭辞、productベースライン、アクセント畳み込み、サブベースライン不一致)。
補足
- 未移植。 v1.23.0 の大半は web-ui が使わない CLI/ダッシュボード面(batch-tailor、discover-ats、NL/PT モード、PDF テーマ、Go ダッシュボード、updater/doctor);リレースクリプトは変更不要。親 VERSION → 1.23.0。
[1.126.1] — 2026-07-25
修正
- v1.126.0 の再同期が見落とした CLI ロスターのドリフト 2 箇所 — (1)
#/configの API keys タブ導入文(config.providerModelNote、i18n ×17)が 7 CLI しか列挙していなかった — Antigravity と Grok Build を OpenCode の後に挿入; (2) ヘルプガイド(×17)の 2 つ目の比較表の行と CI ビルドのサイト help がまだInside Claude Code / Codex / Cursor / Gemini CLI(旧 Cursor 入り)だった — 全ロスターに修正。どちらも v1.126.0 スイープのパターンが対象外だったスラッシュ/中黒区切り。i18n スナップショット再生成、スイートは 1969 維持。
[1.126.0] — 2026-07-25
追加
- AI CLI ツールタブが career-ops の 8 つの一級 CLI をすべて検出 —
#/configのロスターを親のdocs/SUPPORTED_CLIS.mdと同期:server/lib/routes/cli-detect.mjsに Grok Build CLI(grok)と Kimi CLI(kimi)を追加し、Antigravity は正規バイナリagyを優先的に探索します。読み取り専用の PATH スキャンは 9 ツール を報告するようになり、見つかったバイナリを実行しない点は変わりません。
変更
- career-ops.org/docs とのドキュメント再同期 — すべてのドキュメント面を親のライブページ(全 31 ページを読了)と突き合わせました。正規の AI アシスタントロスター(help ×17 + README ×17)は、8 つの一級 CLI — Claude Code、Codex、OpenCode、Antigravity CLI、Grok Build CLI、Qwen Code、Kimi、GitHub Copilot CLI — と Gemini CLI(レガシーラッパー)を列挙します。ヘルプバンドルは 29 H2 / 105 H3 構造を維持します。
[1.125.4] — 2026-07-23
変更
- site の依存関係(dependabot #151–#153)—
site/のsharp0.34.5→0.35.3、svgo4.0.1→4.0.2、fast-uri(dev)3.1.3→3.1.4。Astro ビルドはグリーン、SPA/サーバーへの影響なし。
補足
- 親プロジェクトのパリティスイープ(career-ops
37d17ec..254764a、v1.22.0 以降) — 移植対象なし:set-statusの誤行ガード(#2108)は CLI 専用(web-ui のトラッカー行は UI で明示的に選択され、どのルートもset-status.mjsを呼ばない)、ローカライズ済みモードの Risk Summary(#2109)は web-ui が読まないmodes/<lang>/ファイル(読むのはトップレベルのmodes/*.mdのみ)、update-systemのマニフェスト検証(#2111)はアップデーター専用、残りは親のドキュメント(トルコ語 README、SIGNATURES ×4、SCRIPTS.md、es のアクセント)。親の VERSION は 1.22.0 のまま —parentVersionに変更なし。
[1.125.3] — 2026-07-23
修正
- デンマーク語・ヒンディー語の LLM プロンプトが英語で応答していた問題(ユーザー報告)—
server/lib/prompts.mjsのLOCALE_NAMESと 5 つのSCAFFOLD_STRINGSブロックがda・hiに拡張されておらず、resolveLocale()がenにフォールバックし、ディープリサーチ(ライブ・手動)、モード実行、評価、面接、ネットワーキング、CV Studio のすべての AI プロンプトから# Output language指示が失われていました。両ロケールを正式サポート: ロケール指示 + ローカライズ済みスキャフォールディング。tests/locale-scaffold.test.mjsの回帰ゲートはハードコードされた 12 件ではなく正規の 17 ロケール一覧を走査し、新しい構造パリティゲートは英語にフォールバックするスキャフォールドキーを失敗させます — 今後prompts.mjsを見落としたロケールは出荷できません(+12 テスト、スイートは 1969 件に)。
[1.125.2] — 2026-07-22
修正
- Gemini でのディープリサーチ:HTTP 502(
MALFORMED_FUNCTION_CALL) (#145、@Alien10140 の貢献) — ライブの/api/deepプロンプトはモデルに「Use WebFetch / WebSearch」とファイル保存を指示していましたが、ヘッドレス API プロバイダにはツールチャネルがなく、Gemini はテキストではなく関数呼び出しで応答し、空の HTTP 502 として現れていました。buildDeepPromptとbundleProjectContextにheadlessフラグを追加:ライブ実行(Anthropic/Gemini/フォールバックカスケード)はインライン化されたコンテキストからブリーフを書くツールなしプロンプトを受け取り、Claude Code 用のコピー&ペーストプロンプトはツール指示を保持します。tests/critical-fixes.test.mjsにテスト +1。
変更
- 非推奨の
gemini-2.0-flashを超えて Gemini デフォルトを更新 (#144、@Alien10140 の貢献) — 設定ドロップダウン、gemini.mjsのサーバーフォールバック(ヒントと静かに食い違っていた値)、OpenRouter フォールバックチェーン、config.geminiModelHint×17、ヘルプガイド ×17 がすべてgemini-3.6-flashを指すようになりました。新しいドリフトゲートtests/gemini-default-model.test.mjs(+5 テスト)がすべての面を同一リテラルに固定します — スイートは 1957 テストになりました。
[1.125.1] — 2026-07-21
修正
- SuccessFactors:マルチブランドの RMK テナントがブランドパスを維持(親 #2099、v1.22.0 以降)— 一つの共有 RMK インスタンス上で複数の買収ブランドを運用するホールディングカンパニーは、パスセグメントでブランドを区別します(
careers.nemetschek.com/Bluebeam/vs…/Vectorworks/)。アダプタは以前、設定された URL を origin まで切り詰めてしまい、親ブランドの求人だけを黙ってスキャンしていました。エンドポイントは今やブランドプレフィックスを保持し、末尾の/search/または/tile-search-results/セグメントのみを取り除くため、二重スキャンが発生することはありません。単一ドメインのテナントはバイト単位で変更されません。新しくエクスポートされたresolveTenantBaseヘルパー +tests/sources-successfactors.test.mjsに移植したテストブロック 1 件。
[1.125.0] — 2026-07-21
追加
- cvstart.org:「求人ソース」ランディングセクション — スクリーンショットと比較表の間に新しいセクションが追加され、67 件のスキャナーソースすべてをクリック可能なチップ(英語圏の求人ボード/ATS 62 件 + 独自の見出しの下にまとめたロシア語圏のボード 5 件)として一覧表示します。各チップはそのソースの公開サイトへリンクします。この一覧はビルド時に実際のアダプタレジストリ(
sync-assets.mjs→facts.sources)から同期されるため、アプリの実態と乖離することはありません。Sources.astro内の厳選されたリンクマップは、新設のtests/site-sources.test.mjsによって保証されます。ヘッダーナビゲーションに Sources アンカーが追加され、サイトの i18n キーが 4 件 × 17 言語分新設されました。あわせて、ランディングページの JSON-LD のinLanguage一覧にhiが抜けていた問題も修正しました。
[1.124.0] — 2026-07-21
追加
- 5 件のスキャンソース(親 v1.22.0 パリティ、#1808/#1572/#2024/#2055)— Welcome to the Jungle(ボード全体の JSON API)、Agentic Engineering Jobs(エージェンティック/AI エンジニアリング専門ボード)、Jobvite(ゼロ認証のテナント単位 ATS)、Gem(テナント単位 ATS)、Alibaba Group(キャリア JSON API、Meituan/Tencent パターン)。いずれもホスト固定・CI 分離されたソース + アダプタのペアで、レジストリは 67 個のアダプタ(英語圏 62 個 + ロシア系 5 個) を同梱するようになりました。
#/scanの Source ドロップダウンのフォールバックとそのドリフトゲートも更新済みです。新しいテストスイートtests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjsを 5 本追加。
修正
- Arbeitsagentur:全国リモート判定は
homeofficetypがVOLLSTAENDIGの場合のみ(親 #1981)—homeoffice=nv_trueクエリはハイブリッド求人も返してしまうため、リモート判定は各ヒットを求人詳細エンドポイントに対して小さなバッチで確認するようになりました。照会がエラーになった場合はフェイルクローズし、求人の実際の勤務都市を保持するため、勤務地フィルタは引き続き適用されます。 - SmartRecruiters:公開求人 URL に
/postings/が付与されずに生成される問題(親 #2047)— リンクは、公開サイトがこのセグメントを省略しているテナントで 404 になる代わりに、公開求人ページへ正しく到達するようになりました。
補足
- 親 v1.22.0 では、Web UI がシェルアウトしていない、またはすでにカバーしている CLI 側の変更も出荷されています:zh-CN 向け CV テンプレート + PDF タイポグラフィ、
/expandモード、プロバイダのプロンプトキャッシュ調整(Gemini/OpenAI/Ollama)、ステップ単位のトークン内訳(Web UI は独自の使用量メーターを保有)、トラッカーのライターロックによる直列化(Web UI は v1.21 以降withFileLockで書き込みを経路化)、スキャンのvisa_filter+ 絶対投稿日 CLI フラグ(Web UI は独自の「投稿からの経過日数」フィルタを保有)、そして seen-sources 重複排除のシード投入(Web UI スキャナーは独自のスキャン履歴による重複排除を保持)です。
[1.123.0] — 2026-07-17
追加
- Oracle Recruiting Cloud スキャンソース(親 v1.21.0 パリティ、#1929)— Oracle Fusion/ORC 系のキャリアサイト(JPMorgan Chase、Oracle、BNY Mellon、American Express、Honeywell など)が使うゼロ認証の
recruitingCEJobRequisitionsREST API:*.fa[.<region>][.ocs].oraclecloud.comにホスト固定し、サイト番号は各トラッキング対象企業のcareers_urlから解決、オフセットページネーションはハード上限付き、WAF を意識したブラウザ風ヘッダーを使用します。レジストリは 62 個のアダプタ(英語圏 57 個 + ロシア系 5 個) を同梱するようになりました。#/scanの Source ドロップダウンのフォールバックとそのドリフトゲートも更新済みです。CI 分離された新しいテストスイートtests/sources-oraclecloud.test.mjsを追加。
修正
- repost 検出器:ベースタイトルを特化サフィックス違いの兄弟求人と区別(親 #1922)— 「Senior Analytics Engineer」が「Senior Analytics Engineer, People Analytics」とクラスタリングされなくなりました:一方のタイトルのトークンが他方の厳密な部分集合であり、余分なトークンが(基本語ではなく)実際の専門分化を示す場合、両者は別々に応募可能な求人として扱われます。再掲載の注記(「(Repost)」、「relisted」)はメタ的なノイズとしてストップワード化されました。
tests/detect-reposts.test.mjsに +2 アサーション。
補足
- 親 v1.21.0 では、Web UI がシェルアウトしていない、またはすでにカバーしている CLI 側の変更も出荷されています:同一企業への再応募警告(Web UI は v1.84.0 以降、再応募クールダウンを保有)、カバーレターの
--format/--reportフラグ、面接のレッドフラグ / パネルインテル / 無断欠席メールのプロンプトモード、スキャンの信頼シグナル & ポータルヘルスの永続化(Web UI は独自のインプロセススキャナーでtrust-validatorと Portals health ページを運用)、そして stats/salary-gap の拡張(読み取り専用かつフェイルソフトで中継)。
[1.122.0] — 2026-07-16
追加
- ヒンディー語(हिन्दी)— 17番目の言語 — 完全な UI 辞書(約 1,110 キー)、完全なアプリ内ヘルプガイド(29 の H2 / 105 の H3 パリティ)、
README.hi.md、新しいCHANGELOG.hi.md(de/it/tr の前例に倣い v1.122.0 から開始)、cvstart.org のランディング + メソドロジー/ライセンス/変更履歴/ヘルプページ、言語スイッチャー(🇮🇳)、ブラウザ言語の自動検出、ローカライズされたダッシュボードのスクリーンショットを追加しました。×16 のパリティゲートはすべて ×17 で実行されるようになりました:i18n 辞書パリティ + スナップショット、ヘルプ H2/H3 ゲート、変更履歴パリティ、サイトのcheck-i18n、そして Playwright のロケール一巡テストです。
[1.121.0] — 2026-07-16
追加
- cvstart.org: メソドロジー、ライセンス、変更履歴ページ — ランディングに、既存の Compare ブロックの隣に全 16 言語で 3 つの新セクションが追加されました: /methodology/(6 次元の 0.0–5.0 スコアリングルーブリック、4.0 の応募しきい値、絶対にしないことのルール — career-ops.org/methodology のローカライズされた要約)、/license/(NOTICE.md へのリンク付きの正規 MIT 全文)、/changelog/(このファイルを、リポジトリの 16 の翻訳済み CHANGELOG からロケールごとにレンダリングしたもの)。ヘッダーに新しい Methodology エントリ、フッターの Resources にもリンクを追加。
sync-assets.mjsはビルド時に CHANGELOG ×16 と LICENSE をサイトへ同期するようになり、ページがリポジトリから乖離することはなくなりました。 - ドキュメント全体へのメソドロジーリンク — README(全 16)、アプリ内ヘルプガイド §1 の正規ガイドリスト(全 16)、そして wiki が、既存の career-ops.org/docs ガイドと並んで career-ops.org/methodology(FAQ・用語集にも)にリンクするようになりました。
変更
- README のリリースバナーとバッジを更新(テスト 1850、リリース v1.121.0)— バナーはまだ v1.119.5 を告知したままでした。
[1.120.0] — 2026-07-16
追加
- CareerOps マニフェスト(親 v1.20.0 パリティ)— 親プロジェクトが CareerOps マニフェスト(
MANIFESTO.md· career-ops.org/manifesto)を公開し、README・アップデーター・Go ダッシュボードから案内するようになりました。Web UI もこれに追随します:サイドバーフッターの新しいリンクからマニフェストのページが開くようになり(全 16 ロケールに新しい i18n キーfooter.manifestoを追加)、アプリ内ヘルプガイドには全 16 言語で §29「CareerOps マニフェスト」が追加され、README はマニフェストとは何か・どう署名するかを説明し、cvstart.org のランディングフッターにもリンクが張られました。
備考
- 親 v1.20.0 では、
upskillのターゲットモードにおける既知スキルの抑制も修正され、scan --jsonの標準出力がパース可能であり続けるよう dotenv を静音化し、役職見出しがその箇条書きから分離しないよう HTML CV テンプレートを修正しました — いずれも Web UI がシェル経由で呼び出さない CLI 側の挙動であり、Web UI 側のコード変更は不要でした。
[1.119.5] — 2026-07-13
修正
- ランディングの言語ボタンが折り返さなくなりました — v1.119.2 の国旗追加により、ヘッダーのスイッチャーラベル(例:「🇷🇺 Русский」)が狭いデスクトップ幅で最大 3 行に折り返すことがありました。スイッチャーラベルとドロップダウンの全項目を
whitespace-nowrapにし、国旗 + 言語名が常に 1 行に収まります。 フッターの言語リストは固定の 2 列グリッドから 1 行アイテムの折り返し行に変更 —「🇧🇷 Português (Brasil)」も名前の途中で折れなくなりました。
[1.119.4] — 2026-07-13
変更
- LICENSE に作者を明記 — 著作権行は Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors になりました(MIT の正規本文は無変更)。新しい NOTICE.md がライセンスを詳細に解説:著作権者は誰か、MIT 許諾が正確に何をカバーするか(コード、ドキュメント、翻訳、ランディング、wiki)、何をカバーしないか(実行時のあなたのデータ、親プロジェクト、求人ボードのコンテンツ、商標)、サードパーティ構成要素の表(express/js-yaml — MIT、Astro/Tailwind — MIT、フォント Figtree と JetBrains Mono — SIL OFL 1.1、sharp — Apache-2.0)、任意の帰属表示の一文。
[1.119.3] — 2026-07-13
追加
- SECURITY.md — CONTRIBUTING が指していたセキュリティポリシーがついに実在します:サポート対象バージョン、非公開報告フロー(リポジトリで GitHub の private vulnerability reporting を有効化 — Security タブ →「Report a vulnerability」)、localhost バインドの単一ユーザーアプリの脅威モデル(スコープ内:敵対的な求人経由の XSS / SSRF / パストラバーサル / シークレット漏えい / CSP の弱体化。スコープ外:自分の localhost への DoS と親プロジェクトの問題)、レビュアー向けのハードニング基準。
[1.119.2] — 2026-07-13
追加
- CONTRIBUTING.md — ランディングと README がずっとリンクしていたコントリビューターガイドがついに実在します:セットアップ、プロジェクトマップ、セキュリティ/ノービルドの厳格ルール、テスト階層、スキャンソース追加の「2 つのレジストリ」ウォークスルー、×16 i18n 契約、コミット/PR 規約、リリースプロセス。
- ランディングの言語フラグ — cvstart.org の言語スイッチャー、フッターの言語グリッド、「あなたの言語で読む」バナーに、各ロケールの国旗をエンドニムの横に表示するようになりました(アプリの言語
<select>と同じ地域指示子セット。国旗グリフのない環境では地域文字に退化)。 - ランディングのフッター修正 — 機能が有効化されていないためリンク切れだった Discussions は、プロジェクトの wiki を指すようになりました。フッターには作者のクレジットを追加:Sergei Emelianov(sergey-cv.com · LinkedIn)。
[1.119.1] — 2026-07-13
修正
#/scanのソースフィルターがレジストリに追いつきました — Source ドロップダウンの背後にある静的なFALLBACK_SOURCESリスト(GET /api/scan/sourcesに到達できない場合のみ使用)は v1.87.0 以降、静かに遅れていました:オフラインフォールバックに 20 のプロバイダー(Amazon、Avature、SAP SuccessFactors、Get on Board、Dassault Systèmes、beesite、HigherEdJobs、JibeApply (iCIMS)、softgarden、Cornerstone、Phenom、Radancy、Deutsche Bahn、EchoJobs、TKMS、Heckler & Koch、Rheinmetall、LaraJobs、そして新しい Meituan / Tencent)が欠けていました。全 61 と同期し、クライアントのリストがサーバーレジストリから乖離すると CI を失敗させるドリフトテスト(値もラベルも)で保護されるようになりました。+1 テスト(1845)。
[1.119.0] — 2026-07-13
親 career-ops v1.19.0 パリティ + cvstart.org ランディングの刷新。
追加
- 2 つの新スキャンプロバイダー — Meituan(
zhaopin.meituan.com)と Tencent(careers.tencent.com):中国テック系ボードの認証不要な公開 JSON API。ホストから自動検出、または明示的なprovider:で選択。キーワードごとのサーバーサイド検索・ページネーション・URL による重複排除つき — これで 61 アダプタ(英語圏 56 + ロシア系 5)。+20 テスト(1844)。 - ランディングのコントリビューターブロック — cvstart.org にコードを提供した全員のアバターを表示(ビルド時に GitHub
/contributorsAPI から取得、ボットは除外)。16 言語すべてにローカライズされ、コントリビューターグラフ全体へのリンクつき。 - ランディングのライブ GitHub スター数 — ヘッダーのバッジは訪問のたびにクライアント側で GitHub API から更新(ビルド時のスナップショットはフォールバック)。週次スケジュールの Pages 再ビルドがスナップショットとコントリビューター一覧を新鮮に保ち、CI の API 呼び出しはトークン認証になりました。
修正
- Workday CXS リクエストがブラウザ風ヘッダーを送信(親 #1813)— Cloudflare 保護テナント(実例:geico)は通常の UA/
accept-language/origin/refererを欠くリクエストに 500 を返します。フェッチャーは origin とサイトスラッグを CXS URL 自体から導出するようになりました。Glints リクエストにも同じブラウザ UA + origin/referer を追加 — どちらもhttp-json.mjsの共有定数BROWSER_LIKE_USER_AGENTから。
[1.118.4] — 2026-07-10
修正
- ロシアの IP から hh.ru スキャンが 0 件を返していた(地域サブドメインのリンク) — ロシアの住宅用 IP からだと hh.ru は検索を地域サブドメイン(
sochi.hh.ru、spb.hh.ruなど)へ 302 リダイレクトし、求人リンクをそのサブドメインで返します。パーサーはタイトルリンクを固定ホストhttps://hh.ru/vacancy/で探しており、地域リンクを 1 件もマッチできず、完全に動作するスキャンが黙って 0 件を記録していました。現在は任意の*.hh.ruホストを受け入れ(adsrv.hh.ru/click?…の広告は引き続き除外 —/vacancy/<id>パスを持たない)、各結果 URL をhttps://hh.ru/vacancy/<id>に正規化します。実地検証済み:以前 0 件だったsochi.hh.ruページから 17 件の実求人が解析されます。+1 テスト(1824)。
[1.118.3] — 2026-07-10
修正
- hh.ru がエラーなしで 0 件を返していた(VPN チェックの中間ページ) — hh.ru は VPN/プロキシと判定したネットワーク(データセンター IP)を
/vpncheeck中間ページ(「VPN мешает работе сайта」)へ 302 リダイレクトするようになり、このページは求人カードを 1 枚も含まない HTTP 200 を返すため、スキャンはエラーなしで 0 件を報告していました。スキャナーはレスポンスの最終 URL からリダイレクトを検出し、実行の残りの間 hh.ru を無効化し、正直なヒントを出力します:トラフィックは本当に住宅用 IP から出ている必要があります — ブラウザのトグルをオフにしてもシステム全体の VPN/プロキシは有効なままのことがあります。+1 テスト(1823)。
[1.118.2] — 2026-07-10
メンテナンス
- ランディングのフォローアップ(#118) —
site/README.mdを Astro 7(#116 のセキュリティアップグレード)に合わせて修正し、未使用 import を削除、ランディングのビルドスクリプトに実行可能なガードを 4 件追加: i18n パリティゲートが壊れた辞書で確実に失敗することを証明し、sync-assetsはsite/の外に書き込まないことを保証 — スイート 1822。CodeQL アラート 2 件を解決(1 件はソース修正、1 件は意図されたビルド時動作として却下)。
[1.118.1] — 2026-07-10
修正
- ロシア国外からの hh.ru スキャン — hh.ru が公開検索ページでロシア国外の IP に HTTP 451(地域的な法的ブロック)を返すようになりました。スキャナーは 451 を 403 と同様に扱います: 最初のブロック後、実行の残りで hh.ru を無効化し、ロシア IP / VPN 出口を案内する正直なログを残すため、残りのクエリや他の RU ソースを無駄にしません。ヘルプ §7 を全 16 言語で更新。テスト +1(1818)。
[1.118.0] — 2026-07-09
親 career-ops v1.18.0 パリティパック。
追加
- 9 つの新しいスキャンプロバイダー — Cornerstone OnDemand (
csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — これでアダプターは 54 個。Lever アダプターは EU テナンシーのボード(jobs.eu.lever.co)も検出します。 - トラッカーの
Hiredステータス(親のstates.ymlパリティ): 受諾したオファーは独自の正規ステータス、お祝いバッジ、#/trackerの内定獲得バナーを持ちます。ファネルとコンバージョンのチャートは全ステージを通過したものとして数えます。 #/statsの累計タブ — 親のstats.mjs(累計トラッカー集計、累積ファネル率、スキャナー合計、ポータルカバレッジ)とsalary-gap.mjsの報酬観測(希望 vs 求人提示 vs 実際、応募ごと)を読み取り専用で中継します。新ルートGET /api/stats/lifetimeとGET /api/stats/salary-gap— ゼロトークンのシェルアウトで、親プロジェクトがなければ{available:false}に安全にフォールバックします。- 全 16 ロケールに 28 個の新しい i18n キー。ヘルプガイド §14/§26 を全言語で更新。
テスト
- ユニットテスト +38(プロバイダーパリティ 3 スイート + リレー/ステータスルート) — 合計 1817。
[1.117.2] — 2026-07-06
パリティ・シェルアウトの空トラッカー修正。 トラッカーに応募がまだ無い場合、親スクリプトはコード1と構造化された {error} JSONで終了します。フォローアップボードと不採用パターンタブはこれを「script-error」と表示していました。両ルートはこれを健全な空状態(available:true, empty:true)として中継し、UIは正直な「まだ何もない」メッセージを表示します。実際の親でライブ検証済み。
新規: なし。
[1.117.1] — 2026-07-06
v1.117.0 のハードニング(CodeQLトリアージ)。 3つのシェルアウト・エンドポイント(GET /api/followup、POST /api/followup/seed、GET /api/stats/patterns)に共有のIP別リミッターを適用(リクエストごとに子プロセスを生成; ループバックではno-op)。CVに追加のURLテキスト抽出は、タグを不動点まで除去した後、残った </> をすべて削除 — LLMプロンプト用テキストとして証明可能に完全なサニタイズ。有効な入力の挙動は不変。
新規: なし。
[1.117.0] — 2026-07-06
親パリティパック — 親 career-ops の6つの機能をUIへ。 (1) #/followup のフォローアップ・ケイデンスボード: followup-cadence.mjs による応募ごとの緊急度(🔴/🟠/🟡/🔵)+ フォローアップ日をシードボタン(followup-seed.mjs --backfill)。(2) 不採用パターン: 統計の4つ目のタブが analyze-patterns.mjs(読み取り専用)を実行 — 結果の内訳、推奨、ATSベンダー別前進率。(3) CVに追加: CV StudioのカードがURLまたは貼り付けテキストを、その出典のみに基づくATS箇条書きに変換(提案のみ、書き込みなし; URLフェッチはSSRF保護)。(4) 新スキャンプロバイダ4つ — beesite、HigherEdJobs(RSS)、JibeApply(iCIMS)、softgarden — レジストリは50アダプタ(45 EN + 5 RU)になり、すべてScanのドロップダウンに表示。(5) Applyチェックリストに失格要件の事前スキャンステップ。(6) reconcileランナー(/api/run/reconcile)。シェルアウトのルートは親スクリプトがなければ正直に「利用不可」を表示。
- 新ルートモジュール
server/lib/routes/followup.mjs(31番目)+ 新ルート + ソース/アダプタ8ファイル。テスト: 6 + 7 追加; スイート 1737 → 1750。新しいi18nキー41件×16。ヘルプ §13/§17/§24/§26 を×16拡張。
新規: GET /api/followup、POST /api/followup/seed、GET /api/stats/patterns、POST /api/cv-studio/add-entry、POST /api/run/reconcile。
career-ops-ui v1.267.1 · page 5/10 · mirror of the project changelog for cvstart.org