Skip to main content
CC Safety Net は、ツール呼び出しのたびにポリシーのスナップショットを読み込みます。読み取る対象は、ユーザーポリシーのファイル、その上に重なるプロジェクトポリシーのファイル、そして両スコープの rule.json です。rule.json に列挙された rulebook はいずれもライブファイルで、同じ呼び出しの中で <scope>/rules/<name>/rulebook.json から読み込まれます。この読み込みでは、書き込みもネットワークアクセスも結果のキャッシュも行わないため、スナップショットは常にディスク上の最新の設定を反映します。 スナップショットの状態は readydegraded の 2 つだけです。このページでは、設定元が拒否されたときに失われる保護と、ready に戻す手順を説明します。

設定の状態

警告が 1 つでもあれば、ランタイムは degraded になります。エラーと警告の違いは状態の深刻さではなく、その設定元がどう扱われるかにあります。
  • エラーは、その設定元が破棄されたことを示します。その設定元からはルールが一切読み込まれません。
  • 警告は、その設定元は有効なままで、拒否された部分だけが無視されることを示します。
どちらの場合も degraded になります。
cc-safety-net status が出力する判定は readydegraded の 2 つだけで、スナップショットの状態がそのまま反映されます。Claude Code のプラグインが無効でも判定は変わりません。その場合、statusNot active の先頭項目として次のように報告します。“plugin cc-safety-net@cc-marketplace is disabled in Claude Code; nothing is enforced in Claude Code until it is re-enabled. Other integrations are not affected.”

無効な設定の扱い

設定が無効だというだけの理由で、通常の作業が拒否されることはありません。無効な設定は強制されませんが、それによってエージェントが何もできなくなることもありません。
  • 検証できないルールの設定元は破棄され、そのルールは強制されなくなります。
  • 検証に成功した他のスコープは、引き続きルールを強制します。
  • 組み込みの保護は、どの場合でも適用されます。破壊的コマンドのルール、シークレット保護、ポリシーファイルの保護、Git メタデータの保護は、ルールの設定を読み取らないためです。
  • ユーザーポリシーのファイルを読み取れない場合は安全側の既定値に戻るため、破壊的コマンドの保護とシークレット保護は有効なままです。プロジェクトポリシーのファイルを読み取れない場合は、そのファイルの内容が一切反映されず、ユーザーポリシーがそのまま有効です。
degraded の間に使う特別な復旧モードや許可リストはありません。設定できないことを理由に拒否される操作がないためです。rule.json の読み取りも、その場での編集も、cc-safety-net rule update の実行も通常のツール呼び出しであり、それぞれの内容に応じて成功または失敗します。そのため、エージェント自身が設定を修復できます。
設定元が破棄されると、その設定元による拒否がなくなります。破棄された rulebook がブロックしていたコマンドは、修復するまで実行できます。エラーに名前が記載された rulebook は、保護を続けていません。
どの状態でも保護され続けるのは、両スコープの policy.json です。ポリシーファイルの保護と Git メタデータの保護は、ポリシースナップショットの読み込みよりに動作するため、設定が壊れていても影響を受けません。ブロックされる操作の詳細はポリシーを参照してください。

設定のフォールバック一覧

エラー:設定元が破棄される

いずれのメッセージも、拒否したファイルまたは設定元と、それに応じた修復方法を示します。リモートの設定元の rulebook がない場合は run `cc-safety-net rule update` to vendor <source> で終わります。ローカルの設定元の rulebook がない場合は create that file or remove that source from the rules config で終わります。rulebook が無効な場合と名前が一致しない場合は、どちらも fix that file で終わります。

警告:設定元は有効なまま

rulebook はすべてライブファイルです。保存した編集は次のツール呼び出しから有効になり、反映のための操作は要りません。編集して壊した場合も、黙って見過ごされることはありません。パースできない、またはスキーマに適合しないファイルは、上記の invalid rulebook のエラーで破棄され、削除されたファイルは missing rulebook file のエラーで破棄されます。どちらの場合もスナップショットは degraded になります。
rulebook の名前が重複した場合は、先に読み込んだ側を使います。ユーザースコープを先に読み込むため、同名のプロジェクト rulebook は読み込まれません。ルールの一部だけが隠れるわけではありません。この衝突は致命的エラーではなく、先に読み込んだ側を採用して解決されるため、一方のスコープでの変更が、他方のスコープがすでに確保している名前を理由に失敗することはありません。

policy.json:救済するか、安全側の既定値に置き換える

フィールド単位で救済するため、1 つの無効なフィールドが、ファイル内の他の保護まで無効にすることはありません。安全側の既定値は、拒否を増やす設定です。破壊的コマンドの保護とシークレット保護を強制的に有効にし、両方の allow path にある無効な項目と、保護を無効にする override を破棄します。有効なシークレットの allow path は、救済後のポリシーにも残ります。.cc-safety-net/policy.json のプロジェクトファイルも同じように救済されますが、1 点だけ違いがあります。audit はユーザースコープ専用のため、プロジェクトファイルの audit セクションは project policy audit settings are ignored; audit is user scope only という診断とともに無視されます。フィールドごとの挙動はポリシーを参照してください。 ランタイムが policy.json を書き換えることはありません。手作業で修復するか、ダッシュボードの修復機能を使ってください。 ファイルにエラーがある間、ダッシュボードのフォームには救済後の値ではなく既定値一式が表示され、修復するまで保存できません。修復機能は、認識できた有効な設定を残します。ファイル全体が既定値に置き換わるのは、JSON をパースできない場合だけです。

transparent wrapper の対象範囲が欠ける場合

transparent_wrappers は rulebook ではなく rule.json で宣言しますが、rule.json にはダイジェストがありません。その結果、次の 2 点が生じます。
  • rulebook が破棄された場合でも、そのスコープの wrapper は維持されます。rule.json 自体は読み取れるためです。
  • rule.json を読み取れない場合は、そのスコープの wrapper が失われます。フォールバックに使える検証済みのコピーがないためです。解析は、wrapper 越しに実行される保護対象コマンドを見つけられなくなります。
拒否された設定が、独自のルールだけでなく組み込みの対象範囲まで狭めてしまうのは、ここだけです。この理由でスコープが破棄された場合は、まず rule.json を修復してください。

fail closed になるケース

「fail closed」は、実行時の失敗や解析の失敗に対してその 1 回のツール呼び出しを拒否することを指す言葉であり、設定が無効なときの動作を指す言葉ではありません。 設定が無効な場合の動作は、これとは逆です。ルールの設定元を破棄し、policy.json を救済するか安全側の既定値に置き換えたうえで、作業は続行します。

degraded 状態の報告

ルールの設定と policy.json の両方を報告するのは doctor だけです。各コマンドのオプションと終了時の挙動はCLI コマンドを参照してください。 構造上の制限が 2 つあります。
  • Config warning: の行と監査ログの configFallback フラグが付くのは、スナップショットを読み込んだに行われた判定だけです。ポリシーファイルと Git メタデータによる拒否はそれより前に起きるため、どちらも含まれません。
  • 診断は、拒否したファイルと条件の名前を示すだけで、ファイルの中身をそのまま写すことはありません。不正な設定ファイルに含まれるシークレットがメッセージに再出力されることはありません。

気づきやすい失敗と気づきにくい失敗

  • 設定元が破棄されても、その場では通知されません。 拒否が減るため、通常のセッションでは問題に気づけないことがあります。ルールの設定変更後とアップグレード後には、cc-safety-net status を実行してください。詳しい診断には doctor を使います。
  • 未移行の旧設定は、さらに見つけにくい問題です。 ランタイムはそのファイルを読み込まず、何も報告しません。そのため、旧設定のルールが何も保護していない状態でも、スナップショットは ready のままです。検出には rule verify を使います。
  • 無効な policy.json は、たいてい自分から気づけます。 拒否されたセクションは、2 つの保護を有効にし、allow path と保護を無効化する override を破棄する安全側の既定値に戻るため、設定したつもりより多くの拒否が発生するからです。
  • 無効な policy.json の、気づきにくい側面:無効な safety.level は黙って standard に戻るため、paranoid の綴り間違いは preset を引き下げてしまいます。無効な secret_protection.deny_paths の項目や、ルールを既定より強くするルール単位の override も、修復されずに破棄されます。
  • 常時表示されるサインは、ステータスラインの表示だけです。Config warning: の行は無関係な拒否が起きたときにしか現れず、その他の表示箇所は、コマンドを実行するかダッシュボードを開くまで何も知らせません。

設定を復旧する

以下のコマンドはいずれも通常のツール呼び出しなので、ランタイムが degraded の間でも、エージェント自身が一連の手順をすべて実行できます。各コマンドのオプションと終了時の挙動はCLI コマンドにあります。
1

判定を確認する

ready または degraded の判定と、Not active 内の診断を 1 件ずつ表示します。Claude Code のプラグインが無効な場合は、別の判定にはなりません。Not active の先頭項目として表示されます。終了コードを使うゲートにはせず、日常の状態確認に使ってください。
2

詳細なレポートを取得する

ルールの設定と policy.json の両方を対象にする唯一のコマンドです。ランタイムが degraded の場合は config.runtime-degraded の警告として表示され、その詳細欄に、拒否されたすべての設定元を含む理由の全文が出ます。
3

実際に有効なものを確認する

実際に有効になっているものを一覧表示し、続けて IssuesWarnings を表示します。破棄された設定元と一緒に失われたルールを確認するときに使います。終了コードが 0 以外になるのは、設定にエラーがある場合だけです。警告だけの場合は Warnings に出力したうえで 0 を返します。
4

ルールの設定を検証する

ユーザーとプロジェクトの rule.json をスキーマに照らして検証し、実行時と同じ読み込みを再現するため、ガードが遭遇するのと同じ問題を検出できます。移行が必要な旧形式のファイルも検出します。問題がなければ All configs valid. または Configs valid with warnings. を出力し、問題があれば Config validation failed. を出力して終了コード 1 を返します。書き込みが 1 つだけ発生する場合があります。有効な rule.json$schema キーがない場合は追加し、Added $schema to <scope> config. と出力します。それ以外の変更は行いません。
5

設定元を修復する

ローカルの rulebook にコマンドは不要です。診断が指すファイルを編集すれば、次のツール呼び出しでガードがそれを読み込みます。リモートの設定元がない、または古い場合は、取り込み直します。
設定済みのリモートの設定元をすべて解決し直して rules/<name>/rulebook.json に書き出し、そのうえでガードと同じ方法でそのスコープを読み込み直します。設定元を 1 つ指定すればそれだけを更新でき、ユーザースコープには --global を付けます。診断が残っている場合は成功と報告せず、診断を出力して 0 以外の終了コードを返します。Rule config updated. に続いて Active rulebooks (<n>): の一覧が出れば、そのスコープに問題はありません。更新は設定元ごとに独立しています。失敗した設定元は Failed to update <spec>: <message> を出力し、すでにあるコピーをそのまま保持します。他の設定元は更新されます。検証の対象は、更新しているスコープだけです。
6

policy.json を手作業で直す

ランタイムが policy.json を書き換えることはありません。診断に挙がったフィールドを自分で修正するか、ダッシュボードの修復機能を使ったうえで、status を実行し直してください。スキーマ全体と既定値はポリシーを参照してください。
修復のたびに status を実行し直してください。ランタイムは次のツール呼び出しで再読み込みするため、何かを再起動する必要はありません。

以前のバージョンのロックとキャッシュを移行する

以前のバージョンで設定したスコープには、rule.lockcache ディレクトリが残っていることがあります。どちらも読み込まれなくなったため、スナップショットは ready のままで、そこから強制されるものもありません。cc-safety-net doctor は、これらを info 重大度の finding config.v2-leftovers(タイトルは “Rulebook lock and cache leftovers detected”)として報告し、詳細欄に Files an earlier version left behind are no longer read: <paths>. を出します。修正のヒントは Run `cc-safety-net rule sync` (add `--global` for user scope) to migrate them, then rerun doctor. です。 現在の rule sync が行うのは、この移行だけです。オフラインで動作し、最初に非推奨の告知を出力します。
記録されたダイジェストと一致するキャッシュ済み rulebook を取り込んだうえで、ロックとキャッシュディレクトリを削除します。これらのファイルが残っているのにそのスコープの rule.json がない、または読み取れない場合は、実行を中止します。設定元を記録しているのがロックだけになるためです。出力されるメッセージの全体は rule sync を参照してください。

旧形式のインラインルールを移行する

旧形式のインライン設定ファイル(~/.cc-safety-net/config.json.safety-net.json)は、実行時に読み込まれず、診断も出ません。他の部分は動作しますが、それらのルールはまったく強制されず、スナップショットは ready のままです。アップグレード後には、この状態を見落とすことがあります。移行待ちの旧形式ファイルは、cc-safety-net rule verify だけが検出します。 変換したい旧設定があるプロジェクトで、移行コマンドを実行します。
rule migrate は同期の結果をそのまま引き継ぎます。移行後のスコープに診断が残っている場合は、成功とは報告せず、その診断を出力します。移行後のファイルは書き込まれ、旧形式のファイルも残るため、報告された問題を直してから再実行できます。移行先となる rulebook の構成はカスタムルールを参照してください。

関連ページ

ポリシー

policy.json の完全な仕様、既定値、フィールド単位の救済。

カスタムルール

rulebook の構成、設定元、取り込み、override、transparent wrapper。

CLI コマンド

statusdoctor、および各 rule サブコマンドのオプションと終了時の挙動。

監査ログ

判定が記録される場所、エントリのスキーマ、保持期間。
最終更新日 2026年8月31日