policy コマンド
policyコマンドは、KovaでAPI鍵に適用するポリシーを管理するためのコマンドです。ポリシーを使用することで、AIエージェントの操作を制限し、セキュリティを強化できます。
構文
kova policy <subcommand> [options]サブコマンド一覧
| サブコマンド | 構文 | 説明 |
|---|---|---|
create | kova policy create --file <path> [--allow-outside-cwd] | 新しいポリシーを作成 |
list | kova policy list | ポリシー一覧を表示 |
update | kova policy update [--id <id>] | 既存ポリシーのルールを編集(--id 省略時は対話的に選択) |
remove | kova policy remove --id <id> | ポリシーを削除(参照中の API 鍵がある場合は拒否) |
policy create
JSONファイルからポリシーを作成します。作成されたポリシーは、kova init の AI 接続設定で新規 API 鍵に適用するか、既存 API 鍵には kova key rotate でロールアウトできます。
構文
kova policy create --file <path> [--allow-outside-cwd]オプション
| オプション | 必須/任意 | 説明 | デフォルト値 |
|---|---|---|---|
--file <path> | 必須 | ポリシーJSONファイルのパス | - |
--allow-outside-cwd | 任意 | カレントディレクトリ外のファイルを許可 | false |
ポリシーファイル制約
ポリシーファイルには以下の制約があります:
| 制約項目 | 最大値 |
|---|---|
| ファイルサイズ | 256KB |
| ネスト深度 | 8 |
| 配列長 | 200 |
| 文字列長 | 4096 |
| 禁止キー | __proto__, prototype, constructor |
ポリシーファイル形式
ポリシーは フラットな制約フィールドではなく rules[] 配列 で定義します。ルール type は snake_case です。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | 必須 | ポリシー ID(例: "policy_agent_safety") |
name | string | 必須 | 表示名 |
version | number | 必須 | バージョン(新規作成時は 1) |
created_at | string | 必須 | 作成日時(ISO 8601) |
action | string | 必須 | 通常 "deny" |
rules | array | 必須 | ルール配列(空配列も可) |
allowedChains/allowedTokens/maxAmount/requireApprovalといった camelCase のフラット形式は kova では使えません。チェーン制限はallowed_chains、トークン制限はspending_limitの(chain, token)ペアで表現します。
ポリシー制約の例
基本的なポリシー(チェーン制限 + 有効期限):
{
"id": "policy_basic",
"name": "基本ポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:8453", "eip155:1"] },
{ "type": "expires_at", "timestamp": "2027-01-01T00:00:00Z" }
]
}厳格なポリシー(累積上限 + チェーン制限):
{
"id": "policy_strict",
"name": "厳格なポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:8453"] },
{ "type": "spending_limit", "chain": "eip155:8453", "token": "USDC", "daily_limit": "10" },
{ "type": "expires_at", "timestamp": "2027-01-01T00:00:00Z" }
]
}テストネット専用ポリシー:
{
"id": "policy_testnet",
"name": "テストネットポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:11155111", "eip155:84532"] },
{ "type": "spending_limit", "chain": "eip155:84532", "token": "USDC", "daily_limit": "100" },
{ "type": "spending_limit", "chain": "eip155:84532", "token": "NATIVE", "daily_limit": "0.1" }
]
}使用例
基本的な使用:
kova policy create --file ./policies/basic-policy.json出力例:
{
"ok": true,
"data": {
"policy": {
"id": "policy_basic",
"name": "基本ポリシー",
"executable": false,
"registered": true
}
}
}カレントディレクトリ外のファイルを使用:
kova policy create --file ~/policies/strict-policy.json --allow-outside-cwd重要な注意点
- ファイルパス: デフォルトではカレントディレクトリ内のファイルのみ許可されます。外部ファイルを使用する場合は
--allow-outside-cwdを指定してください。 - CAIP-2形式:
allowed_chainsのchain_idsは CAIP-2 形式(eip155:8453)で指定してください。 - トークン制限: 独立した
allowed_tokensルールはありません。許可トークンはspending_limitの(chain, token)ペアで定義します(1 件でもspending_limitがあると whitelist として fail-closed に動作)。 - 金額の単位:
spending_limitのdaily_limit/monthly_limitは人間可読形式("100"= 100 USDC)で指定してください。
policy list
作成済みのポリシー一覧を表示します。
構文
kova policy listオプション
このサブコマンドにはオプションはありません。
使用例
kova policy list出力例:
{
"ok": true,
"data": {
"policies": [
{
"id": "policy-a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "基本ポリシー",
"createdAt": "2026-03-28T00:00:00Z"
},
{
"id": "policy-b2c3d4e5-f6a7-8901-bcde-f12345678901",
"name": "厳格なポリシー",
"createdAt": "2026-03-27T00:00:00Z"
}
]
}
}ポリシーが存在しない場合:
{
"ok": true,
"data": {
"policies": []
}
}policy update
既存ポリシーの rules を対話的に編集します。owner-only 操作のため TTY と passphrase 入力が必要で、agent(非対話)モードからは実行できません。
対話エディタでは以下の 4 種類のルールを追加・編集・削除できます:
spending_limit— 累積上限allowed_chains— 許可チェーン制限expires_at— ポリシー有効期限sign_allowlist— 署名許可リスト(permit / typed-data / message)
max_valueは executable policy としてkova initで自動生成されるため、対話エディタの対象外です。変更する場合はpolicy remove→policy createで作り直してください。
構文
kova policy update [--id <id>]オプション
| オプション | 必須/任意 | 説明 |
|---|---|---|
--id <id> | 任意 | 編集対象のポリシー ID(省略時は対話的に選択) |
policy update は常に対話モードで起動します(非対話の rule 操作フラグは現状未提供)。
対話フロー
実行すると以下の選択肢が表示されます。
| アクション | 動作 |
|---|---|
add | 新しいルールを追加(ルール種別を選択後、各フィールドを順に入力) |
remove | 任意のルールを削除 |
done | 編集を確定し、変更サマリと Apply changes? 確認に進む |
Apply changes? で Yes を選ぶと変更が適用されます。No または途中での Ctrl+C キャンセルでは何も書き換えません。
動作(atomic update)
- 対象ポリシーを参照中の API 鍵 ID を一覧から収集
- ポリシー削除 → 編集後ポリシーの再作成を順に実行(
policy.versionは+1) - 再作成が失敗した場合、元のポリシーの再 create で復元を試みる(復元失敗時は重大エラーとして
OWS_ERRORを返す) - 成功時、参照中の各 API 鍵に対して新しい policy hash を再記録
- API 鍵 (id, secret, expiry) と
~/.kova/spend.jsonの累積カウンタは触らない
使用例
kova policy update --id policy-a1b2c3d4-e5f6-7890-abcd-ef1234567890成功時の出力例:
{
"ok": true,
"data": {
"updated": {
"id": "policy-a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "基本ポリシー",
"rulesCount": 2
}
}
}キャンセル時の出力例:
{
"ok": true,
"data": {
"updated": false,
"cancelled": true
}
}重要な注意点
- owner-only: 非対話(agent / 非 TTY)環境からは実行できません。passphrase が一致しない場合は
OWS_ERRORを返します(messageに “passphrase” を含む)。 - version は自動 +1: 編集ごとに
policy.versionが単調増加し、参照中 API 鍵の policy hash も再記録されます。tampering 検出を担保するため、再記録に失敗した場合はポリシー更新自体を rollback します。 - 累積カウンタはリセットされない:
~/.kova/spend.jsonには触らないため、spending_limitの日次/月次累積はそのまま保持されます。 - 編集可能ルール: 対話エディタでは
spending_limit/allowed_chains/expires_at/sign_allowlistの 4 種類を編集できます。max_valueを変更する場合はpolicy remove→policy createの作り直しが必要です。
spending_limit ルール
spending_limit は ApiKeySigner(agent)経路でのみ評価される累積上限ルールです。signer.enforce() が事前評価し、上限超過時は fail-closed で POLICY_DENIED となります。
スキーマ
| フィールド | 型 | 必須/任意 | 説明 |
|---|---|---|---|
type | string | 必須 | "spending_limit" 固定 |
chain | string (CAIP-2) | 必須 | 例: "eip155:1"、"eip155:8453" |
token | string | 必須 | トークンシンボル。ネイティブトークンは予約語 "NATIVE"(ETH/MATIC ではなく NATIVE) |
daily_limit | string (human-readable) | 任意 | 日次上限(例: "100" = 100 USDC)。monthly_limit と少なくとも一方必須 |
monthly_limit | string (human-readable) | 任意 | 月次上限(例: "1000" = 1000 USDC)。daily_limit と少なくとも一方必須 |
1 ルール = 1 (chain, token) の組。複数の chain / token を制限するには
spending_limitルールを複数並べます。
例
{
"type": "spending_limit",
"chain": "eip155:8453",
"token": "USDC",
"daily_limit": "100",
"monthly_limit": "1000"
}複数 chain / token を組み合わせる例:
"rules": [
{ "type": "spending_limit", "chain": "eip155:1", "token": "USDC", "daily_limit": "100", "monthly_limit": "1000" },
{ "type": "spending_limit", "chain": "eip155:137", "token": "USDC", "daily_limit": "50", "monthly_limit": "500" },
{ "type": "spending_limit", "chain": "eip155:1", "token": "NATIVE", "daily_limit": "0.05", "monthly_limit": "0.5" }
]whitelist 挙動(fail-closed)
spending_limit ルールが 1 つでも存在するポリシーは whitelist として動作 します。送金対象の (chain, token) に一致するルールが無い場合は、上限未設定として素通しせず POLICY_DENIED で拒否されます。許可したい token ごとに spending_limit ルールを追加してください。
累積記録
- 累積値は
~/.kova/spend.jsonに token 別・chain 別・base-unit BigInt 文字列 で記録されます(USD 換算は使いません)。 - ERC-20 calldata 内の amount を累積記録する処理は現時点で未対応です。
sendの--tokenで指定された amount のみが累積されます。
評価対象の entry point
spending_limit は send / call / sign(tx entry points)でのみ評価されます。sign_message / sign_typed_data / sign_hash / sign_authorization は対象外です(署名系は sign_allowlist ルールが担当)。
注: 以前存在した
kova pay(x402 マイクロペイメント)は v0.x から削除されました。
policy remove
ポリシーを削除します。削除されたポリシーに関連付けられたAPI鍵は、ポリシー制約なしで動作するようになります。
構文
kova policy remove --id <id>オプション
| オプション | 必須/任意 | 説明 |
|---|---|---|
--id <id> | 必須 | ポリシーID |
使用例
kova policy remove --id policy-a1b2c3d4-e5f6-7890-abcd-ef1234567890出力例:
{
"ok": true,
"data": {
"message": "Policy 'policy-a1b2c3d4-e5f6-7890-abcd-ef1234567890' has been removed successfully."
}
}重要な注意点
- 参照中の API 鍵があれば削除拒否: そのポリシーを参照している API 鍵が 1 つでも存在する場合、
policy removeはPOLICY_DENIEDで削除をブロックします。なおkova key rotateは旧鍵のpolicy_idsをそのまま新鍵に引き継ぐため、ローテーションだけでは参照は外れません。CLI から API 鍵を直接 revoke する手段は現状提供されていないため、運用を新ポリシー側に切り替えてから OWS ダッシュボード等で旧鍵を revoke し、その後policy removeを実行してください。新規エージェントを別ポリシーセットで立て直したい場合はkova initを実行できます(既存ポリシーは別途整理が必要)。{ "ok": false, "error": { "code": "POLICY_DENIED", "message": "Policy \"policy-...\" is referenced by API key \"api-...\". Rotate the API key first (\"kova key rotate\"), or create a new agent with \"kova init\"." } } - 復元不可: 削除されたポリシーは復元できません。必要に応じて再作成してください。
- rules を編集したいだけなら
policy update: ポリシーを丸ごと作り直す代わりに、対話的に rule を編集できるkova policy updateも利用できます。
よくあるエラーと対処法
INVALID_PARAMS
エラーメッセージ(ファイルが大きすぎる):
{
"ok": false,
"error": {
"code": "INVALID_PARAMS",
"message": "Policy file exceeds maximum size of 256KB."
}
}対処法:
- ポリシーファイルのサイズを256KB以下に削減する
- 不要な制約を削除する
エラーメッセージ(無効なチェーン):
{
"ok": false,
"error": {
"code": "INVALID_PARAMS",
"message": "Invalid chain ID 'base'. Use CAIP-2 format (e.g., 'eip155:8453')."
}
}対処法:
allowed_chainsのchain_idsを CAIP-2 形式(eip155:8453)に修正する- サポートされているチェーンを確認する
OWS_ERROR
エラーメッセージ:
{
"ok": false,
"error": {
"code": "OWS_ERROR",
"message": "Failed to create policy: Invalid JSON format."
}
}対処法:
- ポリシーファイルのJSON形式を確認する
- オンラインJSONバリデーターで構文をチェックする
- 禁止キー(
__proto__,prototype,constructor)を使用していないか確認する
FILE_NOT_FOUND
エラーメッセージ:
{
"ok": false,
"error": {
"code": "INVALID_PARAMS",
"message": "Policy file not found: ./policies/unknown.json"
}
}対処法:
- ファイルパスを確認する
- カレントディレクトリ外のファイルを使用する場合は
--allow-outside-cwdを指定する - ファイルが存在することを確認する(
ls -la ./policies/)
POLICY_DENIED
エラーメッセージ(参照中の API 鍵を持つポリシーを削除しようとした場合):
{
"ok": false,
"error": {
"code": "POLICY_DENIED",
"message": "Policy \"policy-...\" is referenced by API key \"api-...\". Rotate the API key first (\"kova key rotate\"), or create a new agent with \"kova init\"."
}
}対処法:
- 先に
kova key rotateで参照中の API 鍵をローテーションする - もしくは
kova initで新しいポリシー + API 鍵セットを構築し、旧ポリシーを参照する API 鍵を整理する
OWS_ERROR(passphrase 不一致)
エラーメッセージ(policy update などの owner-only 操作で passphrase が一致しない場合):
{
"ok": false,
"error": {
"code": "OWS_ERROR",
"message": "Master wallet passphrase mismatch"
}
}対処法:
- 正しい passphrase を入力する
- passphrase を忘れた場合は
kova wallet reset-passphraseで seed phrase から復旧する - 詳細は error-codes.md を参照
ルール type 一覧
| ルール type | 説明 | 主なフィールド |
|---|---|---|
allowed_chains | 許可チェーン(CAIP-2) | chain_ids: string[] |
expires_at | ポリシー有効期限 | timestamp: string (ISO 8601) |
spending_limit | chain × token ごとの日次/月次累積上限 | chain, token, daily_limit, monthly_limit |
sign_allowlist | 署名許可リスト | messagePattern, primaryType, domain, spender 等(camelCase) |
max_value | ネイティブトークン 1 回上限(executable) | kova init で自動生成。手動 JSON では executable スクリプトが必要 |
サポートされているチェーン(allowed_chains / spending_limit.chain):
eip155:1- Ethereum Mainneteip155:8453- Baseeip155:137- Polygoneip155:42161- Arbitrumeip155:10- Optimismeip155:11155111- Sepoliaeip155:84532- Base Sepoliaeip155:80002- Polygon Amoyeip155:43114- Avalancheeip155:43113- Fuji
主なトークン(spending_limit.token):
NATIVE- ネイティブトークン(ETH/POL等ではなく予約語NATIVE)USDC,USDT,JPYC等 - ERC-20 シンボル
requireApprovalに相当する機能は kova にはありません。高リスク操作は owner-only(passphrase 必須)と agent モード(policy-gated)の分離で制御します。
実用的なポリシー例
マイクロペイメント用ポリシー
小額送金のみ許可する構成:
{
"id": "policy_micro",
"name": "マイクロペイメントポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:8453"] },
{ "type": "spending_limit", "chain": "eip155:8453", "token": "USDC", "daily_limit": "1" }
]
}開発用ポリシー
開発環境用(テストネットのみ):
{
"id": "policy_dev",
"name": "開発用ポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:11155111", "eip155:84532"] },
{ "type": "spending_limit", "chain": "eip155:84532", "token": "USDC", "daily_limit": "100" },
{ "type": "spending_limit", "chain": "eip155:84532", "token": "NATIVE", "daily_limit": "0.1" }
]
}本番用ポリシー
本番環境用(高セキュリティ):
{
"id": "policy_prod",
"name": "本番用ポリシー",
"version": 1,
"created_at": "2026-07-07T12:00:00.000Z",
"action": "deny",
"rules": [
{ "type": "allowed_chains", "chain_ids": ["eip155:8453"] },
{ "type": "spending_limit", "chain": "eip155:8453", "token": "USDC", "daily_limit": "50", "monthly_limit": "500" },
{ "type": "expires_at", "timestamp": "2027-01-01T00:00:00Z" },
{ "type": "sign_allowlist", "messagePattern": "^Login:" }
]
}関連コマンド
- key - ポリシーを適用したAPI鍵を作成・失効
- wallet - ウォレットを作成・管理
- send - 送金(ポリシー制約が適用される)
- error-codes -
POLICY_DENIED/OWS_ERROR等のエラー詳細
次のステップ
- ポリシー作成後:
kova initの AI 接続設定で新規 API 鍵にポリシーを適用するか、key rotate で既存 API 鍵に反映しましょう - ポリシー編集: policy update で
spending_limitルールを対話的にメンテナンスできます - AIエージェント統合: AIエージェント統合ガイドでポリシーを使った安全なエージェント運用を学びましょう
- セキュリティ: セキュリティガイドでポリシーのベストプラクティスを確認しましょう
- 署名制御:
sign_allowlistルールで permit / typed-data / message の署名範囲を制限できます