CGF を 5 分で

Compliance Graph Format は、コードベースを署名済みの検証可能なコンプライアンス・グラフに変えます。動詞は四つ、バンドルは一つ、スプレッドシートはなし。

パイプライン

   ┌──────────┐      ┌───────────┐      ┌───────────┐      ┌───────────┐
   │ Ingest   │ ───► │  Check    │ ───► │  Bundle   │ ───► │  Verify   │
   │ (graph)  │      │ (claims)  │      │ (sign)    │      │ (policy)  │
   └──────────┘      └───────────┘      └───────────┘      └───────────┘
        │                  │                  │                  │
        ▼                  ▼                  ▼                  ▼
   graph.json         check.{md,txt}    dossier.cgfevidence    pass / fail
                      SARIF レポート     (Ed25519 + TSA)        + 違反一覧

四つの動詞

cgf ingest                                # → .cgf/graph.json
cgf check                                 # → .cgf/check.{txt,md}
cgf bundle --out dossier.cgfevidence      # 署名済みバンドル
cgf verify dossier.cgfevidence            # 暗号 + ポリシー
  • ingest はリポジトリを走査し、決定論的なグラフを出力します。コードファイル、シンボル、モデル、プロンプト、データセット、エンドポイント、ポリシー、コントロール、リスク、エビデンス、承認、デプロイ、関係者、開示が対象です。
  • check はクレーム・パック(EU AI Act、GDPR Art. 30、SOC 2 CC、CGF-JP)をグラフに対して実行し、構造化された違反を書き出します。
  • bundle はグラフ + クレーム + ナラティブを、一つ以上の Ed25519 署名と任意の RFC 3161 タイムスタンプを伴う単一の .cgfevidence ファイルに封印します。
  • verify は任意のバンドルをどこでも、オンラインでもオフラインでも読み、署名・タイムスタンプ・信頼ポリシーがすべて成立するかを報告します。

語彙

概念何か場所
グラフ型付きノード + 型付きエッジ.cgf/graph.json
クレーム・パックある体系のためのルール集合src/lib/cgf/claim-packs/
ナラティブ人間可読のドシエcgf narrative
バンドル署名済み .cgfevidencecgf bundle / inspectBundle()
トラスト・ストア信頼鍵と TSA.dpw/compliance/trust-store.json
信頼ポリシー最少署名者、要信頼、…TrustPolicy
ポリシー・プリセット保存された TrustPolicy.dpw/compliance/policy-presets.json

なぜグラフか?

コンプライアンスの問いはグラフの問いだからです:

  • 「どのエンドポイントが個人データに触れるか?」Endpoint → reads → Dataset を辿る。
  • 「どのモデルにリスク評価が欠けているか?」 — 入力辺 Risk → applies_to のない Model ノードを探す。
  • 「どのデプロイを誰が承認したか?」Approval → gates → Deploy → shipped → Endpoint

グラフがひとたび署名されれば、答えは意見ではなくエビデンスになります。ナラティブはグラフからレンダリングされるのであって、その逆ではありません — だから根拠の事実と食い違うことができません。

TypeScript API

import {
  ingest, runClaims, renderNarrative,
  BundleBuilder, verifyWithPolicy, TrustStore,
} from '@/lib/cgf';

const graph     = await ingest(root);
const claims    = await runClaims(graph);
const narrative = renderNarrative({ graph, claims }, { format: 'md' });

const bytes = await new BundleBuilder()
  .withGraph(graph)
  .withClaims(claims)
  .withNarrative(narrative)
  .signEd25519(privateKey)
  .timestamp('https://freetsa.org/tsr')
  .build();

const result = await verifyWithPolicy(bytes, trustStore, {
  minSigners: 2,
  requireAllTrusted: true,
  requireTimestamp: true,
});

次に読むもの