minordata-lossunverifiedcollected
日本語フォルダ名の濁点でClaude Codeの履歴が2つに割れ、152MBが/resumeに出なくなった(未検証の報告)
macOSで、濁点や半濁点を含む日本語フォルダの下でClaude Codeを使っていたところ、`~/.claude/projects/` に同じプロジェクトを指すディレクトリが2つずつでき、セッションの履歴が分かれていた。`/resume` に出るのは片方だけだった。
原因
筆者によれば、~/.claude/projects/ のディレクトリ名は作業フォルダの絶対パスの英数字以外を1文字につき1本のハイフンに置き換えて作られる。「ダ」はNFCでは1文字、NFDでは2文字になるため、同じパスでもハイフンの本数が変わり、別のディレクトリになった。どのツールがNFDのパスを書いているのかは分かっていない。
結果
38のディレクトリのうち10組が対になっており、小さい側を合わせた152MBぶんの履歴が /resume から見えなくなっていた。ファイルは消えていなかった。~/.claude.json には同じパスがNFCとNFDの両方で9件登録されていた。
対策
筆者は、中身が完全な側のファイルを /resume に出る側へコピーするスクリプトを30分ごとに走らせ、そのうえで10組を1つずつNFC側へまとめて対を0組にした。割れる原因そのものは止めておらず、新しく割れ続けている可能性があるとしている。
何が起きたか
筆者は2026年9月7日、Claude Codeの環境を監査している途中で
~/.claude/projects/ を一覧にし、ほとんど同じ名前のディレクトリが2つ
並んでいることに気づいた。違うのはハイフンの本数だけで、どちらも
デスクトップの「作業フォルダ」の下にある同じプロジェクトを指していた。
履歴は28セッションと5セッションに分かれ、/resume に出てくるのは片方
だけだった。
現場の混乱
対はこの1組だけではなかった。38のディレクトリのうち10組が同じように
対になっていて、小さい側を合わせると152MBあった。そのぶんの履歴が
/resume から見えず、消えたように思えたが、ファイルは残っていた。
~/.claude.json の projects には、画面の上では同じパスがNFCとNFDの
両方の形で9件登録されていた。ディレクトリの10組と1件合わない理由は
確かめていない。NFD側のファイル16件のうち13件(144MB)は中身がNFC側に
そっくり含まれ、NFD側にしか無かったのは3件だった。
まとめる作業でもつまずいた。退避のためにNFD側のディレクトリを tar で
固めようとすると、名前がハイフンで始まるため tar がオプションとして
読んで失敗した。-C で親に移るだけでは防げず、-T で対象をリストから
読ませ、各行の先頭に ./ を付けて解決した。
原因
~/.claude/projects/ のディレクトリ名は、作業フォルダの絶対パスの
英数字以外を、1文字につき1本のハイフンに置き換えて作られる。濁点や
半濁点を含む文字は、Unicodeの正規化の形で文字数が変わる。「ダ」は
NFCでは1文字、NFDでは「タ」と結合用の濁点の2文字になる。そのため
「作業フォルダ」はNFCで6文字、NFDで7文字になり、ハイフンが1本違う別の
ディレクトリができる。割れていたのは「作業フォルダ」と「キャリアプラン」
の下だけで、濁点を含まない「個人開発」の下は割れていなかった。
/resume が片方しか出さないのは、今いるパスの正規化の形に合う
ディレクトリだけを見ているからだと筆者は考えているが、実装は確かめて
いない。どのツールがNFDのパスを書いているのか、CLIとデスクトップアプリの
どちらなのかも分かっていない。
対策
筆者はまず、中身が完全な側のファイルを /resume に出る側へコピーする
スクリプトを書き、LaunchAgentで30分ごとに走らせた。上書きするのは、
上書き先の中身が上書き元の先頭と完全に一致するときだけで、上書き前の
ファイルは .bak で残す。そのうえで10組を1つずつ、NFC側に含まれることを
確かめてからNFD側を消す手順でまとめ、対を0組にした。~/.claude.json に
残ったNFD側の9件は、動いているセッションの書き込みとぶつかるため
消していない。割れる原因は止めておらず、NFD側には監査の数日前に
更新されたものもあったため、今も割れ続けている可能性があるとしている。
フォルダ名に濁点や半濁点を含む環境では、ハイフンの連続を1本に潰した
名前の重複を一度数えておくと、/resume に出ない履歴に早く気づける。