occasio について
Occasioは、AIコーディングエージェント向けのローカルプロキシ兼監査ツールです。開発者やコンプライアンス担当者がポリシーで通信を制御し、ハッシュチェーン付きログや検証可能な証拠バンドルを作成できます。
主な機能
- 01ポリシーによるエージェント操作の制御
- 02機密情報へのアクセス遮断と権限の承認制
- 03送信トラフィックのローカル表示
- 04改ざん検知可能な監査チェーンの検証
- 05持ち運び可能な証拠バンドルの作成
- 06機密情報とポリシー違反のスキャン
活用シーン
- 01エージェントがLLMに送る内容の確認
- 02SSHやクラウドへのアクセスに人の承認を要求
- 03エージェントのCI実行記録をオフラインで検証
- 04CIでポリシー変更を検知
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| path | string | はい | 読み取るファイルのパス |
| end_line | any | いいえ | 読み取る最終行(1 始まり、指定行を含む) |
| start_line | any | いいえ | 読み取る最初の行(1 始まり、指定行を含む) |
詳細
Occasio
AI コーディングエージェント向けの、ローカルファーストな監査チェーン および ID ゲートです。プロンプト、ツール呼び出し、監査ログはすべてお使いのマシン上に保存され、後から暗号学的に検証できます。また、エージェントは ID(ssh/クラウド/root)を 要求できますが、黙って 前提とすることはできません。
Occasio は、お使いの AI コーディングエージェント(Claude Code、Cline、または Anthropic API と通信するもの)と、設定した LLM エンドポイントの間に配置されるローカルプロキシです。すべてのツール呼び出しは、お客様が管理する、人が読めるポリシーファイルを通過します。マシンから送信される内容をリアルタイムで確認し、許可すべきでない動作をブロックできます。また、必要に応じて数か月後に第三者がオフラインで検証できる、改ざんを検知可能なハッシュチェーン付きログが残ります。エージェントの動作を証明できます。
Occasio が第三者にデータを送信することはありません。Occasio のクラウドも、Occasio のアカウントも、テレメトリもありません。アーキテクチャについては docs/WHY-LOCAL.md を、クラウドホスト型の AI オブザーバビリティツールとの違いについては docs/COMPARE.md を、Apache 2.0 のもとでローカルファースト製品をどのように運営しているかについては docs/SUSTAINABILITY.md をご覧ください。

スクリーンショット:合成データに対する occasio eyes --demo の実行例です。実際のパスや実際のトラフィックは使用していません。デモモードでは、左上に「(demo)」バッジが常に表示されます。
npm install -g @occasiolabs/occasio
occasio demo audit # Auditor scenario: signed attestation + cross-verifier proof (10s, no API key)
occasio demo attest # End-to-end attestation pipeline against a synthetic chain
occasio demo anomalies # Live EDR detection on a synthetic adversarial chain
occasio harness # Real Claude Code attacking a denied path — defense holds
最初の3つのデモは合成データで実行されるため、外部依存なしで数秒のうちにパイプライン全体を確認できます。4つ目のデモでは、お使いの Anthropic ログインを使って Claude Code の実際のサブプロセスを起動し(認証機能を内蔵しているため API キーは不要)、エンドツーエンドで防御を実証します。まず demo audit を実行してください。これは、本当に重要な唯一の質問に答えます。「CI で AI エージェントが何をしたか証明してください。」
ID ゲート — 前提とせず、要求する
このツールの開発につながったインシデント:エージェントにデプロイコマンドだけを頼んだにもかかわらず、エージェントが自分の判断でサーバーに ssh 接続し、env を読み取ってしまいます。strict ポリシーはまさにこの動作を阻止します。AI エージェントは ID を 要求できますが、黙って 前提とすることはできません。
- 流出は、ツールを問わず拒否されます。
printenv、cat .env、/proc/self/environ、秘密鍵の読み取り、シークレット名のgrepは、どのコマンドやツールで読み取ろうとしてもブロックされます。出力がモデルに届くことはありません。 - ID の利用には人間の承認が必要です。
ssh/scp、az/クラウドのコントロールプレーン、sudo/systemctlは、フェイルクローズで BLOCK され、エージェント自身では承認できない「人間による承認が必要です」という拒否を返します。 - ハンドシェイクにより、それぞれの役割が明確になります。 エージェントが 要求し、お客様が自身のターミナルから、帯域外で一度だけ承認します。
occasio init --template strict # the identity-gated posture
# agent runs `ssh deploy@host` → BLOCKED, pending apr_…
occasio approvals approve apr_… --once # you, single-use, short TTL
# the agent's retry passes through once — then it's blocked again
エージェントが 自分で承認することはできません。承認のコントロールプレーンはエージェントの拒否ゾーン内にあり、トークンは HMAC で署名されます。チェーンには actor=ai_agent · delegator=you · approved_by=you と記録されます。プロキシを通らない実行をカバーするため、2つ目の独立した強制ポイントである PreToolUse フック(occasio hook --install)も用意されています。
設計の詳細、脅威モデル、正直に開示する残存リスク(実行時の間接化、送信通信)については docs/identity-gate.md をご覧ください。
2 つの使い方
ここにたどり着く方のほとんどは、次のどちらかを目的としています。自分に合う列を選び、該当する箇所を確認してください。
| 日々の開発作業 | CI/コンプライアンス | |
|---|---|---|
| 確認したいこと | 「エージェントは実際に Anthropic に何を送信していて、費用はいくらかかっていますか?」 | 「今回の実行中にエージェントが行ったことを証明してください。」 |
| 主なコマンド | occasio eyes、occasio dashboard、--budget N、--eyes、occasio scan、occasio preflight simulate | occasio attest、occasio bundle → occasio verify、occasio policy lock/diff、occasio anomalies、occasio audit verify |
| 得られるもの | 127.0.0.1 上で動作するブラウザー UI。送信されるすべてのペイロード、バイト数の内訳、明示されたマスキング内容に加えて、ポリシーで許可/ブロックされる内容のプレビューを確認できます。 | 第三者が 1 つのコマンドでオフライン検証できる、持ち運び可能な証拠ファイル。署名/承認済みのポリシーロックと、ラウンドごとの容量制限も得られます。 |
| 移動先 | ライブ可視化 · スキャナーと事前チェック | 証拠ワークフロー · ポリシーワークフロー |
どちらのビューも同じ基盤ログを読み取ります。どちらか一方を選ぶ必要はありません。プロキシを起動するだけで、両方を追加設定なしで利用できます。
クイックスタート
初めての方へ:**5 分で始めるガイド**では、ID ゲートのフローを最初から最後まで説明しています。インストール →
init --template strict→ エージェントの実行 → 借用の承認 → ログの検証まで、記載されているすべてのコマンドは公開リリースを使ってテスト済みです。
Node.js ≥ 18 が必要です。Windows、macOS、Linux で動作します。
npm install -g @occasiolabs/occasio # Install
occasio doctor # Verify setup (Node, claude CLI, port, profile)
occasio init # Write ~/.occasio/policy.yml (dev-default)
occasio init --template strict # …or the identity gate: deny secrets, gate ssh/cloud/root behind approval
occasio register # Add 'claude' shell alias (one-time)
claude "read package.json and tell me the version"
エイリアスを登録すると、以降のすべての claude の呼び出しが透過的に Occasio 経由でルーティングされます。監査チェーンの行は ~/.occasio/pipeline-events.jsonl に蓄積されます。
実行内容を確認する:
occasio status # Session totals
occasio replay --detail # Run-level audit
occasio audit verify # Re-walk the hash chain end-to-end
occasio anomalies # Run EDR detectors over the last 15 minutes
occasio attest --run-id <uuid> # Build a behavioral attestation for one session
occasio explain <event-id> # Why was this blocked? — the matched policy rule + how to unblock
コマンド一覧
作業内容ごとに分類しています。(stable) = テストカバレッジがあり、重要な機能です。(beta) = エンドツーエンドで動作しますが、範囲はより限定的です。(alpha) = 足場となる実装です。全コマンドの一覧:occasio help。
| コマンド | 目的 | |
|---|---|---|
claude [args] | ローカルプロキシ経由で Claude Code を起動する | (stable) |
status · ledger · replay · boundary · inspect | コスト/トークン/実行ごとの監査/クラウド境界を確認する | (stable) |
eyes · dashboard | 送信トラフィックをブラウザー/ターミナルでリアルタイムに表示する | (beta) |
scan --file|--stdin | 説明可能なシークレットスキャン(prefix/jwt/env-key/entropy)。検出時に終了コード 1 を返す | (stable) |
preflight simulate | 候補アクションが有効なポリシーで許可/ブロックされるかを予測する | (stable) |
preflight | 過去の初動パターンを遡って検出する | (beta) |
audit verify · attest [verify] | ハッシュチェーンを検証する · 署名付き証明を作成/検証する | (stable) |
bundle --run <id> → verify <file> | 1 回分の実行を持ち運び可能な証拠ファイルにまとめる · オフラインで検証する | (stable) |
policy show/validate/lock/diff | ポリシーを確認する · リントする · 承認済みポリシーを記録する · 差分を検出する | (stable) |
explain <event-id> | BLOCK と、その原因となったルールおよび解除方法を関連付ける | (stable) |
anomalies | チェーンを対象とするウィンドウベースの EDR | (beta) |
doctor [--paranoid] | セットアップの健全性を確認する · ローカル優先でセルフ監査する | (stable) |
証拠ワークフロー
監査担当者または CI に渡し、1 つのコマンドで確認できるファイルを 1 つ作成します。
occasio attest --run-id <uuid> --sign # behavioral attestation (Sigstore optional)
occasio bundle --run <uuid> --out run.occasio.json # pack attestation + chain slice + policy + manifest
occasio verify run.occasio.json # 6 offline checks; exit ≠ 0 on tamper
verify は、スキーマ、マニフェストのハッシュ、チェーンスライスの完全性、ポリシーとの紐付け、git の状態とチェーンの相互確認、そして Sigstore 署名がある場合はその署名を、ファイル内に埋め込まれたデータに対して検証します(作成者のマシン上のデータは使用しません)。実行は git_state の行(HEAD + diff hash + changed files)によって、実際に変更されたコードに紐付けられます。署名は任意です。署名のないバンドルでも、それ以外のすべてを検証できます。バンドルには作成者の絶対パスが埋め込まれます。これは内部監査用の成果物です。公開前に内容を確認してください。→ docs/VERIFY.md
ポリシーのワークフロー
~/.occasio/policy.yml は、シークレットの処理、deny_paths/allow_paths、カスタムの deny_patterns、ラウンドごとの limits、ツールのルーティングなど、Occasio が制御する経路を管理します。承認し、ドリフトがないか固定して確認してください。
occasio policy init # starter policy.yml
occasio policy validate # lint before you rely on it
occasio policy lock --sign --out policy.lock.json # record the approved policy
occasio policy diff --since policy.lock.json # CI gate: exit 1 if the policy drifted
スキャナーと事前チェック
occasio scan --file .env # explainable secret findings (masked, exit 1)
occasio preflight simulate --read ~/.ssh/id_rsa --bash "npm test" --strict # would the policy block this?
scan はシークレットを平文では表示しません(マスクされたスニペットと SHA-256 を表示します)。preflight simulate は、候補となるアクションを実行時に使用されるものと同じポリシーエンジンに通し、ブロックされるアクションについては、一致したルールとブロックを解除する方法を表示します。
→ docs/SCAN.md · docs/PREFLIGHT.md
ローカルファーストの主張を検証する
occasio doctor --paranoid
インストール済みのソースをスキャンして、すべてのアウトバウンドネットワークプリミティブを特定し、各呼び出し箇所を分類します。また、テレメトリー SDK のシグネチャを確認し、監査チェーンの状態を表示します。重大な検出事項がある場合は、ゼロ以外の終了コードで終了します。--paranoid --json で JSON を出力します。この検証対象となるアーキテクチャについては、docs/WHY-LOCAL.md を参照してください。
SLSA Provenance および CycloneDX AI-BOM と並ぶ Occasio の位置付けについては、docs/SUPPLY-CHAIN-TRIANGLE.md を参照してください。Occasio は実行時の振る舞いを担います。
ライブ表示 — 開発者向け
監査チェーンと署名付き証明書は、監査担当者の問いである 「エージェントは何をしたのか、証明して」 に答えます。よりシンプルな問い、「エージェントは今、何をしているのか?」 を知りたい場合もあります。この HTTP リクエストで、何がマシンから送信されているのか。このセッションで、どのファイルがすでに Anthropic に送られたのか。システムプロンプトはどのような内容なのか。送信前に何が伏せ字にされたのか。
occasio eyes は http://127.0.0.1:3002 で動作するローカルのブラウザー UI で、これらをそのまま表示します。プロキシの --eyes でオプトインした場合のみキャプチャが行われます。マシンの外にデータが送信されることはなく、すべてのデータは ~/.occasio/eyes/ に保存されます。
occasio eyes --demo # synthetic data, no proxy needed (10-second tour)
occasio claude --eyes # then in another terminal:
occasio eyes # browser tab opens automatically
表示される内容:
- ユーザープロンプトごとにグループ化されたサイドバー — 「read the readme」のような 1 つのプロンプトを展開すると、実際に行われた 3〜6 回の HTTP ラウンドトリップを確認できます(Claude Code のエージェント型ループを可視化します)。
- セッションのスパークライン+ファイルごとの集計 — 時間経過に伴うアウトバウンドサイズ、クラウドに送信されたファイルとその送信回数を確認できます。
- リクエストごとのバイト数の内訳 — システム/履歴(再送)/今回新たに追加された内容/ツールのフレーミングを積み上げ棒グラフで表示します。124 KB の「小さな」リクエストも、毎回同じシステムプロンプトが 108 KB を占めていると分かれば、その理由がはっきりします。
- タブ:リクエスト · レスポンス · ツール(完全なローカルツール出力 — インターセプターがローカルで処理し、外部に送信しなかった Read/Glob/Grep/Bash のバイト数) · 差分(変換前と送信内容の比較 — 伏せ字にされた実際のシークレットをローカルでそのまま確認できます) · ヘッダー · Raw SSE バイト · 統計。
- 新しいアウトバウンドを受信すると表示されるライブフラッシュオーバーレイ — 内容の把握にもデモにも役立ちます。
画面収録用の安全な表示 — --sanitize
実際のセッションで occasio eyes のデモやスクリーンショットを撮影すると、通常は個人情報が漏れてしまいます。ホームディレクトリのパス(C:\Users\<you>\...)、OS のユーザー名、Git のメールアドレス、本名、ホスト名などです。--sanitize フラグを指定すると、表示上のみ、これらを決定的な仮名に置き換えます。~/.occasio/eyes/ 配下のディスク上の内容は変更されないため、監査証跡は実際のまま保たれます。
occasio claude --eyes --sanitize # capture as normal
occasio eyes --sanitize # view with identity scrubbed
ブラウザー UI では、水色のドットと (sanitized) バッジで有効になっていることを確認できます。C:\Users\<you>\Desktop\proj のようなパスは /home/user-7c/Desktop/proj に変換され、セッション内で一貫して表示されます。
--sanitize の対象: $HOME のパス、OS のユーザー名、Git の user.email / user.name、ホスト名、および ID を含む環境変数(USER、USERNAME、LOGNAME、HOME、USERPROFILE)。
対象外の項目 — 共有する前に確認してください:
$HOMEの外にあるプロジェクトのパス(例:D:\Work\Acme\…)- ツールの出力に含まれる Git リモート URL(
github.com:org/repoから組織名が漏れます) - ファイルの内容 — コメント、コミットメッセージ、README にある名前は自動検出されません。サニタイズでは、OS や Git から検出できる ID 値を対象とし、任意の部分文字列は対象にしません。
- Claude Code の TUI バナー(「Welcome back X」、組織名の行)— HTTP 通信が始まる前に表示され、Eyes を経由しません。画面収録から手動で切り取ってください。
このフラグは表示フィルターであり、録画モードではありません。同じ Eyes のキャプチャを後からサニタイズなしで再生できます(フラグを付けずに occasio eyes を実行してください)。
Dashboard と Eyes の違い
どちらもローカルのブラウザー UI として動作しますが、解決する課題は異なります。
occasio dashboard (3001) | occasio eyes (3002) | |
|---|---|---|
| 焦点 | セッション単位の指標:コスト、節約額、トークン数 | リクエスト単位の通信内容:送信内容と受信内容 |
| 詳細度 | 集計カウンターとリクエストごとの概要テーブル | HTTP ボディ全体、デコードされた SSE、ローカルツールの出力 |
| キャプチャの必要性 | 不要 — session.json と日次ログを読み取ります | 必要 — プロキシに --eyes を渡します(オプトイン) |
| データの範囲 | メタデータのみ | ペイロードの全バイト(ローカルの ~/.occasio/eyes/ 配下に保存) |
| 最適な用途 | 「今日はどのくらい使ったか?」 | 「エージェントは Anthropic に実際に何を送信したか?」 |
どちらも 127.0.0.1 でのみ動作します。CORS も認証も、外部ネットワークへの接続もありません。
コマンド
| コマンド | 動作 |
|---|---|
occasio(引数なし) | アクティブな実行の統合ライブスナップショット |
occasio claude [args] | Occasio プロキシを有効にして Claude Code を起動 |
occasio register | claude シェルエイリアスを登録 |
occasio doctor | セットアップのヘルスチェック |
occasio doctor --paranoid | アンチ SaaS 証明スキャン(--watch <s>、--sign、--json) |
occasio live | アクティブなセッションのターミナル監視(終了するには Ctrl-C) |
occasio status | セッションの合計と削減額の内訳 |
occasio explain <event_id> | 単一のチェーンイベントに記録されている内容とその理由を表示 |
occasio replay | 実行レベルの監査(--detail、--run <id>、--attribute) |
occasio inspect | リクエストごとのクラウド境界マニフェスト |
occasio boundary | 3 列表示:生成/再流入/防止 |
occasio ledger | リクエストごとのトークン台帳 |
occasio distill | 蒸留されたツール出力を確認 |
occasio dashboard | http://localhost:3001 のライブブラウザーダッシュボード(セッション指標) |
occasio eyes | http://127.0.0.1:3002 のブラウザー UI(交換ごとのトラフィック、--eyes でキャプチャをオプトイン) |
occasio audit verify | SHA-256 監査チェーンを最初から最後まで再検証 |
occasio audit repair --file <path> | クラッシュによって部分的に書き込まれた末尾行を切り詰める(.bak を書き込み) |
occasio report | ガバナンス概要をエクスポート(--days N、--format csv) |
occasio anomalies | 監査チェーンに対する EDR 検出(--window 15m、--json) |
occasio attest --run-id <uuid> | 動作証明述語 v1 を生成 |
occasio attest --sign | GitHub Actions OIDC 経由で Sigstore 署名 |
occasio attest verify <file> | 署名済み証明を最初から最後まで再検証 |
occasio receipt [--run <id>] [--sign] | 共有可能な簡易実行概要(--out file、--json) |
occasio bom export [--run <id>] | 実行スライスから CycloneDX 1.6 ML-BOM を生成(--out file) |
occasio compliance export [--run <id>] | 監査担当者向けバンドル:チェーン+レシート+BOM+フレームワークマッピング |
occasio policy [show | validate | init | doctor] | ポリシーの作成と診断 |
occasio harness | ポリシーに対してスクリプト化された敵対的シナリオを実行 |
occasio redteam | 自律型テスター LLM が対象の Claude Code セッションを調査 |
occasio computer-use --dry-run | 合成された tool_use ブロックに Computer-Use ポリシーを適用 |
occasio demo attest | 合成チェーンに対するエンドツーエンドの証明パイプライン |
occasio demo anomalies | EDR スモークテスト:合成された敵対的チェーン → 4 つの検出器すべて |
occasio selftest | スクラッチチェーン上でインプロセスのガバナンス自己チェックを実行 |
occasio baseline [learn | compare] | プロジェクトごとの動作ベースライン+ドリフト検出 |
occasio preflight | ポリシー候補の提案に向け、最近のアクティビティを読み取り専用で分析 |
policy.yml に加えて適用されるセッションレベルのオーバーライド:
| フラグ | 効果 |
|---|---|
--preset strict | セッションで block_secrets_in_tool_results を強制的に有効化 |
--preset off | 純粋なパススルー、ログ記録のみ |
--budget <N> | ハード上限:セッションのコストが $N に達すると HTTP 402 |
--hardened | Read/Glob/Grep を統合ランタイム+蒸留+シークレットスキャン経由で処理 |
--eyes | occasio eyes ブラウザー UI 向けに送信・受信ペイロードをキャプチャ |
4つのレイヤーで実現すること
内部では、4つのレイヤーが処理を担います。レイヤー1〜2は毎回実行され、レイヤー3〜4は証明書を要求したとき、または検出器を実行したときに動作します。
レイヤー1 — ツール呼び出しのインターセプト。 ローカルプロキシが、エージェントとAnthropic APIの間に配置されます。Read、Glob、Grep、TodoRead/TodoWriteはマシン上でプロセス内実行され、ファイルのバイト列が外向きのリクエストに含まれることはありません。厳選された読み取り専用シェルコマンド(git status、git log --oneline -N(git -C <path>の有無を問わない)、およびecho/cdのcwdプレフィックスチェーン)も、プロセス内で実行されます。その他のシェルによる読み取り(cat <file>など)は、埋め込まれた読み取りパスを対象にポリシー分析されるため、deny_pathsが一貫して適用されます。ただし、コマンド自体はBashツールを介してサーバー側で実行されます。
レイヤー2 — ポリシーの適用。 すべてのツール呼び出しは、policy.ymlに基づいて、LOCAL/PASS/BLOCK/TRANSFORMのいずれか1つの判断を受けます。deny_pathsはrealpathで解決された絶対パスに適用されるため、シンボリックリンクやパストラバーサルのさまざまな形式も、同じ拒否対象として扱われます。block_secrets_in_tool_resultsは、ツール出力がプロンプトに戻る前に、APIキーとJWTをすべてマスキングします。ホットリロードにより、policy.ymlの編集は次の呼び出しから反映され、監査チェーンにはpolicy_loaded行が記録されます。strictテンプレートではIDゲートも有効になり、deny_commandsが情報流出につながる動作(環境変数のダンプ、シークレット名のgrep)をブロックし、identity_approvalがIDの借用(ssh/az/sudo)を、1回限りの人間承認済みトークンで制御します(IDゲートを参照)。
レイヤー3 — 振る舞いの証明。 occasio attest --run-id <uuid>は、1つのエージェントセッションにおける監査チェーンの全範囲を確定する、自己完結型のJSON述語を生成します。これには、すべてのツール呼び出し、ブロック、変換、マスキングされたシークレットに加え、有効なポリシーのSHA-256ハッシュとルールダイジェストが含まれます。--signを指定すると、これをin-toto Statement v1でラップし、GitHub Actions OIDCを使ってSigstoreで署名します(鍵管理は不要です)。述語の型URIはagent-attestation/v1です。独立した2つのリファレンス検証ツール(Node版のoccasio attest verifyとPython版のdocs/attest_verify.py)が付属しており、テストスイートでは、同じペイロードに対して両者がバイト単位で一致することを検証しています。
レイヤー4 — 異常検出(EDR)。 occasio anomaliesは、監査チェーンの期間を対象に、4つの検出器を実行します。拒否率の急増、ファイル読み取り量の急増、これまでにないツール入力の形状、シークレットのマスキング率の急増です。重大度は過去のベースラインに照らして引き上げられます。通常の約10〜20倍を超えると、検出器レベルでHIGHになります。通常時のベースラインがまばらな場合、実際に観測された倍率は100〜1000倍の範囲になります。再現可能な多層防御の解説については、docs/edr-demo.mdを参照してください。
アーキテクチャ
agent (Claude Code / Cline / MCP / Computer Use)
│
▼ tool call
┌──────────────────────────────────────────────────────────────┐
│ Occasio proxy │
│ │
│ Layer 1: adapter parse → canonical event │
│ Layer 2: policy decision (LOCAL / PASS / BLOCK / TRANSFORM) │
│ Layer 2: deny_paths + deny_patterns + secret redaction │
│ Layer 2: native dispatch for LOCAL/TRANSFORM tools │
│ ──► row appended, SHA-256-chained │
│ Layer 4: anomaly detectors (windowed, on-demand or live) │
└──────────────────────────────────────────────────────────────┘
│
▼ cloud-bound: only PASS calls, with shaped result if TRANSFORM
Anthropic API
End of session
│
▼ occasio attest --run-id … --sign
Layer 3: signed in-toto Statement → Sigstore bundle → GitHub Check Run
│
▼ independent verifier
Node / Python / cosign — all must agree
検証
検証済み証明には、以下の3つの独立したチェックすべてが必要です。
- Sigstore 署名 — Fulcio 証明書チェーンと Rekor の包含証明です。Sigstore 準拠ツール(
cosign verify-blob、sigstore-js、sigstore-python)で検証できます。 - DSSE ペイロードと証明述語の同等性 — バンドル内の in-toto Statement を再デコードし、RFC 8785 サブセットを使って述語を正規化してから、
signatureメタデータフィールドを除いた証明述語とバイト単位で比較します。 - 監査チェーンの整合性 — GENESIS センチネルからすべての
prev_hash → hashリンクを SHA-256 でたどり、証明のfirst_hashとlast_hashが正しい相対順序でチェーン内に現れることを確認します。
2つのリファレンス検証ツールを並行して提供しています。
- Node:
occasio attest verify <file> - Python:
python docs/attest_verify.py <file>— 標準ライブラリとオプションのsigstore-pythonを使用し、チェーン検証にはdocs/audit_walker.pyを再利用します。docs/python-verifier.mdを参照してください。
言語間の不変条件(テストスイートでは xlang: と xlang-float: のケースで検証):同じペイロードについて、両方の検証ツールは述語の同等性チェックと監査チェーンチェックの結果をバイト単位で一致させます。改ざん検出のケースも含まれます。将来のスキーマで不一致が気づかれないまま生じないよう、整数以外の数値は両方の正規化実装で拒否されます。
Sigstore 署名ステップでは、標準の DSSE でラップされた in-toto Statement 形式を使用します。Sigstore 準拠ツールであれば検証できます(cosign verify-blob、sigstore-js、sigstore-python)。テストスイートでは署名パスをモックします。実際の OIDC による署名・検証のエンドツーエンドの往復テストには GitHub Actions 環境が必要で、CI では integrations/attest-action/ ワークフローを使って実行されます。
ドラッグ&ドロップで確認できる、3つ目の部分検証ツールを integrations/attest-view/ でブラウザー上で実行できます。ブラウザーでは述語の同等性チェックと監査チェーンチェックを行いますが、Sigstore 証明書チェーンの検証は2つの CLI のいずれかに委ねます(Fulcio/Rekor の信頼ルートをブラウザー内にバンドルすることは意図的に行っていません。この点はページ上で明示しています)。
なぜ今なのか
3つの規制要因が、同じ要件へと収束しています。AI エージェントの動作に関する実行時の証拠は、暗号学的に検証可能でなければなりません。
- EU AI Act 第12条は、高リスク AI システムの包括的な自動ログ記録を義務付けています。規制対象セクターでは2026年から適用されます。
- **NIST AI RMF(GOVERN、MEASURE、MANAGE の各ファミリー)**は、米国連邦政府の調達で必須となりつつあり、FedRAMP の AI 管理策にも影響を与えています。
- SOC 2 Common Criteriaは、AI エージェントの管理策に対象を広げています。大手監査法人の監査担当者は、2026年の監査で「エージェントのツール呼び出しログを見せてください」と尋ね始めました。
現在、CI 内で AI コーディングエージェントが行ったことについて、署名付きで第三者が検証できる成果物を生成する既製品はありません。Occasio はオープンスキーマ(Apache-2.0)とそのリファレンス実装を提供し、この空白を埋めます。
ログ形式
すべてのデータはローカルの ~/.occasio/ に保存されます。
~/.occasio/
pipeline-events.jsonl # tamper-evident audit chain (SHA-256 linked)
policy.yml # active policy
session.json # current run_id, totals
logs/YYYY-MM-DD.jsonl # per-request log
baseline/<cwd-hash>.json # per-project behavior baseline (opt-in)
eyes/ # `occasio eyes` capture (opt-in via --eyes)
payload-NNNNNN.json # per-exchange metadata + extracted blocks
content/<sha> # content-addressed blob store (file bytes,
# tool outputs) — dedup by SHA-256
監査チェーンの行スキーマは docs/AUDIT.mdに記載されています。各行には prev_hash と hash(SHA-256 の16進数表記)が含まれ、最初の行は固定の GENESIS センチネル(64個のゼロ)からチェーンされています。occasio audit verify と docs/audit_walker.py は、ウォーカーの独立した実装です。
デモ
- EDR による多層防御 — 実際の Claude Code がポリシーで拒否されたパスを攻撃し、すべてのブロックが維持されます。EDR はベースラインの HIGH ×100~×1000 で作動します。2 分以内に再現できます。
- リファレンスパイプライン — AI エージェントを使った PR → GitHub Action が Sigstore のキーレス方式でアテステーションに署名 → PR に Check Run を作成 → オフラインで独立して検証します。
- プロトコル横断ガバナンス — 同じ
deny_pathsルールが、Claude Code の HTTP プロキシと MCP サーバーの両方で、同一のBLOCK行を生成します。
リファレンス
spec/agent-attestation/v1/README.md— predicate 型の仕様schemas/agent-attestation-v1.json— 正式な JSON Schemadocs/AUDIT.md— 監査チェーンの行スキーマと正規シリアライズ規則docs/compliance-mapping.md— SOC 2 共通基準のマッピングdocs/python-verifier.md— 独立した Python 検証ツールdocs/edr-demo.md— 多層防御の解説docs/reference-pipeline.md— エンドツーエンドの CI パイプラインintegrations/attest-action/— 署名して Check Run を投稿する GitHub Actionintegrations/attest-view/— アテステーションファイル用の静的ブラウザービューアー
要件
- Node.js ≥ 18
- Claude Code(
npm install -g @anthropic-ai/claude-code)— またはANTHROPIC_BASE_URLを尊重する任意のエージェント - Python 3(任意)— 独立した検証ツールと LAO コンテキストのトリミングに必要です
sigstore-python(任意)— Python 検証ツールに暗号学的な Sigstore ステップを追加します
ライセンス
Occasio は Apache License 2.0 に基づくオープンソースであり、安全なエンタープライズ利用のための明示的な特許許諾を含みます。バージョン 0.6.6 以前は MIT License の下でリリースされており、これらのリリースは今後も MIT のままです。
Apache-2.0 の下でコントリビューションを受け付けています。DCO に従って、コミットに sign-off を付けてください(git commit -s)。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。