GAP / gxai.dev

GAP GX AI Protocol — wire version gap/0.1

企業のESGデータを、PDFの開示レポートを経由せず、発生源で署名された生の活動量のまま、 API と MCP で投資家のAI Agentに直結するための通信規約。

GAPは排出量を運ばない。活動量と、それが本物である証拠だけを運ぶ。
  • Status: Draft
  • wire gap/0.1
  • Ed25519 + SHA-256
  • リファレンス実装あり
  • License: 未定

何を変えるのか

データが人間の手を経るたびに、証拠は失われる

従来の開示は、基幹システムから投資家に届くまでに集計・整形・再入力を通る。 最後に残るのは数値だけで、それがどの測定に由来するかを受け手が確かめる手段はない。

従来

基幹システム
担当者 / コンサル
(集計・化粧)
PDF報告書
アナリスト
(再入力)
評価

GAP

基幹システム / センサー
[署名]
GAP Node
[MCP / REST]
投資家 AI Agent
(算定・検証は受け手側)

排出量は「活動量 × 排出係数」であり、係数の選択は制度・基準・年度によって変わる判断である。 その判断を企業側で先に済ませてしまうことが「化粧」の入口になる。GAP は係数の適用を受け手側の明示的な選択として分離し、 企業側には「測ったもの」だけを出させる。

測られている数字

これは「解析がうまくなれば埋まる差」ではない

PDF は、ISO 32000-2:2020 の序文が掲げる目的からして 「デバイス・プラットフォーム・ソフトウェアに依存しない文書の忠実性の保存」のための形式であり、 制作段階は「最終利用者への配布のための最終状態の形式」と位置づけられている [S4]。位置は正確に保つが、その位置が何を意味するかは標準では運ばない。 その先で何が起きているかは、すでに測られている。

測定されたこと結果出典
財務文書 400 件(年次報告書・SEC 提出書類を含む)での表検出の F1 0.06 pdfplumber / 0.10 Camelot / 0.24 Tabula / 0.79 TATR
同じ比較で本文抽出は 0.95〜0.99
Adhikari & Agarwal (2024)
人手注釈した実在の 10-K 81 件で、指標と数値を結びつける関係抽出 最良モデルでも Relation F1 22.68% Deußer et al., ICMLA 2022(KPI-EDGAR)
香港証券取引所上場 166 社の 2022 年版 ESG 報告書からの抽出 GPT-4 + RAG の最良構成で正解率 76.9% Deng et al. (2023), ESGReveal
1 つの指標を転記する所要時間(データベンダー担当者の証言) HTML 約 20分 / PDF 約 30分 / 画像 約 50分。XBRL からは 1〜2秒 XBRL US ESG Working Group
462 頁のサステナビリティ報告書 1 件での表検出候補 ツールの生判定 460頁 → タスク条件で機械的に絞り込むと 62頁 著者らの JASAG v3.1 実験記録
未公刊・目視での全数検証はしていない

注目すべきは失敗の型である。同じ文書群で地の文は 0.95〜0.99 で取れているのに、 表だけが 0.06〜0.24 に落ちる [S17]。抽出側が下手なのではなく、 数字が表であることが形式に書かれていない。だから GAP は「PDF をうまく解析する」方向には行かない。 PDF に落とすの層に署名を置き、そこから直接運ぶ。

出典の詳細と確認範囲は evidence-sources.json にある。 これらは執筆中の書籍『証拠なき非財務情報』(三部作第3部)第7章 「PDF開示で失われる出所・座標・計算過程」の証拠台帳から、実際に引用した分を抜き出したもの。 同書は未公刊

名前が指す 3 つの GAP

閉じようとしている断絶は 3 つある

Disclosure GAP開示値と一次データの乖離

発生源の秘密鍵で署名された活動量だけを流通させ、途中の書き換えを数学的に検知可能にする。

Time GAP年1回の報告と意思決定の時間軸のズレ

追記専用ストリームへの継続的 ingest(Continuous Auditing)。任意の窓を都度算定できる。

Agent GAP非構造化文書と決定論的I/Fの断絶

MCP Tool として決定論的な算定・検証を提供。同じ引数なら常に同じ数値とハッシュ。

Zero-Embellishment Constraint

非化粧制約 — 派生排出量を含む payload は受理しない

GAP が運ぶのは活動量に限る。metric および meta のキーに 派生排出量を示す語(co2 / co2e / ghg / emission / scope1|2|3 / tco2 / carbon_footprint)を含む payload は、 ノードが受理してはならない。

受理 — 測ったものだけ
{
  "spec": "gap/0.1",
  "source_id": "jp-demo-plant-chiba-meter-01",
  "seq": 1,
  "metric": "electricity_kwh",
  "period_start": "2026-07-01T00:00:00Z",
  "period_end": "2026-07-01T01:00:00Z",
  "value": 812.4,
  "unit": "kWh",
  "quality": "measured",
  "prev_hash": null,
  "meta": { "line": "A", "tariff": "peak" }
}

電力量という測定値。これを何倍して何と呼ぶかは受け手が決める。

拒否 — embellishment_rejected
{
  "spec": "gap/0.1",
  "source_id": "jp-demo-plant-chiba-meter-01",
  "seq": 1,
  "metric": "scope2_co2e_t",
  "period_start": "2026-07-01T00:00:00Z",
  "period_end": "2026-07-01T01:00:00Z",
  "value": 0.351,
  "unit": "tCO2e",
  "quality": "measured",
  "prev_hash": null,
  "meta": { "line": "A", "tariff": "peak" }
}

係数の選択がすでに済んでいる。誰の判断でこの数値になったのかが消えている。

同じ理由で、単位変換・丸め・補正を転送経路で行ってはならない。機器が出した値をそのまま運ぶ。 推計値や修正値を使うこと自体は正当だが、quality のラベルなしで混ぜた瞬間に 「化粧していないストリーム」と区別がつかなくなる。

レイヤー構成

意味 / クエリ / 証明 の 3 層

① セマンティック意味の標準化

活動量 1 件の payload が、そのまま署名対象のバイト列になる。時刻は YYYY-MM-DDTHH:MM:SSZ の1形式のみ — 表現ゆれがあると署名バイト列が再現できない。

seq は source ごとに 1 から連番で、欠番は削除・欠測の証跡として残る。

② クエリ & 実行MCP Native

read-only / idempotent な 6 tools。応答点数は既定 1000 点で頭打ちにし、超えたら 黙って切り詰めず too_many_points を返して粒度を粗くさせる。

compute_emissions は係数を一意に特定できないと数値を返さず、 factor_ambiguous として候補一覧を返す。

③ トラスト証明と権限

正規化は RFC 8785 のサブセット、ハッシュは SHA-256、署名は Ed25519。 prev_hash が直前 reading を指す追記専用チェーンで、過去の差し替えはリンク切れとして露見する。

ノードは ingest 時の検証フラグを信用してはならない。算定の直前に取り直す。

MCP Tools

投資家側 Agent に見えるのはこの 6 つ

すべて read-only / idempotent。同一ロジックの REST も /api/v1/gap/* に用意されている。

Tool役割
list_sources一次データ源の発見。呼び出し側の鍵で見える粒度も返す
get_activity_data生の活動量(許可粒度まで)。証跡ハッシュ付き
list_emission_factors適用可能な係数の一覧(出典 URL・公表日つき)
compute_emissions活動量 × 明示指定の係数を決定論的に算定
verify_provenance署名・ハッシュチェーンの再計算(値は返さない
detect_anomalies欠測・seq 欠番・外れ値・フラットライン等の統計的検知

検証可能性

実装は公開テストベクタで自己診断できる

正規化・ハッシュ・チェーン・署名の固定ベクタを配布している。 署名鍵は RFC 8032 §7.1 TEST 1 の公開テスト鍵で、実運用には使えない値を意図的に使っている

canonical JSON(正規化後・これが署名対象のバイト列)

{"metric":"electricity_kwh","period_end":"2026-07-01T01:00:00Z","period_start":"2026-07-01T00:00:00Z","prev_hash":null,"quality":"measured","seq":1,"source_id":"jp-demo-plant-chiba-meter-01","spec":"gap/0.1","unit":"kWh","value":812.4}

payload_hash = SHA-256(canonical_json)

5f42e6df31af80d66e1ee0b906ab172bd9b7cb41c34864d853ee57c3b84a5484

リファレンス実装の自己診断

node scripts/health/gap-selftest.mjs   # 正規化・ハッシュ・署名のテストベクタ検証
node scripts/gap/e2e-local.mjs         # 署名 → ingest → 算定 → 検証 → MCP を一気通し

テストベクタ: test-vectors.json

Granular Access Control

機密は「隠す / 全部見せる」の二択にしない

工場のリアルタイム電力は生産稼働率・原価に直結する機密になり得る。 GAP は時間粒度を落として開示し、落とした後も検証可能性を保つbucket_hash)ことで折り合いをつける。

disclosure_level誰が読めるか粒度
public承認済みの全 API keymin_bucket_seconds まで粗くして開示(例: 時間計測 → 日次開示)
engagementraw_access_grants を持つ鍵のみgrant 側でより細かい粒度を許可可能
restrictedノード内部のみ

engagement の source は grant がない鍵にも 存在だけは見せるaccess.granularity = "none")。隠すとエンゲージメントの入り口が消えるため。

効き方の見取り図

GAP が閉じる歪みと、閉じない歪み

「グリーンウォッシュ」という一語に潰されている現象は、少なくとも 8 つに分かれる [B1]。GAP が届くのは 3 類型で、そのいずれも「登録済みの記録を事後的に こっそり書き換える」という一経路に限られる。2 つは部分的、残る 3 つは通信規約が原理的に持つ 守備範囲の外にある [B2]

類型非財務情報で起きることGAP v0.1 の効き方
情報の紛失 原証憑・計算過程・訂正履歴が PDF 化の途中で失われる 限定的だが届く 発生源で署名し、payload_hashprev_hash の追記専用チェーンで来歴を保つ。 検知できるのは登録済みの記録が後から書き換えられたときのリンク切れだけで、 一度も登録されなかった証拠や、チェーン末尾での記録の途切れは検知できない
数値粉飾 排出量・削減率・再エネ比率などを不適切に算定する 限定的だが届く 非化粧制約と、係数が一意に定まらなければ数値を返さない設計で、少なくともこの一経路は塞がる。 許可されたフィールド(例 electricity_kwh)に虚偽の値を「測定値」として入れることは、 この制約単体では防げない
方法論的粉飾 基準年・排出係数・推計方法を変えて改善して見せる 限定的だが届く 過去の値の事後的な書き換えはリンク切れとして検知しやすい。ただし変更を書き換えではなく 正規の新規レコードとして積むことはチェーンの規約上なんの矛盾も生まず、その変更が 方法論的に妥当かを判定する規定も GAP にはない
境界粉飾 不都合な子会社・地域・Scope 3 カテゴリーを外す 部分的 list_sources が返すのは登録された情報源だけで、登録されていない主体はこの照会にも現れない。 集計範囲の完全性を強制する規定はなく、補うには LEI のような外部の法人識別子体系との突合が別途要る。 Scope 3 の連鎖も v0.1 未対応
選択的開示 良い指標だけを出し、悪化した指標を消す 部分的 engagement の source は grant がなくても存在だけは見える。ただし どの指標をどの周期で公開すべきかという継続性を強制する規定はない
虚偽 実施していない施策を実施したように書く 原理的に届かない 署名鍵の管理者自身が虚偽の活動データに署名した場合、あるいは計器そのものが不正に設定された場合に生じる。 GAP が明示的に設計対象の外に置く領域
時間的粉飾 将来目標を現在の実績のように印象づける 原理的に届かない 開示文書に添える文章の書きぶりの問題。GAP はデータの流通経路を規律する
ナラティブ粉飾 証拠のない価値創造ストーリーで実態を覆う 原理的に届かない 同上。通信規約が誠実さを規律することはできない

署名は「その値が現実を表している」ことを保証しない。保証するのは、登録された鍵で署名された値が その後書き換えられていないことだけである。計器の設置・校正が正しいかは GAP の外にあり、 そこは従来どおり保証・監査の仕事として残る。改ざんされていないことと、正しく測られていることは別の問題である。

ここから、この規約自身にとって最も居心地の悪い可能性が出てくる。値が誤っていたときにそれを訂正する制度が 薄いままであれば、改ざんされていない誤った数字が、改ざんされていないという理由でかえって信頼されてしまう [B3]。改ざん検知の層の上に、値そのものが誤っていたときにどう訂正するかの層が、 なお別に要る。(これは証拠から導かれる懸念であって、測定された結果ではない。)

8 類型は執筆中の書籍『証拠なき非財務情報』の枠組み [B1]。 各類型への対応づけは、同書第8章が仕様書本文のみに基づいて導いた分析にそろえてある [B2]同書は未公刊。

v0.1 の意図的な非対応

やらないと決めていること

以下は v0.2 以降の論点として開いている。「できる」と書かないために列挙する。

  • Zero-Knowledge Proof / 差分プライバシー — 現状の機密対応は時間粒度の粗視化まで。「生データを明かさずに正当性のみ証明する」までは踏み込んでいない
  • 鍵ローテーションの手続きpublic_key_hash を reading に記録しており過去分の再検証はできるが、ローテーション自体のプロトコルは未定義
  • 複数ノード間のクロス検証input_hash により同一入力からの同一結果は照合できるが、ノード間の相互監査プロトコルはない
  • Scope 3 / サプライチェーン連鎖 — 他社ノードの活動量を参照する連鎖構造は未定義。現状は 1 ノード内の source に閉じる
  • ストリーミング購読 — 現状はポーリング。webhook / SSE による push は未定義
  • 制度マッピング(CSRD / SSBJ / GHG Protocol) — GAP は活動量と係数を分離するだけで、どの制度のどの項目に対応するかの写像は持たない。写像は受け手側の責務とする

Status

いまどこにあるか

仕様の状態Draft(wire version gap/0.1
ライセンス未定
リファレンス実装非公開リポジトリ kokubee/gxceed(現時点で外部からは参照できない)
配布物の由来gxceed@19f2540 / tree a77935e

これは解決策ではなく、一つの worked example である [B4]。 隣接領域にある部品を非財務情報の文脈で組み合わせたとき、何が閉じて何が残るかを示すために書かれた。 業界標準としての採用実績も、外部からの検証も、まだない。 財務開示の側には XBRL US による稼働中の公式 MCP サーバーという先例がすでにあり、 その差そのものが、非財務情報の側で何が追いついていないかを示している

ライセンスが未定であるため、この仕様は現時点で他社実装の可否を保証するものではない。 採用を検討する場合は先に確認を。

また、リファレンス実装の GAP_MCP_ENABLED / GAP_INGEST_ENABLED既定 false(fail-closed)であり、配布されている排出係数のうち factor_iddemo- で始まるものは PoC 用の仮値である。本番投入前に公表値への差し替えが要る。

標準としての狙い

固定するのは 4 点だけ

個別企業がばらばらの MCP を実装すると、投資家側 Agent の統合コストが企業数に比例して増える。 GAP が固定しようとしているのは以下だけで、それ以外は各社の自由に任せる。

  1. 署名対象のバイト列(正規化規則)
  2. チェーンの張り方(prev_hash + seq
  3. Tool の名前と入出力の意味(6 tools)
  4. 「排出量ではなく活動量を出す」という制約

この 4 点が揃っていれば、投資家側の 1 つの Agent 実装が、 どの企業の GAP Node に対しても同じコードで接続・検証・横断比較できる。