[{"data":1,"prerenderedAt":495},["ShallowReactive",2],{"content-/claude-config-loss-and-backup-automation":3,"all-pages-for-dir":474,"related-/claude-config-loss-and-backup-automation":475,"og-image-/claude-config-loss-and-backup-automation":494},{"id":4,"title":5,"body":6,"category":454,"concepts":455,"description":456,"extension":457,"meta":458,"navigation":459,"ogImage":455,"path":460,"project_name":461,"published":462,"publishedAt":463,"seo":464,"stem":465,"tags":466,"todo":455,"unpublished":462,"updatedAt":455,"__hash__":473},"pages/2026-07/2026-07-29/claude-config-loss-and-backup-automation.md","Claude Code の ~/.claude が朝いちで丸ごと消えた — GitHubバックアップからの復元と、自動バックアップの二重化",{"type":7,"value":8,"toc":439},"minimark",[9,22,28,32,39,43,59,65,68,71,78,91,131,134,145,156,160,163,175,181,184,187,191,207,214,217,228,232,239,242,249,260,267,270,280,288,299,310,317,321,327,344,357,361,372,375,381,390,416,419,436],[10,11,12,13,17,18,21],"p",{},"朝、Claude Code の下に出るステータスバーが消えていた。表示だけの話だと思って、直前に打った ",[14,15,16],"code",{},"/login"," を疑った。違った。原因はもっと下の層で、",[14,19,20],{},"~/.claude"," が今朝まるごと作り直されていた。",[10,23,24,25,27],{},"VSCode で開いていた ",[14,26,20],{}," のツリーを覗くと、skills も commands も無い。ディレクトリ自体は存在するのに、中身が新品に入れ替わっている。壊された、という気持ち悪い直感の方が正しかった。",[29,30,31],"h2",{"id":31},"消えていたのは同期の本体だった",[10,33,34,35,38],{},"決定的だったのは ",[14,36,37],{},"~/.claude/.git"," が無かったことだ。ここが GitHub との同期の本体で、スキル・コマンド・ルール・フック・settings.json・statusline は全部その中で git 管理下にあった。管理下ごと消えていた。",[29,40,42],{"id":41},"_1時間前の-push-が残っていた","1時間前の push が残っていた",[10,44,45,46,50,51,54,55,58],{},"設定ディレクトリのバックアップ用リポジトリを確認させたら、最終コミットが ",[47,48,49],"strong",{},"2026-07-29 06:35:41","。消失のおよそ1時間前に push が入っていた。",[14,52,53],{},".gitignore"," を読むと、消えて困るものは全部 git 管理下に入っていた。方針は迷わなかった。",[14,56,57],{},".git"," ごと丸ごと戻す。",[10,60,61,62,64],{},"ところが復元コマンドが auto mode の分類器に止められた。",[14,63,20],{}," 配下への書き込みは、Claude Code 自身が自分の設定やフックを勝手に書き換えられないようガードされている。承認を出して進めさせた。",[10,66,67],{},"戻ったことは説明を待たずに分かった。応答が返る直前で、スキル一覧が画面に復活していた。",[29,69,70],{"id":70},"戻らなかったもの",[10,72,73,74,77],{},"セッションログは戻らない。",[14,75,76],{},"~/.claude/projects/"," ごと消えていて、しかも壊した本人のセッションログがその中にあった。今日残っていたのは 07:24 以降のログだけ、つまり事故より後のものだけだ。",[10,79,80,83,84,87,88,90],{},[14,81,82],{},"/clear"," のときに自動アーカイブする仕組みを入れるべきかと考えたが、",[14,85,86],{},"cleanupPeriodDays: 99999"," で Claude Code 側の自動削除はオフになっていたので、",[14,89,82],{}," は今回の損失と関係がなかった。",[10,92,93,94,96,97,100,101,100,104,107,108,111,112,111,115,118,119,122,123,126,127,130],{},"被害は ",[14,95,20],{}," で止まっていなかった。ホーム直下を洗わせたら、",[14,98,99],{},"~/.claude.json","・",[14,102,103],{},"~/.gitconfig",[14,105,106],{},"~/.config/"," も消えていた。",[14,109,110],{},".ssh"," ",[14,113,114],{},".npmrc",[14,116,117],{},".rustup"," は無傷。",[14,120,121],{},"~/.config"," が飛んだせいで mise のグローバル設定と CLI 群の認証が落ち、",[14,124,125],{},"node"," と ",[14,128,129],{},"pnpm"," がその場で動かなくなった。バイナリは残っていて、活性化する設定だけが消えた状態だった。",[29,132,133],{"id":133},"犯人は分からなかった",[10,135,136,137,140,141,144],{},"一番怪しかったのは、自動チェーンの中の「Step 14（ログ削除）」という工程だ。掃除をする場所は、ドットファイルを消しうる場所でもある。中身を読ませたら、",[14,138,139],{},"cd"," してプロジェクト配下の明示パスしか消していない。",[14,142,143],{},"claude-code-sync/2026-07-28"," は狙い通りに消えていて、Step 14 は正常に完走していた。シロだ。",[10,146,147,148,151,152,155],{},"時刻を突き合わせて、犯行時刻は ",[14,149,150],{},"codex exec"," が走っていた ",[47,153,154],{},"07:19:30〜07:23"," の数分間まで絞れた。Windows のイベントログも見た。そこから先は詰められていない。壊した本人のログが道連れになっているので、肝心の証拠が残っていない。",[29,157,159],{"id":158},"実装の前に-codex-に殴らせた","実装の前に Codex に殴らせた",[10,161,162],{},"再発防止の方針は2本にした。",[164,165,166,170],"ol",{},[167,168,169],"li",{},"セッションログを増分でアーカイブして、手元の外に出す",[167,171,172,174],{},[14,173,20],{}," を private リポジトリに自動同期する",[10,176,177,178,180],{},"両方やる前に、妥当性を Codex でレビューさせた。ここで一度足を止めることになった。Codex 自身の認証も ",[14,179,121],{}," の巻き添えで飛んでいて、レビューを走らせるのに再ログインが要ったのだ。バックアップを作るためにバックアップが要る、という順序になっていた。",[10,182,183],{},"返ってきた結論は「このまま実装に入るな」。致命的な指摘が4件、論点が7つ。しかも過去の自分の事故（tar のオプション解釈で落ちた issue）を引いてきて、それが実在した。捏造ではなかった。",[10,185,186],{},"暗号化は age を使うつもりだったが、scoop の main バケットに無かった。Git for Windows 同梱の gpg 2.4.7（AES256 の対称暗号）で代替し、パスフレーズは 1Password に置いた。ラウンドトリップを確認してから、計画書を v2 に書き直させた。",[29,188,190],{"id":189},"セッションログの暗号化アーカイブ","① セッションログの暗号化アーカイブ",[192,193,194,201,204],"ul",{},[167,195,196,197,200],{},"増分の基準は cutoff ファイル。",[47,198,199],{},"送出が失敗したら cutoff を前進させない","（次回また同じ範囲を送る）",[167,202,203],{},"gpg で固めて、Google Drive の API 直アップロードと外付けドライブの2系統に送る",[167,205,206],{},"SHA-256 のマニフェストを取る",[10,208,209,210,213],{},"保存先は最初 ",[14,211,212],{},"G:\\","（Drive for Desktop）に置く案だった。あれはキャッシュが C: に載るので、C: を空けたい目的と衝突する。API 直アップロードに変えて、C: には一時ファイルしか置かない形にした。",[10,215,216],{},"障害試験もやらせた。Drive を落とした状態で走らせたら、cutoff は前進しなかった。設計通りだ。復元テストは Drive から落として復号・展開し、19/19 ファイルが SHA-256 一致で戻った。増分も効いた（19 → 7 ファイル）。",[10,218,219,220,223,224,227],{},"途中で小石を2つ踏んだ。",[14,221,222],{},"$TEMP"," が Windows 形式のパスなので、GNU tar が ",[14,225,226],{},"C:"," をリモートホストと解釈して落ちた（POSIX パスに直した）。もう1つは Drive 側の CLI で、アップロード対象のパスをカレントディレクトリ配下に制限していた。",[29,229,231],{"id":230},"claude-を-private-リポジトリへ","② ~/.claude を private リポジトリへ",[10,233,234,235,238],{},"バックアップ用のリポジトリを ",[47,236,237],{},"private"," で新規に作って push した。中身は4ファイルだけで、状態ファイルは gitignore の通り入っていない。",[10,240,241],{},"ガードは2つ入れた。秘密検出（見つけたら exit 1 で止める）と、大量削除ガード。両方が本当に効くか検証させたら、検出は効いた。ただし検出のログに token の先頭40文字が出ていた。検出器そのものが漏出源になっていたので、そこを潰した。",[10,243,244,245,248],{},"復元作業の副作用も1つあった。",[14,246,247],{},"git checkout -- ."," で settings.json まで巻き戻して、モデル設定が前の値に戻っていた。今朝設定した値に直した。",[29,250,252,255,256,259],{"id":251},"create-が-cprogram-filesgitcreate-に化ける",[14,253,254],{},"/Create"," が ",[14,257,258],{},"C:/Program Files/Git/Create"," に化ける",[10,261,262,263,266],{},"手で走らせる仕組みは、忙しい日に飛ぶ。",[14,264,265],{},"schtasks"," に XML 定義ファイルを食わせる形で登録することにした（Codex が求めた「登録内容を再現できる設定ファイル」も兼ねる）。",[10,268,269],{},"手元で打ったコマンドが MSYS のパス変換に食われた。",[271,272,277],"pre",{"className":273,"code":275,"language":276},[274],"language-text","schtasks /Create /XML \"...\\ClaudeBackup-SyncDotclaude.xml\" /TN ... /F\n→ エラー: 無効な引数またはオプションです - 'C:/Program Files/Git/Create'\n","text",[14,278,275],{"__ignoreMap":279},"",[10,281,282,284,285,287],{},[14,283,254],{}," がパスと解釈されて ",[14,286,258],{}," に化けている。変換を止めて叩き直させても、今度は「アクセスが拒否されました」。タスクのルートフォルダへの登録に昇格が要る、と読んだ。",[10,289,290,291,294,295,298],{},"PowerShell を ",[14,292,293],{},"-Verb RunAs"," で起こしたが、タスクは入らなかった。昇格ウィンドウのプロセスだけが残っている。XML が悪いに違いない、と思って検証させたら、2本とも正常で ",[14,296,297],{},"bash.exe"," のパスも実在していた。XML は原因ではなかった。",[10,300,301,302,305,306,309],{},"効いていたのは ",[14,303,304],{},"/XML"," 取り込みという経路の方だった。権限要求の軽い簡易形式に落として叩いたら、昇格なしで2本とも登録できた。取りこぼし（PC が落ちていた回の追いつき）の設定は ",[14,307,308],{},"Set-ScheduledTask"," が要って、これも昇格で弾かれた。追いつきをあきらめて、4時間ごとに複数回試行する形に置き換えた。",[10,311,312,313,316],{},"09:16:03、タスクスケジューラ経由で両方が起動した。sync は終了コード 0、sessions は増分8ファイルを処理して完走。パスフレーズの ",[14,314,315],{},"op read"," がタスクスケジューラ経由でも通ることまで確認できた。",[29,318,320],{"id":319},"mise-の-shim-が残骸として証言した","mise の shim が残骸として証言した",[10,322,323,324,326],{},"前の作業で pre-commit hook が失敗していた。mise の node shim が壊れたと見て、node の実体を PATH に通して回避してあった。調べさせたら、shim は壊れていなかった。mise に「どのバージョンを使うか」を教える設定ファイルが1つも無い状態だった。",[14,325,121],{}," の消失がここに出ていた。",[10,328,329,330,333,334,126,337,339,340,343],{},"復元後にもう1つ出た。",[14,331,332],{},"wrangler"," が mise のシム経由で解決されて落ちる。戻した mise 設定は4ツール分だけで、シムには ",[14,335,336],{},"ccusage",[14,338,332],{}," が残っていた。",[47,341,342],{},"設定が消えてもシムは残る","ので、そこから「元は何を入れていたか」を逆算できた。落ちていた理由は node のバージョン選択ミスで、グローバルパッケージは全部 22.22.2 側にあった。選び直したら wrangler 4.92.0 と ccusage 20.0.14 が復活した。",[10,345,346,347,349,350,353,354,356],{},"結局 ",[14,348,121],{}," を使っていたのは mise / gws / op / scoop の4つだけで、全部戻っていた。wrangler の設定は ",[14,351,352],{},"%APPDATA%"," 側、gh も gcloud も ",[14,355,352],{}," 側にあり、巻き添えを免れていた。",[29,358,360],{"id":359},"ローカルの-env-を消したらどうやって読むのか","「ローカルの .env を消したら、どうやって読むのか」",[10,362,363,364,367,368,371],{},"ローカルに置いておくのが心細くなったので、半年以内にコミットのあるリポジトリの ",[14,365,366],{},".env"," を10本、1Password に上げさせた。",[14,369,370],{},"op document create \u003Cfile>"," はパスを渡すだけなので、中身を一度も読ませずに済む。保管庫は途中で分けて、アイテムはドキュメントとして格納した。",[10,373,374],{},"このあたりで 1Password の認証プロンプトが何度も出て、うっとうしくなった。値を出さずにサイズだけ照合する、という提案も切った。中身が取れないなら照合の意味が薄い。それで疑問がはっきりした。",[10,376,377,378,380],{},"ローカルの ",[14,379,366],{}," を消したら、1Password に入れた控えから、アプリはどうやって読むのか。",[10,382,383,384,386,387,389],{},"答えは、読めない。1Password は消えたときの復旧元であって、実行時の供給源ではない。",[14,385,366],{}," はアプリが起動時にディスクから読むものなので、ファイルが無ければ動かない。今日やったのは金庫に控えを置いたところまでで、読み込み方は何も変わっていない。",[14,388,366],{}," はローカルに置いたまま使う。",[10,391,392,393,396,397,400,401,126,404,407,408,411,412,415],{},"ここでも小石を踏んだ。",[14,394,395],{},"op://Private/..."," で読めず、保管庫の内部名が ",[14,398,399],{},"Personal"," だった（アプリの表示は「個人」）。保管庫を分けたら名前に空白が入って、参照が ",[14,402,403],{},"op://Dev",[14,405,406],{},"Secrets/..."," に割れて壊れた。リネームにも強い UUID 指定に変えた。アップロード5本が NG と報告されたのも誤りで、レスポンスのキーが ",[14,409,410],{},"id"," ではなく ",[14,413,414],{},"uuid"," だっただけで、実際は成功していた。",[29,417,418],{"id":418},"拾ったこと",[192,420,421,424,427,430,433],{},[167,422,423],{},"助かった理由は1つだけだった。消失の1時間前に push が残っていたこと。バックアップは押した瞬間ではなく、押していた習慣が効く",[167,425,426],{},"git 管理下に入れていたものは全部戻り、入れていなかったセッションログは戻らなかった。管理下の境界が、そのまま被害の境界になった",[167,428,429],{},"原因を調べる材料が、壊れた場所と同じ箱に入っていた。ログを手元だけに置かない理由がこれ",[167,431,432],{},"1Password に入れても、実行時にファイルが要るものは要る。復旧元と供給源を混ぜて考えていた",[167,434,435],{},"シムやキャッシュの残骸は、消えた設定の証言者になる。何が入っていたかを思い出す手がかりに使える",[10,437,438],{},"犯人はまだ分かっていない。次に同じことが起きたら、消えた側ではなく、外に出したアーカイブの側から辿ることになる。",{"title":279,"searchDepth":440,"depth":440,"links":441},2,[442,443,444,445,446,447,448,449,451,452,453],{"id":31,"depth":440,"text":31},{"id":41,"depth":440,"text":42},{"id":70,"depth":440,"text":70},{"id":133,"depth":440,"text":133},{"id":158,"depth":440,"text":159},{"id":189,"depth":440,"text":190},{"id":230,"depth":440,"text":231},{"id":251,"depth":440,"text":450},"/Create が C:/Program Files/Git/Create に化ける",{"id":319,"depth":440,"text":320},{"id":359,"depth":440,"text":360},{"id":418,"depth":440,"text":418},"dev",null,"ステータスバーが出ないことに気づいて調べたら、~/.claude がまるごと作り直されていた。消失1時間前のpushが残っていたGitHubのバックアップリポジトリから復元し、セッションログの暗号化アーカイブと設定の自動同期をタスクスケジューラに載せるまでの記録","md",{},true,"/claude-config-loss-and-backup-automation","claude-code-tools",false,"2026-07-29T00:00:00.000Z",{"title":5,"description":456},"2026-07/2026-07-29/claude-config-loss-and-backup-automation",[467,468,469,470,471,472],"Claude Code","バックアップ","1Password","タスクスケジューラ","gpg","開発日記","U0Zk77OYLzSn5YIBxW4S4Odz2DgtqvtohL6gOU3oMTc",[],[476,479,483,487,491],{"title":477,"path":478,"publishedAt":463},"2026年7月29日の開発日記 - 朝いちで ~/.claude が消えた日に、7本の作業が並走した","/2026-07-29-diary",{"title":480,"path":481,"publishedAt":482},"DRAM価格ページの解説文追加で、サブエージェントの嘘の報告を実物確認で見破った話","/memory-price-mechanism-subagent-fabrication","2026-07-21T00:00:00.000Z",{"title":484,"path":485,"publishedAt":486},"Claude Codeで他社モデルが動く非対称性からMCP解剖まで — AIベンダー戦略を対話で掘って記事5本を書いた日","/ai-vendor-strategy-writing","2026-07-14T00:00:00.000Z",{"title":488,"path":489,"publishedAt":490},"1Password Environments MCPは\"Codex専用\"ではない — WindowsのClaude Codeで動かすまで","/1password-environments-mcp-windows","2026-07-02T00:00:00.000Z",{"title":492,"path":493,"publishedAt":490},"1Password Environments MCPサーバーのWindows検証 — トグルがオンにできない原因を追ってOS制約に行き着くまで","/onepassword-mcp-windows-verification","https://log.eurekapu.com/og/blog/claude-config-loss-and-backup-automation.png?v=2026-07-29T00%3A00%3A00.000Z&title=Claude%20Code%20%E3%81%AE%20~%2F.claude%20%E3%81%8C%E6%9C%9D%E3%81%84%E3%81%A1%E3%81%A7%E4%B8%B8%E3%81%94%E3%81%A8%E6%B6%88%E3%81%88%E3%81%9F%20%E2%80%94%20GitHub%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%8B%E3%82%89%E3%81%AE%E5%BE%A9%E5%85%83%E3%81%A8%E3%80%81%E8%87%AA%E5%8B%95%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E4%BA%8C%E9%87%8D%E5%8C%96&author=Kei%20Komatsu&sig=0975a8597a0d31d3",1785379972803]