# 点検記録（F-05 / `inspections`）— 決まっていること / 決まっていないこと

**作成日**: 2026-09-17 / **ブランチ**: `develop` / **種別**: 調査。★指示書ではない★

---

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

ユーザーの言:「★点検記録はまだ色々決まってないので、指示書は作れない★」。
であれば ★何が決まれば指示書を書けるのか★ を先に確定させる、というのが本書の目的です。

**書き方の約束**

- ★すべての「決まっている」に `file:line` の実測根拠を付けた★。根拠を書けないものは
  「決まっていない」側に置いた（`CLAUDE.md` §6-6 / §7「推測で埋めない」）。
- ★「たぶんこうだろう」で埋めていない★。資料に無いものは「記述なし（実測）」と書いた。
- 本書の作成でコードは1行も触っていない。★新規作成したのは本ファイルのみ★。
- ★本番DB（`133.125.238.144`）には接続していない★（D-148）。

**件数（本書の結論）**

| 区分 | 件数 |
|---|---|
| ★決まっていること★ | ★34件★（決定5 / API契約16 / 画面7 / 既存コード6） |
| ★決まっていないこと★ | ★35件★ |
| うち ★着手をブロックするもの★ | ★5件★ |
| うち ★暫定で進められるもの★ | ★30件★ |
| ★API契約とモックの食い違い★ | ★8件★（うち1件は既に解消） |

---

## 1. 材料の所在（実測）

| 材料 | 場所 | 中身 |
|---|---|---|
| API契約 | `d-watch-api.yaml:1289-1401`（パス）/ `:2221-2256`（スキーマ）/ `:59-60`（タグ）/ `:20-22`（データソース注記） | 4本のエンドポイントとスキーマ2種 |
| 画面モック | `d-watch-mock.jsx:80`（点検7項目）/ `:81-89`（データ7件）/ `:1071-1145`（一覧画面）/ `:1976-2025`（詳細モーダル）/ `:2027-2085`（新規登録モーダル） | 画面の姿 |
| 機能一覧 | `docs/spec.md:16` / `:75-81`（F-05）/ `:128`（並走可）/ `:215-221`（M6） | 作るものと順序 |
| 決定 | `docs/decisions.md:38-41`（D-004）/ `:197-199`（D-031）/ `:1059-1066`（D-072 項7）/ `:2182`（D-079 項3）/ `:2642-2657`（D-083 項6）/ `:6666-6673`（D-111 項6）/ `:11359-11380`（D-143 項1） | なぜ今の状態か |
| fixtures | `lib/fixtures/inspections.ts`（全157行）/ `docs/fixtures.md:233-243`（§9） | 用意済みのサンプル6件 |
| 型 | `lib/types/index.ts:979-1009` | `InspectionItemName` / `InspectionPhoto` / `InspectionListItem` / `InspectionDetail` |
| 現在の実装 | `app/(dashboard)/inspections/page.tsx`（全5行、`PlaceholderScreen`）/ `components/layout/AppShell.tsx:17-22`（メニューのコメントアウト） | 画面は空 |
| データ層 | `lib/db/index.ts:310-311`（宣言）/ `:521-525`（fixtures 実装）/ `:1704-1708`（prisma は `notImplemented`） | 2メソッドだけ |
| ログ | `lib/logger/events.ts:225-232`（`InspectionLogEvent`） | 名前空間は確保済み |

★**要件定義書 P1 / UI仕様書 v6.0 には点検記録の記述が無い**★ — D-031（`docs/decisions.md:198`）が
「モックに存在していたが★要件定義書・画面要件整理シートに記載がなかった★」と明記している。
つまり ★この機能の一次資料はモックと `d-watch-api.yaml` の2つだけ★で、他画面のように
「UI仕様書に戻って裏を取る」ことができない。★これが本件の不確定性の根本原因★。

---

## 2. 決まっていること（34件）

### 2.1 決定として確定しているもの（5件）

| # | 決まっていること | 根拠 |
|---|---|---|
| D1 | ★点検記録はメインDBに保存しない★。DFA独自ストア（SQLite + オブジェクトストレージ）で管理する | `docs/decisions.md:38-40`（D-004）/ `CLAUDE.md` §3・§7 |
| D2 | ★P1スコープに含む★（モック由来で正式にスコープ入り）。★TeamWorks への確認・依頼は不要★ | `docs/decisions.md:197-199`（D-031） |
| D3 | ★実装順は最後★。他の実装が全部終わってから | `docs/decisions.md:1059-1066`（D-072 項7）/ `:6666-6673`（D-111 項6） |
| D4 | ★メニューからは一時的に隠す。ルート（`page.tsx`）と `lib/i18n.ts` のエントリは残す★。復活はコメント1行を外すだけ | `docs/decisions.md:2642-2651`（D-083 項6）/ `components/layout/AppShell.tsx:17-22` |
| D5 | ★モックの実在人名・店舗名・申し送り本文は1文字もコピーしない★ | `docs/decisions.md:2596-2601` / `CLAUDE.md` §7 |

### 2.2 API契約から読み取れること（16件）

★`d-watch-api.yaml` は「API契約の正」（`CLAUDE.md` §5）なので、以下は確定として扱ってよい★。

| # | 決まっていること | 根拠 |
|---|---|---|
| A1 | ★エンドポイントは4本★: `GET /inspections` / `POST /inspections` / `GET /inspections/{id}` / `DELETE /inspections/{id}` | `d-watch-api.yaml:1290` / `:1340` / `:1380` / `:1393` |
| A2 | 一覧のクエリは ★`date_from` `date_to` `customer_id` `facility_name` `q` `page` `per_page` の7つ★ | `:1297-1321` |
| A3 | `date_from` / `date_to` は ★訪問日（`visited_on`）の範囲★ | `:1300` |
| A4 | `facility_name` は施設名の部分一致。★実装時は `includesFoldName` を通す（記号・大文字小文字を無視）★ | `:1308-1313` |
| A5 | `q` は ★記入者名 or シリアル番号★の部分一致。★`includesFoldPlain`（大文字小文字だけ無視）★ | `:1317-1319` |
| A6 | 一覧のレスポンスは ★`summary` + `items` + `meta`★。`summary` は ★`total`（記録数）/ `facilities`（施設ユニーク数）/ `with_notes`（申し送りあり件数）の3値★ | `:1330-1339` |
| A7 | `InspectionListItem` は ★8フィールド★（`id` `visited_on` `inspector_name` `inspector_company` `customer_name` `facility_name` `serial_number` `has_notes`） | `:2221-2232` |
| A8 | ★「ブランド」列は `customer_name`。facility → customer 経由で導出する★ | `:2223` / `:2229` |
| A9 | `InspectionDetail` = `InspectionListItem` + ★`notes`（nullable）+ `photos[]`★ | `:2234-2256` |
| A10 | 写真1件は ★`item_type` / `phase` / `url` の3フィールド★。`item_type` は ★英語 enum 7値★（`brush` `dust_box` `filter` `squeegee` `suction_hose` `waste_tank` `brush_back`）、`phase` は ★`before` / `after`★ | `:2246-2252` |
| A11 | ★未撮影の組み合わせは `photos` 配列に含めない★（空要素を返さない） | `:2242` |
| A12 | 詳細の写真URLは ★署名付き一時URL（有効期限あり）★ | `:1387` / `:2256` |
| A13 | 登録は ★`multipart/form-data`★。写真のフィールド名は ★`photos[{item_type}][{phase}]`★ | `:1344-1346` / `:1351` / `:1365-1370` |
| A14 | ★必須5項目★: `visited_on` `facility_id` `robot_id` `inspector_name` `inspector_company`。★`notes` と写真は任意★ | `:1354` |
| A15 | ★上限値★: 写真 ★1枚10MB / jpeg・png / 最大14枚★、`inspector_name` ★100★、`inspector_company` ★100★、`notes` ★2000★ | `:1347` / `:1362-1364` |
| A16 | ★削除は論理削除（誤登録対応）で 204★。`{id}` の検証は ★`PathId`（1以上の整数、0・負値・非整数は422）★ | `:1393-1401` / `:1444-1448`（`PathId`） |

補足（契約として確定している周辺事項）:

- ★ロボットは「施設選択後に `GET /facilities` の `robots` から選ばせる」★（`:1361`）。
  ★モックの空セレクトを契約側が補っている★。
- ★認証は cookie 方式（`dwatch_session`）がグローバルに適用される★（`:35-36` の `security`）。
  ★IP制限も `proxy.ts` が全ルートで判定する★（`proxy.ts:112-114` の matcher は
  静的ファイル以外すべてを通す）。★点検記録だけを除外する記述は無い（実測）★。

### 2.3 モックから読み取れる画面の姿（7件）

| # | 決まっていること | 根拠 |
|---|---|---|
| U1 | 一覧画面は ★見出し + サマリカード3枚 + フィルタ + 8列の表★ | `d-watch-mock.jsx:1071-1145` |
| U2 | サマリカードは ★総点検数（期間内）/ 点検施設数（ユニーク）/ 申し送りあり（要確認）★ | `:1097-1110` |
| U3 | フィルタは ★日付範囲（from〜to）/ グループ選択 / 会社選択 / フリーテキスト（プレースホルダ「施設名 / 記入者」）★の4つ | `:1083-1096` |
| U4 | 表の列は ★訪問日 / 記入者 / 所属会社 / 店舗名 / ブランド / シリアル / 申し送り / 操作★ の8列。申し送りは ★「あり」/「ー」★の2値表示 | `:1114-1122` / `:1134` |
| U5 | 詳細はモーダル。★上段に記入者・所属会社・ブランド・シリアル、その下に Before / After の2列★、各列に ★7項目★が縦に並ぶ。★申し送りは本文があるときだけ表示★ | `:1976-2025` |
| U6 | 新規登録もモーダル。★入力欄は 訪問日* / 店舗* / 記入者氏名* / 所属会社* / ロボット* の5つ＋Before/After×7項目の写真アップロード＋申し送り事項★ | `:2027-2085` |
| U7 | 点検7項目の ★日本語名と並び順★: ブラシ / ダストボックス / フィルター / スクイジー / 吸引ホース / 汚水タンク / ブラシ裏面 | `d-watch-mock.jsx:80` / `docs/spec.md:77` / `d-watch-api.yaml:2249` |

### 2.4 既存コードとして用意済みのもの（6件）

| # | 決まっていること | 根拠 |
|---|---|---|
| C1 | ★TS型は定義済み★（`InspectionItemName` / `InspectionPhoto` / `InspectionListItem` / `InspectionDetail`） | `lib/types/index.ts:979-1009` |
| C2 | ★fixtures は用意済み★（6件。写真全14枚 / 一部欠け / なし、申し送り長文 / 空、同一施設の複数回） | `lib/fixtures/inspections.ts:24-157` / `docs/fixtures.md:233-243` |
| C3 | `DataSource` に ★`inspections()` と `inspectionDetail(id)` が宣言済み★ | `lib/db/index.ts:310-311` |
| C4 | ★`fixturesSource` 側は実装済み★（`:521-525`）、★`prismaSource` 側は `notImplemented()`★（`:1704-1708`） | 同上 |
| C5 | ★ログイベントの名前空間は確保済み★（`inspection.read` / `inspection.write` / `inspection.photo`。★メインDB系 `db.*` と分ける★） | `lib/logger/events.ts:225-232` |
| C6 | ★実装するときは最初から `Pagination` を入れる★（一覧にページ送りを後付けしない） | `docs/decisions.md:7910` / `:7998`（D-120 の申し送り） |

---

## 3. ★決まっていないこと（35件）★ — 本題

観点ごとに「決まっているか / いないか」を1つずつ判定した。
★「資料に記述なし」は grep の実測結果であり、見落としではなく不存在として扱っている★。

### 3.1 データの保存先（6件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N1★ | ★SQLite を本当に使うのか★（採否そのもの） | ★未決★ | D-004（`docs/decisions.md:39`）は「SQLite + オブジェクトストレージ」と書くが、★`package.json` に SQLite ドライバの依存が1つも無い★（`better-sqlite3` / `sqlite3` / `libsql` いずれも0件。実測）。Prisma 7 で2つ目のクライアントを立てるのか、`better-sqlite3` を直に使うのか、★どちらの記述も無い★ |
| ★N2★ | ★SQLite ファイルの置き場所★ | ★未決★ | 記述なし（実測）。★既存の独自ストアは `data/settings/*.json`★（`lib/settings/json-store.ts:8-10`）で、★`/data` は `.gitignore:50` に入っている＝ git のバックアップが無い★。同じ場所に置くのかも未決 |
| ★N3★ | ★オブジェクトストレージの実体★（さくらのオブジェクトストレージ / 他の S3互換 / VM のローカルディスク） | ★未決★ | ★grep で「オブジェクトストレージ」は12箇所ヒットするが、すべて「SQLite + オブジェクトストレージ」という同じ1文の引用★。★具体のサービス名は1箇所も無い（実測）★ |
| ★N4★ | ★バケットの用意・費用・アカウント発行を誰がやるか★ | ★未決★ | D-143（`docs/decisions.md:11366-11373`）は「★サーバー・ネットワークの用意と構築保守はすべて TeamWorks★」と確定したが、★対象として挙がっているのは「本番のアプリVM / DB / テスト環境」の3つだけ★。★オブジェクトストレージは名指しされていない★。→ §5 の「実は決まっているかもしれないもの」も参照 |
| ★N5★ | ★バックアップと復旧★（写真とSQLiteの両方） | ★未決★ | 記述なし（実測）。★VM の保守は TeamWorks（D-143）だが、DFA独自ストアがバックアップ対象に入るかは書かれていない★ |
| ★N6★ | ★`USE_FIXTURES` の切替をこのストアにも適用するか★ | ★未決★ | `CLAUDE.md` §9.5 は「APIルートは `USE_FIXTURES` で fixtures / Prisma を切り替える」と定めるが、★点検記録は Prisma を使わない★。`prismaSource.inspections()` が `notImplemented()` のまま（`lib/db/index.ts:1704-1708`）である現状をどう解消するかが未決 — ★「独自ストアを第3の実装として `DataSource` に足す」のか「`lib/db` の外に別系統を作る」のか★。`docs/handoff/analysis/prismaSource実装前チェックリスト.md:415` も ★「そもそも `prismaSource` で実装すべきものか要確認」★と書いている |

### 3.2 写真（9件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N7★ | 枚数の上限 | ★決まっている★ | ★最大14枚（Before/After × 7項目）★（`d-watch-api.yaml:1347`） |
| ★N8★ | 1枚あたりのサイズ上限 | ★決まっている★ | ★10MB★（同上） |
| ★N9★ | 形式 | ★決まっている（ただし §3.2 の N10 参照）★ | ★jpeg / png★（同上） |
| ★N10★ | ★HEIC（iPhone の既定形式）をどうするか★ | ★未決★ | 記述なし（実測）。★現場がスマホで撮るなら必ず当たる★。「弾く」「サーバで変換する」「端末側の設定に任せる」のどれも書かれていない |
| ★N11★ | ★1リクエストの合計サイズ★（10MB × 14 = ★最大140MB★を1回の POST で受ける） | ★未決★ | 記述なし（実測）。Next.js の Route Handler の body サイズ制限、nginx の `client_max_body_size` のどちらにも触れた記述が無い。★「1枚ずつ送る」設計に変えるかどうかも未決★ |
| ★N12★ | ★縮小・サムネイル生成をするか★ | ★未決★ | 記述なし（実測）。★一覧・詳細グリッドで14枚をフル解像度で出すと重い★が、方針の記録が無い |
| ★N13★ | ★元画像を保持するか / EXIF（位置情報）を落とすか★ | ★未決★ | 記述なし（実測）。★`lib/logger/redact.ts` は個人情報13キーを弾く仕組みを持つが、画像のメタデータは対象外★ |
| ★N14★ | ★Before / After の対応づけ — 片方だけの登録を許すか★ | ★実質未決★ | 契約は「★未撮影の組み合わせは配列に含めない★」（`:2242`）としか書いておらず、★「Before だけ登録して保存してよいか」は書かれていない★。fixtures は片方だけのケースを作ってある（`lib/fixtures/inspections.ts:47-56`）ので ★許す前提に見えるが、明記は無い★ |
| ★N15★ | ★署名付きURLの有効期限★ | ★未決★ | 契約は「有効期限あり」としか書いていない（`:1387` / `:2256`）。★分か時間か日かが無い★。★誰が署名するか（ストレージ側の機能か、アプリが自前で発行して自分で配信するか）も未決★ — 後者なら `proxy.ts` の IP制限が写真URLにも掛かる（`proxy.ts:112-114`） |

### 3.3 点検項目（5件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N16★ | 項目は何か（7項目の名前と順序） | ★決まっている★ | `d-watch-mock.jsx:80` / `d-watch-api.yaml:2248-2249` / `docs/spec.md:77` の3つが一致 |
| ★N17★ | ★固定かマスタ化か★ | ★未決★ | 契約は ★enum（固定）★（`:2248`）。しかし ★P1 の対応機種は PUDU CC1 のみ★（`CLAUDE.md` §1）で、★MT1 / Keenon C30・C40 が入ると部位が変わる★（`lib/config/index.ts` の `ROBOT_MODELS`。D-087）。★機種が増えたときどうするかの記録が無い★ |
| ★N18★ | ★チェック式か自由記述か — 「点検結果」を記録する欄が無い★ | ★未決★ | ★契約にもモックにも、項目ごとの OK/NG・数値・コメントの欄が1つも無い（実測）★。★記録できるのは「写真」と「記録全体に1つの申し送り」だけ★。「点検記録」という名前に対して ★点検の合否がどこにも残らない★ |
| ★N19★ | ★写真が無い項目の意味★（「未実施」か「異常なし」か） | ★未決★ | 記述なし（実測）。★N18 が決まらないと決められない★ |
| ★N20★ | ★消耗品の交換記録を残すか★（ブラシ交換等） | ★未決★ | 記述なし（実測）。`CLAUDE.md` §4.5 の L2 が「★消耗品交換★」を想定対応に挙げているが、★点検記録との接続は書かれていない★ |

### 3.4 運用（5件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N21★ | ★誰が入力するか★（現場スタッフ / DFA の訪問担当 / DFA運用担当が代理入力） | ★未決★ | 記述なし（実測）。★モックの記入者は全件同一人物（`d-watch-mock.jsx:82-88`）で、所属会社の既定値が `DFA Robotics`（`:2050`）★なので ★DFA の訪問者を想定しているように見えるが、明記は無い★。`CLAUDE.md` §1 の P1 利用者は「★DFA社内のみ★」 |
| ★N22★ | ★入力端末★（PC / スマホ / タブレット） | ★未決★ | 記述なし（実測）。★モックはモーダル幅 640px の PC 前提★（`:1979`）だが、★写真はスマホで撮る★のが自然。★スマホ対応の記述はリポジトリ全体で点検記録には1件も無い★ |
| ★N23★ | ★社外から入力するか★ | ★未決。ただし決めないと詰む★ | ★IP制限が全ルートに掛かる★（`proxy.ts:112-114` / `lib/config/allowed-ips.ts:24-26`）。★`ALLOWED_IPS` は完全一致のみで CIDR 非対応★（`lib/config/allowed-ips.ts:14-16`）。→ ★現場のモバイル回線から入力させる運用は、いまの認証設計では成立しない★ |
| ★N24★ | ★オフライン入力が要るか★ | ★未決★ | 記述なし（実測）。★店舗のバックヤードは電波が弱い★という想定の有無自体が書かれていない |
| ★N25★ | ★いつ入力するか★（訪問中 / 帰社後） | ★未決★ | 記述なし（実測）。N24 と連動 |

### 3.5 保持・削除（3件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N26★ | ★保持期間（何年）★ | ★未決★ | 記述なし（実測）。★メインDB側は「保持2年」という前提がある★（`lib/db/index.ts:176`）が、★点検記録に適用するとは書かれていない★。D-004（`docs/decisions.md:41`）は ★年間8,400枚★という規模想定だけを書いている |
| ★N27★ | ★論理削除した記録の写真をどうするか★ | ★未決★ | 契約は「論理削除」（`:1395`）とだけ。★ストレージ上の実ファイルを消すのか残すのかが無い★。★`InspectionDetail` に `deleted_at` 相当のフィールドも無い★（`:2234-2256`。実測） |
| ★N28★ | ★削除した記録の復元導線★ | ★未決★ | 記述なし（実測）。論理削除にした以上、★復元できないなら物理削除と運用上同じ★ |

### 3.6 認証・権限（3件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N29★ | ★誰でも登録・削除できてよいか★ | ★未決★ | ★P1 は共有トークン1本★（`d-watch-api.yaml:1406-1414` の `cookieAuth`）。★ユーザー管理・権限管理は P1 スコープ外★（D-032。`docs/decisions.md:201-204`）。→ ★ログインできる人は全員、誰の記録でも削除できる★。これでよいかの記録が無い |
| ★N30★ | ★記入者名が自己申告のテキストのままでよいか★ | ★未決★ | `inspector_name` は ★自由入力の文字列（maxLength 100）★（`:1362`）。★ログイン主体と紐づける仕組みが無い★（N29 の帰結） |
| ★N31★ | ★編集（更新）ができなくてよいか★ | ★未決★ | ★契約に `PUT` / `PATCH` が無い★（`:1290-1401`。実測）。★モックにも編集ボタンが無い★。「誤ったら削除して再登録」という運用を意図しているように読めるが、★記録が無い★ |

### 3.7 施設との紐づけ（2件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N32★ | ★★表示名（`facility_name` / `customer_name` / `serial_number`）をどう解決するか★★ | ★未決。★実装の核心★★ | ★保存するのは `facility_id` / `robot_id`（`:1354`）、返すのは名前3つ（`:2229-2231`）★。★独自ストアとメインDBは別物なので SQL の JOIN ができない★。取りうる案は ★(a) 読み取り時にメインDBを引いて突き合わせる / (b) 登録時に名前をコピーして独自ストアに保存する★ の2つで、★どちらとも書かれていない★ |
| ★N33★ | ★施設名・シリアルが変わったとき、過去の記録は「当時の値」と「現在の値」のどちらを見せるか★ | ★未決★ | N32 の (a) なら現在の値、(b) なら当時の値になる。★施設がメインDBから消えたときの表示も未決★ |

### 3.8 一覧・検索（2件）

| # | 論点 | 状態 | 判定の根拠 |
|---|---|---|---|
| ★N34★ | ★並び順★ | ★未決★ | ★契約に `sort` パラメータも既定順の記述も無い★（`:1296-1321`。実測）。★モックは配列順に出しているだけ★（`d-watch-mock.jsx:1126`） |
| ★N35★ | ★サマリ3値（`total` / `facilities` / `with_notes`）の集計範囲★ | ★未決★ | ★フィルタ適用後の全件か、ページング前か、フィルタ無視の全件かが書かれていない★（`:1330-1335`。実測）。モックは ★フィルタが効かない飾り★なので判断材料にならない |

---

## 4. ★ユーザーが決めるべき論点の一覧★（1論点1行・帰結つき）

### 4.1 ★★これが決まらないと1行も書けない（5件）★★

| # | 論点 | ★この選択をするとこうなる★ |
|---|---|---|
| ★B1★ | ★そもそも点検記録をサービスとして出すのか★（`docs/decisions.md:6670-6671` で「★サービスとして展開するかも保留中です★」とユーザー自身が述べている） | ★「出さない」なら以下の全論点が不要になり、`AppShell.tsx:22` のコメントアウトを恒久化して終わり★。★「出す」なら B2 以降に進む★。★ここが未決のまま B2 以降を決めると、決め損になる★ |
| ★B2★ | ★オブジェクトストレージの実体は何か★（さくらのオブジェクトストレージ / 他の S3互換 / VM のローカルディスク） | ★S3互換なら★ SDK を1つ足して署名付きURLはストレージ側の機能で済む（★アプリは URL を返すだけ★）。★VM のローカルディスクなら★ ストレージ課金は不要だが ★署名付きURLを自前で実装することになり、写真配信が `proxy.ts` の IP制限の内側に入る★（＝社外からは写真が見えない。N23 と連動）。★どちらでも「写真のURL」という契約（`:2256`）は守れるが、実装量が桁で違う★ |
| ★B3★ | ★誰がストレージを用意し、費用を払い、保守するのか★ | ★TeamWorks なら★ 第10回の確認事項に1問足すだけで、DFA は使うだけになる（★ただし回答待ちの分だけ着手が遅れる★）。★DFA なら★ 今日から契約して進められるが、★D-143 で確定した「DFA はビューアーのみ」から外れる★ので、責任分界を1件上書きする決定が要る |
| ★B4★ | ★点検記録に「点検結果」を持たせるか（N18）★ | ★持たせないなら★ いまの契約のまま（写真＋申し送りだけ）で書ける。★持たせるなら★ `d-watch-api.yaml` のスキーマ変更が先（`CLAUDE.md` §6-1）で、★`InspectionDetail` に項目別の結果配列が増え、fixtures と型も作り直し★になる。★後から足すと既存レコードが全部「結果なし」になる★ |
| ★B5★ | ★誰がどこから入力するか（N21 / N22 / N23）★ | ★DFA社内のPCからだけなら★ モックのモーダルをそのまま移植でき、IP制限も現行のままでよい。★現場スタッフがスマホから入れるなら★ ①スマホ幅のレイアウトを新規に設計（★モックに無い＝「モックが正」の原則から外れる決定が要る★）②IP制限の設計変更（`ALLOWED_IPS` は完全一致のみで CIDR 非対応。`lib/config/allowed-ips.ts:14-16`）③共有トークン1本で現場に配るかの判断（N29）— ★3つとも別々の決定になる★ |

### 4.2 暫定で進められるもの（30件）— ★決め方の提案付き★

★以下は「決めないと止まる」ではなく「決めずに始めて、後で差し替えられる」もの★。
★ただし ★印を付けた4件は、後から変えると作り直しになる★。

| # | 論点 | 暫定で進める場合の置き方 | 後から変えると |
|---|---|---|---|
| N1 / N2 | SQLite の採否と置き場所 | ★`data/inspections/` に置き、読み書きを `lib/inspections/` の1モジュールに閉じ込める★（`lib/settings/json-store.ts` と同じ作法） | 中で差し替え可 |
| ★N15★ | 署名付きURLの有効期限 | 設定値として `lib/config/` に外出し（`CLAUDE.md` §7 の閾値ハードコード禁止と同じ扱い） | 設定変更で済む |
| ★N11★ | 1リクエスト合計サイズ | ★先に「1枚ずつアップロードする」設計にしておくと後で困らない★ | ★一括POST前提で作ると作り直し★ |
| N12 / N13 | 縮小・EXIF | 保存時に原本＋長辺1600pxの2枚を持つ | ★既存写真の再処理が要る★ |
| N10 | HEIC | 当面は弾いて 422 | 追加は容易 |
| N14 | 片方だけの登録 | 許す（fixtures がそうなっている） | — |
| N17 | 項目のマスタ化 | ★P1 は enum 固定★（契約どおり） | ★マスタ化は作り直し★ |
| N19 / N20 | 写真なしの意味 / 消耗品 | B4 に従属。B4 が「持たせない」なら記録しない | — |
| N24 / N25 | オフライン / 入力タイミング | ★P1 はオンライン前提★ | ★オフライン対応は全面的な作り直し★ |
| N26 | 保持期間 | ★メインDB に合わせて2年を暫定値、設定値として外出し★ | 設定変更で済む |
| N27 / N28 | 削除時の写真 / 復元 | 論理削除では写真を消さない。復元導線は作らない | — |
| N29 / N30 | 権限 / 記入者 | P1 は共有トークンのまま。`inspector_name` は自己申告 | P2 のユーザー管理と同時 |
| N31 | 編集機能 | ★作らない（削除→再登録）★ | ★API 追加が要る★ |
| ★N32★ | 表示名の解決 | ★登録時に名前をコピーして保存する（(b)案）★を推す — ★メインDBが読めない場面でも一覧が出る／過去の記録が「当時の店名」で残る★ | ★(a)案から(b)案への移行は既存レコードの埋め戻しが要る★ |
| N33 | 施設の改名・消滅 | N32 の帰結として自動的に決まる | — |
| N34 | 並び順 | ★訪問日の降順、同日は id の降順★（他一覧と同じ作法） | — |
| N35 | サマリの集計範囲 | ★フィルタ適用後・ページング前の全件★（他画面と同じ） | — |
| N5 | バックアップ | `/data` ごと VM のバックアップ対象に含めるよう申し送る | — |
| N6 | `USE_FIXTURES` | ★`DataSource` に足さず、`lib/inspections/` を独立させる★ | 中で差し替え可 |
| N23 | 社外からの入力 | B5 に従属 | — |
| その他 | CSVインポート（§6 の M3）/ `group_id` 絞り込み（M2）/ 写真の見せ方（M6） | いずれも ★P1 では作らない★ で進められる | — |

---

## 5. ★実は既に決まっているもの★（ユーザーが「未決」と思っている可能性があるもの）

| # | 「決まっていない」と思われがちなもの | ★実際には決まっている★ |
|---|---|---|
| 1 | 写真の上限（枚数・サイズ・形式） | ★決まっている★ — ★14枚 / 10MB / jpeg・png★（`d-watch-api.yaml:1347`）。★契約に書いてあるので、変えたければ先に YAML を直す★（`CLAUDE.md` §6-1） |
| 2 | 点検項目が何か | ★決まっている★ — ★7項目、英語 enum まで確定★（`:2248`）。★モック・spec・YAML の3つが一致している（実測）★ |
| 3 | 入力欄と必須項目 | ★決まっている★ — ★必須5項目★（`:1354`）。モックの入力欄（`d-watch-mock.jsx:2030-2060`）と一致 |
| 4 | 削除の方式 | ★決まっている★ — ★論理削除★（`:1395`） |
| 5 | 文字数上限 | ★決まっている★ — 記入者100 / 所属会社100 / 申し送り2000（`:1362-1364`） |
| 6 | メインDBに保存しないこと | ★決まっている★ — D-004（`docs/decisions.md:38-40`）。★`CLAUDE.md` §7 の禁止事項にも入っている★ |
| 7 | サンプルデータと型 | ★用意済み★ — `lib/fixtures/inspections.ts`（6件）/ `lib/types/index.ts:979-1009`。★書き始める段階でここは作らなくていい★ |
| 8 | メニューの復活方法 | ★決まっている★ — `components/layout/AppShell.tsx:22` のコメントを外すだけ（D-083 項6） |
| 9 | ページ送り | ★決まっている★ — ★最初から入れる★（`docs/decisions.md:7910` / `:7998`） |
| 10 | ★サーバーの用意と保守★ | ★決まっている（ただし射程に注意）★ — ★TeamWorks★（D-143。`docs/decisions.md:11366-11373`）。★★ただし名指しされているのは「アプリVM / DB / テスト環境」の3つで、オブジェクトストレージは含まれていない★★。→ ★「同じ扱いだろう」と推測せず、論点 B3 として出す★（`CLAUDE.md` §7） |

---

## 6. ★API契約とモックの食い違い（8件）★

| # | 食い違い | モック | API契約 | 状態 |
|---|---|---|---|---|
| ★M1★ | ★写真の項目名★ | ★TS型は日本語リテラル★（`lib/types/index.ts:979-986` の `InspectionItemName`、フィールド名は `item`） | ★英語 enum★（`d-watch-api.yaml:2246-2249` の `item_type`） | ★★未解決のまま残っている★★ — D-083 項3 #2（`docs/decisions.md:2579`）と D-084 項11（`:2745`）が ★「点検記録に着手する前に解決が必要」★と明記。★fixtures も日本語側（`lib/fixtures/inspections.ts:24-32`）なので、直すと fixtures も型も一緒に動く★ |
| ★M2★ | ★グループ絞り込み★ | ★「全グループ / PPIH」のセレクトがある★（`d-watch-mock.jsx:1089-1091`） | ★`group_id` パラメータが無い★（`:1296-1321`。実測。他の一覧11本は持っている） | ★契約の抜け。足すなら YAML が先★ |
| ★M3★ | ★CSVインポート★ | ★ボタンがある★（`d-watch-mock.jsx:1080`）。★ただし `onClick` が無い飾り★ | ★該当エンドポイントが無い★ | `docs/spec.md:220` は ★「過去のGフォームデータのCSVインポート（任意）」★。★D-083 項4 #3（`docs/decisions.md:2592`）の前例に従えば「動かないボタンは置かない」＝実装しない★ |
| ★M4★ | ★`customer_id` が実際には使われていない★ | 「全会社」のセレクトがある（`:1092-1094`） | ★契約が自分で「★`/inspections` の `customer_id` だけは例外で、まだ絞り込みに使っていない★」と書いている★（`d-watch-api.yaml:1452-1454`） | ★画面が復活したときに足す、と契約自身が指示している★ |
| ★M5★ | ★ページ送り★ | ★無い★（7件を一括描画。`:1126`） | `page` / `per_page` あり（`:1320-1321`） | ★契約が正。最初から入れる（C6）★ |
| ★M6★ | ★写真の見せ方★ | ★「📷 写真」は `onClick` の無い飾り★（`:2004`）。★押して何が起きるか定義されていない★ | 契約は URL を返すだけ（`:2253-2256`） | ★モーダルの中でモーダルを開くのか、サムネイルを並べるのかが未定義★。`docs/spec.md:77` は ★「写真グリッド」★と書くが、★モックはグリッドではなく項目名の縦並び★ |
| ★M7★ | ★ロボット選択★ | ★選択肢が空★（「店舗を選択すると表示」。`:2057`） | ★`GET /facilities` の `robots` から選ばせる★と明記（`:1361`） | ★契約側が補っている。食い違いではなく補完★ |
| ★M8★ | ★ブランド列に複数ブランドが出る★ | ★ドン・キホーテ / ユニーの2ブランド★（`:82-88`） | — | ★P1 の対象顧客はドン・キホーテのみ★（`CLAUDE.md` §1）。★モックの見た目と実データの見た目が違う★（他画面と同種の既知事項） |

★既に解消していたもの★: D-083 項4（`docs/decisions.md:2609-2612`）が ★YAML の example に実在の人名が残っている★と指摘していたが、
★現在の `d-watch-api.yaml` は `"点検 太郎"` に置換済み★（`:1362` / `:2227`。★`grep "香原" d-watch-api.yaml` は0件。実測★）。

★契約そのものの抜け（モックとの食い違いではないが、実装時に必ず詰まる）★:

- ★`GET /inspections` に `422` の宣言が無い★（`:1322-1339`）。★他の一覧（例 `/schedules` の `:1287`）は宣言している★。
  ★`customer_id` / `page` / `per_page` の検証は共通で効くので、宣言だけが漏れている★
- ★`POST /inspections` に `413`（サイズ超過）の宣言が無い★（`:1371-1377`）。★10MB の上限を書きながら、超えたときの応答が未定義★
- ★`InspectionDetail` に `created_at` / `deleted_at` が無い★（`:2234-2256`）。★論理削除を謳いながら、状態を表すフィールドが応答に無い★

---

## 7. ★指示書の見取り図★（決まった場合にどうなるか。骨格のみ）

★どの決定がどの段階をブロックしているか★を示す。★詳細は決まってから書く★。

| 段階 | 内容 | ★ブロックしている決定★ |
|---|---|---|
| ★段階0★ | ★契約の食い違いを先に潰す★ — M1（`item_type` vs `item`）、M2 / M4（絞り込み）、`422` / `413` / `deleted_at` の宣言漏れ。★`CLAUDE.md` §6-1 により YAML が先★ | ★B4★（点検結果を持たせるならスキーマが大きく変わるので、B4 の後でないと二度手間） |
| ★段階1★ | ★独自ストアの土台★ — `lib/inspections/` にスキーマと読み書きを作る。fixtures と型は流用 | ★B2 / B3★（置き場所が決まらないと1行目が書けない）、N1 / N2 |
| ★段階2★ | ★写真の保存と取り出し★ — アップロード受け、保存、署名付きURL発行 | ★B2★（実体が S3互換かローカルかで実装が別物）、N11 / N15 |
| ★段階3★ | ★`GET /inspections` と `GET /inspections/{id}`★（読み取り2本） | ★N32★（表示名の解決方法）。★N34 / N35 は暫定で進められる★ |
| ★段階4★ | ★一覧画面★（サマリ3枚 + フィルタ + 8列の表 + ページ送り） | ★B5★（PC のみかスマホもか）。★モック移植で足りるのは PC のみの場合だけ★ |
| ★段階5★ | ★詳細モーダル★（Before/After × 7項目） | ★M6★（写真の見せ方）、★B4★（結果欄の有無） |
| ★段階6★ | ★`POST /inspections`（登録）と登録モーダル★ | ★B4 / B5 / N11 / N29★ |
| ★段階7★ | ★`DELETE /inspections/{id}`（論理削除）★ | ★N27 / N29★（写真をどうするか / 誰が消せるか） |
| ★段階8★ | ★メニューの復活★（`AppShell.tsx:22` のコメントを外す）と `docs/architecture.md:68` / `:130` の更新 | 段階4〜7 の完了 |

★要約★: ★B2（ストレージの実体）と B3（誰が用意するか）が決まれば段階1〜3 は書ける★。
★B4（点検結果を持たせるか）と B5（誰がどこから入力するか）が決まれば段階0 と段階4〜7 まで書ける★。
★B1（そもそも出すのか）が No なら、全段階が不要になる★。

---

## 8. 本書を書くにあたって触れていないもの（確認用）

- ★コードは1行も変更していない★（`lib/` `app/` `components/` `prisma/` `d-watch-api.yaml` `d-watch-mock.jsx` はすべて読み取りのみ）
- ★`docs/decisions.md` `docs/handoff.md` `CLAUDE.md` `docs/spec.md` も読み取りのみ★
- ★他の `docs/handoff/*.md` に触れていない★
- ★git のコミット・push・`git add` を実行していない★
- ★本番DB（`133.125.238.144`）に接続していない★（D-148）
