変更履歴

GitHub

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

[1.59.13] — 2026-05-21

fix(i18n): @alias で真の重複キーを統合 + 個人データの最終一掃. メンテナの実名をテストフィクスチャと QA レポートから除去(→ Jane Doe)、LICENSE/package.json を Fighter90 ハンドルへ。@alias 機構で全 8 ロケール一致の 10 キーを統合。nav.config/config.title はスペイン語で異なるため統合しない。991 → 994 テスト。(I18N-CL3)


[1.59.12] — 2026-05-21

fix(i18n): i18n-dict.js のクリーンアップ — fr 前 (I18N-CL1, I18N-CL2, I18N-CL4). training.coursePh の個人データを汎用プレースホルダに置換、followup.lastPh を固定日付から書式ヒントへ、npm run audit:i18n を追加。重複値グループは意図的(UI ロールが異なる)— 辞書ヘッダ参照。(I18N-CL1, I18N-CL2, I18N-CL4)


[1.59.11] — 2026-05-21

fix(test): v1.59.11 — e2e-comprehensive スイートが 23/23 パス(以前 11/23)。 Playwright の page.goto がハッシュのみ変更で no-op になる問題が根本原因。新しい goRoute(hash) ヘルパーが about:blank を経由して実ナビゲーションを強制。(e2e-harness-r1)


[1.59.10] — 2026-05-21

fix(api): NEW-F1-sub-r1 (v1.59.10) — 生 .. ガードをすべての /api ルート登録の上に移動。 v1.59.8 のものは app.all の後で発火しませんでした。Express 正規化前に実行されます。(NEW-F1-sub-r1)


[1.59.9] — 2026-05-21

fix(ux): UX-A5-r4 (v1.59.9) — Help TOC スクロールスパイに data-toc-spy="active" デバッグマーカー + 動作ベースのロックテスト。 6 サイクル目。同期初期ペイント + ダブル rAF 再計算 + resize リスナー + hashchange クリーンアップ。(UX-A5-r4)


[1.59.8] — 2026-05-21

fix(ux+api): v1.59.8 — UX-A5-r3 + NEW-F1-sub (HIGH + LOW 同梱)。 FINAL-REGRESSION-v1.59.7 で承認されたドクトリン例外。UX-A5-r3: #/help の IntersectionObserver を rAF スロットル付き scroll リスナーに置換。NEW-F1-sub: /api/* の素の .. を 404 JSON で拒否。(UX-A5-r3 · NEW-F1-sub)


[1.59.7] — 2026-05-20

fix(api): NEW-D3-cache (v1.59.7) — GET /api/cv が Cache-Control: no-store を送信。 CV はユーザの主要成果物のため常に再検証。(NEW-D3-cache)


[1.59.6] — 2026-05-20

feat(a11y): NEW-D2-motion (v1.59.6) — prefers-reduced-motion: reduce を尊重。 新しい @media ブロックがアニメーション・トランジション・scroll-behavior を無効化。(NEW-D2-motion)


[1.59.5] — 2026-05-20

fix(api): NEW-F1 (v1.59.5) — 不明な /api/* がすべての HTTP 動詞で JSON 404 を返却。 app.get → app.all。(NEW-F1)


[1.59.4] — 2026-05-20

fix(ui): NEW-OR1 (v1.59.4) — #/config Active/Keys チップのレース解消。 atomic replaceChildren + in-flight トークン + last-good キャッシュ。(NEW-OR1)


[1.59.3] — 2026-05-20

fix(ux): UX-A5-r2 (v1.59.3) — #/help スクロールスパイ強化。 rootMargin の可視帯を 10 % から 25 % に拡大 + マウント時の初期状態計算を追加。(UX-A5-r2)


[1.59.2] — 2026-05-20

fix(ui): v1.59.2 — Active/Keys チップ: カウント修正、プロバイダ名の大文字化、重なり解消。 (post-v1.59.1 hotfix)


[1.59.1] — 2026-05-20

fix(test): v1.59.1 — NEW-D1 ガードが UX-A11 で磨かれた ES コピーを受容。 (v1.59.1)


[1.59.0] — 2026-05-20

feat(ui): UX-A14 (v1.59.0) — モバイル (≤ 420 px) 監査パス。 新しい @media (max-width: 420px) ブロック内に 5 つの修正。(UX-A14)


[1.58.65] — 2026-05-20

test(ui): UX-A2 (v1.58.65) — Modes 構造化フィールドフォームのリグレッションロックテスト。 v1.54.3 の実装を回帰から保護します。(UX-A2)


[1.58.64] — 2026-05-20

fix(i18n): UX-A11 (v1.58.64) — es/pt-BR コピーの磨き上げ。 英語の借用語を母語の同等表現に置換。(UX-A11)


[1.58.63] — 2026-05-20

fix(ui): UX-A15 (v1.58.63) — Dashboard Pipeline タイルに視覚的プライマリ強調。 Pipeline タイルにアクセントボーダー、大きめのアイコン、太字ラベルが追加されました。(UX-A15)


[1.58.62] — 2026-05-20

feat(ui): UX-A9 (v1.58.62) — API keys タブ上部の sticky サマリーチップ。 #/config → API keys タブの上部にアクティブなプロバイダと設定済みキー数を表示する sticky チップが追加されました。(UX-A9)


[1.58.61] — 2026-05-20

docs(readme): UX-A8 (v1.58.61) — 8 つの README すべてに初回起動クリーンアップセクションを追加。 初回スキャン前に 2 つの QA フィクスチャ URL をクリアする make clean-test-fixtures 手順を文書化しました。(UX-A8)


[1.58.60] — 2026-05-20

feat(ui): UX-A12 (v1.58.60) — 通知ドロワーにすべてクリア + エントリ別閉じる。 通知パネルに全体クリアボタンとエントリ別 × ボタンが追加されました。(UX-A12)


[1.58.59] — 2026-05-20

feat(ui): UX-A13 (v1.58.59) — #/health の失敗行に実行可能な「Fix →」CTA。 FAIL/OPTIONAL 行は対応する設定タブに直接ジャンプするゴーストボタンを表示します。(UX-A13)


[1.58.58] — 2026-05-20

fix(ux): UX-A10 (v1.58.58) — #/cv で未保存編集の喪失を防止。 ブラウザ閉鎖(beforeunload)と SPA 内ナビゲーション(hashchange)時、ダーティバッファがあればローカライズされた確認を表示します。(UX-A10)


[1.58.57] — 2026-05-20

test(ui): UX-A7 (v1.58.57) — cost-line 自動更新契約のリグレッションロックテスト。 providers-changed のディスパッチ・購読・全アドバイザビューでの呼び出しを静的に保証します。(UX-A7)


[1.58.56] — 2026-05-20

fix(a11y): UX-A4 (v1.58.56) — .lang-btn が WCAG 2.5.8 の最小タッチターゲットを満たしました。 修正前は言語ボタンの高さが 23–25 px で 24×24 px 基準を下回っていましたが、min-height: 28px + min-width: 28px を指定し WCAG 2.2 AA に準拠しました。(UX-A4)


[1.58.55] — 2026-05-20

feat(ui): UX-A3 (v1.58.55) — Dashboard アクティブプロバイダチップ。 #/dashboard のヒーローに現在の LLM プロバイダ(⚡ Live evals: Anthropic claude-sonnet-4-6 または 📋 Manual prompt mode)を表示。#/config で LLM_PROVIDER を変更したときやタブにフォーカスが戻ったときに自動更新。(UX-A3)


[1.58.54] — 2026-05-20

fix(ux): UX-A1 (v1.58.54) — Deep ブリーフ構造の防御的警告。 保存されたブリーフに標準の 6 セクション(Company snapshot / Engineering culture / Recent news / Glassdoor / Interview process / Negotiation leverage)のうち 3 つ未満しか含まれていない場合、public/js/views/deep.js は非ブロッキングの警告とリファレンスへのリンクを先頭に表示します。UI のガードレールであり、プロンプトレベルの修正は親プロジェクトで行います。(UX-A1)


[1.58.53] — 2026-05-20

fix(ux): UX-A6 — すべての saved-card が単一の renderSavedCard() ヘルパーを経由。 どのレンダリングパスでも <span>+<time> 構造が保証される。948 → 949 ユニット。(UX-A6)


[1.58.52] — 2026-05-20

fix(ux): UX-A5 — #/help TOC スクロールスパイが正しく発火するように。 v1.58.45 の setTimeout(0) は router マウント前に発火していた。fix: headings の直接参照 + 二重 requestAnimationFrame。947 → 948 ユニット。(UX-A5)


[1.58.51] — 2026-05-20

chore(docs): v1.58.51 — v1.58.37 → v1.58.50 サイクル(14 releases)の最終ハウスキーピング。 コード変更なし。qa/ を整理し、すべてのバージョン固定ドキュメントを archive/v158-cycle/ へ移動;6 つの perennial がルートに残る。REGRESSION-FINAL §13 が v1.58.37→.50 のすべての不変条件を文書化。ベースライン不変(947/947)。(housekeeping)


[1.58.50] — 2026-05-20

docs: DOC-1 — qa/REGRESSION-FINAL.md に §5a を追加(サーバエラーボディの英語固定ポリシーを明文化)。 NEW-D4 を not-a-finding として close。FIX-PROMPT-FINAL-EXHAUSTIVE.md の v1.58.37 → v1.58.50 キューを完了(14 リリース)。 946 → 947 ユニット。(DOC-1)


[1.58.49] — 2026-05-20

chore(tooling): TOOL-1 — make clean-test-fixtures と親プロジェクト data/pipeline.md から example.com 行を削除するスクリプトを追加。 --dry-run 対応。CI-isolated テスト 4 件。942 → 946 ユニット。(TOOL-1)


[1.58.48] — 2026-05-20

fix(ux/onboarding): UX-D-B — プロフィールがデフォルトテンプレートのままなら #/dashboard に警告バナーを表示。 /api/health で Profile customized: false を検出すると .hero-banner--warning を表示。新 i18n キー onboarding.fixtureWarning + onboarding.fixProfile × 8。941 → 942 ユニット。(UX-D-B)


[1.58.47] — 2026-05-20

fix(ux/naming): UX-D-C — トップバーの「Quick scan」を Scan を開く に改名(動作はナビゲーションのみで実際にスキャンは開始しないため)。 8 言語で更新。940 → 941 ユニット。(UX-D-C)


[1.58.46] — 2026-05-20

fix(ux): UX-D-D — #/apply チェックリストの {company}-{role} を URL/JD 由来のスラグに置換。 以前はプレースホルダがそのまま表示されていた。新 extractSlugs + substitutePlaceholders が Greenhouse/Lever/Ashby/Workable/SmartRecruiters/Workday を認識。フォールバックは [company]/[role]。939 → 940 ユニット。(UX-D-D)


[1.58.45] — 2026-05-20

fix(ux): UX-D-K — #/help の TOC スクロールスパイで現在のセクションをハイライト。 IntersectionObserver が現在表示中の H2 に対応する TOC リンクに .toc-current を付与。938 → 939 ユニット。(UX-D-K)


[1.58.44] — 2026-05-20

fix(ux): UX-D-L — #/deep で開いた Saved-research の brief にインライン × クローズボタンを追加。 以前はスクロール・ナビゲーション以外で閉じる手段がなかった。新キー deep.closeBrief × 8。937 → 938 ユニット。(UX-D-L)


[1.58.43] — 2026-05-20

fix(ux): UX-D-F — #/evaluate で空送信時に専用のローカライズトーストを表示。 以前は「短すぎる」と同じメッセージ。新キー eval.emptyJd × 8。936 → 937 ユニット。(UX-D-F)


[1.58.42] — 2026-05-20

fix(ux): UX-D-J — すべての advisor ページで ETA チップを統一。 以前は #/auto のみ「⏱ ~1–2 min」表示。#/evaluate・#/deep・5 つの mode ページにも ⏱ ~30s を追加(新 advisor.eta キー × 8)。935 → 936 ユニット。(UX-D-J)


[1.58.41] — 2026-05-20

fix(ux/truthfulness): UX-D-I — コストヒントがタブ復帰時 + providers-changed イベントで再取得。 以前は 1 回のみ取得していたため、別タブでプロバイダを変更すると古い値が表示されていた。934 → 935 ユニット。(UX-D-I)


[1.58.40] — 2026-05-20

fix(ux/docs): UX-D-H — career-ops.org/docs/... 深層リンクがクリック可能であることを保証する regression-lock。 新しい tests/external-doc-links.test.mjs が views/.js と docs/help/.md を検査。932 → 934 ユニット。(UX-D-H)


[1.58.39] — 2026-05-20

fix(ux): NEW-D2 — ダッシュボードヘッダの Refresh ボタンが明示的なフィードバックを提供。 ページリロードなしで再フェッチ + 再レンダリング。2 つの新 i18n キー。931 → 932 ユニット。(NEW-D2)


[1.58.38] — 2026-05-20

fix(a11y): NEW-D3 (WCAG 4.1.2) — #/tracker 検索入力にプレースホルダとは異なるローカライズ aria-label を追加。 以前は placeholder のみで SR には目的が伝わらなかった。新 i18n キー track.searchAria × 8 言語、placeholder と異なる文字列。930 → 931 ユニット。(NEW-D3)


[1.58.37] — 2026-05-20

fix(i18n): NEW-D1 — #/pipeline の H1 を es/pt-BR/ru でローカライズ + 2 件の RU タイトル漏れを修正。 新しい tests/i18n-no-latin-leaks.test.mjs が contacto.title / health.title の RU の漏れも検出して同時修正。928 → 930 ユニット。(NEW-D1)


[1.58.36] — 2026-05-20

chore(docs): v1.58.36 — v1.58.x サイクル終了時の完全ハウスキーピング sweep。 コード変更なし。(1) qa/: 3 つのバージョン固定スナップショット(REGRESSION-END-TO-END-v1.58.16/33/35.md)を qa/archive/v158-cycle/ に移動。(2) REGRESSION-FINAL.md に §12 を追加(v1.58.4 → v1.58.35 全不変条件)。(3) UX-AUDIT-PROMPT.md に 30 行追加。(4) docs/architecture/ 更新(FRONTEND drawer、TESTING 合計 928/62/20/23)。(5) CLAUDE.md に「v1.58.x サイクルの教訓」セクション追加。(6) README ×8 に「通知 🔔」行追加 + テスト数の古い値を修正。ベースライン変更なし。(housekeeping)


[1.58.35] — 2026-05-20

fix(ui): v1.58.35 — 通知ドロワーが自動オープンしないように修正 + ヘルプに §18「通知」を追加(ユーザー報告)。 v1.58.34 のバグ: .notif-drawer { display: flex } が UA の [hidden] { display: none } に勝っていた。.notif-drawer[hidden] { display: none } を明示。ドロワーは鈴アイコンのクリックでのみ開きます。8 言語のヘルプに §18 を追加(カテゴリ表 + キーボード操作)。927 → 928 ユニット。(ユーザー報告)


[1.58.34] — 2026-05-20

feat(ui): v1.58.34 — 通知ドロワー(U-13 完全クローズ)。 v1.58.33 のキャプチャ上に: 新 API UI.onToast(fn)、トップバーのベル 🔔 + 未読バッジ、右スライド <aside role="dialog"> でローカライズされたタイトル / 空状態 / エントリ (notif.* × 8)。Esc + 閉じる + ベル再クリックで閉じる。926 → 927 ユニット。(U-13 follow-up)


[1.58.33] — 2026-05-20

fix(ux): U-13 + U-14 + U-15 — トーストジャーナル (50 件キャップ + UI.getToastHistory()) + .page-header h1 + p 安全弁ルール + #/cv の未保存変更インジケータ。 v1.58.x シリーズ完了。新規 i18n キー cv.unsaved × 8 言語。925 → 926 ユニット。(U-13/U-14/U-15)


[1.58.32] — 2026-05-20

fix(ux): U-12 — #/help TOC のフィルタ入力に min-width: 16ch を設定。 KO/JA のプレースホルダが切れないよう .help-toc__filter クラスを追加。924 → 925 ユニット。(U-12)


[1.58.31] — 2026-05-20

fix(ux): U-11 — Tracker の Legitimacy 列ヘッダにローカライズされた情報チップ ⓘ + ツールチップで High/Caution/Suspicious スケールを説明。 新規 i18n キー track.col.legitimacy.help × 8 言語。923 → 924 ユニット。(U-11)


[1.58.30] — 2026-05-20

fix(ux): U-10 — Tracker の Normalize / Dedup / Merge ボタンが data/applications.md 空のとき無効化。 ローカライズされたツールチップ (track.fixEmpty × 8 言語) が理由を表示。922 → 923 ユニット。(U-10)


[1.58.29] — 2026-05-20

fix(ux): U-9 — #/pipeline のカウンタ ↔ フィルタ行が狭幅で縦積みに。 新しい .pipeline-controls クラスと @media (max-width: 720px) でフィルタを横幅 100% に拡張。921 → 922 ユニット。(U-9)


[1.58.28] — 2026-05-20

fix(ux): U-8 — 7 つのモードページで生成プロンプトブロックがデフォルト折り畳み。 <details class="prompt-block"> でラップし、サマリは「Show prompt (N lines)」をローカライズ表示(prompt.show / prompt.lines × 8)。Copy + Run-live は引き続き上部に。920 → 921 ユニット。(U-8)


[1.58.27] — 2026-05-20

fix(ux): U-7 — verify-pipeline.mjs の === ASCII 区切りをモーダルから除去。 ハンドラ内で ^={10,}$ 正規表現により事前にストリップ。919 → 920 ユニット。(U-7)


[1.58.26] — 2026-05-20

fix(ux): U-6 — #/scan の “Active companies N/M” チップにツールチップ + aria-label で N と M の意味を提示。 新規 i18n キー scan.activeCo.help × 8 言語。918 → 919 ユニット。(U-6)


[1.58.25] — 2026-05-20

fix(ux/ia): U-5 — Dashboard の CTA を整理(ヘッダの Open Pipeline ボタンと Quick-action の Scan all sources タイルを削除)。 サイドバーとヒーロが既に両ルートをカバーしており、v1.58.3 QA の 4× Pipeline / 4× Scan を 2× ずつに減らした。917 → 918 ユニット。(U-5)


[1.58.24] — 2026-05-20

fix(ux): U-4 — エラートーストの “(METHOD /path · HTTP NNN)” 末尾を折りたたみ <details> に格納。 技術的詳細は DOM 内に保持(BUG-006 不変条件)、ヘッドラインは人間向けの文だけが残る。新規 i18n キー toast.details × 8 言語。916 → 917 ユニット。(U-4)


[1.58.23] — 2026-05-20

fix(ux): U-3 — #/followup の lastContact プレースホルダを今日 − 14 日に動的算出。 固定 2026-04-21 は時間経過で陳腐化していた。new Date() ベースで setDate(getDate() - 14) し、ISO YYYY-MM-DD を生成。915 → 916 ユニット。(U-3)


[1.58.22] — 2026-05-20

fix(ux): U-2 — #/auto の H1 が先頭の ✨ のせいで 2 行に折り返さないようにした。 auto.title から ✨ を分離し、<span class="page-icon" aria-hidden="true"> に移動。.page-header--icon は grid レイアウトで絵文字専用列を確保。914 → 915 ユニット。(U-2)


[1.58.21] — 2026-05-20

fix(ux): U-1 — #/cv の H1 + サブタイトルが他ページと統一(v1.56.0 UX-9 のチップを設計上撤回)。 .cv-breadcrumb チップを削除し、<h1 class="page-title"> + <p class="page-subtitle"> を復活。シングル <h1> 不変条件は維持。913 → 914 ユニット。(U-1)


[1.58.20] — 2026-05-20

fix(i18n/platform): I-6 — フッターのショートカットは Mac で ⌘K、それ以外で Ctrl+K、動詞はローカライズ。 修正前はプラットフォーム/言語に関わらず CTRL+K — search のリテラルが表示されていた。top.langhint に {hotkey} — 検索 形式を導入し、applyFooterHotkey() が navigator.platform に応じて {hotkey} を置換。915 → 916 ユニット。(I-6)


[1.58.19] — 2026-05-20

fix(i18n): I-4 — ロシア語 #/followup のラテン語 cadence / follow-up 流出を排除。 RU の followup 関連文字列(H1、ヒント)に cadence、follow-up、scope、timeline が混じっていたが、ロシア語ネイティブ表現に置換。914 → 915 ユニット。(I-4)


[1.58.18] — 2026-05-20

fix(i18n): I-3 — ヘルプ TOC 項目 2/5/13/14 の非ラテンロケールでの英語残りを排除。 修正前、複数のロケールヘルプ束で ## 2. App settings & API keys、## 5. Portals & Sources、## 13. Mode prompts、## 14. Apply checklist が混在していた(ru/ja/ko/zh-CN/zh-TW)。今は 8 言語全てで完全にローカライズ。913 → 914 ユニット。(I-3)


[1.58.17] — 2026-05-20

fix(i18n): I-2 — Saved-research の日付ラベルを Intl.RelativeTimeFormat でロケール化。 public/js/views/deep.js の formatRelative() は英語の today / 1d ago / Nd ago をハードコードしていた。Intl.RelativeTimeFormat(I18n.getLang(), { numeric: 'auto' }) に置換 — ブラウザネイティブで「今日/昨日」「сегодня/вчера」等のローカライズ表現を取得。7 日以上前は Intl.DateTimeFormat(locale, { dateStyle: 'medium' }) にフォールバック。912 → 913 ユニット。(I-2)


[1.58.16] — 2026-05-20

fix(ui): ブランドボタンのホバーちらつき(ユーザー報告)。 原因:.btn-primary / .btn-danger のデフォルト背景は linear-gradient(...)、:hover は単色 var(--rausch-dark)。CSS はグラデーション↔単色を補間できず、180ms の transition: background がスナップして白〜ピンクのちらつきが見えていた。修正は public/css/app.css:ホバーでもグラデーションを維持し filter: brightness(0.92) で減光 — filter はあらゆるブラウザでスムーズに補間される。.btn の transition 一覧に filter var(--transition) を追加して減光がアニメーションする。911 → 912 ユニット。(ユーザー報告)


[1.58.15] — 2026-05-20

fix(a11y/i18n): I-1 — トップバー検索の aria-label と非表示 <label> を i18n 化。 従来は全 8 言語で英文の aria-label がスクリーンリーダーに読まれていた。public/js/app.js に汎用 data-i18n-aria-label フックを追加 — applyI18n() が data-i18n / data-i18n-placeholder と同様に言語変更時に aria-label を差し替える。新規 i18n キー 2 つ(top.search.aria、top.search.label)を 8 言語に追加。任意の将来のコントロールでも再利用可。910 → 911 ユニット。(I-1)


[1.58.14] — 2026-05-20

fix(ux): M-9 — 接続バナーの「更新」ボタンにフィードバックを追加(従来は無音リロード)。 v1.58.13 以前はクリックで即 location.reload() を呼んでいた。今は「更新中…」トーストを即表示し、sessionStorage['refreshedToast'] をセット、ボタンを disabled に(連打で重ねない)、リロードを 200ms 遅延させてトーストを描画。次回ブートで app.js がフラグを検出し、成功トースト「更新しました」を出す。新規 i18n キー 2 つ(common.refreshing、common.refreshed)を 8 言語で追加。909 → 910 ユニット。(M-9)


[1.58.13] — 2026-05-20

fix(ux): M-8 — #/apply のチェックリストがインタラクティブに。 v1.58.13 まで「▶ チェックリスト生成」は項目 0〜7 を等幅 <pre> で表示するだけでチェックできなかった。今は各項目を本物の <input type="checkbox"> として描画し、<label> でラップ(クリック領域は行全体・WCAG 2.5.5)。状態は localStorage['applyChecklist:'+slug] に URL ごとに永続化 — 3 つチェック → リロード → 3 つとも残る。ボタン:未チェック項目をコピー(未消化の項目を - markdown で書き出し)と リセット。新規 i18n キー 5 つ(apply.checklist.copyUnchecked, resetBtn, copied, copyFailed, reset)を 8 言語で追加。パーサが項目を見つけなかった場合の防御的フォールバックあり。908 → 909 ユニット。(M-8)


[1.58.12] — 2026-05-20

fix(ux): M-7 — コストヒントがアクティブプロバイダに追従(OpenRouter で誤った固定額が出ない)。 UI.providerCostHint() は既に /api/status/providers 経由でプロバイダ対応していたが、public/js/api.js のマップに anthropic/gemini/openai/qwen のみ。v1.57.0 で OpenRouter が 5 番目のプロバイダとして加わってからも汎用フォールバック 0.03 に落ち、表示名も小文字 openrouter のままだった。今回 EST に openrouter: null を追加(ルーターがモデルを選ぶためコストは可変)、=== null 分岐でローカライズされた「cost varies (router picks)」を出力。NAME には openrouter: 'OpenRouter'。新規 i18n キー cost.varies を 8 言語で追加。907 → 908 ユニット。(M-7)


[1.58.11] — 2026-05-20

fix(ux): M-4 — 保存済みリサーチカードのタイトル↔日付の間隔を構造的 CSS に(従来はインライン margin)。 v1.58.3 の MASTER リグレッションで、一部のカードに software-engineer-generaltoday(タイトルと日付の間に空白なし)が確認された。原因は 2 つの裸の <span> の間の style="margin-left: 8px" インラインに依存しており、特定エントリで崩れていたこと。public/js/views/deep.js を修正 — 2 つの <span> を .saved-card__title + セマンティックな <time class="saved-card__date" datetime="…"> に置き換え、フレックスコンテナ .saved-card でラップ。間隔は gap: var(--space-2, 8px) で制御するため崩れず、<time> で a11y/SEO の意味付けも得られる。906 → 907 ユニット。(M-4)


[1.58.10] — 2026-05-20

fix(ux): M-2 — 結果モーダル表示前に進捗トーストを排水。 #/cv の sync-check クリック時、「Running cv-sync-check.mjs…」トーストが右下に残ったまま結果モーダルが開き、注目を奪い合い狭い画面では視覚的に重なっていた。Health ページの Doctor / verify-pipeline ボタンは UI.modal() 前に UI.dismissToast() を明示呼び出ししていたが、cv.js の sync-check のみ抜けていた。public/js/api.js で UI.modal() の最初の実行文として dismissToast() を呼ぶよう変更(境界での多層防御)。あわせて cv.js のハードコード英語文字列を t('cv.syncCheckRunning') / t('cv.syncCheck') に置換し、BUG-008 不変条件(モーダルタイトル == ローカライズボタンラベル)も満たす。新規 i18n キー 2 つを 8 言語で追加。905 → 906 ユニット。(M-2)


[1.58.9] — 2026-05-20

fix(a11y): M-1 — フォームフィールドに可視 :focus-visible リングを復元(WCAG 2.4.7 Level AA)。 v1.58.3 MASTER リグレッションで getComputedStyle(focusedInput) が outline: rgb(255,255,255) none 1.5px を返し、none キーワードがリング幅を 0 px に潰していたことを確認。根本原因:.input, .textarea, .select { outline: none } と .searchbar input { outline: none } のベース指定がグローバル *:focus-visible より優先度が高く、ページあたり 88 個のフォーカス可能要素のキーボードフォーカスリングを静かに消していた。修正は public/css/app.css — 明示的に .input:focus-visible/.textarea:focus-visible/.select:focus-visible と .searchbar input:focus-visible を追加し outline: 2px solid var(--rausch) + 半透明 box-shadow を付与。マウスフォーカス(:focus)は従来通りクリーン。904 → 905 ユニット(静的契約ガード);Playwright 60 → 61(Tab トラバーサル)。(M-1)


[1.58.8] — 2026-05-20

feat(health): OPENAI_API_KEY / QWEN_API_KEY / OPENROUTER_API_KEY を #/health に表示(GEMINI_API_KEY と同様)。 v1.57.0 で OpenRouter が 5 番目のヘッドレス live-eval プロバイダとして追加され、v1.55.3(UX-2)で 4 プロバイダのオンボーディングも表示されるようになった。しかし #/health ページでは GEMINI_API_KEY と ANTHROPIC_API_KEY のみ表示され、残り 3 つはルーティング対象でありながら見えない状態だった。ユーザー要望:「set / unset (manual mode)」行のパターンを全ヘッドレスプロバイダに拡張。server/lib/routes/health.mjs に 3 つの任意チェック行を追加(/api/status/providers と同じ isUsableKey ゲートに接続)。hasOpenAIKey() / hasQwenKey() / hasOpenRouterKey() は既にインポート済みで未使用だった。Health ビューは body.checks を反復するため 8 言語の文字列追加は不要。903 → 904 ユニット。(ユーザー要望)


[1.58.7] — 2026-05-20

fix(security): NEW-2 — isValidJobUrl がペアのテンプレートプレースホルダ構文(${…}、{{…}})を拒否するよう修正、エラーメッセージと整合化。 POST /api/pipeline の 400 エラーは 「contain no script or template characters」 と謳っていたが、v1.58.3 MASTER リグレッションで実際には ASP/EJS 形式の <%…%> のみが [<>"'\\s]ガードの副作用で阻止されており、JS テンプレートリテラル${TEST}と Mustache/Handlebars{{TEST}}は素通りだったと確認。fix-prompt の Option A(正規表現をメッセージに合わせる)で、[server/lib/security.mjs](https://github.com/Fighter90/career-ops-ui/blob/main/server/lib/security.mjs) に新規TEMPLATE_PATTERNS 配列(/${[^}]}/、/{{[^}]}}/)を追加し、new URL(…)の前にhasTemplatePlaceholder(url) でチェック。**ペア** のみを拒否({normal}` のような正当な ATS パスはそのまま許可)。901 → 903 ユニット。(NEW-2)


[1.58.6] — 2026-05-20

fix(a11y/i18n): BUG-008-tb — トップバーの Doctor モーダルタイトルがローカライズ済みボタンラベルと一致するよう修正。 v1.58.0 でクローズした台帳 BUG-008(「モーダルタイトル == ローカライズ済みボタンラベル」)は Health ページのエントリーには適用されていたものの、v1.58.3 の MASTER リグレッションで トップバー のエントリーが不変条件に違反していることが判明:UI 言語に関わらず、トップバーの Doctor をクリックすると常に doctor(英語小文字)というモーダルタイトルが表示されていました。修正は public/js/app.js:118 — リテラル 'doctor' を I18n.t('top.doctor', 'Doctor') に置換。top.doctor キーは 8 言語すべてに既に存在(EN Doctor、ES/pt-BR Diagnóstico、KO 진단、JA 診断、RU Диагностика、zh-CN 诊断、zh-TW 診斷)し、ボタンが data-i18n="top.doctor" で宣言しているキーと同一です。tests/qa-report-fixes.test.mjs に静的契約ガードを追加。900 → 901 ユニット; Playwright 60/60。(BUG-008-tb)


[1.58.5] — 2026-05-20

fix(ui): NEW-3 — #/followup Run-live 二重 POST は 再現不能 と判定、Playwright リグレッションガードで施錠。 v1.58.3 の MASTER リグレッションでは(monkey-patch した window.fetch で計測)、#/followup の Run live を一度クリックしただけで /api/mode/followup への同一 POST が約 2 秒以内に 2 件 観測されました(company/role/notes 入力済み、日付は空欄)。fix-prompt の「まず再現せよ」原則に従い、public/js/views/mode-page.js::submit() を精査した結果:(a) Run live と Generate prompt はいずれも <button> 要素で onClick を 1 つだけ持ち、親 <form> も addEventListener('submit') もないため二重発火が成立しない、(b) UI.withSpinner()(FIX-L1)がリクエスト発火中は button.disabled = true を設定し、二度目の物理クリックを根本でブロック、の 2 点が確認できました。tests/playwright-smoke.mjs に新規テストを追加し、リグレッションの再現レシピを忠実に踏みます — company/role/notes を入力し、日付を意図的に空欄のままにし、Run live と同じ submit() を呼ぶ手動ボタンを 1 回クリックして、3 秒間で POST /api/mode/followup が 正確に 1 件 であることを検証します。ロケール非依存のセレクタ(8 言語すべてで ▶ グリフは同一)を採用し、同一ブラウザコンテキスト内で先行する言語切替テストの影響を防ぐため addInitScript で career-ops-ui:lang=en を事前注入。Playwright 59 → 60。元の QA 観測はレシピとして記録するに留め、製品コード変更は不要。(NEW-3)


[1.58.4] — 2026-05-19

fix(security): NEW-1 — すべてのレスポンスに Content-Security-Policy を付与(従来はループバック時に欠落)。 v1.58.4 以前は isPubliclyExposed() が真(HOST がループバック外)のときだけ CSP ヘッダーを付与していたため、127.0.0.1 上では / も /api/health も CSP なし で応答し、UI.md() のエスケープ優先契約が唯一の XSS 防御でした。v1.58.3 の MASTER リグレッション(§5)がこれを stop-ship 不変条件として指摘。CSP は 無条件 となり、バインドアドレスに関係なく全レスポンスで同一です:default-src 'self'; script-src 'self'; style-src 'self' https://fonts.googleapis.com 'unsafe-inline'; font-src 'self' https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'。script-src は 'unsafe-inline'/'unsafe-eval' を一切許可しません。ディレクティブ集合は従来の公開時専用ポリシーから変更なし(SPA に最適化済み — Inter 用に Google Fonts を許可リスト化)のため、視覚・機能のリグレッションはありません。tests/security-headers.test.mjs を書き直し、Playwright のルート巡回(en/ru/ja/zh-TW × 7 ルート)で CSP 違反 0 を検証。ユニット 900 · Playwright 58→59 · e2e 20/20+23/23。後続の fix-prompt 項目はプロジェクト方針に従い one-fix リリースとして順次公開します。(NEW-1)


[1.58.3] — 2026-05-19

fix(deep): R-2 / FIX-C1 — 調査出力から孤立/不均衡なエージェント足場タグを除去。 v1.58.0 の cleanLlmMarkdown は対ブロックと末尾の開きタグのみ除去。v1.58.2 の深い回帰で、開きの無い孤立 </tool_response>(</thinking>)がそのまま保存ブリーフに出ていた。最終の保守的スイープで、単独の足場トークン(開閉・均衡不問)、Anthropic ツール XML(<invoke>/<parameter>/antml:*)、tool_* フェンスを除去。純粋・冪等。実 <https://…> 自動リンク/コードは保持。FIX-C2 は再現せず(i18n.js は既に <html lang> 設定+navigator.language 検出)。両者を回帰ガードで固定。896 → 900 ユニット · Playwright 58/58。v1.58.3 fix-prompt の残りは one-fix ship でキュー(バッチ不可)。


[1.58.2] — 2026-05-19

fix(i18n): I18N-011 — #/help の目次を非 EN 7 ロケールでローカライズ。 TOC は docs/help/<lang>.md の ## 見出しから生成。3/4/6/7/8/9/10/11/12 章が es/pt-BR/ko/ja/ru/zh-CN/zh-TW で 英語 タイトルのままで、サイドバーは翻訳済みなのに TOC は英語でした。各見出しをサイドバーの nav.* キーと同一の語にローカライズ(単一の真実源 — TOC とサイドバーが一致)、章番号と (#/route …) は原文維持。EN は不変。v1.58 QA 唯一の i18n バックログを解消。ドキュメントのみ;896/896 ユニット · 33/33 help · Playwright 58/58。


[1.58.1] — 2026-05-19

fix(test): CI 隔離の checkProfileCustomized ガード(v1.58.0 へのパッチ)。 v1.58.0 は助言的 pre-commit は通過したが ci.yml(Node 18/20/22)で失敗:テストが cache-bust 動的 import + PATHS 書換を使用したが paths.mjs はプロジェクトルートをプロセスごとに一度解決するため無効だった。堅牢な静的ガード(allow-list + ^(…)$/i アンカー済み正規表現;“test” を含む実名は誤検知しない)に置換。プロダクションコード変更なし;publish-package.yml も解除。896/896 ユニット · Playwright 58/58。qa/v158-regression/ 参照。


[1.58.0] — 2026-05-19

fix(qa): 外部 QA レポートのバグ一掃 + 整形済みの調査出力。 修正: BUG-001 #/followup の任意の日付をクライアントで ISO YYYY-MM-DD 検証; BUG-003 ブロック引用内でも **太字**/`code`/リンクが描画(全 Help ページ); BUG-005 重複 URL は「すでにキューにあります — スキップ」; BUG-006 無効 URL メッセージを人間向けに((POST /api/pipeline · HTTP 400) 文脈は意図的に維持); BUG-007/008 「Running doctor.mjs…」トーストをモーダル前に消す(新 UI.dismissToast())、モーダル題はボタンのローカライズ済みラベル; BUG-010 #/reports 空状態にサブタイトル; BUG-002/UX-032 checkProfileCustomized() がテストフィクスチャ名を「未カスタマイズ」と判定(親の profile.yml/cv.md は不変 — ルール #1); I18N-012/013 ロシア語 Deep research を実翻訳。新規: cleanLlmMarkdown() がエージェント足場(<tool_call>{…}</tool_call>, <tool_response>, <thinking> …)を #/deep・保存済み調査から除去(全プロバイダ+保存済みファイル配信時); #/outreach→#/contacto エイリアス(BUG-004); クライアントのネットワークエラーを I18n.t() で多言語化(8 ロケール; サーバの details は意図的に英語の診断)。テスト: 新規 tests/qa-report-fixes.test.mjs(10)・tests/llm-output.test.mjs(5)、881 → 896 ユニット、Playwright 58/58。未変更(理由付き): BUG-009(#/cv H1 は設計上、WCAG single-h1)、親データ(parent-owned)、minor i18n/UX のロングテールはバックログ。詳細は CHANGELOG.md。



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