Newer
Older
client_dwatch / .claude / commands / d-watch.md

description: D-Watch(清掃ロボット監視ビューアー)の作業を引き継いで再開する

D-Watch(清掃ロボット監視ビューアー)の作業を引き継ぎます。

★役割分担(最初に読むこと)★

このリポジトリでは2つの環境で Claude が動きます。担当が違います。

どこで動いているか 担当 指示書を渡されたら
Cursor の中(エディタに統合された Claude) ★実装担当★ .ts の実体(ロジック・型・テスト)を書く ★実装してください★
Claude Code(デスクトップアプリ / ターミナル。このスラッシュコマンドを使う側) 調査・検証・指示書の作成、docs/*.md などの文書 作るところまで。実行しない

★自分がどちらか分からないときの判定★

  • このスラッシュコマンド(/d-watch)から起動された → Claude Code 側(実装しない)
  • ユーザーが docs/handoff/指示書*.md を指して「実行して」と言った → ★あなたが実装者です。実装してください★

「実装は Cursor 側」という記述を「Claude は実装しない」と読み違えないこと。 2026-09-07 に、Cursor 内の Claude がこの記述を読んで実装を拒否し、 代わりに文書作業のメニューを出す事故が起きました。

Claude Code 側が守ること: docs/handoff/指示書*.md は「作る」までが担当で、「実行」はしません。 2026-09-03 に指示書D を Claude Code 側で実行してしまい、24ファイルの変更を作ったうえで 全部差し戻した経緯があります(docs/handoff.md の「追記2」参照)。 サブエージェントを使うのは調査・検証まで。実装を委譲しないこと。

★例外: ユーザーが Claude Code に「ここで実装して」と明示したとき★は実装してよい(外出中で Cursor に渡せないため、指示書AR〜AT を Claude Code で実装した(git log の日時は 2026-10-02)。指示書AU も 2026-10-05 にユーザー指示「ここで実装してください」で同様。D-158 項9。★指示書AV・AW も 2026-10-06 にユーザー指示「ここで実装する」で同様(追記61・追記62)★。★D-161〜D-171・D-173 は指示書なしで、ユーザーの画面での指示をその場で実装した(追記63)★)。 その場合も ★指示書の期待値表は変えない★・★監督(メイン)が型チェック・テスト・差分を自分で確かめてから push★。

最初にやること

★入口はこの1枚です。先にこれを読んでください。★

  • ★docs/handoff/セッション引き継ぎ_20260917.md★

そのうえで、必要に応じて次を読みます。いずれも本ファイルより優先される正の情報源です。

資料 何の正か
CLAUDE.md ★仕様・規約・禁止事項の正★
docs/decisions.md ★決定の正★。★D-194 まで(182件。2026-11-05)★。★番号順に並んでいません★
docs/handoff.md ★全履歴★。★追記63 まで★
d-watch-api.yaml API契約の正
d-watch-mock.jsx 画面の正

★★本ファイルの数字は書いた瞬間から古くなります。必ず実測してください。★★


★★最新 — 2026-11-05 の作業(制御盤のログの取り出し AY・BJ・BK と記録の穴埋め)★★

★この節が一番新しい★。その下の「2026-10-30〜11-04」も読むこと。「30秒で読む現在地」「最初の報告」の数字は 10-07 時点(古い)。

現在地(★2026-11-05 夕方 JST 実測★)

項目 値
ブランチ develop。★origin/develop は 32dfd11 のまま。ローカルが30コミット以上先★(★ユーザー指示「全ての実装が終わったら push する。まだしない」2026-11-05★)。GitBucket の次のタグは 2026-11-05
テスト ★170ファイル / 4,315件 全パス★(tsc・lint も緑。cc2cba2)
指示書 ★BK まで(次は BL)★。AY・BJ・BK は Cursor が実装し、監督(Claude Code)が点検
決定 ★D-194 まで記録した(2026-11-05)★ — それまで見出しが D-181 で止まり、D-182〜D-185(指示書BB〜BE)と BF〜BI・10-27〜10-30 の決定が抜けていた。★D-190〜D-194 は 10-29〜10-30 の判断で、D-188・D-189(11-04)より古い(番号は日付順でない)★。★記録の穴は grep -c "指示書BX" docs/decisions.md で指示書ごとに数えると見つかる★
未コミット ★別セッションの4ファイル★(components/features/errors/ErrorContentPicker.tsx・lib/errors/error-content-label.ts とそのテスト(改行コードだけ)・docs/handoff/指示書AY_* の1行)。★触らない・コミットに入れない★

この日にやったこと

  • ★指示書AY(制御盤のログを D-Sec ログ画面から取り出す。D-179)★: 制御盤(Raspberry Pi の常駐プログラム C:\Users\daich\dev\dwatch-log-agent\agent.py。★別リポジトリ・読むだけ★)が /api/ds-agent/commands を長く待ち(long poll)、一覧・エクスポート(4MB ずつ・SHA-256)を中継する。★中継はメモリだけ(lib/ds-agent/relay.ts。globalThis の1つ。プロセス1つ前提)・ディスクに書かない★。制御盤のトークンは SHA-256 で data/settings/ds-agent-tokens.json。/api/ds-agent/ は Bearer だけ、他は cookie
  • ★指示書BJ(AY の点検の指摘直し)★: 一覧の結果の形が崩れていたら制御盤に 400 result_invalid・ブラウザに 502 agent_error(agent_code: ["result_invalid"])/取り消し(AbortError)だけ黙り、通信失敗は文言を出す/ボタンの幅を固定(112・100・140px)
  • ★指示書BK(BJ の点検の直し)★: テストが見張りになっていない箇所を直した(壊しても緑だった)/★ファイル ID の上限 1024 → 8192★(制御盤が受け取れる上限にそろえた)/★エクスポートで選ぶ file_ids を JSON にした大きさが 48KB を超えたら 422「選んだファイルが多すぎます」★ — ★制御盤は D-Watch の応答を 64KB までしか読まない★(agent.py の RESPONSE_READ_MAX_BYTES)ので、超えると指示が途中で切れて 50秒後に 504 になっていた
  • ★d-watch-api.yaml を YAML として読めるようにした★(precheck_minutes の説明の (旧: … の : を引用符で囲んだ。中身は変えない)。★js-yaml で読める・$ref は全部解決する★ことを確かめた
  • ★docs/decisions.md に D-182〜D-194 を足した★(上の「決定」。D-186 BF・D-187 BG・D-188 BH・D-189 BI・D-190 進み具合は前日・D-191 アラートは事前チェックだけ・D-192 status 6 と不明(n)・D-193 障害サマリの error_list_id とエラー内訳・D-194 10-29 の表示の手直し)。docs/code-map.md の「D-182〜D-185 は監督待ち」も直した

この日に分かった罠

  1. ★「壊して赤」を指示書に書くときは、その壊し方が本当に赤になるかを監督が先に試す★。BJ で書いた await import("node:fs") はどのテストにも捕まらない壊し方だった(BK K2 で静的な検査に import(・require(・モジュール名の文字列を足して塞いだ)
  2. ★点検の報告で「指示書に無い変更」と書く前に、指示書の全部の節(YAML の節・記録の節)を grep する★(BJ §2-3 にあった変更を「無い」と誤って報告した)
  3. ★制御盤側の上限は agent.py の定数を読む★: FILE_ID_MAX_LEN = 8192(受け取る側だけ。作る側に上限なし)・RESPONSE_READ_MAX_BYTES = 64KB。D-Watch の上限を変えるときは両方と突き合わせる
  4. ★:3100 の後始末★: TaskStop しても子の node が残ることがある。★kill の前に 3100 を listen しているプロセスのコマンド行を見る★(next\dist\bin\next" start -p 3100。引用符が挟まるので 'next start' では当たらない)
  5. ★Cursor の「完了」はコミットで確かめる★(git log 53f46e0..HEAD 等)。11-05 に1回、何もコミットされていないまま「完了」と言われた(渡し直して解決)

★★2026-10-30〜11-04 の作業(D-Watch 2セッション目のまとめ)★★

★この節の数字は 11-04 時点★。最新は上の「2026-11-05」。

現在地(★2026-11-04 17:4x JST 実測★)

項目 値
ブランチ develop。★HEAD = origin/develop = 619e21d★(未 push 0)
GitBucket ★develop は1コミット★(11-04 にユーザー指示でまとめ直した。中身は GitHub develop の先頭と同じ。GitHub の履歴は含まない)。★以後はその上に1つずつ積むので、サーバーは普通の git pull で取れる★。下の「GitBucket への上げ方」
テスト ★157ファイル / 3,855件 全パス★(tsc・lint も緑)
指示書 ★BH・BI まで(次は BJ)★。BH・BI は Cursor が実装し、監督(Claude Code)が点検・コミット
決定 ★コミット済みは D-181 まで★(docs/decisions.md)。★BH・BI の決定は未記録★(下の「残り」1)
未コミット ★別セッションの作業中の6ファイル★(docs/decisions.md・docs/handoff/指示書AY_*・docs/handoff/設計_制御盤ログの取り出し_*・components/features/errors/ErrorContentPicker.tsx・lib/errors/error-content-label.ts とそのテスト)。★触らない・コミットに入れない★(コードの3つは改行コード以外の差なし)

この期間のコミット(古い順)

コミット 内容
a2e240a・a1e4b59(10-30) 清掃結果 status = 6 は 3 と同じ「清掃キャンセル」。表に無い値(7 以上など)は「不明(7)」と数字を残す(CLAUDE.md §4.7)
38e8f5d(10-30) 施設ロボットマスタを「監視」「D-Sec」列で並べ替え(1回目 desc = ○ が上 → ▲ → 既定)
4bb639e(11-04) ★指示書BH★: 清掃詳細ログ7列(機種・シリアル・日付・出発・清掃結果・完了率・判定)とエラー一覧6列(検知時刻・シリアル・種類・レベル・対応状況・備考)を見出しで並べ替え(1回目 asc = 悪いほうが上。サーバー側・ページングの前・CSV も同じ並び)。
★「予定:すべて/予定あり/予定なし」の絞り込み★をエラー一覧と清掃詳細ログ(API・CSV・画面)に(lib/api/schedule-filter.ts・components/ui/ScheduleFilterSelect.tsx の1か所)。
★並べ替えの印★: 並べていない列=薄い △、asc ▲・desc ▼。色はダーク白・ライト #1e293b(--sort-mark)。印の字は日本語フォント(--font-ja。body と共有)。
★表示の文言「予定外」→「予定なし」★(プルダウン・詳細ログの予定列・ダッシュボードの小さい表・CSV・清掃面積の注記。API の値 unscheduled は変えない。BH §13)。
YAML の清掃面積の行(CleanAreaRow)の説明を実装どおり「予定外も含む」に
619e21d(11-04) ★指示書BI★: ★予定なしの △× の行にもアドバイスの ▼★(詳細ログ・ダッシュボード)。入口 GET /clean-logs/unscheduled/{report_id}/advice(report_id は varchar(20) の文字列。数値にしない)。エリア別詳細のボタンは予定ありの行だけ(cleanLogRowView().areaDetail)。データ層 db.unscheduledCleanLog()。応答づくりは lib/clean-logs/advice-response.ts に切り出し両ルートで共有

このセッションで固めた手順

  • ★GitBucket への上げ方★(★サーバー(ステージング)が git pull して使う★。公開設定なので★GitHub の履歴は出さない★ — 履歴にステージングの DB ユーザー名が14コミット入っている。D-177):
    1. 先に GitHub(git push origin develop → git fetch origin)
    2. git ls-remote https://git.d-sec.dfarobotics.com/git/develop/client_dwatch.git refs/heads/develop で GitBucket の今の先頭 <head> を取る(知らない版なら止めてユーザーに聞く)
    3. ★S=$(git commit-tree "origin/develop^{tree}" -p <head> -m "D-Watch develop <hash> のスナップショット。GitHub の履歴は含まない")★(★-p <head> を必ず付ける★ — 付けないとサーバーで pull が効かない)→ git branch -f gitbucket-snapshot $S
    4. gitbucket-snapshot^{tree} と origin/develop^{tree} が一致、git merge-base --is-ancestor <head> $S を確かめる
    5. ★git push <上の URL> gitbucket-snapshot:develop(--force を付けない)★。拒否されたら誰かが積んだので止めてユーザーに聞く
    6. ★日付のタグを付ける★(ユーザー指示 2026-11-04): git ls-remote --tags <URL> で既存を確かめ、git push <URL> $S:refs/tags/YYYY-MM-DD(同じ日の2回目以降は -2・-3)。ローカルにはタグを作らない。最初のタグは 2026-11-04(0fff50c)
    7. ★サーバーで戻すとき★: git log --oneline(またはタグ名)で版を選び git reset --hard <タグ名か ID> → コンテナ作り直し。最新へ戻すのは git pull origin develop
    8. 経緯: 11-04 まで毎回「親なし1コミット」を force push していたので、サーバーで pull が効かず古い版のまま残った(10-29・11-04)。11-04 にいったん合流コミット(ecb9f68)でつなぎ直したあと、ユーザー指示「rebase などでまとめて最新の状態に」で★1コミットにまとめ直した(最後の force push)★。サーバーはその1回だけ git fetch origin → git reset --hard origin/develop。★以後は force push しない★
    9. ★サーバーへの反映★: サーバーで git pull → コンテナをイメージごと作り直して再起動 → ブラウザで Ctrl+Shift+R(npm run build だけではコンテナに届かない)
  • ★コミットの作法★: ファイルを名前で指定(git add -A 禁止)・別セッションの6ファイルを入れない・★コミット前に差分へテスト用トークン/本物の AUTH_TOKEN/DB のパスワード/接続先 IP が入っていないことを grep で確かめる★(値は表示しない)
  • ★fixtures の画面確認★: USE_FIXTURES=true npm run build → AUTH_TOKEN=<テスト用トークン> USE_FIXTURES=true npx next start -p 3100 → アプリ内ブラウザでログイン(★テスト用トークンはスクラッチパッドに乱数で作る。本物のトークンは打たない★)→ 終わったら止め、3100 を listen しているプロセスのコマンド行を確かめてから kill
  • ★ステージングでユーザーがローカル確認★: preview_start の d-watch(:3000。.env.local が clean_watch)で立て、★ログインはユーザー自身★。「止めて」と言われたら preview_stop → 3000 が空いたか確かめる
  • ★ステージングを監督が画面で見るとき★: USE_FIXTURES=false とテスト用トークンで :3100 を立てる(読むだけ)。API だけなら .env.local の AUTH_TOKEN を cookie に付けて curl(値は表示しない)
  • ★指示書と実装の点検★: Workflow で4観点(コードとの食い違い/期待値の実計算/画面の流れ/漏れと矛盾)→ 指摘ごとに別エージェントが反証 → 本物だけ反映(BH §12: 12件中6件、BI: 29件中26件、BI の実装: 14件中13件・全部軽微)。★結果ファイルは途中で切れるので journal.jsonl から組み立てる★(started の agentId→label で指摘と判定を対応づける)
  • ★Cursor の担当と「こちらで直して」★: 指示書の実装は Cursor。★ユーザーが「こちらで直して」と言ったものだけ Claude Code 側でサブエージェントに直させる★(文言の統一・BI の軽微5項目)。メインは担当を分けて委譲し、差分とテストを自分で確かめる

このセッションで分かった罠

  1. ★ステージングは予定なしの行が大半★(詳細ログ 636件中 596件が予定なし。予定ありは40件で全部出発失敗。11-04 実測・先方投入)→ ★「予定あり」が少ない・▼ が少ないのは不具合ではない★(ユーザーが「アドバイスが消えた」と感じた原因。BI で予定なしにも出すようにした)
  2. ★詳細ログのツールバーは 1366px で2行になる★(予定のプルダウン 160px を足したため。承知のうえ。BH §12-2)
  3. ★開いた行の見出し(adviceHead())とアドバイス本文は EN でも日本語★(前から。本文は運用設定の日本語)
  4. ★(2026-11-05 に解消)★ d-watch-api.yaml は js-yaml で読めない箇所が1つあった(precheck_minutes の説明の「(旧: …」の :)。★引用符で囲んで直した★。★説明に : を含む1行の文字列を書くときは引用符で囲むか | にする★。確かめ方: node -e 'require("js-yaml").load(require("fs").readFileSync("d-watch-api.yaml","utf8"))'
  5. ★clean_task_reports.report_id は varchar(20) の文字列★(19桁で安全な整数を超える。Number("1315386034733453312") は …300 に丸まる)。parsePathId() を流用しない(parsePathReportId())
  6. ★UNSCHEDULED_TIMETABLE_ID_WHERE はトップレベルの OR★。他の条件は展開して並べる(AND で包むのは OR が2つになるときだけ)。★app/api/clean-logs/__tests__/route.test.ts のスタブの matchesWhere は AND を黙って無視する★
  7. ★予定あり/予定なしの向き★: エラー一覧は key.scheduled(true=予定あり)、詳細ログは r.unscheduled(true=予定なし)。matchesScheduleFilter() には必ず「予定あり=true」を渡す
  8. ★アドバイスを開けるかは表の側(view.expandable)が決める★。cleanLogAdviceUrl() は ID が欠けた行だけ null(◎・結果待ちでも URL を返す)

残り(次にやること)

順 内容
1 ★(2026-11-05 に済み)★ docs/decisions.md に BB〜BI と 10-27〜10-30 の決定を記録(D-182〜D-194)
2 ★(2026-11-05 に済み)★ d-watch-api.yaml を YAML として読めるように直す(上の罠4)
2b ★(2026-11-05 に済み)★ 古い記述を直した: docs/code-map.md:69・:595(予定外を入れない=BG の前)・:656(エラー一覧の列幅が古い)・docs/spec.md:80(「種類の2行目にエラー内容」=今は「詳細」の列)・指示書BB 付録A の D20(「直列化しない」=実装は直列化。D-182)。★code-map の予定外の記述は他にも4か所(:439・:1169・:1328〜1339・:1640 付近)古かったので合わせて直した★
3 必要なら: 開いた行の見出しの EN 対応(罠3)
4 ★施設69(MEGAUNY稲沢東店・ロボット2台)のデータが入ったら表示を確かめる★(10-30 の確認では問題なし。データ待ち)
5 下の「次にやること」(10-07 時点)の PR #6・第12回の回答・点検記録画面(F-05)・契約によるメニューの出し分け・セキュリティはリリース直前、は★まだ残っている前提で、実測してから★進める

★★最初に知るべきこと — 接続先はステージングです★★

★★133.125.238.144 / clean_watch はステージング。本番DBは別にある★★(D-152。D-148 は破棄)。

  • ★★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。D-157)。★10-06 は予定と実績がつながっていなかった★(レポート54行すべて clean_timetable_id が NULL。D-158 末尾)が、★10-07 はレポート87行のうち80行が本清掃の予定に紐づいていた★(予定外7行。D-170 2026-10-07 実測・先方投入)。★投入が終わったかは未確認★
  • ★4カラムの書き込みは 10-06 にエラー一覧(/errors)から確かめた★(1行を書いて戻し、4列は完全一致・権限エラーなし。先方投入データ。追記62 §3)。★エラー16行はすべて本清掃に紐づくので /alerts から書ける行は無い★
  • ★事前チェックの予定は本清掃とは別の行(別の id・parent_id あり)★だが、★事前チェックで見つかったエラーにどちらの id が入るかは未確認★(第12回で聞く。D-172)

30秒で読む現在地(★2026-10-07 11:3x JST 実測。古い — 最新は上の「2026-10-30〜11-04 の作業」★)

項目 値
ブランチ develop
最終決定番号 ★D-174★(アドバイス B2 の根拠の進め方。記録のみ)。最後の実装は ★D-173★(レポートがまだ無い清掃は予定の終了から2時間「結果待ち」。08ba9e9)
最新の追記 ★追記63★(D-161〜D-171・D-173 の実装と D-172・D-174 の記録)
main..develop ★533コミット★(origin/main..origin/develop。fetch 済み)。★HEAD = origin/develop = 04f974a(第12回の送付版)。未 push 0★
★PR★ ★#6 open(develop→main)・レビュー未了★。★CI「Lint / Test / Build」は 04f974a で緑(11:4x 確認)★。★レビュー担当は daichi(D-154)★。★積み上げ PR に分けて出し直す予定★(docs/handoff/PRレビュー手順_20261001.md。区切りは数え直す)
テスト ★125ファイル / 2,946件 全パス★(8a657a2。929c5b9・04f974a は資料だけ)
指示書 45本(★次は AX★)。★AR・AS・AT(2026-10-02。git log の日時)・AU(2026-10-05)・AV・AW(2026-10-06)は Claude Code で実装済み★。★D-161〜D-171・D-173 は指示書なし★

完成しているもの

★画面12枚中11枚が実装済み★(★エラー一覧 /errors を 10-06 に足した★)。★空なのは点検記録(F-05。docs/spec.md)だけ★。 ★2026-09-17 に全画面をブラウザで目視確認済み★(追記58)。★2026-10-05 に AR〜AT の変更(清掃結果の表示名・総清掃面積の注記・アラートの状態ボタンと備考)を fixtures で確認★。★AU(顧客の見出し・当期 KPI の式・予定の2表読み)は fixtures の API で境界値を確認済み、ブラウザ目視(EN・375px)は記録なし★(追記60)。★AV(ダッシュボードの直近モード・清掃詳細ログの既定を全期間)は fixtures の本番ビルドを撮影して確認、ステージングでも API を確認済み★(追記61)。★AW(エラー一覧)は fixtures の API と画面・ローカルDB・ステージング(1行を書いて戻した)で確認済み★(追記62)

★2026-10-06〜07 に足したもの(D-161〜D-171・D-173。追記63)★:

  • ★対応状況はプルダウン(D-161)、対応状況と備考は「編集モード」でだけ変えて「保存(N件)」でまとめて送る(D-165)★ — エラー一覧とアラートの両方。即時保存は無くなった
  • ★レポートの施設別パフォーマンスを CSV で出す★(GET /reports/facility-performance/export。D-163)/★CSV の値が無い率は空欄★(D-164)
  • 一覧の見た目(分類のプルダウン固定幅・期間の枠全体でカレンダー・備考を1行。D-162)/列幅(エラー一覧 D-166・余りを全列に配る D-167)/見出しと中身の寄せ(D-168)
  • ★事前チェックの結果も有無も判定に使わない★ことを確かめ、テストで固定(D-170)/表示する事前チェックの回は後で設定値で運用(D-169。いまは 60/30)
  • ★事前チェックの予定が無い回の「1h前ST / 30分前ST」は「-」★(API は null、CSV は空。予定があって異常なしは "Standby.")/★本清掃が成功した事前チェック異常はアラートで薄く表示し「本清掃は成功」の Pill★(main_run_succeeded。対応状況・件数は変えない)/D-Secログの備考の文字の頭を見出しに揃えた(D-171)
  • ★レポートがまだ無い清掃は、予定の終了から2時間(RESULT_WAIT_MINUTES)まで「結果待ち」で、失敗に数えない★(D-173)— 詳細ログは出発「…」・「結果待ち」・判定なし/ダッシュボードに「結果待ち」カード(成功率の分母に入れない)・直近の清掃は予定が終了した最後の清掃(settleMinutes は削除)/アラートの出発失敗・連続日数・要レスキュー・当期の率も数えない

次にやること

順 内容
★1★ ★資料のコミットを push したあと、PR #6 の CI が緑のままか確認する★(04f974a では緑。11:4x 確認)
★2★ ★第12回は送付版を作成済み★(docs/handoff/TeamWorks確認事項_第12回_20261007_送付版.md・04f974a。R-1 事前チェックで見つかったエラーの clean_timetable_id は事前チェックの行と本清掃の行のどちらの id か(D-172 P-9)/R-2 clean_task_reports は清掃の終了から最大どれくらい遅れて書かれるか(RESULT_WAIT_MINUTES の見直し。D-173)/R-3 お願い: データ投入(予定と実績の紐づけを含む)が終わったら一言ほしい)。★実際に送ったかは未確認★ → ★送付の確認と回答待ち。回答が来たら受領日を docs/decisions.md に記録★。★serial_number の拡張の再依頼は第12回には入れていない(急がない。D-172)★。P-13 と「予定が履歴に移る時期」も外した(D-172)。R-1 で本清掃の id が入るなら、アラートの「◯分前異常」は出なくなる(D-104)。R-2 の回答で RESULT_WAIT_MINUTES(120)を見直す
★3★ ★ステージングの投入が終わったら再実測★: 予定と実績のつながり(10-07 は 87行中 80行が予定に紐づく。D-170)・clean_timetable_histories と db.timetable_conflict・ダッシュボードの直近モードの内訳・事前チェックに紐づくエラー行が入ったらアラートからの書き込み(指示書AT 段階9)と main_run_succeeded・結果待ち(D-173)の出方。★prisma db pull は serial_number の拡張を確かめてから・急がない★(D-172)
★4★ ★PR #6 を積み上げ PR に分けて daichi がレビューし main に入れる★(先に CI 修正の PR。main は 2026-08-27 で停止中。D-154)。★ユーザー回答: レビューが終わったら全部 push する★(D-171 末尾)
5 ★点検記録画面(F-05)の指示書を書く★(★唯一の未実装画面★。独自ストアなので TeamWorks 待ちが無い。customer_name の説明に残した「ブランド」列もここで合わせる)
6 ★契約(facilities.contract)によるメニューの出し分け★(★P2。顧客に使わせる前に必ず★。D-160 追記4)
7 ★セキュリティ強化はリリース直前にまとめて★(D-154。一覧は CLAUDE.md §3: ALLOW_ALL_WHEN_EMPTY・AUTH_TOKEN が changeme・パスワード変更・TLS 等)
8 ★次フェーズ★: エラーの3区分・D-Sec アラートの取得元の切り替え(第11回 P-8〜P-10。D-158 当方の対応5)。★アドバイス B2 の根拠を本清掃のエラー内容に切り替える★(D-174 で決定。エラーコード(ユーザーが情報収集中)が決まってから)
9 後で・要望があれば: 表示する事前チェックの回を設定値で(D-169)/施設別パフォーマンスの CSV の追加列(D-163)/D-160 追記の残り(「解消済みも表示」の性能・375px でサイドバーが畳まれない)/★EN の文言と D-Secログの備考の見出しが EN で "NOTE" の件は、運用が始まって必要になったら直す★(D-171 末尾のユーザー回答)/指示書AV・AW で範囲外にしたもの(AV: 遷移先の条件・Q6・Q7 / AW §10: 件数カード・バッジ・名前の一般化・部品の共通化)/★fixtures で data.anomaly の「実績が予定を上回る」側を再現し直す★(D-173 で有効スケジュールが 11件になり再現できなくなった。追記63 §5)

外部待ち — ★第11回は 2026-10-05 に回答受領(D-157 / D-158)。第12回は送付版を作成済み★

  • ★第12回は送付版を作成済み★(docs/handoff/TeamWorks確認事項_第12回_20261007_送付版.md・04f974a。R-1 事前チェックで見つかったエラーの clean_timetable_id は事前チェックの行と本清掃の行のどちらの id か(D-172 P-9)/R-2 clean_task_reports は清掃の終了から最大どれくらい遅れて書かれるか(RESULT_WAIT_MINUTES の見直し。D-173)/R-3 お願い: データ投入(予定と実績の紐づけを含む)が終わったら一言ほしい)。★実際に送ったかは未確認★ → ★送付の確認と回答待ち。回答が来たら受領日を docs/decisions.md に記録★。★serial_number の拡張の再依頼は第12回には入れていない(急がない。D-172)★。P-13 と「予定が履歴に移る時期」も外した(D-172)
  • ★先方のデータ投入の完了★(10-06 は clean_task_reports 54行すべて clean_timetable_id が NULL(D-158 末尾)→ 10-07 は 87行中 80行が予定に紐づく(D-170))。★ログインできない件(1045)は 10-06 に解消★
  • ★DDL の取り込み★: robot_id は NULL 可になった(10-06 構造で確認)が、★serial_number は varchar(20) のまま★(第11回 P-8 c の拡張は未反映。10-07 も同じ。D-171)。★ユーザー判断: 急がない・db pull もそれまで待つ★(D-172)。それまでは robot_error_reports を select で絞って読む(lib/db/robot-error-select.ts)
  • ★clean_ratio の訂正(N-3)は待たなくてよい★: 第11回 P-1・P-2=A で★今の式のまま確定★(D-158)。訂正後の列も同じ値になる
  • 第11回で解決: 屋号 → customers は法人で「顧客」(P-15)/本番DBも JST(P-11)/task_area = 0 は 0%(P-5)/当期 KPI はサマリの式(P-6)。★どれも指示書AU で実装済み★
  • ★次フェーズ★: エラーの3区分・D-Sec アラートの取得元の切り替え(P-8〜P-10。D-158 当方の対応5)

★回答が来たら受領日を docs/decisions.md に記録すること★。


進めるときの注意

★引き継ぎ書 §6 の地雷を必ず読むこと。★ 特に★例外もテスト失敗も出ないまま結果だけ間違う★もの:

  1. ★facility_ids の null(全件)と [](0件)は別物★
  2. ★facilities.contract は varchar(10) の桁位置★(数値比較すると全施設が「契約なし」)
  3. ★表示用に丸めた値で判定しない★
  4. ★DATETIME は JST の壁時計値★(素で読むと9時間進む)
    • ★生の値に9時間を足さない★。★先方が 2026-10-02 に DB のタイムゾーンを JST に統一し再登録した(N-14)。本番も JST(第11回 P-11)。アプリのコードは変えない。再実測は未了★(CLAUDE.md §3)
  5. ★★4カラム(status / comment / responded_at / resolved_at)の UPDATE は書き込んでよい(D-152)。それ以外は禁止★★
  6. ★「実測」と書くときは出所を併記する★(CLAUDE.md §6-6)
  7. ★予定は lib/db/timetable-source.ts を通して読む★(clean_timetables と clean_timetable_histories の両方。直接 cleanTimetable を読むと履歴が抜ける)
  8. ★robot_error_reports は lib/db/robot-error-select.ts の select で読む★(robot_id / robot を読まない)
  9. ★ダッシュボードの数値カード・表は直近モード、スケジュール進捗・要レスキューは当日★(D-159)。★cleanLogs() と cleanLogRunMeta() は mainTimetableWhere() を共有する★(別々に書くと突き合わせが静かにずれる)
  10. ★4カラムを書くルートは /prechecks/{id}/status と /errors/{error_id}/status の2本★(どちらも writeRobotErrorColumns() を通る)。★エラー一覧は2段階で読む★(errored_at ?? created_at の順を Prisma で書けないため。D-160 追記2)
    • ★画面からは「編集モード」で下書き → 「保存」でまとめて送る★(変えた行だけ1行ずつ順に。1行の失敗で止めず、失敗行の下書きだけ残る。D-165)。★下書きの扱いは lib/prechecks/edit-drafts.ts の1本★(エラー一覧とアラートが共有)。★巡回順の lib/prechecks/status-cycle.ts は削除済み★(D-161)
  11. ★i18n のキーは全画面で共有★(「備考」→ "Note" を足したら D-Secログの見出しも変わった)。★vitest でモックした @/lib/db/prisma の同時の動的 import は片方に本物が返る★(テストだけ。vi.spyOn で避ける。追記62 §4)
  12. ★事前チェックの結果も有無も、成功・失敗の判定に使わない★(判定は本清掃のレポート行の有無と完了率だけ。D-170 / CLAUDE.md §4.4。lib/dashboard/__tests__/aggregate.test.ts が見張る)
  13. ★CleanLogItem.status_1h / status_30m の null は「その分数の事前チェックの予定が無い」、"Standby." は「予定あり・異常なし」★(別物。D-171)。★PrecheckItem.main_run_succeeded は見た目を薄くするだけで、対応状況・未解消の件数は変えない★(D-171)
  14. ★結果待ち(CleanLogItem.result_pending)は departed / grade を変えない旗★(結果待ちの行も departed: false・grade: "×" のまま)。★行を数える・△×を拾う処理を足すときは必ず旗を見る★(見ないと出発失敗に数える)。判定は lib/clean-logs/result-pending.ts の isResultPending() 1本、待つ時間は RESULT_WAIT_MINUTES(★LAUNCH_GRACE_MINUTES とは別物・流用しない★。D-173)

作法:

  • ★検証が通ったら即コミット★ / ★git add -A は禁止★
  • ★決定番号は grep -n "^### D-" docs/decisions.md | tail -3 で実測★(^### D-0 では3桁台を拾えない)
  • ★指示書を2本同時に走らせない★
  • ★fixtures の画面確認は本番ビルドで★(2026-11-05 に改めた。旧: preview_start の d-watch-fixtures(dev サーバー)と .env.example の開発用トークン): USE_FIXTURES=true npm run build → AUTH_TOKEN=<スクラッチパッドに乱数で作ったテスト用トークン> USE_FIXTURES=true npx next start -p 3100 → アプリ内ブラウザ(Edge は使わない)。★:3000(ユーザーのサーバー)は止めない★。.claude/launch.json の d-watch-fixtures は残っているが使わない
  • ★サブエージェントが起動した dev サーバーは止めてから終わらせる★(2026-10-02 に残ったサーバーの作業プロセスが落ち、PATCH が500になった)
  • ★新しいクローンでは npx prisma generate が要る★
  • ★ワークツリーでは npm run build が落ちる★(Turbopack が node_modules のジャンクションを拒否)。★ビルドは本体で★
  • ★Bash ツールはヒアドキュメントの中でも \\ を \ に縮める★(正規表現の \S 等を書くスクリプトは Write ツールで書く)
  • ★別の Claude セッションが同じ develop に docs のコミットを積むことがある★。コミット直前に git status --short と git log --oneline -3 を見る

最初の報告

★次を実際に実行して★現状を確認し、簡潔に報告してください。★推測で答えないこと。★

git log --oneline | head -10
git status
git rev-list --count origin/develop..develop
npm test
  1. ★未コミットの変更があるか★(★別の Claude セッションの作業中の変更なら触らない・stash しない★)
  2. ★テスト数と最終決定番号★が上の表(★2026-11-04 時点: 157ファイル / 3,855件 / コミット済みの決定は D-181。HEAD 619e21d★)と一致するか
  3. ★未 push のコミットがあるか★ / ★PR #6 の状態★(★最新の head の CI は緑か / レビューが通ったか / head はどこか★)
  4. ★第12回(送付版。R-1〜R-3)を送ったか / 先方のデータ投入が終わったか(予定と実績がつながったか) / 回答が来ているか★(★回答が来ていたら受領日の記録が最優先★。レポートの最大の遅れの回答が来ていたら RESULT_WAIT_MINUTES を見直す。D-173)

そのうえで、何から進めるかをユーザーに確認してください。

この文書について

引き継ぎメモとこのコマンド定義は、次の担当者の行動をそのまま決めます。 古い記述を残すと、次のセッションがその指示に従って誤った作業を始めます。 このファイルは要約と道案内に留めてあります。詳細は docs/handoff.md に書いてください。 方針が変わったら、引き継ぎメモへの追記と同時にこのファイルも直してください。