手形 (Tegata)
手形 (Tegata) は宣言的なポリシーです。一つの 認可ポリシーの正本となる、小さな JSON ドキュメントです。「誰が・何を・どのリソースに・どんな条件で行えるか」を、散らばった if 文としてではなく、一箇所に宣言的に答えます。
手形を直接強制することはありません。手形をコンパイルして(認可コンパイラ を参照)、実際に動くコードにします。手形は読んで承認するもの、コンパイル出力は実行されるものです。
実際の手形
{
"tegata": "0.1",
"policy": {
"id": "invoice-access",
"description": "請求書の閲覧・削除・承認"
},
"rules": [
{
"id": "allow-employee-view-own-invoice",
"effect": "allow",
"subject": { "roles": ["employee"] },
"actions": ["view"],
"resource": { "type": "invoice" },
"relationships": [
{ "label": "own_submission", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "submitted_by" }
]
},
{
"id": "allow-manager-approve-invoice-within-limit",
"effect": "allow",
"subject": { "roles": ["manager"] },
"actions": ["approve"],
"resource": { "type": "invoice" },
"conditions": [ { "key": "resource.amount", "op": "lte", "value": 500000 } ]
}
]
}
各ルールは一つの文のように読めます。従業員 (employee) は自分が提出した 請求書 (invoice) を 閲覧 (view) できる。マネージャー (manager) は 50 万円以内の請求書を 承認 (approve) できる。評価のセマンティクスは固定で設定不可です。ルール内の条件は AND、同じ効果のルールは OR、deny は allow に優先し、マッチする allow がなければ答えは deny です。あなたは意図を記述するだけで、その解決を組み立てることはありません。詳しいセマンティクスと全フィールドは 手形スキーマ を参照してください。
エージェントが書き、人間が承認する
手形は小さく宣言的なので、AI エージェントは要件から直接それを書け、人間は差分としてレビューできます。
- AI エージェント(またはあなた)が要件から手形を書く。
- 関所 (Sekisho) がコンパイル時に検査し、危険なものを却下する。
- 人間 がフィンガープリント(
tegata_hash)を承認する。
意味が同じなら、ハッシュも同じ
tegata_hash はポリシーの 意味 に対して計算され、バイト配置には依存しません。人間向けのメタデータ(説明、リレーションの label、audit ブロック全体)は除外されます。ですから、AI エージェントが同じポリシーをルールや配列の順序を変えて、あるいは説明を言い換えて再出力しても、ハッシュは変わりません。意味が同じなら、ハッシュも同じ です。ハッシュの変化は、常に「許可されるもの」の実際の変化を示します。(ハッシュの承認がなぜ動くコードの承認になるのかは 認可コンパイラ を参照。)
audit.ambiguities:エージェントが解釈の根拠を示す場所
自然言語の要件は曖昧です。AI エージェントが「マネージャーは 50 万円以内の請求書を承認できる」をルールに変換するとき、50 万円ちょうどは含むのか、といった解釈上の選択をします。audit.ambiguities は、その選択を宣言する場所です。
"audit": {
"ambiguities": [
{
"code": "assumed_interpretation",
"message": "「50万円以内」を resource.amount lte 500000(整数・JPY)と解釈した。境界値50万円ちょうどは承認可に含む。含まない意図なら lt に変更が必要。",
"related_rules": ["allow-manager-approve-invoice-within-limit"]
}
]
}
これらのメモは人間のレビュアーのためのものです。audit ブロック全体は非正統(non-canonical)なので、tegata_hash から除外され、ポリシーにコンパイルされることもありません。レビューを変えることはあっても、判定を変えることは決してありません。承認の前にあなたが最も確認すべき前提を、エージェントが表に出す場所です。