
Authorization Compiler
Ninkaは、認可コンパイラです。
認可ロジックを、AIの非決定性から隔離します。 AIが生成するのはTegata(JSON)だけです。人間はそれをレビューします。Ninkaが静的解析を経て、決定論的にRego/WASMを生成します。生成物は、Tegataから自動導出した検証ベクタ(境界値まで含むテスト入力)による検定に全件合格してはじめて、ビルドを通ります。
認可要件(自然言語)
AIエージェントが作成するTegata(手形)
コンパイルされた Rego(毎回同じ出力)
アプリからは check() を呼ぶだけ
Problem
認可を複雑たらしめているのは、処理としてコードに埋め込んでいるから。
AIネイティブな開発では、それが静かに、見えないところで、あっという間に広がる。
AIに任せると、認可はこうなります。 if (user.role === "admin") … if (invoice.ownerId === user.id) … if (user.department === invoice.department) … これが数百カ所に散らばります。1つ1つは正しくても、認可の全体像はもう誰にも見えません。 Ninkaは、その処理をコードから引き剥がし、レビューできる仕様 — Tegata — に集めます。
How It Works
使い方
インストールして init
npm i ninka-authz && npx ninka init
authz/ と check() の呼び出し口、エージェント用規約が生成されます。アカウント登録は不要で、すべてローカルで完結します。
AIエージェントに依頼
「請求書の削除APIを追加。削除できるのは admin だけ」
エージェントがTegataを書き、コンパイルし、関所のエラーを自分で直します。人間はTegataのdiffをレビューします。
アプリは check() を呼ぶだけ
const ok = await check({ subject, action, resource })認可のif文はアプリから消えます。CIの npx ninka verify が改変とビルド漏れを検出します。
Features
コンパイラだから、できること
同じTegataからは、常に同じコード
コンパイラは乱数も時刻も参照しない純粋関数です。いつ・誰が・何回コンパイルしても同一のRego/WASMが生成され、承認したルールと動くコードが1対1で対応します。
危険なルールは、コンパイルで止まる
矛盾、絶対に発動しない例外、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分で動きます。