Policy as Code
UIで作成して、そのままAPIへ適用
Policy as Code。ゼロトラスト。監査証跡。データシンク。
LLMが「言い訳できない」唯一のAPIエンドポイント。
強制実行からデータベースまで、4つのレイヤーですべてのデータ入力を制御。
すべての書き込みは、データベースに到達する前にガバナンスレイヤーを通過します。
対象オブジェクト、条件、承認者をUIで選ぶだけ。/v1/executeに適用できるポリシーをその場で生成します。
amount > 1000
currency is required
書き込み拒否 + 理由コード amount_exceeds_limit
{
"policy_key": "invoice_update_guard",
"object_type": "invoice",
"action": "update",
"rules": [
{
"rule_key": "invoice_amount_limit",
"status": "active",
"priority": 10,
"rule_definition": {
"type": "max_value",
"field": "amount",
"max": 1000
},
"reason_code": "amount_exceeds_limit",
"reason_message": "Amount exceeds policy limit."
},
{
"rule_key": "invoice_required_currency",
"status": "active",
"priority": 20,
"rule_definition": {
"type": "required_fields",
"fields": ["currency"]
},
"reason_code": "missing_required_fields",
"reason_message": "Required fields are missing."
}
]
}
実際のポリシーはJSONで保存され(GovernanceRule.rule_definition / GovernancePolicyVersion.rule_snapshot)、/v1/execute で同じ判定ロジックが使われます。
ソフトガードレールは文脈を理解し、ハードガードレールはデータベースレベルで不正な書き込みを拒否します。
import json
import requests
JWT = "YOUR_ACCESS_TOKEN"
H = {"Authorization": f"Bearer {JWT}", "Content-Type": "application/json"}
P = {"workspace_id":"12345678","object_type":"invoice","operation":"update","target_id":"0001","payload":{"vendor":"Apple","currency":"USD","line_items":[{"item_name":"MacBook Pro 14-inch","quantity":1,"unit_price":2000}],"notes":"macbook-purchase-request"},"dry_run":True}
run = requests.post("https://api.sanka.com/v1/execute", json=P, headers=H, timeout=15).json()
result = {"decision": run["data"]["decision"], "reasons": run["data"]["reasons"]}
print("decision:", result["decision"])
print("reasons:", result["reasons"])
with open("invoice_approve_dryrun.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print("saved:", "invoice_approve_dryrun.json")
// invoice_approval.mjs
import { writeFileSync } from "node:fs";
const JWT = process.env.SANKA_JWT;
const H = { Authorization: `Bearer ${JWT}`, "Content-Type": "application/json" };
const P = { workspace_id: "12345678", object_type: "invoice", operation: "update", target_id: "0001", payload: { vendor: "Apple", currency: "USD", line_items: [{ item_name: "MacBook Pro 14-inch", quantity: 1, unit_price: 2000 }], notes: "macbook-purchase-request" }, dry_run: true };
const runRes = await fetch("https://api.sanka.com/v1/execute", { method: "POST", headers: H, body: JSON.stringify(P) });
const run = await runRes.json();
const result = { decision: run.data.decision, reasons: run.data.reasons ?? [] };
writeFileSync("invoice_approve_dryrun.json", JSON.stringify(result, null, 2));
console.log("saved:", "invoice_approve_dryrun.json");
# governance_demo.sh
JWT="YOUR_ACCESS_TOKEN"
curl -sS -X POST "https://api.sanka.com/v1/execute" \
-H "Authorization: Bearer ${JWT}" \
-H "Content-Type: application/json" \
-d '{"workspace_id":"12345678","object_type":"invoice","operation":"update","target_id":"0001","payload":{"vendor":"Apple","currency":"USD","line_items":[{"item_name":"MacBook Pro 14-inch","quantity":1,"unit_price":2000}],"notes":"macbook-purchase-request"},"dry_run":true}' \
| jq '{decision:.data.decision,reasons:(.data.reasons // [])}' > invoice_approve_dryrun.json
cat invoice_approve_dryrun.json
reasons
UIにはこの結果がそのまま返るので、ユーザーは修正ポイントを即時に理解できます。
1年後には「なぜこの計算を行ったか」を思い出せないことがあります。 Sankaでは、任意の時点のロジック・権限・文脈を再現できます。
コンテキストを完全保持したAppLog
WORM - Write Once, Read Many
社内チーム、外部パートナー、監査担当者向けの専用ユーザー管理。 あらゆる場所からデータを取り込み、サーバーレスでジョブを実行します。
ロールベースアクセス制御
データを取り込み、ジョブを実行
プロジェクトごとに認証、監査、アクセス制御を作り直す必要はありません。 Sankaは導入後すぐにエンタープライズグレードの基盤を使えるようにします。