# UI差分まとめ 第4章 — 26件の「記録あり / 仕様 / 不具合 / 要判断」振り分け調査

**作成: 2026-09-17 / ブランチ: `develop`（`79bcf20` 時点。作業ツリーは clean）/ ★調査のみ。コードは1行も変更していない★**

---

## 0. この文書の位置づけ

`docs/UI差分まとめ_20260915.md` ★第4章（`:223-255`）の26件★を「仕様」と「不具合」に振り分けるための材料です。

- ★本文書は決定ではありません★。決めるのはユーザーで、決めた内容は `docs/decisions.md` に残してください（★採番は監督★）
- ★根拠はすべて実測★（`file:line` / grep コマンド）。推測の箇所は「推測」と明記しました
- ★第3章の8件は D-143 §3 / D-146 で片付いています★。★第4章にはその6件がそのまま残っているため、まず陳腐化の整理が要ります★
- ★`docs/UI差分まとめ_20260915.md` は書き換えていません★（訂正は監督が行う）

### 使った grep（すべて再実行可能）

```
$ grep -n "^### D-" docs/decisions.md            # 最新は D-148（`^### D-0` では3桁台を拾えない）
$ grep -rn "ログアウト\|logout" docs/
$ grep -n "空状態\|該当するログはありません\|該当なし\|読み込み中" docs/decisions.md docs/handoff.md
$ grep -n "平日のみ\|土日のみ\|曜日\|サブタイトル\|メーカーPill\|備考セル\|統計カード\|アンバー\|D-Sec ログ" docs/decisions.md docs/handoff.md
$ grep -n "StatCard\|共通カード\|色帯\|大文字\|uppercase" docs/decisions.md docs/handoff.md
$ grep -n "絞り込み条件に一致する全件\|表示中のページ\|注意文\|アドバイスはありません\|該当するエリア" docs/decisions.md docs/handoff.md
$ grep -n "SHOW_ALL_LIMIT\|weekdaysLabel\|weekdays_label" docs/decisions.md docs/handoff.md
$ grep -n "全エリアが◎○\|total_count=1\|404 にしない" docs/decisions.md
$ grep -n "全期間\|既定値\|date_from\|resolved_at" docs/decisions.md
```

---

## 1. 結論 — 26件の分類表

**内訳: ★記録あり 11件★ / ★仕様として記録すべき 12件★ / ★不具合 2件★ / ★判断が要る 1件（＋サブ項目2件）★**

凡例: **記** 記録あり（第4章の記載が誤り、または09-16以降に決着） ／ **仕** 仕様として記録すべき ／ **バ** 不具合 ／ **判** 判断が要る

| # | 画面 | 内容 | 現状（実測） | モック | 記録 | 判定 |
|---|---|---|---|---|---|---|
| 1 | 共通 | メニューの未対応件数バッジが無い | `components/layout/AppShell.tsx:36-53`（`NavItem` に `badge` 引数が無い） | `d-watch-mock.jsx:372,378,391` | ★D-143 §3 #4（`docs/decisions.md:11411`）/ D-146 §8 #4（`:11891`）★ = ★足さない・保留で確定★ | **記** |
| 2 | 共通 | ログアウトの導線が無い | API は `app/api/auth/logout/route.ts` にあるが、`components/` からの呼び出し0件 | ★モックにログイン自体が無い★ | ★無し★（`grep -rn "ログアウト" docs/` は `docs/code-map.md:617`「画面からの呼び出しは現状なし」の**事実記載**のみ） | **仕**※1 |
| 3 | ダッシュボード | 清掃ログ表が4列 | ★5列になっている★（`CleanLogTable.tsx:168` の `colSpan={compact ? 5 : 11}`） | `d-watch-mock.jsx:311` 付近 | ★D-146 §1 #3（`:11767`）★ = ★「出発」1列だけ足す＝5列で確定・実装済み（`065c9a7`）★ | **記** |
| 4 | ダッシュボード | 行展開アドバイスが無効 | ★有効★（`CleanLogTable.tsx:30,174,183` に `!compact &&` が無い） | 同上 | ★D-146 §1 #6 / §5（`:11833`）★ = ★有効化済み（`148734b`）。根拠だった「規約」は存在しなかった★ | **記** |
| 5 | ダッシュボード | 「判定 ?」ボタンが機能しない | ★機能する★（`DashboardScreen.tsx:64,290-291` の `showGradeInfo`） | — | ★D-146 §1 #2（`:11767`）★ = ★修正済み（`49a5ce9`）★ | **記** |
| 6 | ダッシュボード | 未解消件数バッジが1枚だけ | `DashboardScreen.tsx:217-219`（D-Sec の Pill のみ） | `d-watch-mock.jsx:479-480`（未解消＋D-Sec の2枚） | ★無し★。ただし ★`DashboardResponse`（`lib/types/index.ts:1080-1123`）に事前チェック未解消件数のフィールドが無い★ のは実測で確認 | **仕**※2 |
| 7 | ダッシュボード | 表の空状態の文言 | `CleanLogTable.tsx:168-170`「該当するログはありません」 | 無し | ★無し★ | **仕** |
| 8 | 清掃詳細ログ | CSVの注意文を常時表示 | `DetailLogScreen.tsx:487` | 無し | ★★記録あり — D-120 項14 ③（`docs/decisions.md:7994`）★★「CSV と画面の件数が食い違う → ★清掃詳細ログに注記を出すだけにした★」。D-136（`:10346`）が表示方法を精緻化 | **記** |
| 9 | 清掃詳細ログ | アドバイス0件時の文言とボタン非表示 | `CleanLogTable.tsx:226-229`（文言）/ `:251-260`（ボタンは `advices.length > 0` の中） | （△×は必ず何か出る） | ★無し★ | **仕**※3 |
| 10 | 清掃詳細ログ | エリアモーダルの空状態を2種に分岐 | `AreaModal.tsx:115-119` | 1種類 | ★★根拠は記録あり — D-119（`docs/decisions.md:7726`）★★「全エリアが◎○ → `items` は空配列・`total_count=1`（★404 にしない★）」。★文言そのものの記録は無い★ | **記**※4 |
| 11 | アラート | サマリーカードの見た目（色帯・文字サイズ） | 共通 `StatCard`（`components/ui/StatCard.module.css`: 36px / uppercase / `border-left: 3px`） | アラート画面だけ専用の小型カード（`d-watch-mock.jsx:587-598`。28px・色帯なし） | ★無し★ | **仕**※5 |
| 12 | アラート | 「合計」カードの色 | `AlertsScreen.tsx:144` `tone="ac"` | `d-watch-mock.jsx:596` `color={c.txD}`（グレー） | ★無し★。`StatTone` は `ok\|wn\|ng\|ac` の4値のみ（`StatCard.tsx:8`）＝★中立トーンが存在しない★ | **仕**※5 |
| 13 | アラート | 日付の既定値が空 | `AlertsScreen.tsx:58-59` `useState("")` | `d-watch-mock.jsx:604-606` `defaultValue="2026-03-27"`（★飾り。`onChange` なし★） | ★無し★ | ★**判**★ |
| 14 | アラート | 「解消」バッジに日付を追加 | `AlertsScreen.tsx:36-38,298`（`formatMd` + `formatHm`） | `d-watch-mock.jsx:644`「解消 (01:45)」 | ★無し★ | **仕**※6 |
| 15 | アラート | バッテリー残量行 | `lib/fixtures/prechecks.ts` に値あり・実DBは常に `null` | 無し | ★★記録あり — D-105 項5（`docs/decisions.md:5602`）/ D-114★★（第4章 `:244` で訂正済み） | **記** |
| 16 | レポート | 絞り込みを実動作にした | `ReportsScreen.tsx:97-102,265-267,323`（draft / 確定の分離、`<form onSubmit>`） | `d-watch-mock.jsx:679` の「検索」ボタンは飾り | ★★記録あり — D-069 項8（`docs/decisions.md:763-764`）★★「検索欄（施設名・シリアル・ステータス）は★「検索」ボタン押下時のみ★APIに反映する」 | **記** |
| 17 | レポート | 「上位10件に戻す」「全N施設を表示」の出現条件 | `FacilityPerformanceTable.tsx:155-164`（★理由をコードコメントに明記済み★） | `d-watch-mock.jsx:821` `RANK.length > 10`（10 を直書き） | ★無し★（決定としては未記録。D-120 項14 ②（`:7993`）は `SHOW_ALL_LIMIT` の別件） | **仕** |
| 18 | レポート | 空状態の文言 | `ReportsScreen.tsx:570`「該当施設なし」/ `:667`「該当なし」 | 無し | ★★記録あり — D-069 項6（`docs/decisions.md:744-747`）★★「エラー種別内訳の空データ時の文言は『該当なし』（★モックが持たない空データ文言として新規に採用★）」 | **記** |
| 19 | D-Secログ | 見出しの表記ゆれ（英語対訳が当たらない） | `DsLogScreen.tsx:301` `t("D-Secログ")` | `d-watch-mock.jsx:833` `t("D-Sec ログ")`（半角スペースあり） | ★無し★。★`lib/i18n.ts:37` に `"D-Sec ログ": "D-Sec Logs"` が**孤児キーとして残っている**★（D-143 §4 #4 が「使用箇所0」と実測済み） | ★**バ**★ |
| 20 | D-Secログ | 統計カードのラベル短縮／並び順／案内文／備考セルの色 | ラベル `DsLogScreen.tsx:306-308`／並び順 `:300-404`（カード→フィルタ）／案内文 `:367`／備考色 `DsLogScreen.module.css:148` `var(--tx-m)` 固定 | `d-watch-mock.jsx:834-851`（フィルタ→カード。ラベル「D-Sデバイス総数／正常稼働／異常・通信断」／案内文「施設名 / デバイスID」）／`:884` `color: d.n ? c.wn : c.txM` | ★無し★。ただし案内文は ★D-129 の照合規則表（`docs/decisions.md:8823-8824`）★ と一致（`facility_name` + `serial_number` を検索。`lib/ds-devices/query.ts:87-88` で実測）。備考の意味変更は ★D-065 / D-076★ | **仕**＋★判1件（備考セルの色）★ |
| 21 | D-Secアラート | 「通信断」バッジの色 | `DsAlertsScreen.tsx:36-38` `c.wn`（アンバー） | 赤 | ★D-143 §3 #5（`:11412`）/ D-146 §8 #5（`:11892`）★ = ★アンバー維持で確定★ | **記** |
| 22 | D-Secアラート | 期間フィルタが無い | `DsAlertsScreen.tsx:86-95`（`date_from` / `date_to` を組み立てていない） | `d-watch-mock.jsx` の日付欄は★飾り★ | ★D-146 §8 #7（`:11893`）★ = ★今は入れない。入れるなら `d-watch-api.yaml` の変更から★ | **記** |
| 23 | 施設マスタ | メーカーPillの見た目 | 共通 `Pill`（`components/ui/Pill.module.css`: 12px / `padding: 2px 8px` / 太字なし / 背景 `color + "22"`） | `d-watch-mock.jsx:1019`（11px / `padding: 2px 6px` / `fontWeight: 600` / 背景 `c.prD`） | ★無し★ | **仕**※5 |
| 24 | スケジュール | 曜日に「平日のみ」「土日のみ」「なし」を追加 | `lib/format/schedule.ts:17-28` | `d-watch-mock.jsx` は「毎日」「月水金」の2例のみ | ★`docs/decisions.md` には無し★。ただし ★`docs/fixtures.md:216`★ と ★`docs/code-map.md:1264`★ が対応表を明記 | **仕**※7 |
| 25 | システム管理 | サブタイトルの位置 | `SystemScreen.tsx:245-251`（h1 直下に昇格、`運用設定` は h2 に分離） | `d-watch-mock.jsx:1631-1633`（カード見出し「運用設定」の中） | ★無し★。ただし ★D-084 段階6 / 項4（`docs/decisions.md:2721,2745`）★ が「9タブUIを作らず運用設定1画面にする」「モックの `:1628` 側を採用」と記録済み＝★位置変更はその帰結★ | **仕** |
| 26 | 全画面 | 空状態・読み込み中・エラー表示の追加（EN未対応を含む） | 空状態12箇所・`読み込み中…`12箇所・エラー表示11箇所（下の §4 に実測一覧） | 無し | ★無し★ | **仕**＋★**バ**（EN が壊れている10箇所）★ |

### 表の注

- ※1 **#2 ログアウト**: ★モックにはログイン画面が無いので「モックから外れた差分」ではありません★。ログイン画面（D-101）を足したときに導線だけ作らなかった、という★新規UIの未完成★です。`docs/code-map.md:617` が「画面からの呼び出しは現状なし」と★事実として★書いており、意図の記録ではありません。
- ※2 **#6 ヘッダのバッジ**: モックの `unresPre`（事前チェック未解消件数）に相当する項目が API に無いことは実測で確認しました（`lib/types/index.ts:1080-1123`）。★D-143 §3 #4 が同じデータについて「現状足さない。保留」と決めている★ので、★同じ判断がここにも及ぶ★と読むのが自然です（→ §3 の確認事項 J-4）。
- ※3 **#9 アドバイス0件**: ★この分岐は現在の発火条件では到達しません★（実測）。`lib/db/clean-log-mapping.ts:177` が ★`departed === false` ⟺ `completion_rate === null`★ を不変条件として保証しており、`lib/judge/advice.ts:60-83` は △（10〜70%未満）→ B1、×（10%未満）→ R2、未実施（null ⇒ 未出発）→ R1 か R3/R4 を必ず返します。★つまり △× の行で0件になる経路が無い★ので、文言もボタン非表示も★防御的な分岐★です。★ただし到達したときはエリア別詳細ボタンごと消える★ので、その事実は残す価値があります。
- ※4 **#10**: 「404 にしない＝空配列で返す」という★API契約の決定★は D-119 にあります。★画面が2文言に分けたこと自体★の記録はありません。
- ※5 **#11 / #12 / #23 は同じ原因**: ★モックが同じ種類の部品を画面ごとに書き分けていたものを、実装が共通部品1つに寄せた★結果です。`components/ui/StatCard` は★モックのダッシュボードの `Num`（`d-watch-mock.jsx:99-107`）をそのまま移植した部品★で、36px・uppercase・`letterSpacing 1.2`・`borderLeft 3px` まで一致します。つまり ★モックの中でも「ダッシュボード流」と「アラート流」の2種類があり、実装は前者に統一した★ということです。同様に `components/ui/Pill` はモックの `Pill`（`:91-97`）の移植で、施設マスタのメーカーバッジ（`:1019`）だけがモック内で独自に書かれていました。
- ※6 **#14**: #13（日付既定値が空＝全期間）と★セット★です。全期間を既定にすると一覧に複数日のアラートが混ざるため、★時刻だけでは「いつ解消したか」が読めなくなります★。
- ※7 **#24**: `weekdaysLabel()` は7桁ビット列 128 通りすべてを扱う関数で、モックはその値域のうち2例を書いていただけです。★モックから「外れた」というより、モックが網羅していなかった★というのが正確です。

---

## 2. ★第4章の記載が誤っていたもの★（記録があったのに「記録なし」とされていた）

★★4件★★（うち1件は第4章の中で訂正済み）。★いずれも第4章の作成日（2026-09-15）より前に記録されていました★。

| # | 件名 | 実際の記録 | 記録日 |
|---|---|---|---|
| 8 | 清掃詳細ログ CSVの注意文 | ★D-120 項14 ③（`docs/decisions.md:7994`）★ | 2026-09-11 |
| 16 | レポート 絞り込みを実動作にした | ★D-069 項8（`docs/decisions.md:763-764`）★ | 2026-09-07 |
| 18 | レポート 空状態の文言 | ★D-069 項6（`docs/decisions.md:744-747`）★ | 2026-09-07 |
| 15 | アラート バッテリー残量行 | ★D-105 項5（`docs/decisions.md:5602`）/ D-114★（★第4章 `:244` で訂正済み★） | 2026-09-10 |

**部分的に記録があったもの（1件）**

| # | 件名 | 実際の記録 | 何が記録され、何が記録されていないか |
|---|---|---|---|
| 10 | エリアモーダルの空状態2種 | ★D-119（`docs/decisions.md:7726`）★ | ★「全エリアが◎○」を404にせず空配列で返すという**API契約**は記録あり★。★画面が2文言に分けたことは記録なし★ |

**第4章の作成後（09-16／09-17）に決着したもの（6件）** — ★記載の誤りではなく陳腐化です★

| # | 件名 | 決着 |
|---|---|---|
| 1 | メニューの未対応件数バッジ | D-143 §3 #4（足さない・保留） |
| 3 | 清掃ログ表が4列 | D-146 §1 #3（★5列にして実装済み。8列に戻す作業として再提案しないこと★） |
| 4 | 行展開アドバイスが無効 | D-146 §1 #6（有効化済み） |
| 5 | 「判定 ?」ボタン | D-146 §1 #2（修正済み） |
| 21 | 「通信断」バッジの色 | D-143 §3 #5（アンバー維持） |
| 22 | D-Secアラートの期間フィルタ | D-146 §8 #7（今は入れない） |

> ★★第4章の表（`:229-255`）は、この11行が実質すでに片付いています★★。★残る「本当に未記録」は15件★です。

---

## 3. ★★ユーザー判断が要るもの★★

### J-1 — アラートの日付既定値を「空＝全期間」のままにするか（#13）

**現状**: `components/features/alerts/AlertsScreen.tsx:58-59` が `useState("")`。
対応状況フィルタの既定は `"open"`（`:60`）なので、★画面を開いた初期状態は「未解消の全期間」★です。

| 選択 | 何が起きるか（具体例） |
|---|---|
| ★このまま（全期間）★ | ★3日前に出て未解消のままのアラートが、翌朝に画面を開いた時点で見える★。「翌朝確認型」の運用（`CLAUDE.md` §1）とは相性がよい。一方 ★一覧に複数日が混ざる★ので、#14（解消バッジに日付を出す）が★必須★になる。件数が増えたときはページ送り（D-120）頼み |
| ★当日を既定にする（モック相当）★ | 開いた瞬間は当日ぶんだけ。★昨夜以前から未解消のアラートが初期表示から消える★ — ★★「未解消なのに画面に出ない」が起きる★★。運用担当が日付を手で戻さないと取りこぼす |

★推奨は現状維持★（上の理由。ただし決めるのはユーザー）。

### J-2 — D-Secログの備考セルを「備考があるとき色を変える」に戻すか（#20 の一部）

**現状**: `components/features/ds-logs/DsLogScreen.module.css:148` が `color: var(--tx-m)` 固定。
**モック**: `d-watch-mock.jsx:884` が `color: d.n ? c.wn : c.txM`（備考ありはアンバー）。

| 選択 | 何が起きるか |
|---|---|
| ★このまま（常にグレー）★ | ★備考は D-065 / D-076 で「DBに無い、運用担当の自由メモ」と判明した★ので、★アンバー＝警告色を当てると「異常がある行」と誤読される★。★同じ画面の「接続状態」列が異常＝赤／正常＝緑なので、備考の色と意味が干渉する★ |
| ★モックに戻す（備考ありはアンバー）★ | ★どの行にメモが入っているか一覧で分かる★（12行でも探すのは面倒）。ただし上の誤読リスクを負う。★中立色（`var(--tx)` など）で「入っている」ことだけ示す第3案もある★ |

### J-3 — EN の抜けをいま直すか、英語配布を決めるまで保留するか（#19 / #26 の一部）

★D-143 §3 #1 で「★英語を配布するか未定★」を理由に i18n の不具合（`未対応` の誤訳）を★直さないと決めています★。
★本章で見つかった2件も同じ性質★ですが、★こちらは辞書の側ではなく呼び出しの側の漏れ★で、★JA表示には一切影響しません★。

| 件 | 実測 | 直す手間 |
|---|---|---|
| ★#19 D-Secログの h1★ | `DsLogScreen.tsx:301` が `t("D-Secログ")`。辞書にあるのは `lib/i18n.ts:37` の `"D-Sec ログ"`（★半角スペースあり★）で★当たらない★。孤児キーであることは D-143 §4 #4 が実測済み | ★`lib/i18n.ts:37` のキーを `D-Secログ` に直す1行★。JA表示は変わらない |
| ★#26a `読み込み中…` / エラー文言★ | ★辞書には既にある★（`lib/i18n.ts:73` `"読み込み中…": "Loading…"` / `:336` `データの取得に失敗しました: "Failed to load data"`）。なのに ★10箇所が `t()` を通さず生文字列で書かれている★（§4 の表） | ★`t()` で包むだけ★。JA表示は変わらない |

| 選択 | 帰結 |
|---|---|
| ★いま直す★ | ★JA は1文字も変わらない★ので回帰リスクは実質ゼロ。★英語配布を決めたときの残作業が減る★ |
| ★英語配布を決めるまで保留★ | D-143 §3 #1 と歩調が揃う。★ただし「辞書に登録済みなのに当たらない」状態は、次の担当者が辞書を見て「対応済み」と誤認する★ |

### J-4 — 確認だけ: ダッシュボードのヘッダバッジ（#6）も「足さない」でよいか

★D-143 §3 #4 は「★サイドバーの★未対応件数バッジ」を足さないと決めました★。
★ダッシュボードのヘッダにも同じデータ（事前チェック未解消件数）のバッジがモックにあり（`d-watch-mock.jsx:479`）、そちらは決定に名前が出ていません★。
★データが無いこと（`lib/types/index.ts:1080-1123` に該当フィールド無し）は同じ★なので、★同じ判断を明示的に及ぼしてよいか★の確認です。

---

## 4. ★不具合と判定したもの★（2件）

### B-1 — D-Secログの h1 が英語対訳に当たらない（#19）

```
$ grep -n "D-Sec ログ\|D-Secログ" lib/i18n.ts
17:  "🔒 D-Secログ": "🔒 D-Sec Logs",      ← サイドバーのメニュー（当たる）
37:  "D-Sec ログ": "D-Sec Logs",           ← ★孤児。使用箇所0★
$ grep -n 't("D-Secログ")' components/features/ds-logs/DsLogScreen.tsx
301:        <h1 className={styles.title}>{t("D-Secログ")}</h1>
```

**実害**: EN に切り替えても h1 だけ「D-Secログ」と和文で出ます。
★サイドバーは `🔒 D-Sec Logs` に変わるので、メニューと見出しが英日で食い違います★。
**なぜ起きたか（推測）**: 実装で h1 から半角スペースを落としたとき、辞書のキーを直さなかった。
★`lib/i18n.ts` はキーが日本語原文の1階層辞書（`lib/i18n.ts:363-366` の `translate()` は完全一致）★なので、★原文を1文字でも変えると黙って当たらなくなります★（D-146 §9 と同じ構造）。

### B-2 — 「読み込み中…」「取得失敗」が `t()` を通っていない（#26 の一部。★10箇所★）

★辞書には登録済み★（`lib/i18n.ts:73` / `:336`）なのに、★呼び出し側が生文字列で書いている★箇所の実測一覧です。

| 種別 | `t()` 未経由（★EN で和文のまま★） | `t()` 経由（正しい） |
|---|---|---|
| `読み込み中…` | `AlertsScreen.tsx:256` / `DashboardScreen.tsx:223` / `DetailLogScreen.tsx:492` / `DsAlertsScreen.tsx:246` / `DsLogScreen.tsx:405` / `FacilitiesScreen.tsx:113` / `ReportsScreen.tsx:445` / `SchedulesScreen.tsx:115` / `SystemScreen.tsx:429` / `CleanLogTable.tsx:224` ＝ ★10箇所★ | `CleanAreaScreen.tsx:281` / `AreaModal.tsx:99` / `SystemScreen.tsx:351` |
| エラー表示 | `{error}` をそのまま描画 — `AlertsScreen.tsx:257` / `DashboardScreen.tsx:224` / `DetailLogScreen.tsx:493` / `DsAlertsScreen.tsx:247` / `DsLogScreen.tsx:406` / `FacilitiesScreen.tsx:114` / `SchedulesScreen.tsx:116` / `SystemScreen.tsx:430` | `SystemScreen.tsx:353`（`t(limitLoadError)`） |

> ★第2章（`docs/UI差分まとめ_20260915.md:200`）は「読み込み中…は4画面で未対応」と書いていますが、★実測は10箇所（9画面＋共通表）★です。★第2章の記載も過小です★（訂正は監督が行ってください）。

**空状態の文言の i18n 登録状況（実測。`grep -c` で確認）**

| 文言 | 辞書 | 呼び出し |
|---|---|---|
| `該当する施設はありません` / `該当するスケジュールはありません` / `該当データがありません` / `要レスキューの店舗はありません` / `アドバイス文言は登録されていません` / `該当施設なし` / `エリアのデータがありません` | ★あり★ | `t()` 経由 |
| ★`該当するアラートはありません`★ / ★`該当するデバイスはありません`★ / ★`問題エリアはありません（全エリア◎○）`★ | ★無し★ | `t()` 経由（だが当たらない） |
| ★`該当するログはありません`★ / ★`該当するアドバイスはありません`★ / ★`該当なし`★ / ★`本日の清掃予定はありません`★ | ★無し★ | ★`t()` すら通っていない★ |

---

## 5. ★`docs/decisions.md` に貼れる文案★（1件1行）

> ★決定番号は `D-XXX` のままにしています。採番は監督が `grep -n "^### D-" docs/decisions.md | tail -3`（★最新は D-148★）で実測してから採ってください★。

### D-XXX `[確定]` UI差分第4章26件の振り分け（記録あり11 / 仕様12 / 不具合2 / 要判断1）

**日付**: 2026-09-__ / **指示書**: なし（調査は `docs/handoff/UI差分第4章_調査_20260917.md`）/
**前提**: D-069 / D-076 / D-084 / D-101 / D-105 / D-119 / D-120 / D-129 / D-143 §3 / D-146 §1・§8 / `CLAUDE.md` §5・§9.6

#### 1. ★第4章の「記録なし」が誤りだった4件（第4章 `:229-255` の該当行を訂正すること）★

| # | 件名 | 実際の記録 |
|---|---|---|
| 8 | 清掃詳細ログ CSVの注意文を常時表示 | ★D-120 項14 ③（`docs/decisions.md:7994`）★ |
| 16 | レポート 絞り込みを実動作にした | ★D-069 項8（`docs/decisions.md:763-764`）★ |
| 18 | レポート 空状態の文言（「該当なし」「該当施設なし」） | ★D-069 項6（`docs/decisions.md:744-747`）★ |
| 10 | エリアモーダルの空状態を2種に分岐 | ★D-119（`docs/decisions.md:7726`）が根拠のAPI契約を記録済み（文言は未記録）★ |

#### 2. ★第4章の作成後に決着していた6件（陳腐化。再提案しないこと）★

| # | 件名 | 決着 |
|---|---|---|
| 1 | メニューの未対応件数バッジ | ★D-143 §3 #4 — 足さない・保留★ |
| 3 | ダッシュボードの清掃ログ表が4列 | ★D-146 §1 #3 — 「出発」1列を足して5列。★8列に戻す作業として再提案しないこと★★ |
| 4 | 行展開アドバイスが無効 | ★D-146 §1 #6 — 有効化済み★ |
| 5 | 「判定 ?」ボタンが機能しない | ★D-146 §1 #2 — 修正済み★ |
| 21 | D-Secアラート「通信断」バッジの色 | ★D-143 §3 #5 — アンバー維持★ |
| 22 | D-Secアラートの期間フィルタ | ★D-146 §8 #7 — 今は入れない★ |

#### 3. ★仕様として確定する12件（「作り忘れ」ではない。親切心で直さないこと）★

| # | 件名 | ★仕様である理由★ |
|---|---|---|
| 2 | ログアウトの導線が無い | ★モックにログイン画面が無いので「モックからの逸脱」ではない★。ログイン（D-101）に付随する★未完成★であり、足すなら新規UIとして設計する |
| 6 | ダッシュボードの未解消件数バッジが1枚だけ | ★`DashboardResponse` に事前チェック未解消件数のフィールドが無い★（`lib/types/index.ts:1080-1123`）。★D-143 §3 #4 の「足さない」を同じデータのこのバッジにも及ぼす★ |
| 7 | ダッシュボード表の空状態の文言 | ★取得0件と取得失敗を画面で区別するため★。モックは固定データなので空状態を持たない |
| 9 | アドバイス0件時の文言とボタン非表示 | ★防御的な分岐で、現在の発火条件では到達しない★（`lib/judge/advice.ts:60-83` と `lib/db/clean-log-mapping.ts:177` の不変条件により、△× の行は必ず1件以上該当する）。★到達したときはエリア別詳細ボタンも消える★ことを併記する |
| 11 | アラートのサマリーカードの見た目 | ★モック内に2流儀（`Num`＝`d-watch-mock.jsx:99-107` と、アラート画面だけの専用カード `:587-598`）があり、共通部品 `StatCard` は前者の完全移植★。★画面ごとに部品を書き分けない★ |
| 12 | 「合計」カードの色がアクセント色 | ★`StatTone` は `ok\|wn\|ng\|ac` の4値で中立トーンが無い★（`components/ui/StatCard.tsx:8`）。D-Secログの「青→シアン」と同じ原因 |
| 14 | 「解消」バッジに日付を追加 | ★日付の既定値が「全期間」なので、一覧に複数日が混ざる★。時刻だけでは「いつ解消したか」が読めない |
| 17 | 「上位10件に戻す」「全N施設を表示」の出現条件 | ★モックは既定件数 10 を直書きしている★。実装は `totalCount` と `items.length` の比較にして★既定件数を知らずに済む形★にした（`FacilityPerformanceTable.tsx:155-164`） |
| 20 | D-Secログの統計カードのラベル短縮／並び順／案内文 | ★ラベル★: 接続状態が2値化（D-065 / D-076）して「異常・通信断」が成り立たなくなった。★並び順★: 他2画面（アラート / D-Secアラート）が「見出し→カード→フィルタ」で、D-Secログだけモックで順序が違っていた。★案内文★: 実際の検索対象が `facility_name` + `serial_number`（`lib/ds-devices/query.ts:87-88`。D-129 の照合規則表）なので、モックの「デバイスID」は事実と合わない |
| 23 | 施設マスタのメーカーPillの見た目 | ★共通部品 `Pill` はモックの `Pill`（`d-watch-mock.jsx:91-97`）の移植★。モック内でこの1箇所（`:1019`）だけが独自に書かれていた |
| 24 | 曜日に「平日のみ」「土日のみ」「なし」 | ★`weekdaysLabel()` は7桁ビット列128通りを扱う関数★（`lib/format/schedule.ts:17-28`）。モックはその2例を書いていただけで、逸脱ではない。対応表は `docs/fixtures.md:216` / `docs/code-map.md:1264` |
| 25 | システム管理のサブタイトルの位置 | ★9タブUIを作らず運用設定1画面にした（D-084 段階6 / 項4）帰結★。カード見出しの中に置くと、画面唯一のカードの中に画面全体の説明が入ることになる |

#### 4. ★不具合として直す2件（JA表示は1文字も変わらない）★

| # | 件名 | 実害 | 直し方 |
|---|---|---|---|
| 19 | D-Secログの h1 が英語対訳に当たらない | ★EN でサイドバーは `D-Sec Logs`、見出しは「D-Secログ」と和文★で食い違う | ★`lib/i18n.ts:37` のキー `"D-Sec ログ"` を `"D-Secログ"` に直す（1行）★ |
| 26a | `読み込み中…` / エラー文言が `t()` 未経由（★10箇所★） | ★辞書に登録済み（`lib/i18n.ts:73` / `:336`）なのに EN で和文★。次の担当者が辞書を見て「対応済み」と誤認する | ★該当箇所を `t()` で包む★。`components/` にテストは1件も無い（`vitest.config.ts` の `include` は `lib/**` と `app/**`）ので★目視確認が要る★ |

#### 5. ★ユーザー判断★

| # | 件名 | 判断 |
|---|---|---|
| 13 | アラートの日付既定値が空（全期間） | ★（記入）★ |
| 20b | D-Secログの備考セルの色 | ★（記入）★ |
| 19 / 26a | EN の抜けをいま直すか、英語配布の決定まで保留するか（D-143 §3 #1 と同じ扱いにするか） | ★（記入）★ |

---

## 6. 直す場合の影響範囲

★どれも `lib/judge/**` `lib/db/**` `prisma/**` `d-watch-api.yaml` には触りません★。

| 件 | 触るファイル | テスト | i18n | ダーク/ライト |
|---|---|---|---|---|
| ★B-1（#19 h1）★ | `lib/i18n.ts:37`（キー1行） | ★影響なし★。`lib/i18n.ts` を直接検証するテストは0件（D-143 §3 #1 で実測済み） | ★JA 変化なし / EN が `D-Sec Logs` になる★ | 影響なし |
| ★B-2（#26a）★ | `AlertsScreen.tsx` / `DashboardScreen.tsx` / `DetailLogScreen.tsx` / `DsAlertsScreen.tsx` / `DsLogScreen.tsx` / `FacilitiesScreen.tsx` / `ReportsScreen.tsx` / `SchedulesScreen.tsx` / `SystemScreen.tsx` / `CleanLogTable.tsx`（★10箇所を `t()` で包むだけ★） | ★`components/**` はテスト対象外★（`vitest.config.ts`）→ ★目視が要る★ | ★JA 変化なし / EN が `Loading…` `Failed to load data` になる★ | 影響なし |
| #13（日付既定値を当日にする場合） | `AlertsScreen.tsx:58-59` | ★`lib/prechecks/__tests__/query.test.ts` は画面の既定値を見ていないので影響なし（実測）★ | 影響なし | 影響なし |
| #20b（備考セルに色を戻す場合） | `DsLogScreen.module.css:143-164`（★`.noteButton` に状態クラスを足す★）＋ `DsLogScreen.tsx:113-124`（クラス付与） | 影響なし | 影響なし | ★アンバー（`--wn`）はダーク/ライト両方でトークン化済み★。新しい色コードを直書きしないこと（`CLAUDE.md` §9） |
| ★空状態の文言に対訳を足す場合★ | `lib/i18n.ts`（★`該当するアラートはありません` / `該当するデバイスはありません` / `問題エリアはありません（全エリア◎○）` / `該当するログはありません` / `該当するアドバイスはありません` / `該当なし` / `本日の清掃予定はありません` の7キー★） | 影響なし | ★★キーを足す前に必ず grep すること★★（D-146 §9。`lib/i18n.ts` は★キーが日本語原文の1階層辞書★なので、同じ日本語を別の意味で使うと必ず衝突する。★`該当なし` は特に汎用的で危険★） | 影響なし |

---

## 7. 調査の限界（正直な記録）

- ★ブラウザでの目視確認は行っていません★。見た目（色帯・文字サイズ・並び順）はすべて★ソースとCSSの実測★です
- ★`components/**` にテストは1件も存在しません★（`vitest.config.ts` の `include` は `lib/**` と `app/**`）。★本章の不具合2件はテストで守れない★ので、直したら目視が要ります
- ★DBには一切接続していません★（本番DB `133.125.238.144` を含む）。データ側の事実（`battery_level` が常に `null` 等）は★既存の決定の引用★であり、本調査での再実測ではありません
- ※3 の「アドバイス0件は到達しない」は ★`lib/judge/advice.ts` と `lib/db/clean-log-mapping.ts` のコード読解による結論★です。★実データでの確認はしていません★
