feat(governance): 新增 AI Provider 路由矩陣
All checks were successful
CD Pipeline / tests (push) Successful in 1m29s
Code Review / ai-code-review (push) Successful in 15s
CD Pipeline / build-and-deploy (push) Successful in 3m51s
CD Pipeline / post-deploy-checks (push) Successful in 1m30s

This commit is contained in:
Your Name
2026-06-05 13:28:38 +08:00
parent 77abbe4cf9
commit 45556f8fd1
17 changed files with 1819 additions and 59 deletions

View File

@@ -1,12 +1,12 @@
{
"schema_version": "ai_agent_automation_backlog_v1",
"generated_at": "2026-06-05T12:34:00+08:00",
"generated_at": "2026-06-05T13:28:00+08:00",
"source_inventory_snapshot_ref": "docs/evaluations/ai_agent_automation_inventory_snapshot_2026-06-04_static_seed.json",
"program_status": {
"overall_completion_percent": 83,
"overall_completion_percent": 87,
"current_priority": "P1",
"current_task_id": "P1-003",
"next_task_id": "P1-004",
"current_task_id": "P1-004",
"next_task_id": "P1-005",
"read_only_mode": true
},
"rollups": {
@@ -17,8 +17,8 @@
"P3": 1
},
"by_status": {
"done": 19,
"planned": 4
"done": 20,
"planned": 3
},
"by_gate_status": {
"read_only_allowed": 20,
@@ -368,27 +368,33 @@
{
"item_id": "AUTO-P1-004",
"priority": "P1",
"status": "planned",
"status": "done",
"workstream_id": "WS3",
"source_asset_id": "ai_router",
"source_signal_kind": "runtime_evidence_gap",
"title": "盤點 AI Router / provider route",
"owner_agent": "openclaw",
"recommended_action": "只讀列出 OpenClaw、Ollama、NemotronGemini 與候選 provider 路徑,不切換任何 provider。",
"recommended_action": "已建立 AI Router / Ollama / OpenClaw / Nemotron / Gemini provider route 只讀矩陣;不切換 provider、不呼叫付費 API、不進 shadow / canary。",
"action_class": "observe",
"gate_status": "production_change_blocked",
"risk_level": "critical",
"evidence_refs": [
"docs/HARD_RULES.md",
"apps/api/src/api/v1/agents.py"
"docs/evaluations/ai_provider_route_matrix_2026-06-05.json",
"GET /api/v1/agents/ai-provider-route-matrix",
"apps/api/src/services/ai_router.py",
"apps/api/src/services/ollama_endpoint_resolver.py",
"apps/api/src/services/ollama_failover_manager.py",
"apps/api/src/services/openclaw.py",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"acceptance_criteria": [
"不修改 provider routing",
"不呼叫付費 API",
"所有候選仍維持 replay/shadow/canary gate",
"OpenClaw 保持目前生產決策核心"
"不修改 provider routing、不改 USE_AI_ROUTER、不改 fallback order",
"不呼叫 Gemini / Claude / NVIDIA 付費 API、不提高呼叫頻率",
"Nemotron / candidate provider 維持 replay / shadow / canary gate",
"OpenClaw 保持目前生產決策核心UI/API 只呈現不可誤讀合約"
],
"next_review": "P1-004",
"next_review": "P1-005",
"approval_boundary": {
"mode": "production_change_blocked",
"display_summary": "生產路由或 provider 變更被阻擋;需 replay、shadow/canary 證據與獨立人工批准。",
@@ -1149,6 +1155,10 @@
"AUTO-P3-001"
],
"items_with_blocked_operations": [
"AUTO-P1-303",
"AUTO-P1-304",
"AUTO-P1-305",
"AUTO-P1-306",
"AUTO-P1-001",
"AUTO-P1-002",
"AUTO-P1-003",
@@ -1166,25 +1176,21 @@
"AUTO-P1-204",
"AUTO-P1-205",
"AUTO-P1-206",
"AUTO-P1-303",
"AUTO-P1-304",
"AUTO-P1-305",
"AUTO-P1-306",
"AUTO-P2-004",
"AUTO-P3-001"
]
},
"progress_summary": {
"overall_percent": 83,
"done_items": 19,
"planned_items": 4,
"overall_percent": 87,
"done_items": 20,
"planned_items": 3,
"total_items": 23,
"formula": "round(done_items / total_items * 100),只有 status=done 計入完成planned/in_progress/blocked/deferred/rejected 不計入。",
"by_priority": [
{
"priority": "P1",
"completion_percent": 90,
"done_items": 19,
"completion_percent": 95,
"done_items": 20,
"total_items": 21
},
{
@@ -1207,15 +1213,15 @@
"completion_percent": 67,
"done_items": 2,
"total_items": 3,
"next_task_id": "P1-001"
"next_task_id": "P3-001"
},
{
"workstream_id": "WS3",
"display_name": "監控自動化",
"completion_percent": 75,
"done_items": 3,
"completion_percent": 100,
"done_items": 4,
"total_items": 4,
"next_task_id": "P1-004"
"next_task_id": "complete"
},
{
"workstream_id": "WS4",
@@ -1239,7 +1245,7 @@
"completion_percent": 0,
"done_items": 0,
"total_items": 1,
"next_task_id": "P2-001"
"next_task_id": "P2-004"
},
{
"workstream_id": "WS7",
@@ -1247,7 +1253,7 @@
"completion_percent": 0,
"done_items": 0,
"total_items": 1,
"next_task_id": "P2-101"
"next_task_id": "P1-007"
},
{
"workstream_id": "WS8",
@@ -1255,7 +1261,7 @@
"completion_percent": 100,
"done_items": 2,
"total_items": 2,
"next_task_id": "P1-004"
"next_task_id": "complete"
}
]
}

View File

@@ -1,11 +1,11 @@
{
"schema_version": "ai_agent_automation_inventory_snapshot_v1",
"generated_at": "2026-06-05T12:34:00+08:00",
"generated_at": "2026-06-05T13:28:00+08:00",
"program_status": {
"overall_completion_percent": 100,
"current_priority": "P1",
"current_task_id": "P1-003",
"next_task_id": "P1-004",
"current_task_id": "P1-004",
"next_task_id": "P1-005",
"read_only_mode": true
},
"status_taxonomy": {
@@ -478,9 +478,9 @@
{
"workstream_id": "WS3",
"display_name": "監控自動化",
"completion_percent": 75,
"status": "in_progress",
"next_task_id": "P1-004"
"completion_percent": 100,
"status": "done",
"next_task_id": "P1-005"
},
{
"workstream_id": "WS4",
@@ -513,9 +513,9 @@
{
"workstream_id": "WS8",
"display_name": "產品 UI",
"completion_percent": 94,
"completion_percent": 96,
"status": "in_progress",
"next_task_id": "P1-004"
"next_task_id": "P1-006"
}
],
"tasks": [
@@ -1447,6 +1447,43 @@
"任何部署、排程、通知或外部呼叫變更"
]
}
},
{
"task_id": "P1-004",
"priority": "P1",
"status": "done",
"completion_percent": 100,
"owner_agent": "openclaw",
"title": "盤點 AI Router / provider route",
"output": "docs/evaluations/ai_provider_route_matrix_2026-06-05.json + GET /api/v1/agents/ai-provider-route-matrix",
"gate_status": "production_change_blocked",
"next_action": "完成 committed AI provider route matrix下一步 P1-005 偵測服務健康缺口與過期端點。",
"approval_boundary": {
"mode": "production_change_blocked",
"display_summary": "生產路由或 provider 變更被阻擋P1-004 只允許只讀盤點、顯示與批准包準備。",
"allowed_actions": [
"盤點 provider route",
"整理 replay 前置證據",
"準備變更批准包",
"顯示治理 UI"
],
"blocked_actions": [
"production_write",
"runtime_execution",
"destructive_operation",
"secret_plaintext_collection",
"provider_switch",
"production_routing_change",
"shadow_or_canary_entry",
"paid_api_call"
],
"requires_operator_approval_for": [
"provider 切換",
"生產路由變更",
"shadow / canary 進入",
"付費 API 呼叫"
]
}
}
],
"evidence": [
@@ -1774,6 +1811,13 @@
"source_ref": "GET /api/v1/agents/observability-contract-matrix",
"status": "done",
"summary": "只讀呈現 Prometheus / Alertmanager / Grafana / SigNoz / ClickHouse / Sentry 合約、降噪 proposal 與分類缺口;不修改 alert rules、不送通知、不讀 Secret。"
},
{
"evidence_id": "ai_provider_route_matrix_api",
"title": "AI Provider 路由只讀 API",
"source_ref": "GET /api/v1/agents/ai-provider-route-matrix",
"status": "done",
"summary": "只讀呈現 AI Router / Ollama / OpenClaw / Nemotron / Gemini provider route、候選 Gate、來源缺口與不可誤讀合約不切 provider、不呼叫付費 API、不讀 Secret。"
}
],
"approval_boundaries": {
@@ -1784,15 +1828,17 @@
"destructive_operation_allowed": false
},
"task_approval_boundary_rollup": {
"total_tasks": 29,
"total_tasks": 30,
"by_mode": {
"ready_for_operator_review": 1,
"read_only_allowed": 27,
"approval_required": 1
"approval_required": 1,
"production_change_blocked": 1
},
"tasks_requiring_explicit_approval": [
"P0-001",
"P0-004"
"P0-004",
"P1-004"
],
"tasks_with_blocked_operations": [
"P0-001",
@@ -1823,7 +1869,8 @@
"P1-203",
"P1-204",
"P1-205",
"P1-206"
"P1-206",
"P1-004"
]
}
}

View File

@@ -0,0 +1,388 @@
{
"schema_version": "ai_provider_route_matrix_v1",
"generated_at": "2026-06-05T13:18:00+08:00",
"program_status": {
"overall_completion_percent": 100,
"current_priority": "P1",
"current_task_id": "P1-004",
"next_task_id": "P1-005",
"read_only_mode": true
},
"source_refs": [
"docs/schemas/ai_provider_route_matrix_v1.schema.json",
"docs/HARD_RULES.md#cost-change-approval",
"docs/HARD_RULES.md#iwooos-security-governance",
"apps/api/src/services/ai_router.py",
"apps/api/src/services/ollama_endpoint_resolver.py",
"apps/api/src/services/ollama_failover_manager.py",
"apps/api/src/services/openclaw.py",
"apps/api/src/services/platform_operator_service.py",
"apps/api/src/services/ai_providers/openclaw_nemo.py",
"apps/api/src/services/ai_providers/nemotron.py",
"apps/api/src/services/ai_providers/permissions.py",
"apps/api/models.json",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"rollups": {
"total_routes": 7,
"by_kind": {
"ai_router_core": 1,
"ollama_failover": 1,
"alert_governance_lane": 1,
"openclaw_nemo": 1,
"nemotron_candidate": 1,
"paid_cloud_fallback": 1,
"legacy_registry": 1
},
"by_status": {
"verified": 4,
"action_required": 2,
"blocked": 1
},
"by_route_gate": {
"route_preserved": 4,
"review_required": 1,
"candidate_blocked": 1,
"source_mismatch": 1
},
"route_ids_requiring_action": [
"legacy_models_json_policy",
"openclaw_nemo_rca_lane"
],
"candidate_gate_ids_requiring_approval": [
"nemotron_replay_gate",
"paid_provider_call_gate",
"provider_switch_gate"
],
"source_gap_ids": [
"ai_router_comment_drift",
"legacy_model_registry_order_gap",
"machine_backlog_next_task_gap"
],
"read_only_denials_total": 12,
"provider_switch_allowed_count": 0,
"paid_api_call_allowed_count": 0,
"shadow_or_canary_allowed_count": 0,
"runtime_route_change_allowed_count": 0
},
"provider_routes": [
{
"route_id": "ai_router_execution_policy",
"display_name": "AI Router 執行決策核心",
"kind": "ai_router_core",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "AIRouter 依 intent、risk、complexity 選 providerCRITICAL / DELETE 仍強制 Claude高複雜度或 HIGH 風險走 OpenClaw Nemo低中複雜度走 Ollama。",
"provider_order": [
"ollama",
"openclaw_nemo",
"gemini",
"claude"
],
"fallback_policy": "一般 intent 使用 full fallback chainDIAGNOSE 有專屬 chain且 Ollama 初選會先交 OllamaFailoverManager 重評。",
"evidence_refs": [
"apps/api/src/services/ai_router.py"
],
"next_action": "只讀顯示路由矩陣;任何 provider override 或 fallback chain 變更都需另開批准包。"
},
{
"route_id": "ollama_global_endpoint_order",
"display_name": "Ollama GCP-A → GCP-B → 111",
"kind": "ollama_failover",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_manifest",
"current_policy": "生產 ConfigMap 與 deployment env 維持 OLLAMA_URL、OLLAMA_SECONDARY_URL、OLLAMA_FALLBACK_URLpolicy order 是 GCP-A → GCP-B → 111再到 Gemini final fallback。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"gemini"
],
"fallback_policy": "OllamaFailoverManager 只在 primary 不健康時檢查後兩層SLOW Ollama 仍優先於直接燒 Gemini quota。",
"evidence_refs": [
"apps/api/src/services/ollama_endpoint_resolver.py",
"apps/api/src/services/ollama_failover_manager.py",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "後續 P1-005 可只讀比對 health 缺口;不得在本任務改 OLLAMA_* 或重啟任何 host / pod。"
},
{
"route_id": "alert_ai_ollama_first_lane",
"display_name": "告警 AI Ollama-first Lane",
"kind": "alert_governance_lane",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "告警與 AI governance lane 必須先走 GCP-A / GCP-B / 111cloud fallback 開啟時才加入 OpenClaw Nemo 與 Gemini。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"openclaw_nemo",
"gemini"
],
"fallback_policy": "ALERT_AI_ENFORCE_OLLAMA_FIRST=trueALERT_AI_ALLOW_CLOUD_FALLBACK=true 只代表既有 final fallback不代表新增付費呼叫批准。",
"evidence_refs": [
"apps/api/src/services/openclaw.py",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "在 AwoooP Runs / timeline 補 route evidence 時只能讀取既有 route status不得提高 Gemini 呼叫頻率。"
},
{
"route_id": "openclaw_nemo_rca_lane",
"display_name": "OpenClaw Nemo RCA Lane",
"kind": "openclaw_nemo",
"status": "action_required",
"risk_level": "high",
"route_gate": "review_required",
"evidence_status": "committed_source",
"current_policy": "OpenClawNemoProvider 維持 AWOOOI API → OpenClaw 188 → NVIDIA NIM 的 RCA 委派路徑OpenClaw 仍是目前生產仲裁核心。",
"provider_order": [
"openclaw_nemo",
"gemini",
"claude"
],
"fallback_policy": "OpenClaw degraded / low confidence response 會被視為 fallbackableP1-004 只盤點,不更換 incumbent。",
"evidence_refs": [
"apps/api/src/services/ai_providers/openclaw_nemo.py",
"apps/api/src/services/ai_router.py",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
],
"next_action": "後續以 replay / shadow / canary 證據比較候選;驗收前不得宣稱 OpenClaw 可被取代。"
},
{
"route_id": "nemotron_tool_calling_candidate",
"display_name": "Nemotron Tool Calling 候選",
"kind": "nemotron_candidate",
"status": "blocked",
"risk_level": "critical",
"route_gate": "candidate_blocked",
"evidence_status": "blocked_replay_recorded",
"current_policy": "NemotronProvider 可作 tool calling / 離線 evaluator但最近 replay / fast-model smoke 仍未過 latency 與品質 gate不得進 production route、shadow 或 canary。",
"provider_order": [
"nemotron"
],
"fallback_policy": "只保留離線 smoke / replay / sanitized request pack任何 NVIDIA/NIM live 呼叫需另有批准與成本邊界。",
"evidence_refs": [
"apps/api/src/services/ai_providers/nemotron.py",
"apps/api/src/services/ai_providers/permissions.py",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"next_action": "P3 才刷新 primary source evidence 與 5 筆 smoke不得把 P1-004 matrix 當作 Nemotron 升級批准。"
},
{
"route_id": "gemini_final_fallback_policy",
"display_name": "Gemini Final Fallback",
"kind": "paid_cloud_fallback",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "Gemini 是 Ollama 三層失敗後的 final cloud fallback既有 route 可顯示,但本任務不新增 paid probe、不直接呼叫 Gemini、不改 quota。",
"provider_order": [
"gemini",
"claude"
],
"fallback_policy": "所有新增付費 provider 呼叫、頻率提高或 quota 調整都需 cost approvalP1-004 只列路徑。",
"evidence_refs": [
"docs/HARD_RULES.md#cost-change-approval",
"apps/api/src/services/openclaw.py",
"apps/api/src/services/ollama_failover_manager.py",
"apps/api/models.json"
],
"next_action": "P2-004 才能提出成本與 fallback 優化;本階段保持現狀。"
},
{
"route_id": "legacy_models_json_policy",
"display_name": "legacy models.json 路由註記",
"kind": "legacy_registry",
"status": "action_required",
"risk_level": "medium",
"route_gate": "source_mismatch",
"evidence_status": "committed_source",
"current_policy": "apps/api/models.json 仍保留 default_provider=ollama、fallback_order=ollama→gemini→claude、tool_calling_fallback_order=nvidia→gemini→claude 與 GCP-A direct endpoint 註記;生產實際 env 則經 110 proxy 與 AI Router / failover manager 決策。",
"provider_order": [
"ollama",
"gemini",
"claude",
"nvidia"
],
"fallback_policy": "此檔可作 legacy registry evidence不可單獨視為生產路由真相需與 k8s env、AI Router source、runtime route status 一起判讀。",
"evidence_refs": [
"apps/api/models.json",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "後續做 source-control / owner response 時整理 legacy registry reconciliation不在 P1-004 直接改路由設定。"
}
],
"candidate_gates": [
{
"gate_id": "provider_switch_gate",
"display_name": "Provider 切換 Gate",
"status": "production_change_blocked",
"approval_required": true,
"summary": "provider switch、production routing change、USE_AI_ROUTER 切換與 fallback order 修改全部需要獨立人工批准。",
"evidence_refs": [
"docs/HARD_RULES.md#iwooos-security-governance",
"docs/HARD_RULES.md#cost-change-approval"
],
"next_action": "若未來要切 provider需先準備 replay、shadow/canary、成本與 rollback 批准包。"
},
{
"gate_id": "nemotron_replay_gate",
"display_name": "Nemotron Replay Gate",
"status": "blocked_by_evidence",
"approval_required": true,
"summary": "Nemotron 目前僅保留為離線 specialist / evaluator不得取代 OpenClaw 或進 shadow/canary。",
"evidence_refs": [
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"next_action": "P3 refresh source evidence 後,僅能先做 5 筆 smoke。"
},
{
"gate_id": "paid_provider_call_gate",
"display_name": "付費 Provider 呼叫 Gate",
"status": "cost_approval_required",
"approval_required": true,
"summary": "Gemini / Claude / NVIDIA external call、quota 或頻率提升都需先做成本影響與人工批准。",
"evidence_refs": [
"docs/HARD_RULES.md#cost-change-approval",
"apps/api/models.json"
],
"next_action": "P1-004 不做 live paid callP2-004 才能整理成本優化提案。"
}
],
"source_gaps": [
{
"gap_id": "ai_router_comment_drift",
"display_name": "AI Router 註解與現況 drift",
"status": "action_required",
"severity": "medium",
"summary": "ai_router.py 同時保留 DIAGNOSE 過往變更註解與目前 override人工閱讀時容易把舊註解誤讀成現行路由。",
"evidence_refs": [
"apps/api/src/services/ai_router.py"
],
"next_action": "後續文件同步時整理 route truth 表,不直接改 provider logic。"
},
{
"gap_id": "legacy_model_registry_order_gap",
"display_name": "models.json 與 runtime env 判讀差異",
"status": "action_required",
"severity": "medium",
"summary": "models.json 是 legacy registry生產 OLLAMA_* 以 k8s env 經 110 proxy 為準。若只看 models.json 會誤判 GCP-A direct endpoint。",
"evidence_refs": [
"apps/api/models.json",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "建立 source truth precedenceruntime env / AI Router source / registry / proposal。"
},
{
"gap_id": "machine_backlog_next_task_gap",
"display_name": "P1-005 / P1-006 機器待辦同步缺口",
"status": "proposal_required",
"severity": "low",
"summary": "工作清單 MD 列出 P1-005 / P1-006但目前 committed backlog JSON 仍未納入這兩項P1-004 完成後需在下一階段對齊。",
"evidence_refs": [
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md",
"docs/evaluations/ai_agent_automation_backlog_2026-06-04.json"
],
"next_action": "P1-005 啟動前先決定是否補 machine backlog item避免 UI next_task 跟 MD 不一致。"
}
],
"latest_observations": [
{
"observation_id": "prod_manifest_ai_router_enabled",
"status": "verified",
"summary": "生產 manifest committed env 顯示 USE_AI_ROUTER=trueOLLAMA_* 三層 route 仍經 110 proxyGemini 僅為三層失敗後備援。",
"evidence_refs": [
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
]
},
{
"observation_id": "operator_route_status_exists",
"status": "verified",
"summary": "platform operator service 已有只讀 ai-route-statusP1-004 不新增 live probe 或 paid probe。",
"evidence_refs": [
"apps/api/src/services/platform_operator_service.py",
"apps/api/src/api/v1/platform/operator_runs.py"
]
},
{
"observation_id": "nemotron_candidate_blocked",
"status": "blocked",
"summary": "MASTER 記錄 Nemotron replay / fast-model smoke 未達取代門檻,只能保留為離線候選。",
"evidence_refs": [
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
]
}
],
"operator_contract": {
"display_mode": "read_only_ai_provider_route_matrix",
"must_not_interpret_as": [
"provider 切換批准",
"production routing change 批准",
"USE_AI_ROUTER 開關變更批准",
"Gemini / Claude / NVIDIA 付費呼叫批准",
"OpenClaw 取代或降級批准",
"Nemotron 進 shadow / canary 批准",
"fallback order 修改批准",
"Ollama endpoint / ConfigMap 修改批准",
"Secret payload 已讀取或可輸出",
"外部 live probe 或 benchmark 批准",
"workflow / deploy / reload 觸發批准",
"runtime execution 授權"
],
"secret_display_policy": "只顯示 env var 名稱與 redacted metadata不得輸出 API key、token、header 或 payload。",
"provider_switch_policy": "P1-004 只能盤點與顯示;切換 provider 需 replay、shadow/canary、成本、rollback 與獨立人工批准。",
"cost_policy": "新增或提高 Gemini / Claude / NVIDIA 呼叫皆需 cost approval本 snapshot 不呼叫任何 paid provider。",
"runtime_policy": "UI/API 可見不等於 runtime route 已授權active runtime gate 維持 0。"
},
"operation_boundaries": {
"read_only_api_allowed": true,
"provider_switch_allowed": false,
"production_routing_change_allowed": false,
"use_ai_router_toggle_allowed": false,
"fallback_order_change_allowed": false,
"ollama_endpoint_change_allowed": false,
"paid_api_call_allowed": false,
"paid_api_frequency_increase_allowed": false,
"external_provider_probe_allowed": false,
"live_benchmark_allowed": false,
"shadow_or_canary_allowed": false,
"openclaw_replacement_allowed": false,
"nemotron_shadow_allowed": false,
"gemini_direct_call_allowed": false,
"secret_read_allowed": false,
"secret_plaintext_allowed": false,
"notification_send_allowed": false,
"workflow_trigger_allowed": false,
"deploy_trigger_allowed": false,
"reload_trigger_allowed": false,
"runtime_execution_allowed": false
},
"approval_boundaries": {
"provider_switch_approved": false,
"production_routing_change_approved": false,
"cost_change_approved": false,
"shadow_or_canary_approved": false,
"external_provider_call_approved": false,
"openclaw_replacement_approved": false,
"nemotron_replay_approved": false,
"secret_access_approved": false,
"runtime_execution_approved": false
}
}