ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-07-15上級

ls には見えるのに、エージェントが開けない — 日本語ファイル名が macOS と Linux で別物になるとき

エージェントが「そのファイルは存在しません」と言い、ターミナルの ls には確かに写っている。三日かけて同期を疑った末に辿り着いたのは、濁点が一文字ではなかったという事実でした。検出スクリプトと三層ゲートまで残します。

antigravity434agents89unicodetroubleshooting87workflow37

プレミアム記事

深夜のランのログに、こう残っていました。

FileNotFoundError: [Errno 2] No such file or directory:
  'content/reference/壁紙_配色ガイド.md'

同じ端末で ls content/reference/ と叩くと、壁紙_配色ガイド.md が涼しい顔で並んでいます。目で見て、一字ずつ追って、同じ名前です。それでもエージェントは開けないと言い張る。

コピーして貼り付ければ開ける。エージェントに任せると開けない。この非対称が、いちばん気持ちの悪いところでした。

三日間、私は同期を疑っていました

最初の見立ては外れています。正直に書いておきます。

私の作業フォルダはクラウド同期の下にあり、以前にも実体のないプレースホルダを掴んで空ファイルを読んだことがありました。だから今回もそれだろうと決めてかかり、同期の除外設定を触り、ローカルへ全ダウンロードをかけ、ログを眺めて、また同じエラーを見ました。

二日目には権限を疑いました。所有者も、モードも、何も問題はありません。

三日目の夜、諦めてバイト列を見ました。

$ ls content/reference/ | grep 壁紙 | xxd | head -3
00000000: e5a3 81e7 b499 5fe9 858d e889 b2e3 8299  ....._........
00000010: e382 ace3 82a4 e383 895f 2e6d 6400       ........._.md.

e3 82 99 が見えます。これは結合文字の濁点、単独で存在する「゛」です。つまりファイル名の中の「配」の次に来る文字は、 という一文字ではなく、 の二文字として並んでいました。

エージェントが探していたのは、e3 82 ac)を含む名前です。ファイルシステムに刻まれていたのは、 + を含む名前です。人間の目にはどちらも同じ形に描画されます。バイト列としては、まったく別の文字列です。

存在しないと言われて当然でした。エージェントは正しかったのです。

なぜエージェントだけが踏み抜くのか

ここが本題です。同じリポジトリを人間が手で触っている限り、この問題はほとんど表に出てきません。

理由は単純で、人間はファイル名をコピー&ペーストするか、タブ補完で入力するからです。どちらもファイルシステムから読み出したバイト列をそのまま使いますから、書かれている通りの並びで問い合わせることになります。

エージェントは違います。エージェントはファイル名を文脈の中の日本語から組み立ててきます。設計メモに「壁紙_配色ガイド.md を参照してください」と書いてあれば、その文字列を読んで、パスとして再構成する。そして言語モデルが出力する日本語は、ほぼ例外なく合成済み(NFC)の形です。

一方 macOS のファイルシステムは、歴史的な経緯から分解済み(NFD)に寄せた名前を返してきます。Finder でフォルダを作り、日本語で名前を付けた瞬間に、濁点は独立した文字として書き込まれます。

つまりこういう構図になります。

経路ファイル名の形「ガ」のバイト列
macOS の Finder で命名NFD(分解)e3 82 ab + e3 82 99
言語モデルが文脈から生成NFC(合成)e3 82 ac
Linux の VM で mkdirNFC(渡された通り)e3 82 ac
Git のインデックス書かれた通りを保持どちらもあり得る

Git はここで積極的な仲裁をしません。core.precomposeunicode は macOS 側の入口を合成済みに寄せてくれますが、既に分解済みで入ってしまった履歴までは戻してくれない。私のリポジトリには、この設定を知る前に入れた NFD のファイルが、そのまま何年も残っていました。

そして最悪の展開が起きます。エージェントは「無い」と判断すると、親切心から作りにいくのです。

content/reference/壁紙_配色ガイド.md   ← 2023年から在る(NFD)
content/reference/壁紙_配色ガイド.md   ← 昨夜エージェントが作った(NFC)

ls の出力に同じ名前が二行並びます。中身は違います。片方は数年分の知見で、片方は生まれたての空に近いファイルです。どちらを読むかは、その時のパスの組み立て方次第で変わる。私はこれを「幽霊二重ファイル」と呼んで警戒しています。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
「見えているのに開けない」を、目視ではなくバイト列の比較で切り分ける60行の走査スクリプト
正規化・大文字小文字・不可視文字という別々の3軸を混ぜずに塞ぐ、入口とCIとエージェント側の三層ゲート
6週間の無人運用で名前ドリフト14件・幽霊二重ファイル3組を検出した実測と、正規化に寄りかかりすぎない線引き
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Agents & Manager2026-06-18
Antigravity 2.0 のエージェントに任せる前に引く、3本の境界線
バックグラウンドエージェントに何を任せ、何を手元に残すか。個人開発の並行運用で実際に引いた3本の境界線と、それをコードに落とすための具体的なパターンをまとめました。
Agents & Manager2026-05-30
Antigravity のエージェントが node や python を『command not found』にするときの原因と対処
自分のターミナルでは動くのに、Antigravity のエージェントがコマンドを実行すると command not found になる。PATH 継承の仕組みから、nvm・pyenv・Homebrew・WSL 環境ごとの具体的な解決手順と、直ったかどうかの確かめ方までまとめます。
Agents & Manager2026-05-26
Antigravity の Browser Sub-Agent が SPA を空ページと誤認する原因と待機戦略
Antigravity の Browser Sub-Agent に SPA ダッシュボードを読ませると、本文が描画される前に get_page_text が返ってきて空ページ扱いされる。原因と、私の運用で安定した3つの待機パターンを整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →