Skip to main content
CC Safety Net は、コマンドの判定を構造化された監査証跡に書き込みます。エージェントが何を実行しようとしたか、その結果がどうなったかを確認するために使います。ログは JSON Lines(JSONL)形式で、1 行に 1 つの JSON オブジェクトがあります。CC Safety Net は、これらのログをローカルマシンに保存します。 このページでは、ファイル配置、レコードスキーマ、対象範囲、保持、編集の制限を定義します。UI でログを読む方法については、ダッシュボードを参照してください。ターミナルで読む方法については、logsを参照してください。

ログの配置

レコードは、プロジェクトおよび月ごとのパスに書き込まれます。
セッション ID はファイル名に入る前にサニタイズされます。A-Za-z0-9_.- 以外の連続した文字は _ にまとめられます。先頭と末尾の .-_ は削除されます。結果は 128 文字に切り詰められます。サニタイズ後に空文字列、... になった場合、書き込み全体を中止します。これはパストラバーサルに対する防御であり、単なる書式調整ではありません。 ディレクトリはモード 0700 で作成され、ログファイルにはモード 0600 で追記されます。 書き込みの失敗は無視されます。監査ログは、許可またはブロックの判定を変更できません。
~/.cc-safety-net/logs/ の直下にあるフラットファイルは、以前のバージョンが使ったレガシー配置です。logs は今もこれらを読み、保持処理もこれらを対象にします。logs --prune-legacy は、このファイルを対象にします。新しいレコードがこの場所に書き込まれることはありません。

各レコードには 1 つの判定が入る

各行には、許可またはブロックされた 1 つのコマンド判定が記録されます。コマンド、判定の原因となったセグメント、理由、一致したルールが含まれます。
  • 書き込み処理では、コマンド出力、モデルプロンプト、ツール結果、会話内容を読み取らず、保存もしません。
  • 拒否は常に記録されます。
  • 許可の判定は、ツール呼び出しが実際にコマンドへルーティングされた場合にのみ記録されます。許可されたコマンド以外のツール呼び出しでは、レコードは作られません。
  • fail-closed パスから生じたブロック、つまりアナライザーでエラーが発生し、推測せずにガードが拒否した場合も記録されます。このレコードには failureStageerrorCode が設定されるため、正確に検索できます。logs --suspect はこのフィールドを使います。

レコードスキーマ

レコードの例:

長さの上限と切り詰めインジケーター

上限は編集のに適用されます。そのため、編集処理がトークンの途中で切れることはありません。 commandsegmenttoolNamecwd のいずれかが上限を超えると、レコードに truncated: true が追加されます。このフラグが false として書き込まれることはありません。フラグがなければ、何も切り詰められていません。logs --id は、これを truncated: yes または - として表示します。

記録内容:監査の対象範囲

CC_SAFETY_NET_AUDIT_SCOPE は、許可されたコマンド判定を拒否と一緒にログへ記録するかを決めます。 無効な値は通知なしで処理されません。doctor は警告重大度の finding environment.audit-scope-invalid を生成します。内容は「Audit scope value is invalid」で、変数を all または blocked に設定して統合を再起動する修正ヒントが付きます。問題の値自体は意図的に表示されません。 拒否が対象範囲によって抑制されることはありません。対象範囲は許可の分岐のみを制御します。

保持

audit.retention_days は 1~365 の整数である必要があります。それ以外は検証で拒否されます。まったく使用できない値は、既定の 30 日にフォールバックします。保持期間は、ポリシーファイルから単独で直接読み取られます。そのため、ポリシーのほかの部分が検証に失敗しても削除処理は動作します。 同じ値が、logs --since の上限と GUI の Activity ビューが提示する期間を制限します。
保持期間の短縮は元に戻せません。スイープは実行ごとにカットオフを再計算します。値を小さくすると、既存のレコードが即座に削除対象になり、リンクが解除されます。アーカイブ、ゴミ箱、取り消しはありません。このため、GUI は値を小さくする前に確認を求めます。

削除処理は操作時に実行される

タイマーで動作する処理はありません。保持スイープは、次の操作によって開始されます。
  • 各監査書き込みの後。削除の失敗によってレコードが失われないように、意図的に書き込み後に実行する
  • logs が読み取る前
  • doctor がアクティビティの要約を作る前
  • GUI の Activity フィードが読み込まれる前
スイープは、監査ルートごとに UTC の 1 日に最大 1 回だけ走査します。監査ルートにある 0 バイトの .last-prune マーカーで抑制します。例外を送出せず、監査ルートを作成せず、シンボリックリンクをたどらず、認識しないファイル形式には触れません。空の月ディレクトリと空のプロジェクトディレクトリは回収されます。ただし、実行中の書き込みとの競合を避けるため、現在の月は残します。レガシーのフラットファイルは、そのファイルのタイムスタンプと内部のすべてのレコードの両方によって完全に期限切れだと証明できる場合にのみ削除されます。異なる経過時間のレコードを含むファイルは、書き換えも分割もされません。 何もスイープを開始しないため、CC Safety Net の操作がない間は、期限切れのレコードがディスクに残ることがありますlogs --id は、ディスク上にあるレコードを検索します。削除処理がまだ到達していない場合、保持期間を過ぎたレコードを返すことがあります。

レガシーログの削除

cc-safety-net logs --prune-legacy は、監査ルートにあるレガシーのフラットな *.jsonl ファイルをすべて即時かつ元に戻せない形で削除します。確認プロンプトも --yes フラグもありません。唯一のプレビューは --dry-run で、削除対象の正確なセットを報告し、何も削除しません。対象かどうかはファイルの場所だけで決まります。経過時間、スキーマの有効性、不正な行はすべて関係ありません。
これは保持スイープではありません。保持スイープは、完全に期限切れの場合にのみレガシーファイルを削除します。--prune-legacy は経過時間に関係なく削除します。ネストされたプロジェクトごとのログには入らず、触れません。そのことはコマンド出力にも表示されます。フラグの終了動作と拒否される組み合わせについては、logs --prune-legacyを参照してください。

件数と返されるエントリ

件数は期間全体を対象にします。エントリのリストには上限があるため、2 つの数値が異なることがあります。 logs がログを走査するとき、削除する必要があったすべてのソース、つまり読み取れないディレクトリ、読み取れないファイル、不正なレコードを数えます。stderr には 1 つの警告 warning: N audit log sources could not be read; these results are incomplete が出ます(N が 1 の場合は source)。パスは表示されません。stdout と終了コードは変わらないため、--json の出力は解析可能な状態を保ちます。ログディレクトリがない場合は履歴が空であり、ソースの脱落ではないため、警告は出ません。 通常のリストと GUI の期間は、保持期間より前を表示しません。GUI は固定リストではなく保持値から期間の選択肢を導出します。ただし、期限切れのレコードが削除前にディスクに残っている間は、logs --id で直接検索すると返されることがあります。各保持設定で選べる期間については、ダッシュボードを参照してください。

シークレットの編集

コマンド、セグメント、ツール名、作業ディレクトリは、レコードをシリアライズするにシークレット編集処理へ渡されます。認識された値は <redacted> に置き換えられます。
  • 名前に TOKENSECRETPASSWORDPASSKEYCREDENTIALS を含む環境変数代入
  • データベース接続変数(DATABASE_URLPOSTGRES_URLMYSQL_URLREDIS_URLMONGODB_URL、その他の DSN、URL、URI、接続文字列変数)
  • PEM 秘密鍵ブロック(-----BEGIN ... PRIVATE KEY-----
  • シークレットを含む HTTP ヘッダー(AuthorizationCookieX-API-KEYAPI-KEY
  • URL 資格情報(scheme://user:pass@hostscheme://token@host)および -u user:pass
  • 署名済み URL の署名クエリパラメーター。テキストの先頭、空白、?&;| の後にパラメーター名がある場合に、大文字と小文字を区別せず x-amz-signaturex-goog-signaturesigsignature の値を処理する
  • 固定リストにあるプロバイダートークン形式(ghp_...gho_...xoxb-...npm_...sk_live_...rk_live_...pypi-... など)
  • JWT(eyJ...)と AWS アクセスキー ID(AKIA... / ASIA...
編集の範囲は限定されています。 これは固定パターンのリストであり、分類器ではありません。認識しないものはすべて、そのまま保持されます。これには、絶対ファイルシステムパス、プロジェクト名とディレクトリ名、ホスト名、IP アドレス、ユーザー名、チケット ID、ファイル名、リストにない形式の資格情報が含まれます。reason フィールドは、書き込み時にまったく編集されません。監査ログを機密性のあるローカルデータとして扱ってください。issue またはチャットに抜粋を貼り付ける前に確認してください。
GUI が誤検知レポートを送る前に、ホームディレクトリの接頭辞は削除されます。そのほかのパスはレポートに残ることがあります。 権限(ディレクトリは 0700、ファイルは 0600)とローカル保存は、アクセスを制限します。ログを編集することも、安全に共有できる状態にすることもありません。

関連ページ

最終更新日 2026年8月12日