# セッション引き継ぎ（★2026-10-06 指示書AW 実装後に更新★・ブランチ `develop`）

## この文書の位置づけ — ★最初に読むこと★

- ★**これが入口です**★。`docs/handoff.md` は全履歴（★追記62まで★）、`docs/decisions.md` は
  決定の台帳（★D-160まで・148件★）で、どちらも読み切るには大きすぎます。
- 本文書は ★**「現在地」と「次の一手」だけ**★ を1枚にまとめたものです。
  ★ファイル名は 20260917 のまま★（`/d-watch` スキルがこの名前で指しているため）。中身は 2026-10-06（指示書AW の実装後）に書き直しました。
- ★★本文書と `docs/handoff.md` / `docs/decisions.md` が矛盾したら、後者2つが正★★です。
- ★前々版は `docs/handoff/セッション引き継ぎ_20260916.md`★（★内容は古い★）。
- ★★本書の数字も書いた瞬間から古くなります。必ず自分で実測してください★★。

---

## 0. 30秒で読む現在地（★2026-10-06 実測★）

| 項目 | 値 | 測り方 |
|---|---|---|
| ブランチ | `develop`（★`main` へ直接 push しない★）。測った時点の HEAD は `f02eb1d`（本書を更新したコミットは含まない）。★origin/develop は `19dbe38`。★未 push は指示書AW の8コミット（`fc9b3cf`〜`f02eb1d`）と、その後の資料のコミット（`a8b2943` 以降）★ | `git log -1` / `git rev-list --count origin/develop..develop` |
| 最終決定番号 | ★D-160★（148件。D-160 に AW の「実装の記録」を足した） | `grep -n "^### D-" docs/decisions.md \| tail -3` / `grep -c` |
| 最新の追記 | ★追記62★（指示書AW の実装） | `grep -n "^## 追記" docs/handoff.md \| tail -1` |
| `main..develop` | ★499コミット★（`origin/main..origin/develop`。手元の develop は＋8（AW）＋資料のコミット）。★fetch はしていない（手元の参照。PR #6 の head は `gh` で `19dbe38` と一致）★ | `git rev-list --count origin/main..origin/develop` |
| ★PR★ | ★#6 が open・CI緑（SUCCESS。head `19dbe38`）・**レビュー未了**（`reviewDecision` 空）★ | `gh pr view 6 --json state,reviewDecision,statusCheckRollup` |
| テスト | ★119ファイル / 2,790件 全パス★ / `tsc` 0 / `lint` 0 / `USE_FIXTURES=true` の `build` 成功（監督が `f02eb1d` で確認） | `npx vitest run` ほか |
| 指示書 | 45本（★次は `AX`★）。★AW まで実装済み★（AP は保留のまま） | `ls docs/handoff \| grep -c "^指示書"` |

---

## 1. ★★接続先はステージングです — 4カラムだけ書き込んでよい★★

★★`133.125.238.144` / `clean_watch` は**ステージング**。本番DBは別にある★★（D-152。D-148「本番DBそのもの」は破棄）。

- ★★4カラム（`status` / `comment` / `responded_at` / `resolved_at`）の UPDATE は書き込んでよい（D-152）。それ以外は禁止★★
- ★2026-09-30〜10-01 に先方が実データ（ドン・キホーテ実店舗10件＋本社）を入れた。当方のダミーは消えている★
- ★★2026-10-06 に接続が回復した★★（`.env.local` 更新後。10-02〜10-05 は `1045 Access denied`。D-157）。11:15 JST の再実測は D-158 末尾
- ★★先方は 10-06 時点でデータを投入している最中★★: `clean_task_reports` 54行がすべて `clean_timetable_id` が NULL（予定外扱い）で、★予定と実績が1件もつながっていない★。
  ★投入が終わったら再実測する★（D-158 末尾）
- ★★4カラムの書き込みは 2026-10-06 16:11 JST にエラー一覧（`/errors`）から確かめた★★（`1000013` の1行。権限エラーなし・4列は操作前と完全一致。先方投入データ。追記62 §3）。
  ★ステージングのエラー16行はすべて本清掃に紐づくので、アラート画面（`/alerts`）から書ける行は無い★
- ★`scripts/seed-local-db.ts` はステージングに絶対に向けない★（テーブルを消して入れ直す。`lib/db/local-guard.ts` が拒否する）

★**実測値を書くときは出所を必ず併記すること**★（`CLAUDE.md` §6-6）。
★当方のシード由来 / 先方投入 / 構造（`information_schema`・`SHOW`・`EXPLAIN`）のどれか★。
★出所を書けない数字は「実測」と呼ばない★。

---

## 2. ★次にやること（優先順）★

### 1位 — ★指示書AW の8コミットと資料のコミットを push する★

- ★未 push★: 指示書AW の実装（`fc9b3cf`〜`f02eb1d` の8件）と、その後の資料のコミット（`a8b2943` 以降）。origin/develop は `19dbe38`。★監督が差分を確かめてから push★
- push すると PR #6 の head が進むので、★CI が緑のままか確かめる★

### 2位 — ★ステージングの投入が終わったら再実測★

- 予定と実績のつながり（`clean_task_reports.clean_timetable_id`）・`clean_timetable_histories` の行と warn `db.timetable_conflict` の有無（指示書AU 段階3b）
- ★ダッシュボードの直近モードの内訳★（10-06 15:0x は11エリア・成功9・失敗1・未実施1。追記61 §3）
- ★`prisma db pull`★ — ★`serial_number` の拡張（varchar(100)）を確かめてから★（ユーザー指示 2026-10-06。10-06 は varchar(20) のまま）
- ★事前チェックに紐づくエラー行が入ったら、アラート画面（`/alerts`）からの書き込み（指示書AT 段階9）★。4カラムの書き込みそのものは `/errors` から確認済み（上の §1）

### 3位 — ★PR #6 のレビューを通す★

- ★積み上げ PR に分けて daichi がレビューし `main` に入れる★（`docs/handoff/PRレビュー手順_20261001.md`。D-154。区切りは数え直す）
- ★`main` は 2026-08-27 で止まったまま★。★差が開くほどレビューが不可能になる★

### 4位 — ★点検記録画面（F-05）の指示書を書く★

- ★唯一の未実装画面★（`app/(dashboard)/inspections/page.tsx` は `PlaceholderScreen` の5行）
- ★独自ストア＋写真管理。メインDBに保存しない★（`CLAUDE.md` §7）。★TeamWorks 待ちが無い★
- ★`customer_name` の説明に残した「ブランド」列★（`d-watch-api.yaml` の `Facility` / `InspectionListItem`、`lib/types/index.ts` の2か所）もここで合わせる（追記60 §6）

### 次点

| # | 内容 |
|---|---|
| A | ★次回（第12回）確認事項の候補★（D-158 項7）: 予定が `clean_timetable_histories` に移る時期／「清掃開始できなかった」エラーの `error_type` の値（10-06 に `NOT_STARTED` を観測。D-158 末尾）／P-9 の `clean_timetable_id` は本清掃・事前確認のどちらか／P-13「本日中に修正」の対象。★AV の §11 Q8（レポートが書かれるまでの遅れ。落ち着き30分で足りるか）も候補★ |
| B | ★次フェーズ★（D-158 当方の対応5）: エラーの3区分（ロボット／制御盤／セキュリティ・清掃開始失敗）・D-Sec アラートの取得元を `robot_error_reports` に切り替え（P-10）・出発失敗の対応状況の書き込み。★エラー一覧（`/errors`）は種類を生値のまま出している（区分は作っていない。D-160 項3）★ |
| C | ★指示書AV で範囲外にしたもの★（§10・§11）: 数値カードから移ったときの遷移先の条件／遡り日数・落ち着き時間を画面から変えること（Q6）／7日以内に予定が無いエリアを知らせること（Q7） |
| C2 | ★指示書AW で範囲外にしたもの★（§10）: 件数カード・メニューのバッジ・CSV／`Precheck*` の名前の一般化／`/alerts` と `/errors` の部品の共通化。★契約によるメニューの出し分けは P2（顧客に使わせる前に必ず。D-160 追記4）★ |
| D | ★375px 幅でサイドバーが畳まれない★（ダッシュボードの見出しが4行に折り返す・エラー一覧は右側が切れる。今回以前からの作り。追記61 §5・追記62 §5）／★AU の EN・375px のブラウザ目視★（追記60 §5。記録なし）／★エラー一覧のツールバーは JP で「解消済みも表示」が2行目に回る★（EN は1行。表の列幅は動かない） |
| D2 | ★i18n の「備考」→ "Note" を足した副作用で、D-Secログの備考列の見出しが EN で "NOTE" になった★（これまでは EN でも「備考」。追記62 §5）。誤訳ではないので直していない |
| E | ★指示書AP（レポート画面のエラー表示）★ — ★作成済み・**保留**★ |
| F | ★規模前提のコメント14か所★ / ★EN の抜け★（保留） |

### ★リリース直前にまとめて行う（D-154）★

一覧は `CLAUDE.md` §3。★`lib/config/allowed-ips.ts:35` の `ALLOW_ALL_WHEN_EMPTY` が `true`★（このままだと誰でも通る）／
★`AUTH_TOKEN` が `.env.example` で `changeme`★／接続元の制限・TLS／ステージングDBのパスワード変更／ログインの試行回数制限と cookie の中身。
★あわせて見直すもの★: 清掃詳細ログの期間なしの取得の性能（既定を全期間にした。Prisma 版は保持期間の予定を全部読んでからページ分けする。D-159 追記）／★エラー一覧の「解消済みも表示」の性能★（保持期間ぶんのキーを読む。D-160 追記2）／★契約によるメニューの出し分け★（顧客に使わせる前に必ず。D-160 追記4）。

---

## 3. 外部待ち — ★第11回は 2026-10-05 に回答受領（D-157 / D-158）★

| 待っているもの | ブロックされていること |
|---|---|
| ★先方のデータ投入の完了（10-06 は投入中）★ | ★予定と実績がつながった状態での確認すべて★（上の 2位） |
| P-13「本日中に修正予定」の対象（権限か、ログインできない件か） | 4カラム更新の権限の確認（★10-06 にステージングで `/errors` から書けた・権限エラーなし。追記62 §3★。どのアカウントの権限で通ったかは未確認） |
| ★DDL 変更の取り込み★: `robot_id` は NULL 可になった（10-06 構造で確認）。★`serial_number` は varchar(20) のまま★（P-8 c の拡張は未反映） | `prisma db pull`（★拡張を確かめてから★）。★それまでは `robot_error_reports` を `select` で絞って読む★（`lib/db/robot-error-select.ts`） |
| 第9回 Q6-2（サマリに実施回数の列） | ★確定期間の稼働率は検算できない★（第11回 P-6 で式は確定。分子＝正常終了の回数の列が無い） |
| 上の「次回の確認事項の候補」 | まだ送っていない |

★**第11回で決まったこと**★（D-158）: 完了率の式は確定（P-2=A）／`task_area = 0` は 0%（P-5=B）／当期 KPI はサマリの式（P-6）／
予定は `clean_timetables` と `clean_timetable_histories` の両方（P-7=C）／`customers` は法人（P-15=B）→ 見出しは「顧客」／本番DBも JST（P-11=A）。
★いずれも指示書AU で実装済み★（追記60）。

★回答が来たら**受領日を `docs/decisions.md` に記録すること**★（★送付と受領の両方を記録する★）。

---

## 4. ★完成しているもの★

★`app/(dashboard)/` の画面12枚中11枚が実装済み★（＋ログイン）。★空なのは点検記録だけ★（`find app -name page.tsx` と `PlaceholderScreen` の grep で確認）。

ダッシュボード / 清掃詳細ログ / アラート / ★エラー一覧（10-06）★ / レポート / 清掃面積 / D-Secログ / D-Secアラート /
施設ロボットマスタ / スケジュール管理 / システム管理（＋ログイン）。

- ★2026-09-17 に全画面をブラウザで目視確認済み★（追記58）
- ★AR〜AT の変更（清掃結果の表示名・総清掃面積の注記・アラートの状態ボタンと備考）は fixtures で確認済み★（`/d-watch` スキルの記述。日付は 2026-10-05）
- ★AU の変更は fixtures の API で境界値を確認済み・ブラウザ目視は記録なし★（追記60 §4・§5）
- ★AV（ダッシュボードの直近モード・清掃詳細ログの既定を全期間）は fixtures の本番ビルドを Edge ヘッドレスで撮影して確認、ステージングでも API を確認済み★（追記61 §3）
- ★AW（エラー一覧）は fixtures の API と画面（撮影）・ローカルDB（当方のシード由来。49行）・ステージング（先方投入。16行。1行を書いて戻した）で確認済み★（追記62 §3）

---

## 5. ★最近わかった重要なこと★

| # | 内容 |
|---|---|
| 1 | ★ダッシュボードの数値カードと表は「各清掃エリアの直近の清掃（7日以内・終わった予定のみ・出発失敗を含む）」★（D-159）。★スケジュール進捗・要レスキュー・セキュリティバナーは当日のまま★なので、★カードと進捗は母集団が違う★（`?date=` を指定したときは従来どおりその日） |
| 2 | ★実データの清掃は 10:00 や 19:00〜22:00（前日の日付）★。サンプルデータ（深夜 1:30〜3:30・当日の日付）とは時間帯が違う。★「当日の日付で数える」作りは、実データでは翌朝に空になる★（D-159 のきっかけ） |
| 3 | ★清掃詳細ログの既定は「期間を指定しない（全期間）」★（D-159 追記。ユーザー指示「C」）。★片方だけ日付を入れたら入っている側だけを送る★（追記61 §4） |
| 4 | ★当期の稼働率は以前より低く出る★（分子が「正常終了（status 4）」に変わった。例: 予定10・開始9・正常終了7 → 90% から 70%）。★施設ステータスの閾値（good 90 / warning 75。`lib/config/index.ts:565-570`。`137a94b`）は据え置き★（D-158 項8。D-158 は「90/80」と書いているが実物は 75） |
| 5 | ★予定は2表から読む★。★同じ id は `clean_timetables` 側を採る★（履歴の id は本表の id のコピー。ユーザー回答 2026-10-05） |
| 6 | ★制御盤・セキュリティ・「清掃を開始できなかった」エラーも `robot_error_reports` に入る★（P-8・P-10）。★区分の見分けは次フェーズ★。★それらを全部見る画面がエラー一覧（`/errors`）★（D-160。アラート画面は事前チェック＋出発失敗だけのまま） |
| 7 | ★`clean_task_reports.started_at` は、予定のある清掃では予定の `start_at` と同じ値★（ユーザー回答 2026-10-05「A」）。★期間の振り分けは画面どうしで一致する★ |
| 8 | ★エラー一覧は「2段階で読む」★（キーだけを SQL で絞って全件読み、アプリで並べてページ分け → そのページの行だけ読み直す）。★並びの `errored_at ?? created_at` を Prisma のクエリビルダで書けないため★（`nulls last` で近似すると `errored_at` が NULL の行が末尾に回る。D-160 追記2）。★4カラムの書き込みは `/alerts`（事前チェックの行だけ）と `/errors`（全行）の2本のルートから★ |

---

## 6. 触ると危ない場所（★次の人が踏む地雷★）

★前々版 §6 の14件（2026-09-16 時点の記述。接続先の呼び名など古い所がある）も読むこと★（`docs/handoff/セッション引き継ぎ_20260916.md`）。
★特に事故が起きやすいもの★（いずれも★例外もテスト失敗も出ないまま結果だけ間違う★）:

1. ★`facility_ids` の `null`（全件）と `[]`（0件）は別物★ — `?.length` で分岐すると★全件が静かに返る★
2. ★`facilities.contract` は `varchar(10)` の桁位置★ — 数値比較すると★全施設が「契約なし」になる★
3. ★表示用に丸めた値で判定しない★（判定は生値、丸めは表示層だけ）
4. ★DATETIME は JST の壁時計値★ — ★生の値に9時間を足さない★（`CLAUDE.md` §3）
5. ★★4カラム以外を書かない★★（書き込みは `lib/db/robot-error-write.ts` の1ファイルだけ。★ルートは `/prechecks/{id}/status` と `/errors/{error_id}/status` の2本になったが、どちらも `writeRobotErrorColumns()` を通る★）
6. ★★予定を `prisma.cleanTimetable` で直接読まない★★ — ★必ず `lib/db/timetable-source.ts` を通す★。直接読むと履歴の表が抜ける。★`count` / `groupBy` を2表にまたがって書かない★（同じ id の重複を引けない）
7. ★★`robot_error_reports` を `select` なし・`include` で読まない★★ — `robot_id` が NULL の行が1件入っただけで読み取りが落ちる（`lib/db/robot-error-select.ts` の定数を使う）
8. ★★`cleanLogs()` と `cleanLogRunMeta()` の `where` を別々に書かない★★ — 非公開の `mainTimetableWhere()`（`lib/db/index.ts`）を共有している。片方だけ直すと、ダッシュボードの行とメタの突き合わせが静かにずれる（対応が無ければ `pickLatestRunPerSection()` が例外）
9. ★ダッシュボードの「現在」はルートで1回だけ作る★（`app/api/dashboard/route.ts` の `const now`）。窓と選び方が別の「現在」を見ると、終了＋30分ちょうど付近で母集団がずれる
10. ★「実測」と書くときは出所を併記する★（`CLAUDE.md` §6-6）
11. ★新しいクローンでは `npx prisma generate` が要る★（`lib/generated/prisma` は gitignore 対象）
12. ★ワークツリーでは `npm run build` が落ちる★（Turbopack が node_modules のジャンクションを拒否。"Symlink [project]/node_modules is invalid"）。★ビルドは本体で行う★
13. ★vitest でモックした `@/lib/db/prisma` を2本同時に動的 import すると、片方に本物が返る★（テスト環境だけ。ルートが `Promise.all` で2つの `db.〇〇()` を呼ぶと500）。エラー一覧の GET のテストは `vi.spyOn` で差し替えた。★`/clean-logs` の Prisma 経路テストで施設名と分類を同時に試すと同じ罠を踏む★（追記62 §4）
14. ★i18n のキーは全画面で共有★ — エラー一覧で「備考」→ "Note" を足したら、D-Secログの見出しも EN で "NOTE" に変わった。★キーを足すときは同じ文字列を `t()` に通している画面を grep する★
15. ★Bash ツールはヒアドキュメントの中でも `\\` を `\` に縮める★（正規表現の `\S` 等を書くスクリプトは Write ツールで書く）

---

## 7. 作業の進め方（この案件の作法）

1. ★実装は自分で書かない。指示書を書いて Cursor に渡す★（★渡し方はファイル名を指すだけ★）。
   ★例外: ユーザーが Claude Code に「ここで実装して」と明示したとき★（AR〜AW はこれで実装した。`.claude/commands/d-watch.md`）
2. ★完了報告を受けたら**独立したエージェントで検証**してから受け入れる★
3. 検証が通ったら ★`docs/handoff.md` に追記★ ＋ ★`docs/decisions.md` に決定を記録★
   （★採番前に `grep -n "^### D-" docs/decisions.md | tail -3` で実測する★。
   ★`^### D-0` では3桁台を拾えない★）
4. ★指示書を2本同時に走らせない★（決定番号の衝突事故あり）
5. ★判定ロジックは「期待値表の確定 → テスト作成 → 実装」の順を崩さない★
6. ★API契約を変えたくなったら、先に `d-watch-api.yaml` を直す★
7. ★★仕様が不明なら止まって確認を求める★★
8. ★`git add -A` は禁止★。★必ずファイルパスを明示する★
9. ★dev サーバーは Browser pane の `preview_start` で起動する★（fixtures は `d-watch-fixtures`、ポート3100）。
   ★サブエージェントが起動した dev サーバーは止めてから終わらせる★
10. ★別の Claude セッションが同じ develop に docs のコミットを積むことがある★（2026-10-06 に `7cb7660` が作業中に入った）。
    ★コミット直前に `git status --short` と `git log --oneline -3` を見て、自分のファイル以外を巻き込まない★

---

## 付録: よく使う出典

| 知りたいこと | どこを見るか |
|---|---|
| 全履歴 | `docs/handoff.md`（追記62まで） |
| 決定と理由 | `docs/decisions.md`（D-160まで） |
| 仕様の正・禁止事項 | `CLAUDE.md` |
| API契約 | `d-watch-api.yaml` |
| 画面の正 | `d-watch-mock.jsx` |
| 何がどこで決まっているか（非エンジニア向け） | `docs/code-map.md`（第4版。2026-10-06 に AU・AV・AW 分を改訂） |
| 最新の外部回答 | `docs/handoff/TeamWorks回答_第11回_20261005.md`（整理は D-158） |
| 最新の指示書 | `docs/handoff/指示書AW_エラー一覧ページを作る_20261006.md`（§13 に実装の記録） |
| サンプルデータでダッシュボードに何が出るか | `docs/fixtures.md` §12.3（直近モード） |
| サンプルデータでエラー一覧に何が出るか | `docs/fixtures.md` §13（既定10行・全11行） |
| PR の分け方 | `docs/handoff/PRレビュー手順_20261001.md` |
