mcpField
O
occasio

occasio

ローカル
github.com/occasiolabsセキュリティ918 週間前に更新

occasio について

Occasioは、AIコーディングエージェント向けのローカルプロキシ兼監査ツールです。開発者やコンプライアンス担当者がポリシーで通信を制御し、ハッシュチェーン付きログや検証可能な証拠バンドルを作成できます。

主な機能

  1. 01ポリシーによるエージェント操作の制御
  2. 02機密情報へのアクセス遮断と権限の承認制
  3. 03送信トラフィックのローカル表示
  4. 04改ざん検知可能な監査チェーンの検証
  5. 05持ち運び可能な証拠バンドルの作成
  6. 06機密情報とポリシー違反のスキャン

活用シーン

  1. 01エージェントがLLMに送る内容の確認
  2. 02SSHやクラウドへのアクセスに人の承認を要求
  3. 03エージェントのCI実行記録をオフラインで検証
  4. 04CIでポリシー変更を検知

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"occasiolabs-occasio": {
"command": "npx",
"args": [
"-y",
"@occasiolabs/occasio"
]
}
}
}
起動コマンドnpx -y @occasiolabs/occasio

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@occasiolabs/occasio0.10.0

ツール

3

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
pathstringはい読み取るファイルのパス
end_lineanyいいえ読み取る最終行(1 始まり、指定行を含む)
start_lineanyいいえ読み取る最初の行(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 — ツールの結果内で秘匿されたシークレットが強調表示された、送信データ交換のライブブラウザビュー

スクリーンショット:合成データに対する 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 simulateoccasio 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

→ docs/POLICY.md

スキャナーと事前チェック

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 registerclaude シェルエイリアスを登録
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 boundary3 列表示:生成/再流入/防止
occasio ledgerリクエストごとのトークン台帳
occasio distill蒸留されたツール出力を確認
occasio dashboardhttp://localhost:3001 のライブブラウザーダッシュボード(セッション指標)
occasio eyeshttp://127.0.0.1:3002 のブラウザー UI(交換ごとのトラフィック、--eyes でキャプチャをオプトイン)
occasio audit verifySHA-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 --signGitHub 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 anomaliesEDR スモークテスト:合成された敵対的チェーン → 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
--hardenedRead/Glob/Grep を統合ランタイム+蒸留+シークレットスキャン経由で処理
--eyesoccasio 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つの独立したチェックすべてが必要です。

  1. Sigstore 署名 — Fulcio 証明書チェーンと Rekor の包含証明です。Sigstore 準拠ツール(cosign verify-blob、sigstore-js、sigstore-python)で検証できます。
  2. DSSE ペイロードと証明述語の同等性 — バンドル内の in-toto Statement を再デコードし、RFC 8785 サブセットを使って述語を正規化してから、signature メタデータフィールドを除いた証明述語とバイト単位で比較します。
  3. 監査チェーンの整合性 — 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 行を生成します。

リファレンス


要件

  • 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)。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。