Governance · 構造上、読み取り専用
ポリシーはコードだ。
プロンプトではない。
SQAI はモデルをあるがままに扱います——信頼できないクライアントとして。許可リストはツール構築時にコードで固定され、実行前にプロセス内で検査され、モデルのプロトコルには現れません。システムを言いくるめる余地は、どこにもありません。
II絞り込みの全体像
3つの層。各層は削るだけ。
すべての応答は同じ封じ込めを通過します。ハッシュで固定されたコントラクトが存在する機能を定義し、ポリシーがそれを許可範囲に絞り込み、型付きリクエストの一つがその両方に収まらなければなりません。
- 01
コントラクト
固定されたランタイムに4,778の機能があり、そのうち4,574がエージェントに公開されています——すべて読み取り専用。残りの204は完全に除外されており、モデルからは存在しないものとして扱われます。
- 02
ポリシー
3つの許可リスト——allowedSources・ソースごとの allowedFields・allowedFunctions——が createSQAI() 時に固定されます。allowedFunctions のデフォルトは「all-readonly」です。
- 03
1つのリクエスト
型付きプランはコントラクトに対して検証され、続いてポリシーに対してプロセス内で検査されます——実行前に、実行後ではありません。
allowedSourcesordersallowedFieldsregionrevenueunit_priceallowedFunctionsstats.medianfinance.npvQuerySpec v1 · median(revenue) by region · policy ✓
contract_hash sha256:79f1c5a6c7164e7e9e1750e70a5c03292fa87eb52d8148a740c06695924be9a1
削るだけ。
ポリシーはサーフェスを縮小できますが、拡張することはできません。コントラクトが公開していない機能を指定すると、createSQAI() は構築時に unsupported_operation をスローします——エージェントが接続する前にアプリが失敗します。
そして、モデルのツール入力には allowed* フィールドが存在しません。ポリシーはプロトコルに含まれないため、プロンプトであれインジェクションであれ、それを拡張する手段はありません。
IIIコードとしてのポリシー
一度書く。毎回検査する。
多くのガバナンスツールはデータパスの外側に置かれ、観察するだけです。SQAI のポリシーはパスの内側にあります——コンストラクタ内の3つの許可リストが、すべての実行前にプロセス内で強制されます。
const sqai = createSQAI({
sources: { orders },
// policy — fixed here, invisible to the model
allowedSources: ['orders'],
allowedFields: {
orders: ['region', 'revenue', 'unit_price'],
},
// functions default: 'all-readonly'
allowedFunctions: [
'stats.median', 'finance.npv',
],
});- allowedSources
- プランが指定できる登録済みソース。それ以外は policy_denied_source を返します。
- allowedFields
- ソースごとの列。それ以外の列に触れるプランは policy_denied_field を返します。
- allowedFunctions
- プランが呼び出せる読み取り専用関数——デフォルトは「all-readonly」。範囲外は policy_denied_function を返します。
- tool input
- allowed* フィールドを持ちません。モデルはポリシーを参照できないため、より広いポリシーを送ることもできません。
拒否の台帳
拒否は例外ではなくデータです。各拒否はエージェントが読める安定したコードを持ち、いずれも再試行不可のため、ループがポリシーを消耗させることはできません。
構築時
unsupported_operationポリシーがコントラクトの公開していない機能を指定しています。構築時にスローされ、エージェントが接続する前にアプリが失敗します。
リクエスト時
policy_denied_sourceプランが allowedSources の範囲外のソースを指定しています。
policy_denied_fieldプランがそのソースの allowedFields の範囲外の列に触れています。
policy_denied_functionプランが allowedFunctions の範囲外の関数を呼び出しています。
source: "sqai" — ポリシー拒否はすべて、構造化された再試行不可の結果として返される。ツールが例外をスローすることはない。
IV保管
結果は保持され、蓄積されない。
完全な結果セットがモデルのコンテキストに直接渡されることはない。結果はガバナンス管理下のストアに格納され、IDで参照される。モデルが受け取るのは、宣言されたサンプルのみだ。
結果ストア
管理ストア · TTL 15分
- result_id
- 16バイトのランダム値、base64url形式。推測不可能で、連番にはならない。
- authorization
- テナント単位で紐付け。テナントが異なる場合はresult_not_foundが返され、ストアは存在の有無を一切開示しない。
- ttl
- 15分。期限を過ぎたエントリは削除される。
- capacity
- 最大256件、合計64 MB、テナントあたり16 MB。
ストアが結果を保持し、モデルはサンプルを読み取ってその旨を明示する。
モデルコンテキストの上限
defaultLimit100プランに上限が設定されていない場合に適用される行数制限maxExecutionRows1,0001回の実行が返す行数の絶対上限maxRowsToModel25モデルコンテキストが受け取る最大行数maxCellsToModel250モデルコンテキストが受け取る最大セル数maxBytesToModel32,000モデルが受け取る結果データの最大バイト数切り捨ては必ず結果内で宣言される。行は完全な形でのみ返され、部分的な行が表示されることはない。
監査の観点
17%エージェントのツール呼び出し全履歴を事後に再構成できる組織の割合
GDPR第30条およびSOC 2 CC7.2は、まさにそのような記録を求めている。
SQAIのすべての回答は、それ自体に再構成に必要な情報を含んでいる:
plan_hash · invocation_hash · computation_hash · contract_hash
リプレイは調査ではなく、参照だ。 リプレイの仕組み →
VIよくある質問
ガバナンスへの直接回答
モデルは自身のアクセス権を拡張できるか?
できない。ポリシーはcreateSQAI()の時点で固定され、実行前にプロセス内でチェックされる。モデルのツール入力にallowed*フィールドは存在しないため、プロトコル上、拡張する手段がない。ポリシー外のリクエストは、構造化されたpolicy_deniedの結果として返される。
読み取り専用はバイパスされうるフラグか?
フラグではない。公開されたコントラクトは4,574件の読み取り専用ケイパビリティを持ち、書き込みパスは無効化されているのではなく、設計上存在しない。プロンプトインジェクションはモデルのリクエスト内容を変えることはできても、固定されたコントラクトにケイパビリティを追加することはできない。
GDPR第30条またはSOC 2 CC7.2のレビューに対応する記録は何か?
すべての結果にplan_hash、invocation_hash、computation_hash、contract_hashが含まれる。正確な計算処理は事後いつでもリプレイでき、それらのハッシュと照合して検証できる。
クエリ後、結果データはどこに保存されるか?
テナント認証済みの結果ストアに格納される。IDは16バイトのランダム値で、エントリは15分後に失効し、ストアは合計64 MB・テナントあたり16 MBに制限される。モデルコンテキストが受け取るのは最大25行・250セル・32,000バイトであり、切り捨ては常に宣言される。