Ninka background logo

Authorization Compiler

認可は、仕様として管理する。

Ninkaは、宣言的な認可仕様「Tegata」を、 Rego/WASMへ決定論的にコンパイルします。

認可要件(自然言語)

AIエージェントが作成するTegata(手形)

コンパイルされた Rego(毎回同じ出力)

アプリからは check() を呼ぶだけ

Problem

認可は、実装ではなく仕様です。

AIがコードを書く時代、認可は実装へと分散し、人間が追えない速度で増え続けます。

if (user.role === "admin") { ... }
if (invoice.ownerId === user.id) { ... }
if (user.department === invoice.department) { ... }

認可を実装として定義することは、もはや現実的ではありません。

How It Works

使い方

1

AIが認可仕様を書く

AIが生成するのは、宣言的な認可仕様 Tegata だけです。 人間はその差分をレビューします。

{
  "effect": "allow",
  "subject": { "roles": ["manager"] },
  "actions": ["approve"],
  "resource": { "type": "invoice" }
}
2

Ninka Compilerがコンパイルする

Tegata
   │
   ▼
Ninka Compiler
   ├─ Static Validation
   └─ Deterministic Compilation
   │
   ▼
Rego / WASM
   │
   ▼
Self Verification

Ninka Compilerは、Tegataを静的解析し、決定論的にRego/WASMへコンパイルします。生成されたRego/WASMは、Tegataから自動導出した検証ベクタによって、境界値・型違反・欠損を含めて自己検証されます。

3

アプリは check() を呼ぶだけ

const ok = await check({
  subject,
  action,
  resource,
});

アプリケーションに認可ロジックを書く必要はありません。 実行はin-processのOPA/WASMが担います。

Features

コンパイラだから、できること

決定論 (Kinza)

同じTegataからは、常に同じコード

コンパイラは乱数も時刻も参照しない純粋関数です。いつ・誰が・何回コンパイルしても同一のRego/WASMが生成され、承認したルールと動くコードが1対1で対応します。

関所 (Sekisho)

危険なルールは、コンパイルで止まる

矛盾、絶対に発動しない例外、admin/administratorのような揺れをコンパイルエラーで検出します。修正はエージェントが自走するため、人のレビューに届く前に解消されます。

実行と決定ログ

実行はアプリ内、判定は記録できる

実行はin-processのWASMで、1判定は数十マイクロ秒です。外部への通信はありません。判定ごとのOPA互換ログは、語彙で宣言した属性以外を自動でマスクします。

FAQ

FAQ

Q. AIに認可を書かせて問題ないのですか?

A. AIが作成するのはTegata(JSON)までで、実行コードには直接関与しません。Tegataはコンパイル時に検査され、問題があれば通りません。

Q. OPA や Rego の知識は必要ですか?

A. なくても使えます。Regoは Tegataから自動生成されるため、手書きすることはありません。知識があるに越したことはなく、生成された Rego はいつでも読んで確認できます。

Q. OPA と競合するものですか?

A. 競合しません。OPA は強力ですが、Rego を書くのは難しい — Ninka は Tegata という認可の抽象化レイヤーを与え、OPA へ決定論的にコンパイルします。実行時に動くのは OPA そのものです。

Q. 生成されたコードが正しいと、なぜ言えるのですか?

A. 検定があるからです。コンパイラがTegataから検証ベクタを自動導出し、境界値・型違い・データ欠損まで機械的に網羅します。独立実装の参照評価器と本番 WASM の両方に流して、全件一致した場合にだけビルドが通ります。テストを人が書く必要はありません。

Q. 無料で使える範囲は?

A. ローカルのツールはすべて無料です。ライセンスは BUSL-1.1 で、ソースの閲覧・改変が可能です(制限は競合サービスとしての提供のみ。2030年に Apache-2.0 へ移行します)。

Next Step

まずは手元で試してみてください

npx ninka init から check() まで、1分で動きます。