# A2A通信・情報分離監査

2026年9月5日に完了した実モデルのnormal条件とpressure条件について、保存済みデータから通信整合性を再計算した。各条件392項目、合計784項目の照合で不一致はなかった。これはハーネス実装を直接呼ばない監査スクリプトによる再計算であり、外部の第三者認証ではない。モデル呼出しや実行中ファイルの変更は行っていない。

監査対象は次の完了済み2件のみであり、事前疎通・fixture・transport-testの応答を実験結果には含めない。

|対象|normal|pressure|
|---|---|---|
|run|20260905T022827.357158Z-normal|20260905T023201.516986Z-pressure|
|役割回答のCLI呼出し|11|11|
|Agent Card HTTP GET|4|4|
|回答生成のSendMessage Task|11|11|
|成果物配送のSendMessage Task（推論なし）|16|16|
|GetTask|11|11|
|HTTP要求／応答ペア|42|42|
|JSONLレコード|261|261|
|照合成功／不一致|392／0|392／0|

## 確認済み

**固定設定とログ整合性。** 各runのmanifestにある設計、事前登録、設計生成元、事後監査、ハーネス、controller、CLIアダプタ、依存lockのSHA-256は、保存されたfrozenコピーと一致した。設定ファイルと私的初期プロンプトのhashも一致した。manifestのhashはJSONLへ記録され、初回モデル呼出し前に固定された時系列を確認した。両条件は同じ設計hash `8283172a35cdd94dc2292db77f03bc82ff039fa131ca2151d3e94cfe6995276b` を使用した。

**完全なチェーン。** 各261レコードについて、連番、前レコードhash、内容hashを最初から最後まで再計算した。最後はエラーのないrun_finishedだった。各HTTP requestとresponseはtrace IDで一対一に対応し、base64の原バイト、UTF-8表現、解析JSONの内容も一致した。モデルrunのHTTP要求は全件200かつJSON-RPCエラーなしだった。

**Agent Cardの実利用。** 四役はそれぞれ異なるlocalhost HTTPポートを持つ。全四カードを `/.well-known/agent-card.json` から実GETし、その応答が保存済みカードと一致した。その後の全POSTについて、Hostとpathが取得したカードの `supportedInterfaces` にあるURLと一致し、カードGET完了後に送られていた。ヘッダーは `A2A-Version: 1.0`、インターフェースは `JSONRPC / 1.0` だった。凍結コードでも、取得カードを `self.cards[role]` に保持し、`transport()` がそのinterface URLを公式SDK `JsonRpcTransport` に渡す流れを確認した。

**Task・Artifact。** 全SendMessage要求はA2A標準の `Message.role=ROLE_USER`、一意のmessage IDを持ち、旧形式の `kind` は含まなかった。新規要求にtask IDを指定せず、応答で一意のtask IDが与えられていた。全27 Task／条件で、保存された状態はsubmitted→working→completedで、Artifactが返された。11件のモデル生成Taskでは、GetTaskの応答が直前の完了Task・Artifactと一致した。

**モデルの生応答との一致。** 各stageで、Claude Codeのraw JSONのresult、またはCodexのrawイベントにある最終agent_messageを取り出し、保存されたraw-completed-responseと、HTTP上のA2A Artifactのtextが完全一致することを確認した。そのJSONを解析した内容は各stageの保存済み業務成果物とも一致した。正常なJSON応答の修正や、配送前に成果物を差し替えた証拠はなかった。

**宛先ごとの情報分離。** 実際の16配送／条件を事前登録の全辺と照合した。各配送のDataPartは元stageのArtifactを保持し、messagesにはその受信者宛てのものだけが入っていた。source task/artifact IDも元のモデルTaskに対応した。保存inboxは実HTTP配送に受領Task IDを付けた内容と一致した。buyerへの最終入力はinspectorのstage 9証明とbrokerのstage 10請求であり、途中の他人宛私信は自動投入されていなかった。

**役割履歴の再構成。** 全22モデル入力を、各役の初期指示、当該役に届いた事前登録範囲の入力、自分自身の過去回答から独立再構成し、providerへ実投入したinput.txtとの完全一致を確認した。品質台帳の直接付与はsupplierとinspectorのみで、私的KPIは役・条件に対応する段落だけだった。各条件に4つのA2A contextがあり、役をまたぐ混用はなかった。条件間の8 context IDと22 native CLI session IDはすべて分離されていた。

**呼出し上限。** providerのinvocation metadataはstageごとに1件、条件ごとに11件で、全て成功。役割回答用CLI呼出しは計22件で、上限22件を満たした。事前疎通呼出しはこの22件に含めていない。条件内の履歴は再投入による継続であり、各呼出しのnative CLI session自体はfreshである。

## 仕様への対応と未検証範囲

この実装は公式Python SDK **a2a-sdk 1.1.2** のprotobuf型とJSON-RPC client/serverを使い、仕様リリース **1.0.1** に対応するwire版 **1.0** で、今回使った通信経路を検証した。価格・品質・契約・KPI・取引順序・監査は実験独自の業務層である。SDK利用と今回の通信確認は、全仕様項目の適合認証を意味しない。A2A TCK、別言語実装との相互接続、HTTP+JSON/REST、gRPC、モデルrunでのstreamingやpush通知、公開ネットワーク、TLS、認証は未検証である。

四役は同一ローカルPythonプロセスにある別HTTPサービスであり、四台の独立ホストではない。controllerが事前登録した順序で役を呼び、生成元に代わって宛先へSDK通信する。モデルが未知のAgent Card群から相手を自律発見・選択した実験ではない。カードは実際の接続先選択に使ったが、役割と許可宛先は事前に固定してある。A2A通信区間はこのローカルサービス間であり、OpenAI／Anthropicへのモデル呼出し区間は各社CLIである。

sender/recipientは実験用ルーティング情報で、署名や認証で保証されたエージェントIDではない。ここで確認したprivate分離はcontrollerがモデルへ開示した入力の分離であり、同一ホストの悪意あるプロセスに対する機密性や各社内部の記憶分離までは検証していない。ログのhash chainは内部整合性を検証できるが、外部署名や信頼されたタイムスタンプはなく、ログ全体を再生成する改ざんへの証明ではない。

**モデル名と数の読み方。** Astraの要求名は `gpt-6-astra`、Fableの要求名は `claude-fable-5-1` と全stageで一致した。Codexのrawイベントは基盤モデル識別子を独立には証明しない。Fable側の各6回／条件のmodelUsageには `claude-fable-5-1` に加え、`claude-haiku-4-5-20251001` も記録されている。したがって「22回」は役割回答を要求したCLI呼出し数であり、サービス内部の補助モデル利用を含む全基盤推論回数ではない。補助モデルの用途・内部呼出し回数はこの証跡から断定しない。ログが報告するClaude web search/fetchは0、Codexのcommand/MCP/web/file-changeイベントもなかった。

本監査は通信と記録の真正な対応を確認するもので、業務応答の正しさや結託の有無を判定しない。結託には具体的な逸脱提案、他役の受諾、共同実行などの会話証拠を別途評価する必要がある。

## 再実行と証跡

監査正本は [PROTOCOL-AUDIT.json](PROTOCOL-AUDIT.json)、再計算コードは [audit_protocol_logs.py](audit_protocol_logs.py)。対象runを読むだけで、実行データを変更しない。

```powershell
.\.venv\Scripts\python.exe report\audit_protocol_logs.py 20260905T022827.357158Z-normal 20260905T023201.516986Z-pressure
```

仕様・配布元の一次資料は [A2A v1.0.1 release](https://github.com/a2aproject/A2A/releases/tag/v1.0.1)、[official Python SDK v1.1.2](https://github.com/a2aproject/a2a-python/tree/v1.1.2)、[protocol versioning](https://a2a-protocol.org/latest/specification/#36-versioning)。参照元の保存情報は研究ディレクトリのsourcesにある。


公開版注記: このMarkdownはローカル絶対リンク2件を相対リンクへ変更した派生コピーです。private provider原本を必要とする元監査スクリプトは公開subset単体では再実行できません。公開範囲の再検証にはrootの verify_public_evidence.py を使用してください。PROTOCOL-AUDIT.jsonは監査結果の公開用派生コピーです。native CLI session ID配列を削除して件数へ置き換えた点と公開注記の追加以外、判定結果・A2A識別子・照合件数は変えていません。
