[{"data":1,"prerenderedAt":182},["ShallowReactive",2],{"content-/claude-code-multi-session-deploy-mystery":3,"all-pages-for-dir":161,"related-/claude-code-multi-session-deploy-mystery":162,"og-image-/claude-code-multi-session-deploy-mystery":181},{"id":4,"title":5,"body":6,"category":143,"concepts":144,"description":145,"extension":146,"meta":147,"navigation":148,"ogImage":144,"path":149,"project_name":150,"published":151,"publishedAt":152,"seo":153,"stem":154,"tags":155,"todo":144,"unpublished":151,"updatedAt":144,"__hash__":160},"pages/2026-07/2026-07-25/claude-code-multi-session-deploy-mystery.md","覚えのないデプロイの犯人は自分の別セッションだった — Claude Codeマルチセッション運用の落とし穴",{"type":7,"value":8,"toc":133},"minimark",[9,13,17,21,24,27,30,34,37,40,43,46,49,59,62,66,69,72,75,83,86,89,92,95,98,101,104,107,110,130],[10,11,5],"h1",{"id":12},"覚えのないデプロイの犯人は自分の別セッションだった-claude-codeマルチセッション運用の落とし穴",[14,15,16],"h2",{"id":16},"朝7時7分と7時52分",[18,19,20],"p",{},"朝、eurekapu-nuxt4のセッションで画像1,800枚あまりのアップロード完了を待っていた。待ち時間にここまでの作業を整理してもらっていたら、報告の中に本番デプロイの記録が2件混じっていた。今朝の7時7分と7時52分。",[18,22,23],{},"時刻を二度見した。やってない。少なくともこのリポジトリでは、今朝そんな操作をした覚えがない。",[18,25,26],{},"「覚えてないんですけど。このeurekapu-nuxt4ではやってないと思うんですけどね」。そう返しながらも、言い切る自信はなかった。並行で複数のセッションを走らせている朝で、どこで何を承認したか、全部は思い出せない。",[18,28,29],{},"ただ、デプロイは本番を書き換える操作だ。実行元が分からないまま流すわけにはいかない。アップロードの監視はそのまま続けさせて、誰が・何がデプロイを走らせたのかの調査を任せた。",[14,31,33],{"id":32},"その朝手元で何が並行して走っていたか","その朝、手元で何が並行して走っていたか",[18,35,36],{},"このeurekapu-nuxt4のセッションでは、進行中だった画像の一括再生成が明け方に完走して、1,837枚のアップロードが淡々と進んでいた。進捗の見張りは自動通知に任せて、自分は節目の報告を受け取るだけの時間帯だった。",[18,38,39],{},"一方で、別ウィンドウにはwordpress-migrationフォルダで開いたセッションがいた。WordPressで作っていたクイズをEurekapuに移植する作業をさせていたやつだ。同じ朝にこの2本が走っていたことが何を意味するか、このときの自分はまだつかんでいない。",[14,41,42],{"id":42},"実行元は自分のもう一つのセッションだった",[18,44,45],{},"ほどなくして「実行元が確定しました」と返ってきた。デプロイを走らせたのは、自分のもう一つのClaude Codeセッションだった。",[18,47,48],{},"根拠として挙がってきたのは、次の2点だ。",[50,51,52,56],"ul",{},[53,54,55],"li",{},"そのセッションはwordpress-migrationフォルダで開かれているが、この朝の作業対象はeurekapu-nuxt4のクイズページだった",[53,57,58],{},"7時7分と7時52分の2回のデプロイは、そのクイズページ作業の流れで実行されていた",[18,60,61],{},"外部からの侵入でも、事故でもない。指示を出したのは自分だった。",[14,63,65],{"id":64},"このディレクトリの話をしてるんじゃなかったの","「このディレクトリの話をしてるんじゃなかったの？」",[18,67,68],{},"ところが、この報告を聞いた時点ではまだ腑に落ちていなかった。",[18,70,71],{},"「ごめん、eurekapu-nuxt4のディレクトリだけの話をしてるんじゃなかったんですか？」と聞き返している。WordPress移行のフォルダで別セッションを動かしていることは知っている。でも、いま話しているのはこのディレクトリで起きたデプロイのはずで、なぜ別フォルダのセッションが犯人になるのか。",[18,73,74],{},"話が噛み合わないまま、しばらく往復した。",[18,76,77,78,82],{},"返ってきた説明で、止まっていた頭が動いた。話は最初から「このeurekapu-nuxt4リポジトリで起きたデプロイ」のこと。ただし、WordPress移行セッションは",[79,80,81],"strong",{},"wordpress-migrationフォルダで開かれているだけで、作業対象はeurekapu-nuxt4リポジトリ","だった。",[18,84,85],{},"「WordPressのクイズをEurekapuに移植する」という流れの中で、あのセッションの作業対象はいつの間にか移植先のリポジトリに移っていた。移植とは移植先を書き換える作業だから、当然そうなる。",[18,87,88],{},"あー、そういうことか、と声が出た。",[18,90,91],{},"自分はセッションを「開いたフォルダの名前」で認識していた。wordpress-migrationで開いたセッション＝WordPress側をいじっているセッション、という等式が頭の中にあって、そのセッションがこっちのリポジトリを書き換えてデプロイまでしている可能性を、最初から選択肢の外に置いていた。",[18,93,94],{},"フォルダ名はセッションのラベルであって、作業範囲の境界ではない。",[14,96,97],{"id":97},"切り分けを速くしたのは記録だった",[18,99,100],{},"実行元がすぐ確定したのは、突き合わせられる記録が両側に残っていたからだ。デプロイ側にはwranglerのデプロイ履歴が時刻付きで残る。手元には各セッションのログが残る。",[18,102,103],{},"7時7分・7時52分という時刻を持って各セッションのログに当たれば、その時間帯にデプロイを走らせていたセッションは一つに絞れる。",[18,105,106],{},"記憶は「やってないと思う」までしか言えなかった。記録は実行元まで言い切った。",[14,108,109],{"id":109},"学びメモ",[50,111,112,118,121,124,127],{},[53,113,114,117],{},[79,115,116],{},"セッションを開いているフォルダと、実際の作業対象リポジトリは一致しない","。「AをBに移植する」型の作業では、A側のフォルダで開いたセッションがB側のリポジトリを書き換え、デプロイまで実行する",[53,119,120],{},"複数のClaude Codeセッションを並行で走らせる運用では、フォルダ名でセッションを認識していると作業対象を見誤る。今回は「移植」という、作業対象が途中でもう一方のリポジトリへ移る種類のタスクで表面化した",[53,122,123],{},"デプロイのような対外操作は、実行元を突き止められるログ（wranglerのデプロイ履歴・各セッションのログ）があると切り分けが早い",[53,125,126],{},"セッションの見分け方は、フォルダ名ではなく「いまどのリポジトリを書き換えうるか」で持つ。並行本数が増えるほど、この一覧を頭に置いておく必要がある",[53,128,129],{},"記憶を疑う前に記録を引く。「やってないと思う」は半分だけ正しかった — この画面で承認した覚えがないのは事実だったが、自分の指示から派生した操作までは記憶がカバーしていなかった",[18,131,132],{},"並行セッションは今後も増える。フォルダ名で見分ける癖が抜けたかというと、まだ怪しい。次に「覚えのない操作」が出たとき、真っ先に自分の別セッションを疑えるかどうかで、この日の学びが本物だったか分かる。",{"title":134,"searchDepth":135,"depth":135,"links":136},"",2,[137,138,139,140,141,142],{"id":16,"depth":135,"text":16},{"id":32,"depth":135,"text":33},{"id":42,"depth":135,"text":42},{"id":64,"depth":135,"text":65},{"id":97,"depth":135,"text":97},{"id":109,"depth":135,"text":109},"dev",null,"朝7時台に覚えのない本番デプロイが2回。実行元を調査させたら、wordpress-migrationフォルダで開いた別のClaude Codeセッションがeurekapu-nuxt4を作業対象にしていた。フォルダ名でセッションを認識する思い込みの記録。","md",{},true,"/claude-code-multi-session-deploy-mystery","claude-code-tools",false,"2026-07-25T00:00:00.000Z",{"title":5,"description":145},"2026-07/2026-07-25/claude-code-multi-session-deploy-mystery",[156,157,158,159],"Claude Code","マルチセッション","デプロイ","運用","SXlEtnQ6t2CvWwJ1yURFzBR4JoHJlaCkQc7GQVRya5Q",[],[163,167,171,174,177],{"title":164,"path":165,"publishedAt":166},"Claude Code の累積状態ファイルを gitignore で締め出し、自動掃除する仕組みを整えた","/claude-state-files-gitignore-cleanup","2026-05-29T00:00:00.000Z",{"title":168,"path":169,"publishedAt":170},"日記自動生成パイプラインが「空白日」をどう扱うか — 前日が無作業ならフォールバックして直前の作業日へ","/diary-automation-empty-day-fallback","2026-05-24T00:00:00.000Z",{"title":172,"path":173,"publishedAt":152},"2026年7月25日の開発日記 - 挿絵1,576枚の完走とクラウド12セッション投入","/2026-07-25-diary",{"title":175,"path":176,"publishedAt":152},"Web版Claude Codeに12セッションを一括投入 — 教材の計画書を先に揃えてクラウドで並列実装させる","/code-course-cloud-sessions-dispatch",{"title":178,"path":179,"publishedAt":180},"Kindle電子書籍をOCRで蔵書DBに取り込む新コマンドを作った","/kindle-ocr-pipeline-async-command","2026-07-23T00:00:00.000Z","https://log.eurekapu.com/og/blog/claude-code-multi-session-deploy-mystery.png?v=2026-07-25T00%3A00%3A00.000Z&title=%E8%A6%9A%E3%81%88%E3%81%AE%E3%81%AA%E3%81%84%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AE%E7%8A%AF%E4%BA%BA%E3%81%AF%E8%87%AA%E5%88%86%E3%81%AE%E5%88%A5%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A0%E3%81%A3%E3%81%9F%20%E2%80%94%20Claude%20Code%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%81%8B%E7%94%A8%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4&author=Kei%20Komatsu&sig=645fc1f7702ed402",1785099351761]