手形スキーマ
手形 (Tegata) スキーマ、バージョン 0.1 の完全なリファレンスです。手形は <policy-id>.tegata.json
という名前の JSON ドキュメントで、1 つの認可ポリシーを宣言します。本ページでは、すべてのフィールド・
演算子・固定された評価セマンティクスを記載します。
導入は クイックスタート と ポリシーを追加する を参照してください。
正規フィールドとメタデータ
すべてのフィールドは 正規 (canonical) か メタデータ のいずれかです。
- 正規 フィールドはポリシーの意味を定義します。Rego にコンパイルされ、
tegata_hash(あなたが 承認するフィンガープリント)に含まれます。 - メタデータ フィールド(description、relationship の
label、auditオブジェクト全体)は人間と 監査証跡のためのものです。ハッシュから除外され、コンパイルされません。
実務上の帰結: ルールの並べ替えや description の書き換えは tegata_hash を変えませんが、role・
action・condition・effect の変更は変えます。
トップレベル構造
additionalProperties: false。必須: tegata、policy、rules。
| フィールド | 型 | 正規 | 備考 |
|---|---|---|---|
tegata | string | はい | スキーマバージョン。const "0.1"。 |
policy | object | はい | id 必須。下記参照。 |
attributes | object map | はい | 属性の型宣言。下記参照。 |
audit | object | いいえ | 人間・監査用メタデータ。コンパイルされない。下記参照。 |
rules | array | はい | minItems: 1。ルールオブジェクト 参照。 |
policy
| フィールド | 型 | 正規 | 備考 |
|---|---|---|---|
policy.id | string | はい | kebab-case ^[a-z][a-z0-9]*(-[a-z0-9]+)*$、maxLength: 64。 |
policy.description | string | いいえ | 自由記述。 |
attributes
object map(正規)です。キーは ^(subject|resource|environment|custom).<name...> に一致し、値は
"string" | "integer" | "boolean" です。ここで属性を宣言する必要があるのは、その型がルールの
リテラルから導出できない場合だけです(例: relationship でのみ使う属性)。
audit
メタデータ(コンパイルされない)です。フィールド:
| フィールド | 型 | 備考 |
|---|---|---|
source_text | string | 元の自然言語の要件。 |
normalized_text | string | 正規化した言い換え。 |
ambiguities | array | 解釈メモ。各要素: code、message、任意の related_rules[]。 |
ambiguities[].code は次のいずれかです: assumed_interpretation、missing_input、contradiction、
unexpressible_delegated、exception_scope。
ルールオブジェクト
additionalProperties: false。必須: id、effect、subject、actions、resource。
| フィールド | 型 | 必須 | 備考 |
|---|---|---|---|
id | string | はい | kebab-case、maxLength: 64、ファイル内で一意。 |
effect | string | はい | "allow" または "deny"。 |
description | string | いいえ | メタデータ。 |
subject | object | はい | 任意の roles。下記参照。 |
actions | array | はい | 下記参照。 |
resource | object | はい | type 必須。下記参照。 |
relationships | array | いいえ | エンティティ間比較。Relationships 参照。 |
conditions | array | いいえ | 属性制約。Conditions 参照。 |
subject
subject.roles は任意の、空でない、一意な snake_case 識別子の配列です。role は any-of(列挙した
いずれかの role を持てば一致)で照合されます。任意の subject に一致させるには roles を省略します。
actions
必須です。空でない一意な snake_case 識別子の配列(any-of で照合)か、正確なワイルドカード
["*"] のいずれかです。
resource
type は必須で、snake_case 識別子またはワイルドカード "*" です。
Relationships
relationships は任意の配列です。エンティティ間比較(subject 対 resource)が許されるのは ここだけ
です。
| フィールド | 正規 | 備考 |
|---|---|---|
label | いいえ | 人間可読な名前。 |
subject_attribute | はい | 識別子。 |
op | はい | eq、neq、gt、gte、lt、lte のいずれか。 |
resource_attribute | はい | 識別子。 |
例 — 「請求書の提出者がリクエストしたユーザーである」:
{ "label": "own_submission", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "submitted_by" }
Conditions
conditions は任意の配列です。各 condition は op による判別共用体です。key は スコープ付きキー
(subject.*、resource.*、environment.*、custom.*)です。
| ファミリ | op の値 | 値フィールド | 備考 |
|---|---|---|---|
| スカラー | eq, neq | value(リテラル) | 等価 / 非等価。 |
| 順序 | gt, gte, lt, lte | value(整数または文字列) | boolean は不可。 |
| 集合 | in, not_in | values(空でない一意なリテラル配列) | 集合への所属。 |
| 配列メンバーシップ | contains, not_contains | value(リテラル) | 配列属性への所属。 |
| 存在 | exists, not_exists | — | 値なし。 |
例:
{ "key": "resource.amount", "op": "lte", "value": 500000 }
識別子とリテラル
- 識別子(role・action・resource type・属性名)は snake_case です。
- リテラル は
string・integer・booleanです。 - 整数のみ — v0.1 に浮動小数点数はありません。 金額やしきい値は整数です(例: JPY を整数として)。
評価セマンティクス
これらは固定で、設定変更できません。
| ルール | 挙動 |
|---|---|
| ルール内 | すべての condition(と relationship)は AND されます。 |
| 同一 effect のルール間 | OR されます — その effect の一致するルールがあれば一致。 |
| allow 対 deny | deny が allow を上書き(Deny-First)。 |
| 一致する allow がない | deny — Zero-Trust、デフォルト false。 |
roles / actions | any-of で照合。 |
| ワイルドカード | "*" はすべてに一致。 |
完全な例
正規の authz/invoice-access.tegata.json:
{
"tegata": "0.1",
"policy": {
"id": "invoice-access",
"description": "請求書の閲覧・削除・承認"
},
"attributes": {
"subject.user_id": "string",
"resource.submitted_by": "string"
},
"audit": {
"source_text": "従業員は自分が提出した請求書を閲覧できる。マネージャー・経理・管理者は全ての請求書を閲覧できる。マネージャーは50万円以内の請求書を承認できる。経理は金額によらず承認できる。管理者は請求書を削除できる。",
"ambiguities": [
{
"code": "assumed_interpretation",
"message": "「自分が提出した」を relationship(subject.user_id = resource.submitted_by)で表現した。代理提出・共同提出の概念はないものと仮定。",
"related_rules": ["allow-employee-view-own-invoice"]
},
{
"code": "assumed_interpretation",
"message": "「50万円以内」を resource.amount lte 500000(整数・JPY)と解釈した。境界値50万円ちょうどは承認可に含む。含まない意図なら lt に変更が必要。",
"related_rules": ["allow-manager-approve-invoice-within-limit"]
},
{
"code": "missing_input",
"message": "resource.amount / resource.submitted_by は請求書レコード(DB)から、subject.user_id はセッションから供給される前提。通貨はJPY単一通貨を仮定。",
"related_rules": ["allow-employee-view-own-invoice", "allow-manager-approve-invoice-within-limit"]
}
]
},
"rules": [
{
"id": "allow-employee-view-own-invoice",
"effect": "allow",
"description": "従業員は自分が提出した請求書を閲覧できる",
"subject": { "roles": ["employee"] },
"actions": ["view"],
"resource": { "type": "invoice" },
"relationships": [
{ "label": "own_submission", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "submitted_by" }
]
},
{
"id": "allow-staff-view-invoice",
"effect": "allow",
"description": "マネージャー・経理・管理者は全ての請求書を閲覧できる",
"subject": { "roles": ["manager", "finance", "admin"] },
"actions": ["view"],
"resource": { "type": "invoice" }
},
{
"id": "allow-manager-approve-invoice-within-limit",
"effect": "allow",
"description": "マネージャーは50万円以内の請求書を承認できる",
"subject": { "roles": ["manager"] },
"actions": ["approve"],
"resource": { "type": "invoice" },
"conditions": [ { "key": "resource.amount", "op": "lte", "value": 500000 } ]
},
{
"id": "allow-finance-approve-invoice",
"effect": "allow",
"description": "経理は金額によらず請求書を承認できる",
"subject": { "roles": ["finance"] },
"actions": ["approve"],
"resource": { "type": "invoice" }
},
{
"id": "allow-admin-delete-invoice",
"effect": "allow",
"description": "管理者は請求書を削除できる",
"subject": { "roles": ["admin"] },
"actions": ["delete"],
"resource": { "type": "invoice" }
}
]
}