AI エージェントとの協働
Ninka は特定のモデルやベンダーを前提としません。お使いの AI コーディングアシスタントをそのまま使えます。エージェントが 手形 (Tegata) を書き、コンパイラが検査し、あなたが差分を承認します。
1. エージェントのルールを生成する
npx ninka init
init は、エージェントが認可に触れるときに従う AGENTS.md を書き出します(Ninka のセクションがない AGENTS.md が既にあれば追記されます)。
- 認可はインラインの
ifコードではなく手形として表現する。 - 手形を変更したら
npx ninka compileを実行する。 - アプリは
lib/authz.tsのcheck()だけを呼ぶ。 - 解釈の仮定を
audit.ambiguitiesに報告する。 - 新しい語を使う前に
authz/vocabulary.jsonに語彙を宣言する。 - ログ出力する属性を
audit: trueで印付ける。
2. エージェントが仮定を記録する
要件が曖昧なとき、エージェントはその判断を、コンパイルされない audit ブロックに書き残します。レビューで浮かび上がります。
"audit": {
"source_text": "Members can edit their own documents.",
"ambiguities": [
{
"code": "assumed_interpretation",
"message": "\"their own\" is relationship(subject.user_id = resource.owner_id). Co-owned documents assumed not to exist.",
"related_rules": ["allow-member-access-own-document"]
}
]
}
3. 関所がエージェントを正す
npx ninka compile は 関所 (Sekisho) を実行し、意味的に危険なポリシーを、修正方法が分かる 1 行のエラーで却下します。エージェントは自分の手形を自分で直して再コンパイルします。多くの場合あなたの介入は要りません。
error: rule "allow-member-access-own-document" is unreachable — deny rule
"deny-locked-document" subsumes it. Narrow the deny or remove the allow.
4. あなたが差分を承認する
レビューするのは手形の差分と曖昧さメモだけです。承認はフィンガープリント(tegata_hash)に紐づきます。同じ手形を同じバージョンの ninka-authz でコンパイルすれば常にバイト単位で同一の出力になるため、フィンガープリントの承認は実行されるコードの承認そのものです。