CLAUDE LABEN
COGNI — Cognizant と Anthropic が提携を広げ、エンタープライズ顧客へ Claude を届ける体制を強化しました(7月27日)TUNNEL — MCP のコネクタ側に埋め込み UI・組織管理の認証・可観測性・プライベートネットワークトンネルが加わりました。社内サービスを公開せずに繋げますOSS — Anthropic はオープンソース AI の禁止には賛同しないとしつつ、違法な蒸留を防ぐ標的を絞った枠組みを求める立場を示しました(7月28日)PACING — OpenAI・Anthropic・Google・Meta の従業員1,100名超が、検証可能な減速を各国で揃えられる仕組みの整備を米政府に求める書簡に署名しましたOPUS5 — Opus 5 は Frontier-Bench v0.1 で Opus 4.8 の約2倍、OSWorld 2.0 では Fable 5 を上回って約1/3のコストと報告されていますFABLE5 — Fable 5 のプラン別扱いが7月20日に確定しました。Max と Team Premium は週次上限の最大50%まで込み、Pro と Team Standard は従量クレジットですCOGNI — Cognizant と Anthropic が提携を広げ、エンタープライズ顧客へ Claude を届ける体制を強化しました(7月27日)TUNNEL — MCP のコネクタ側に埋め込み UI・組織管理の認証・可観測性・プライベートネットワークトンネルが加わりました。社内サービスを公開せずに繋げますOSS — Anthropic はオープンソース AI の禁止には賛同しないとしつつ、違法な蒸留を防ぐ標的を絞った枠組みを求める立場を示しました(7月28日)PACING — OpenAI・Anthropic・Google・Meta の従業員1,100名超が、検証可能な減速を各国で揃えられる仕組みの整備を米政府に求める書簡に署名しましたOPUS5 — Opus 5 は Frontier-Bench v0.1 で Opus 4.8 の約2倍、OSWorld 2.0 では Fable 5 を上回って約1/3のコストと報告されていますFABLE5 — Fable 5 のプラン別扱いが7月20日に確定しました。Max と Team Premium は週次上限の最大50%まで込み、Pro と Team Standard は従量クレジットです
記事一覧/Claude Code
Claude Code/2026-07-30上級

作業ルートを途中で足したとき、無視規則と deny はどこまで届くのか — DirectoryAdded で境界を測り直す

セッション途中で作業ルートを追加すると、無視規則も deny パターンもそのままでは新しいルートに届きません。git check-ignore と照合器の比較で境界を実測し、DirectoryAdded から呼ぶ差分監査スクリプトの実行結果まで記録しました。

Claude Code207hooks15モノレポセキュリティ15運用設計17

プレミアム記事

セッションを止めずに /add-dir でもう一つのリポジトリを足したのは、iOS 側のビルド設定を並べて確認したかったからでした。

個人開発でアプリ側のリポジトリとサイト側のリポジトリを行き来していると、こういう横断はどうしても出てきます。

作業自体はすぐ終わりました。気になったのは、そのあとです。

普段どおり秘匿ファイルの棚卸しを走らせたところ、件数が変わっていませんでした。追加したルートには、設定ファイルが何本も入っているはずなのに。

数分かけて追い、原因は単純でした。棚卸しの起点が最初のルートのままだったのです。ルートを増やすという操作は、そこにぶら下がる前提まで一緒に運んではくれません。

セッションは正常。エラーもゼロ。ただ、検査の網だけが古いところに張られたままでした。

追加したルートは、既存ルートの子ではない

/add-dir や SDK の register_repo_root でルートを足すと、感覚としては作業範囲が「広がった」ように見えます。

実際に起きているのは、独立したルートがもう一本並んだ状態です。親子ではなく、並列。

この違いが効いてくるのが無視規則です。git の除外規則は、リポジトリの外側には適用されません。当たり前の仕様ですが、ルートが二本になった瞬間に、その当たり前が運用上の穴になります。

同じ構造を手元で作って確かめました。root_a には secrets/ を無視する .gitignore を置き、root_b には置いていません。中身はどちらも同じ secrets/prod.env です。

# root_a 側: .gitignore が効いている
$ git -C root_a check-ignore -v secrets/prod.env
.gitignore:1:secrets/	secrets/prod.env
 
# root_a から root_b のファイルを判定させようとすると、そもそも受け付けない
$ cd root_a && git check-ignore -v ../root_b/secrets/prod.env
fatal: ../root_b/secrets/prod.env: '../root_b/secrets/prod.env' is outside repository
 
# root_b 側では、同じパスが無視対象にならない
$ git -C root_b check-ignore -v secrets/prod.env
(出力なし・終了コード 1)

git status まで見ると、差は目に見える形で出ます。

$ git -C root_a status --porcelain
A  .gitignore
A  src/app.ts
 
$ git -C root_b status --porcelain
A  secrets/prod.env 追加ルート側では staged になる
A  src/app.ts

root_a では secrets/prod.env が一覧にすら現れず、root_b では素通しで staged まで進んでいます。

つまり、追加ルートに対する判定は、必ず追加ルートの中で git を回さないと正しい答えになりません。親ルートから相対パスで覗きにいく実装は、静かに間違った「安全」を返します。

deny パターンは、どの照合器で読まれるかで意味が変わる

無視規則の次に確認したのが permissions.deny です。

こちらは git とは別系統で、パターン文字列の照合になります。ここで前提が一つ崩れました。同じパターンでも、照合器が違えば結果が変わります。

代表的な三つ、fnmatchPath.match・glob と同じ ** セマンティクスを並べて、同じパスに当ててみました。

import fnmatch, re
from pathlib import PurePosixPath
 
def m_glob(p, pat):
    """glob と同じ ** セマンティクス(0個以上のディレクトリ)を再現する"""
    rx = (re.escape(pat)
          .replace(r"\*\*/", "(?:[^/]+/)*")
          .replace(r"\*\*", ".*")
          .replace(r"\*", "[^/]*")
          .replace(r"\?", "[^/]"))
    return re.fullmatch(rx, p) is not None
 
for pat in ["*.env", "**/*.env", "config/*.env", "**/config/*.env"]:
    for p in ["config/prod.env", "ios/Config/secrets.env",
              ".vscode/settings.json", "scripts/build.sh"]:
        print(pat, p,
              fnmatch.fnmatch(p, pat),
              PurePosixPath(p).match(pat),
              m_glob(p, pat))

実行して出た結果を表にしたものが以下です。

パターンパスfnmatchPath.matchglob(**)
*.envconfig/prod.envTrueTrueFalse
*.envios/Config/secrets.envTrueTrueFalse
**/*.envconfig/prod.envTrueTrueTrue
**/*.envios/Config/secrets.envTrueTrueTrue
config/*.envconfig/prod.envTrueTrueTrue
config/*.envios/Config/secrets.envFalseFalseFalse
**/config/*.envconfig/prod.envFalseFalseTrue
**/config/*.envios/Config/secrets.envFalseFalseFalse

読み方が二か所あります。

一つ目は *.env の行です。fnmatchPath.match では config/prod.env に当たっています。* がスラッシュを越えているのです。glob の感覚で「直下だけを指定したつもり」で書くと、意図より広く当たります。

二つ目は **/config/*.env の行です。glob では当たるのに、fnmatchPath.match では外れます。**/ が「0個以上のディレクトリ」ではなく「何かしらのディレクトリが1段以上」として読まれるためで、ルート直下の config/ が抜け落ちます。

ここが、私が事前に予想していたのと逆でした。**/ を付けるほど網が広がるつもりでいたのに、照合器によっては直下を取りこぼす方向に働きます。しかも取りこぼす対象が、追加ルートの直下という、いちばん設定ファイルが集まる場所でした。

ルートが一本だった頃は、この差に気づく機会がありません。パスの階層構造が一つしかないので、どの書き方でも結果が揃ってしまうからです。ルートを足して階層の浅い木が増えたときに、初めて表面化します。

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

この記事の続きを読む

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

この記事で得られること
追加ルートの無視規則が親ルートへ合成されない挙動を git check-ignore で実証(同名の secrets/ が片方は無視され、片方は staged になる)
同じ deny パターンが照合器ごとに割れる比較表 — `*.env` はスラッシュを越えて当たり、`**/config/*.env` はルート直下を取りこぼす
DirectoryAdded から呼ぶ約70行の差分監査スクリプトと、その実行出力(未カバー2件・大小文字違い1件・パス衝突2件を検出)
2,882ファイルの追加ルートで計測したフック所要 21.8 ミリ秒と、差分監査が再走査より速くならなかった理由(差は 1% 未満)
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Claude Code2026-07-29
MCPサーバーは繋がっているのに、ツールが0件で返る — 無人実行の権限劣化をツール表の差分で止める
資格情報が抜けてもMCPのハンドシェイクは成功し、tools/list は空配列を返します。例外が飛ばないまま実行が完走する構造と、期待ツール表との差分で無人実行を止めるpreflightの実装を、実測値つきで記録しました。
Claude Code2026-07-25
strictAllowlist で Claude Code サンドボックスの外向き通信を締める
Claude Code v2.1.219 の sandbox.network.strictAllowlist で自動化の外向き通信を締めた実践メモ。接続先を洗い出すスクリプト、失敗までの時間で拒否とDNSと回線を切り分ける実測、許可リストをホスト名で書くべき理由まで。
Claude Code2026-07-19
コミット済みのシンボリックリンクが worktree の外を指す — AI に並列作業を預ける前のリポジトリ点検
Claude Code 2.1.212 で、コミット済みのシンボリックリンクを worktree 作成時に辿ってリポジトリ外へ書きうる不具合が修正されました。パッチが塞いだのは辿りの側です。危険なリンクがコミットされている側を点検する監査スクリプトと、隔離の手順をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →