# 指示書BF — 保存できなかった原因の表示と「種類」の日本語検索（2026-10-27）

**担当**: Claude Code（サブエージェント2本）。監督がレビューする。
**前提**: 指示書BD（API）と指示書BE（画面）が develop に入っていること（`5b2fdd0`）。

---

## 0. ユーザーの要望（2026-10-27）

- 「備考欄未記入以外でも保存できなかったときの原因を出してほしい」
  - 監督が案（§1 の表）を出し、ユーザーは「その方針でOK」と答えた
- 「エラー一覧の検索のときに英語でなく日本語でも検索できるようにしてください」
  - それに続く回答: 「エラー詳細を部分一致検索するだけで問題ないのでは？検索時に分類で絞っている場合は、絞り込まれたもの以外から検索しないように」
  - ★対象は「エラー内容を選ぶ」窓のキーワード欄★（ユーザーが画面の写しを添えて「エラーの検索部分だけのつもりでした」と訂正。2026-10-27）
  - ★旧: 監督は一覧のツールバーの「種類」の検索欄と読み、実装に入りかけた★ → 取り消して元に戻した（コミット前）
  - キーワードは★エラー詳細（日本語・英語）だけ★に部分一致させる（小分類・大分類の名前には当てない）。分類の選択とは AND（選んだ分類の外からは拾わない）

## 1. 保存できなかった原因の表示（画面）

保存できなかった行の下に出す文言を、画面側で失敗の種類から決める。
判定は純粋関数1つにまとめる（例 `lib/errors/save-error-message.ts`）。テストする。

| 失敗の種類（判定に使うもの） | 出す文言 |
|---|---|
| 保存前の検証（その他・備考なし） | その他を選んだときは備考を入力してください（今のまま） |
| 422 かつ `details.error_list_id` あり（選べない行） | この行ではエラー内容を選べません |
| 422 かつ `details.error_list_id` あり（それ以外。選択肢に無い・無効） | 選んだエラー内容は今は使えません。選び直してください |
| 422 かつ `details.note` あり（その他・備考なし。サーバー側で止まった） | その他を選んだときは備考を入力してください |
| 422 で備考の長さ（400文字超） | 備考は400文字以内で入力してください |
| 422 のその他 | サーバーの文言（無ければ「入力内容を確かめてください」） |
| 404 | このエラーは削除されたため保存できません。画面を読み込み直してください |
| 401 | ログインし直してください |
| 500 など 5xx | サーバーで保存に失敗しました（DB への書き込みエラー）。時間をおいて保存し直し、続くときは管理者に連絡してください |
| 通信の失敗（status 0） | 通信に失敗しました。接続を確かめて保存し直してください |
| どれにも当たらない | 保存に失敗しました（今の既定） |

- 判定には `ApiFetchError` の `status` / `details` / `serverMessage` を使う（`lib/api/client.ts`）
  - 選べない行と、選択肢に無い・無効との区別は、`details.error_list_id` の中の文言で判定してよい（サーバーの文言は `lib/errors/status-update.ts`）
  - より確かな手段（コードの比較など）があればそちらを使う
- 文言は `lib/i18n.ts` に JP / EN の両方を入れ、表示で `t()` を通す
- ★エラー一覧の画面（`ErrorsScreen.tsx`）だけ★。アラート・D-Sec アラートの画面は変えない

## 2. 「エラー内容を選ぶ」窓のキーワードを、エラー詳細だけに当てる（画面）

- `lib/errors/error-content-picker.ts` の `filterErrorLists` を直す
- キーワードは `error_detail_ja` と `error_detail_en` の★両方★に部分一致させる（画面の言語によらない）
  - ★小分類・大分類の名前には当てない★（旧: 今の言語の詳細・小分類・大分類と、もう一方の言語の詳細）
- ★分類の選択とは AND★。選んだ分類の外の項目は、キーワードに当たっても出さない
- 日本語の入力の揺れを吸収する。両辺を同じ規則でそろえてから比べる:
  - NFKC（全角・半角の英数字、半角カナ、全角スペース）
  - 小文字化
  - ひらがな→カタカナ
  - 例: 「ばってりー」「ﾊﾞｯﾃﾘｰ」で「バッテリー」に、「ＣＡＮ」で「CAN」に当たる
  - 監督の判断。ユーザーの「日本語でも検索できるように」に合わせた
- 一覧の「種類」の検索欄（`GET /errors` の `error_type`）は★変えない★
- テスト:
  - 日本語の詳細で当たる
  - 英語の詳細で当たる（画面が日本語のときも当たる）
  - 分類の名前だけでは当たらない
  - ひらがな・半角カナ・全角英数・全角スペースの揺れを吸収する
  - 分類の外は当たっても出さない

## 3. 共通ルール

- G1〜G4（指示書AZ §2）
- `git add -A` 禁止
- `docs/decisions.md`・`docs/handoff/指示書AY_*`・`docs/handoff/設計_制御盤ログの取り出し_*` は触らない（別セッションの未コミット差分）
- 完了したら、tsc・lint・vitest の件数を報告する
