feat(governance): 新增 Redis dry-run gate
This commit is contained in:
@@ -2,13 +2,13 @@
|
||||
"schema_version": "ai_agent_interaction_learning_proof_v1",
|
||||
"generated_at": "2026-06-11T23:20:00+08:00",
|
||||
"program_status": {
|
||||
"overall_completion_percent": 55,
|
||||
"overall_completion_percent": 60,
|
||||
"current_priority": "P2",
|
||||
"current_task_id": "P2-403B",
|
||||
"next_task_id": "P2-403C",
|
||||
"current_task_id": "P2-403C",
|
||||
"next_task_id": "P2-403D",
|
||||
"read_only_mode": true,
|
||||
"runtime_authority": "proof_surface_only_no_live_worker",
|
||||
"status_note": "P2-403B 已把 AgentSession / Redis Streams live read model gate、唯讀查詢、回滾與無寫入 smoke 接入證據鏈;live AgentSession/Redis/Telegram/learning writeback 尚未開 gate。"
|
||||
"status_note": "P2-403C 已把 Redis Streams consumer group dry-run、handoff envelope、ack / dead-letter / replay gate 接入證據鏈;live Redis consumer、runtime worker、Telegram receipt 與 learning writeback 仍未開 gate。"
|
||||
},
|
||||
"live_truth": {
|
||||
"runtime_loop_enabled": false,
|
||||
@@ -40,7 +40,7 @@
|
||||
"completion_percent": 100,
|
||||
"operator_meaning": "治理頁會顯示哪些證據真的有資料、哪些仍是 0 與原因。",
|
||||
"source_of_truth": "ai_agent_interaction_learning_proof_v1",
|
||||
"next_gate": "P2-403B live AgentSession / Redis readback。"
|
||||
"next_gate": "P2-403C Redis dry-run gate 已接入;下一步是 learning writeback approval package。"
|
||||
},
|
||||
{
|
||||
"level_id": "live_read_model",
|
||||
@@ -49,25 +49,25 @@
|
||||
"completion_percent": 100,
|
||||
"operator_meaning": "已定義 AgentSession 安全欄位、Redis event envelope、worker gate、回滾與無寫入 smoke;尚未讀 live DB/Redis。",
|
||||
"source_of_truth": "ai_agent_live_read_model_gate_v1",
|
||||
"next_gate": "P2-403C Redis Streams consumer group dry-run。"
|
||||
"next_gate": "P2-403C Redis dry-run gate 已接入治理頁。"
|
||||
},
|
||||
{
|
||||
"level_id": "message_bus_receipts",
|
||||
"display_name": "訊息匯流收據",
|
||||
"status": "live_pending",
|
||||
"completion_percent": 0,
|
||||
"operator_meaning": "啟用後你會看到 Agent 發出、收到、挑戰、審查、決策的脫敏事件收據。",
|
||||
"source_of_truth": "Redis Streams + agent_sessions",
|
||||
"next_gate": "P2-403C consumer group dry-run 與重放驗證。"
|
||||
"status": "contract_ready",
|
||||
"completion_percent": 100,
|
||||
"operator_meaning": "已定義 fixture-only Redis dry-run、consumer group plan、ack / dead-letter / replay idempotency;尚未連 production Redis。",
|
||||
"source_of_truth": "ai_agent_redis_dry_run_gate_v1",
|
||||
"next_gate": "P2-403D learning writeback approval package。"
|
||||
},
|
||||
{
|
||||
"level_id": "handoff_receipts",
|
||||
"display_name": "互相接手紀錄",
|
||||
"status": "live_pending",
|
||||
"completion_percent": 0,
|
||||
"operator_meaning": "啟用後你會看到 OpenClaw 要求 Hermes 補證、NemoTron 回傳 replay 分數、再由 OpenClaw 仲裁的接手鏈。",
|
||||
"source_of_truth": "agent_sessions.parent_turn_id + timeline_events",
|
||||
"next_gate": "P2-403C handoff envelope schema 與拒收測試。"
|
||||
"status": "contract_ready",
|
||||
"completion_percent": 100,
|
||||
"operator_meaning": "已定義 OpenClaw / Hermes / NemoTron handoff envelope、必填欄位、idempotency key 與 redacted evidence refs;尚未啟動 runtime worker。",
|
||||
"source_of_truth": "ai_agent_redis_dry_run_gate_v1",
|
||||
"next_gate": "P2-403D learning writeback approval package。"
|
||||
},
|
||||
{
|
||||
"level_id": "learning_growth",
|
||||
@@ -278,8 +278,8 @@
|
||||
"gate_id": "redis_stream_consumer_gate",
|
||||
"display_name": "Redis Streams consumer group dry-run",
|
||||
"status": "approval_required",
|
||||
"required_before_green": "必須先證明 consumer ack、dead letter、重放與停用開關。",
|
||||
"next_task_id": "P2-403C"
|
||||
"required_before_green": "P2-403C 已完成 fixture-only dry-run、handoff envelope、ack / dead-letter / replay 契約;建立 production consumer group 前仍需人工批准。",
|
||||
"next_task_id": "P2-403D"
|
||||
},
|
||||
{
|
||||
"gate_id": "learning_writeback_gate",
|
||||
@@ -300,7 +300,7 @@
|
||||
"display_name": "前端脫敏與內容紅線",
|
||||
"status": "blocked",
|
||||
"required_before_green": "任何面板只能顯示脫敏摘要、狀態、來源與核准欄位,未脫敏內容不得進前端。",
|
||||
"next_task_id": "P2-403B"
|
||||
"next_task_id": "P2-403C"
|
||||
}
|
||||
],
|
||||
"learning_memory_stack": [
|
||||
@@ -365,11 +365,9 @@
|
||||
},
|
||||
"rollups": {
|
||||
"proof_level_count": 7,
|
||||
"contract_ready_level_count": 3,
|
||||
"contract_ready_level_count": 5,
|
||||
"live_pending_level_ids": [
|
||||
"handoff_receipts",
|
||||
"learning_growth",
|
||||
"message_bus_receipts",
|
||||
"telegram_receipts"
|
||||
],
|
||||
"signal_count": 9,
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
"program_status": {
|
||||
"overall_completion_percent": 100,
|
||||
"current_priority": "P2",
|
||||
"current_task_id": "P2-403B",
|
||||
"next_task_id": "P2-403C",
|
||||
"current_task_id": "P2-403C",
|
||||
"next_task_id": "P2-403D",
|
||||
"read_only_mode": true,
|
||||
"runtime_authority": "contract_only_no_version_or_runtime_update",
|
||||
"status_note": "P2-403B 已把 AgentSession / Redis Streams live read model gate、safe read fields、回滾計畫與無寫入 smoke 接入治理證據;live AgentSession / message / handoff / learning write / Telegram receipt 目前全為 0,下一步是 P2-403C Redis dry-run。"
|
||||
"status_note": "P2-403C 已把 Redis Streams consumer group dry-run、handoff envelope、ack / dead-letter / replay gate 接入治理證據;live AgentSession / Redis consumer / runtime worker / learning write / Telegram receipt 目前全為 0,下一步是 P2-403D learning writeback approval package。"
|
||||
},
|
||||
"external_source_evidence": [
|
||||
{
|
||||
@@ -110,7 +110,14 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "OpenClaw 仲裁 + replay / shadow / canary gate",
|
||||
"approval_gate": "market_scorecard_replay_and_cost_data_approval_required",
|
||||
"tracked_examples": ["OpenClaw", "Hermes", "NemoTron", "LangGraph", "OpenAI Agents SDK", "Claude Agent SDK"]
|
||||
"tracked_examples": [
|
||||
"OpenClaw",
|
||||
"Hermes",
|
||||
"NemoTron",
|
||||
"LangGraph",
|
||||
"OpenAI Agents SDK",
|
||||
"Claude Agent SDK"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "python_packages",
|
||||
@@ -120,7 +127,10 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "dependency upgrade approval package",
|
||||
"approval_gate": "dependency_approval_required",
|
||||
"tracked_examples": ["pyproject.toml", "requirements.txt"]
|
||||
"tracked_examples": [
|
||||
"pyproject.toml",
|
||||
"requirements.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "javascript_packages",
|
||||
@@ -130,7 +140,10 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "dependency upgrade approval package",
|
||||
"approval_gate": "dependency_approval_required",
|
||||
"tracked_examples": ["package.json", "pnpm-lock.yaml"]
|
||||
"tracked_examples": [
|
||||
"package.json",
|
||||
"pnpm-lock.yaml"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "container_images",
|
||||
@@ -140,7 +153,11 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "image digest pin proposal + smoke plan",
|
||||
"approval_gate": "image_pull_build_push_approval_required",
|
||||
"tracked_examples": ["Dockerfile", "Harbor image tags", "base image digest"]
|
||||
"tracked_examples": [
|
||||
"Dockerfile",
|
||||
"Harbor image tags",
|
||||
"base image digest"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "kubernetes_k3s_components",
|
||||
@@ -150,7 +167,13 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "version skew report + maintenance window approval",
|
||||
"approval_gate": "k8s_upgrade_maintenance_window_required",
|
||||
"tracked_examples": ["kube-apiserver", "kubelet", "kubectl", "CNI", "Ingress"]
|
||||
"tracked_examples": [
|
||||
"kube-apiserver",
|
||||
"kubelet",
|
||||
"kubectl",
|
||||
"CNI",
|
||||
"Ingress"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "host_os_packages",
|
||||
@@ -160,7 +183,12 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "Ansible check-mode / maintenance plan only",
|
||||
"approval_gate": "host_update_approval_required",
|
||||
"tracked_examples": ["Ubuntu packages", "kernel", "Nginx", "OpenSSH"]
|
||||
"tracked_examples": [
|
||||
"Ubuntu packages",
|
||||
"kernel",
|
||||
"Nginx",
|
||||
"OpenSSH"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "observability_stack",
|
||||
@@ -170,7 +198,14 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "observability compatibility report",
|
||||
"approval_gate": "monitoring_route_receiver_write_blocked",
|
||||
"tracked_examples": ["Prometheus", "Alertmanager", "Grafana", "SigNoz", "OpenTelemetry Collector", "Sentry"]
|
||||
"tracked_examples": [
|
||||
"Prometheus",
|
||||
"Alertmanager",
|
||||
"Grafana",
|
||||
"SigNoz",
|
||||
"OpenTelemetry Collector",
|
||||
"Sentry"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "stateful_services",
|
||||
@@ -180,7 +215,13 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "backup freshness + rollback + compatibility gate",
|
||||
"approval_gate": "stateful_upgrade_approval_required",
|
||||
"tracked_examples": ["PostgreSQL", "Redis", "MinIO", "Harbor", "Gitea"]
|
||||
"tracked_examples": [
|
||||
"PostgreSQL",
|
||||
"Redis",
|
||||
"MinIO",
|
||||
"Harbor",
|
||||
"Gitea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "backup_dr_tooling",
|
||||
@@ -190,7 +231,12 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "restore drill approval package",
|
||||
"approval_gate": "restore_or_prune_approval_required",
|
||||
"tracked_examples": ["restic", "Velero", "backup scripts", "offsite escrow"]
|
||||
"tracked_examples": [
|
||||
"restic",
|
||||
"Velero",
|
||||
"backup scripts",
|
||||
"offsite escrow"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "ci_cd_and_runner_tools",
|
||||
@@ -200,7 +246,11 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "workflow / runner owner packet",
|
||||
"approval_gate": "workflow_modification_approval_required",
|
||||
"tracked_examples": ["Gitea workflow", "runner labels", "deploy scripts"]
|
||||
"tracked_examples": [
|
||||
"Gitea workflow",
|
||||
"runner labels",
|
||||
"deploy scripts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "mcp_tools_integrations",
|
||||
@@ -210,7 +260,12 @@
|
||||
"current_allowed_autonomy": "L2_approval_package_only",
|
||||
"update_authority": "MCP schema compatibility report",
|
||||
"approval_gate": "new_tool_or_secret_approval_required",
|
||||
"tracked_examples": ["K8s MCP", "Prometheus MCP", "Sentry MCP", "Telegram Gateway"]
|
||||
"tracked_examples": [
|
||||
"K8s MCP",
|
||||
"Prometheus MCP",
|
||||
"Sentry MCP",
|
||||
"Telegram Gateway"
|
||||
]
|
||||
},
|
||||
{
|
||||
"domain_id": "public_web_admin_surfaces",
|
||||
@@ -220,7 +275,12 @@
|
||||
"current_allowed_autonomy": "L1_report_only",
|
||||
"update_authority": "UI smoke report only",
|
||||
"approval_gate": "code_change_required_for_fix",
|
||||
"tracked_examples": ["awoooi.wooo.work", "AwoooP", "IwoooS", "governance tabs"]
|
||||
"tracked_examples": [
|
||||
"awoooi.wooo.work",
|
||||
"AwoooP",
|
||||
"IwoooS",
|
||||
"governance tabs"
|
||||
]
|
||||
}
|
||||
],
|
||||
"delegable_capabilities": [
|
||||
@@ -230,7 +290,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "low",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["version_delta_report", "freshness_score", "stale_source_list"],
|
||||
"outputs": [
|
||||
"version_delta_report",
|
||||
"freshness_score",
|
||||
"stale_source_list"
|
||||
],
|
||||
"approval_gate": "read_only_allowed",
|
||||
"telegram_policy": "failure_or_action_required_only"
|
||||
},
|
||||
@@ -240,7 +304,12 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["risk_matrix", "rollback_plan", "smoke_plan", "owner_packet"],
|
||||
"outputs": [
|
||||
"risk_matrix",
|
||||
"rollback_plan",
|
||||
"smoke_plan",
|
||||
"owner_packet"
|
||||
],
|
||||
"approval_gate": "human_approval_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -250,7 +319,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L3_draft_change_after_gate",
|
||||
"outputs": ["pr_plan", "grouping_policy", "automerge_false_policy"],
|
||||
"outputs": [
|
||||
"pr_plan",
|
||||
"grouping_policy",
|
||||
"automerge_false_policy"
|
||||
],
|
||||
"approval_gate": "workflow_and_bot_approval_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -260,7 +333,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["sbom_plan", "retention_policy", "tool_choice_matrix"],
|
||||
"outputs": [
|
||||
"sbom_plan",
|
||||
"retention_policy",
|
||||
"tool_choice_matrix"
|
||||
],
|
||||
"approval_gate": "tool_install_or_ci_change_approval_required",
|
||||
"telegram_policy": "failure_only"
|
||||
},
|
||||
@@ -270,7 +347,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["vulnerability_report", "blast_radius", "patch_priority"],
|
||||
"outputs": [
|
||||
"vulnerability_report",
|
||||
"blast_radius",
|
||||
"patch_priority"
|
||||
],
|
||||
"approval_gate": "external_scan_and_dependency_approval_required",
|
||||
"telegram_policy": "critical_or_action_required"
|
||||
},
|
||||
@@ -280,7 +361,10 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["license_delta_report", "owner_review_queue"],
|
||||
"outputs": [
|
||||
"license_delta_report",
|
||||
"owner_review_queue"
|
||||
],
|
||||
"approval_gate": "legal_owner_review_required",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -290,7 +374,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["skew_report", "upgrade_order", "rollback_window"],
|
||||
"outputs": [
|
||||
"skew_report",
|
||||
"upgrade_order",
|
||||
"rollback_window"
|
||||
],
|
||||
"approval_gate": "maintenance_window_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -300,7 +388,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["host_patch_plan", "affected_service_map", "reboot_risk"],
|
||||
"outputs": [
|
||||
"host_patch_plan",
|
||||
"affected_service_map",
|
||||
"reboot_risk"
|
||||
],
|
||||
"approval_gate": "host_update_approval_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -310,7 +402,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["drift_report", "owner_packet", "rollback_refs"],
|
||||
"outputs": [
|
||||
"drift_report",
|
||||
"owner_packet",
|
||||
"rollback_refs"
|
||||
],
|
||||
"approval_gate": "owner_response_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -320,7 +416,10 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["stale_endpoint_report", "health_gap_list"],
|
||||
"outputs": [
|
||||
"stale_endpoint_report",
|
||||
"health_gap_list"
|
||||
],
|
||||
"approval_gate": "restart_or_endpoint_change_requires_approval",
|
||||
"telegram_policy": "failure_only"
|
||||
},
|
||||
@@ -330,7 +429,10 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["noise_report", "rule_change_proposal"],
|
||||
"outputs": [
|
||||
"noise_report",
|
||||
"rule_change_proposal"
|
||||
],
|
||||
"approval_gate": "alert_rule_write_approval_required",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -340,7 +442,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["delivery_report", "silent_route_alert", "fallback_gap"],
|
||||
"outputs": [
|
||||
"delivery_report",
|
||||
"silent_route_alert",
|
||||
"fallback_gap"
|
||||
],
|
||||
"approval_gate": "telegram_send_or_route_change_requires_approval",
|
||||
"telegram_policy": "failure_or_action_required"
|
||||
},
|
||||
@@ -350,7 +456,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["readiness_matrix", "restore_drill_package", "offsite_gap"],
|
||||
"outputs": [
|
||||
"readiness_matrix",
|
||||
"restore_drill_package",
|
||||
"offsite_gap"
|
||||
],
|
||||
"approval_gate": "restore_or_prune_approval_required",
|
||||
"telegram_policy": "failure_or_action_required"
|
||||
},
|
||||
@@ -360,7 +470,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["capacity_forecast", "cost_delta", "resource_limit_proposal"],
|
||||
"outputs": [
|
||||
"capacity_forecast",
|
||||
"cost_delta",
|
||||
"resource_limit_proposal"
|
||||
],
|
||||
"approval_gate": "cost_or_runtime_change_approval_required",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -370,7 +484,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["provider_scorecard", "fallback_gap", "cost_boundary_report"],
|
||||
"outputs": [
|
||||
"provider_scorecard",
|
||||
"fallback_gap",
|
||||
"cost_boundary_report"
|
||||
],
|
||||
"approval_gate": "cost_data_and_route_approval_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -380,7 +498,11 @@
|
||||
"primary_owner": "nemotron",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["sanitized_replay_score", "schema_pass_rate", "tool_call_quality"],
|
||||
"outputs": [
|
||||
"sanitized_replay_score",
|
||||
"schema_pass_rate",
|
||||
"tool_call_quality"
|
||||
],
|
||||
"approval_gate": "cost_data_and_sanitized_fixture_approval_required",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -390,7 +512,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["stale_km_report", "merge_draft", "owner_review_queue"],
|
||||
"outputs": [
|
||||
"stale_km_report",
|
||||
"merge_draft",
|
||||
"owner_review_queue"
|
||||
],
|
||||
"approval_gate": "owner_review_required",
|
||||
"telegram_policy": "digest_only"
|
||||
},
|
||||
@@ -400,7 +526,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "low",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["browser_smoke_report", "overflow_report", "route_health"],
|
||||
"outputs": [
|
||||
"browser_smoke_report",
|
||||
"overflow_report",
|
||||
"route_health"
|
||||
],
|
||||
"approval_gate": "code_change_required_for_fix",
|
||||
"telegram_policy": "failure_only"
|
||||
},
|
||||
@@ -410,7 +540,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["schema_drift_report", "rls_context_gap", "migration_plan"],
|
||||
"outputs": [
|
||||
"schema_drift_report",
|
||||
"rls_context_gap",
|
||||
"migration_plan"
|
||||
],
|
||||
"approval_gate": "db_migration_approval_required",
|
||||
"telegram_policy": "action_required"
|
||||
},
|
||||
@@ -420,7 +554,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["postmortem_draft", "learning_delta", "weekly_digest"],
|
||||
"outputs": [
|
||||
"postmortem_draft",
|
||||
"learning_delta",
|
||||
"weekly_digest"
|
||||
],
|
||||
"approval_gate": "km_write_owner_review_required",
|
||||
"telegram_policy": "digest_only"
|
||||
},
|
||||
@@ -430,7 +568,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "high",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["secret_name_inventory", "rotation_due_report", "owner_packet"],
|
||||
"outputs": [
|
||||
"secret_name_inventory",
|
||||
"rotation_due_report",
|
||||
"owner_packet"
|
||||
],
|
||||
"approval_gate": "secret_value_handling_forbidden",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -440,7 +582,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L1_report_only",
|
||||
"outputs": ["evidence_pack", "missing_owner_response", "audit_gap"],
|
||||
"outputs": [
|
||||
"evidence_pack",
|
||||
"missing_owner_response",
|
||||
"audit_gap"
|
||||
],
|
||||
"approval_gate": "read_only_allowed",
|
||||
"telegram_policy": "digest_only"
|
||||
},
|
||||
@@ -450,7 +596,11 @@
|
||||
"primary_owner": "hermes",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["market_watch_report", "candidate_queue", "integration_review"],
|
||||
"outputs": [
|
||||
"market_watch_report",
|
||||
"candidate_queue",
|
||||
"integration_review"
|
||||
],
|
||||
"approval_gate": "market_scorecard_and_replay_gate_required",
|
||||
"telegram_policy": "action_required_only"
|
||||
},
|
||||
@@ -460,7 +610,11 @@
|
||||
"primary_owner": "openclaw",
|
||||
"risk_tier": "medium",
|
||||
"automation_level": "L2_approval_package_only",
|
||||
"outputs": ["release_train_plan", "batching_policy", "blast_radius_map"],
|
||||
"outputs": [
|
||||
"release_train_plan",
|
||||
"batching_policy",
|
||||
"blast_radius_map"
|
||||
],
|
||||
"approval_gate": "operator_release_window_required",
|
||||
"telegram_policy": "action_required"
|
||||
}
|
||||
@@ -612,15 +766,15 @@
|
||||
"summary": "定義 AI Agent 主動營運委派與版本生命週期契約、schema、snapshot、只讀 API 與文件同步。",
|
||||
"next_gate": "正式部署驗證"
|
||||
},
|
||||
{
|
||||
"task_id": "P2-402B",
|
||||
"priority": "P2",
|
||||
"status": "done",
|
||||
"completion_percent": 100,
|
||||
"owner_agent": "Hermes",
|
||||
"summary": "建立 repo-only daily version freshness snapshot schema、committed snapshot、只讀 API 與測試;不查外部 registry、不改 workflow。",
|
||||
"next_gate": "P2-402C_completed"
|
||||
},
|
||||
{
|
||||
"task_id": "P2-402B",
|
||||
"priority": "P2",
|
||||
"status": "done",
|
||||
"completion_percent": 100,
|
||||
"owner_agent": "Hermes",
|
||||
"summary": "建立 repo-only daily version freshness snapshot schema、committed snapshot、只讀 API 與測試;不查外部 registry、不改 workflow。",
|
||||
"next_gate": "P2-402C_completed"
|
||||
},
|
||||
{
|
||||
"task_id": "P2-402C",
|
||||
"priority": "P2",
|
||||
@@ -682,7 +836,16 @@
|
||||
"completion_percent": 100,
|
||||
"owner_agent": "OpenClaw + Hermes",
|
||||
"summary": "建立 AgentSession / Redis Streams live read model gate;定義既有表安全欄位、Redis envelope、worker gate、rollback plan、no-write smoke 與 governance UI 顯示。",
|
||||
"next_gate": "P2-403C_redis_consumer_group_dry_run"
|
||||
"next_gate": "P2-403C_completed"
|
||||
},
|
||||
{
|
||||
"task_id": "P2-403C",
|
||||
"priority": "P2",
|
||||
"status": "done",
|
||||
"completion_percent": 100,
|
||||
"owner_agent": "Hermes + OpenClaw + Nemotron",
|
||||
"summary": "建立 Redis Streams consumer group dry-run、handoff envelope、ack / dead-letter / replay idempotency gate、只讀 API 與 governance UI 顯示;不連 Redis、不建立 consumer group、不 XADD、不 ACK、不 replay、不發 Telegram。",
|
||||
"next_gate": "P2-403D_learning_writeback_approval_package"
|
||||
}
|
||||
],
|
||||
"approval_boundaries": {
|
||||
@@ -703,7 +866,7 @@
|
||||
"cadence_count": 5,
|
||||
"mcp_tool_count": 8,
|
||||
"rag_memory_count": 4,
|
||||
"rollout_task_count": 9,
|
||||
"rollout_task_count": 10,
|
||||
"auto_execute_allowed_count": 0,
|
||||
"approval_required_capability_count": 23,
|
||||
"blocked_update_domain_ids": [
|
||||
|
||||
240
docs/evaluations/ai_agent_redis_dry_run_gate_2026-06-11.json
Normal file
240
docs/evaluations/ai_agent_redis_dry_run_gate_2026-06-11.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"schema_version": "ai_agent_redis_dry_run_gate_v1",
|
||||
"generated_at": "2026-06-11T23:58:00+08:00",
|
||||
"program_status": {
|
||||
"overall_completion_percent": 60,
|
||||
"current_priority": "P2",
|
||||
"current_task_id": "P2-403C",
|
||||
"next_task_id": "P2-403D",
|
||||
"read_only_mode": true,
|
||||
"runtime_authority": "dry_run_contract_only_no_redis_runtime",
|
||||
"status_note": "P2-403C 已把 Redis Streams consumer group dry-run、handoff envelope、ack、dead-letter 與 replay gate 固定為只讀契約;尚未連 Redis、未建立 consumer group、未 XADD、未 XREADGROUP、未 ACK、未 replay、未發 Telegram、未做 learning writeback。"
|
||||
},
|
||||
"source_refs": [
|
||||
"docs/evaluations/ai_agent_live_read_model_gate_2026-06-11.json",
|
||||
"apps/api/src/services/signal_producer.py",
|
||||
"apps/api/src/main.py:Signal Worker",
|
||||
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
|
||||
],
|
||||
"dry_run_truth": {
|
||||
"redis_connection_allowed": false,
|
||||
"consumer_group_created": false,
|
||||
"xadd_allowed": false,
|
||||
"xreadgroup_allowed": false,
|
||||
"ack_allowed": false,
|
||||
"dead_letter_write_allowed": false,
|
||||
"replay_runtime_allowed": false,
|
||||
"telegram_send_allowed": false,
|
||||
"learning_writeback_allowed": false,
|
||||
"live_dry_run_event_count": 0,
|
||||
"live_ack_count": 0,
|
||||
"live_dead_letter_count": 0,
|
||||
"live_replay_count": 0,
|
||||
"truth_note": "目前只允許 fixture / snapshot 層 dry-run 設計;治理頁看得到每一步需要什麼證據,但 production Redis runtime 全部維持關閉。"
|
||||
},
|
||||
"consumer_group_dry_run_contract": {
|
||||
"candidate_group_name": "awoooi-agent-handoff-dry-run",
|
||||
"stream_namespace": "awoooi:agent:*",
|
||||
"fixture_only": true,
|
||||
"redis_network_call_allowed": false,
|
||||
"required_fixture_fields": [
|
||||
"event_id",
|
||||
"trace_id",
|
||||
"session_id",
|
||||
"incident_id",
|
||||
"from_agent",
|
||||
"to_agent",
|
||||
"handoff_type",
|
||||
"event_status",
|
||||
"idempotency_key",
|
||||
"redacted_evidence_ref",
|
||||
"created_at"
|
||||
],
|
||||
"forbidden_fixture_fields": [
|
||||
"secret_value",
|
||||
"credential_value",
|
||||
"raw_prompt",
|
||||
"conversation_transcript",
|
||||
"private_reasoning",
|
||||
"chain_of_thought",
|
||||
"raw_tool_output"
|
||||
],
|
||||
"dry_run_assertion": "fixture replay 必須能決定 ack / dead-letter / replay lane,但不得連 Redis 或寫任何 runtime queue。"
|
||||
},
|
||||
"handoff_envelope_contract": {
|
||||
"required_fields": [
|
||||
"event_id",
|
||||
"trace_id",
|
||||
"session_id",
|
||||
"incident_id",
|
||||
"from_agent",
|
||||
"to_agent",
|
||||
"handoff_type",
|
||||
"handoff_reason",
|
||||
"evidence_summary",
|
||||
"redacted_evidence_ref",
|
||||
"required_next_action",
|
||||
"idempotency_key",
|
||||
"created_at"
|
||||
],
|
||||
"forbidden_fields": [
|
||||
"secret_value",
|
||||
"credential_value",
|
||||
"raw_prompt",
|
||||
"conversation_transcript",
|
||||
"private_reasoning",
|
||||
"chain_of_thought",
|
||||
"raw_tool_output"
|
||||
],
|
||||
"redacted_evidence_required": true,
|
||||
"idempotency_key_required": true,
|
||||
"operator_meaning": "每次 Agent 接手都必須能說清楚誰交給誰、為什麼交、下一步是什麼、證據在哪裡;但不顯示未脫敏 payload 或私有推理。"
|
||||
},
|
||||
"ack_dead_letter_replay_contract": {
|
||||
"ack_requires_verifier": true,
|
||||
"dead_letter_requires_reason": true,
|
||||
"replay_requires_idempotency": true,
|
||||
"runtime_replay_allowed": false,
|
||||
"ack_allowed_statuses": [
|
||||
"validated_no_write",
|
||||
"duplicate_idempotency_key",
|
||||
"operator_review_recorded"
|
||||
],
|
||||
"dead_letter_reasons": [
|
||||
"missing_required_field",
|
||||
"forbidden_payload_detected",
|
||||
"unknown_agent_lane",
|
||||
"stale_or_replayed_without_idempotency",
|
||||
"execution_intent_detected"
|
||||
],
|
||||
"replay_preconditions": [
|
||||
"fixture_only",
|
||||
"idempotency_key_present",
|
||||
"redacted_evidence_ref_present",
|
||||
"no_runtime_write",
|
||||
"no_telegram_send"
|
||||
]
|
||||
},
|
||||
"dry_run_steps": [
|
||||
{
|
||||
"step_id": "fixture_envelope_validation",
|
||||
"display_name": "Fixture envelope 驗證",
|
||||
"owner_agent": "hermes",
|
||||
"status": "contract_ready",
|
||||
"operator_signal": "固定 fixture 必須通過必填欄位、idempotency key 與 redacted evidence refs 檢查。",
|
||||
"blocked_runtime_action": "redis_xadd"
|
||||
},
|
||||
{
|
||||
"step_id": "consumer_group_plan",
|
||||
"display_name": "Consumer group 方案",
|
||||
"owner_agent": "openclaw",
|
||||
"status": "approval_required",
|
||||
"operator_signal": "只定義 group name、stream namespace、pending / ack / dead-letter 行為,不建立 Redis group。",
|
||||
"blocked_runtime_action": "redis_xgroup_create"
|
||||
},
|
||||
{
|
||||
"step_id": "ack_decision_fixture",
|
||||
"display_name": "ACK 判定 fixture",
|
||||
"owner_agent": "openclaw",
|
||||
"status": "contract_ready",
|
||||
"operator_signal": "dry-run 可判斷哪些事件應 ack,但不執行 XACK。",
|
||||
"blocked_runtime_action": "redis_xack"
|
||||
},
|
||||
{
|
||||
"step_id": "dead_letter_fixture",
|
||||
"display_name": "Dead-letter 分流 fixture",
|
||||
"owner_agent": "hermes",
|
||||
"status": "contract_ready",
|
||||
"operator_signal": "缺欄位、敏感 payload、未知 lane 或 execution intent 必須進 dead-letter 候選。",
|
||||
"blocked_runtime_action": "dead_letter_write"
|
||||
},
|
||||
{
|
||||
"step_id": "replay_idempotency_fixture",
|
||||
"display_name": "Replay idempotency fixture",
|
||||
"owner_agent": "nemotron",
|
||||
"status": "approval_required",
|
||||
"operator_signal": "replay 必須先證明 idempotency,不得把重放當成 runtime 自動執行。",
|
||||
"blocked_runtime_action": "runtime_replay"
|
||||
}
|
||||
],
|
||||
"handoff_lanes": [
|
||||
{
|
||||
"lane_id": "diagnosis_to_rule_review",
|
||||
"display_name": "診斷 → 規則審核",
|
||||
"from_agent": "openclaw",
|
||||
"to_agent": "hermes",
|
||||
"status": "contract_ready",
|
||||
"required_evidence": "alert category、matched rule、evidence summary、blocked reason、redacted evidence ref。"
|
||||
},
|
||||
{
|
||||
"lane_id": "rule_review_to_repair_candidate",
|
||||
"display_name": "規則審核 → 修復候選",
|
||||
"from_agent": "hermes",
|
||||
"to_agent": "openclaw",
|
||||
"status": "approval_required",
|
||||
"required_evidence": "PlayBook trust、MCP evidence refs、risk gate、repair candidate safety。"
|
||||
},
|
||||
{
|
||||
"lane_id": "repair_candidate_to_replay_review",
|
||||
"display_name": "修復候選 → replay 審核",
|
||||
"from_agent": "openclaw",
|
||||
"to_agent": "nemotron",
|
||||
"status": "blocked_by_runtime_gate",
|
||||
"required_evidence": "sanitized fixture、idempotency key、no-write replay result、operator review lane。"
|
||||
}
|
||||
],
|
||||
"approval_boundaries": {
|
||||
"redis_connection_allowed": false,
|
||||
"consumer_group_creation_allowed": false,
|
||||
"xadd_allowed": false,
|
||||
"xreadgroup_allowed": false,
|
||||
"xack_allowed": false,
|
||||
"dead_letter_write_allowed": false,
|
||||
"runtime_replay_allowed": false,
|
||||
"worker_start_allowed": false,
|
||||
"telegram_send_allowed": false,
|
||||
"learning_writeback_allowed": false,
|
||||
"secret_plaintext_allowed": false
|
||||
},
|
||||
"display_redaction_contract": {
|
||||
"redaction_required": true,
|
||||
"raw_payload_display_allowed": false,
|
||||
"private_reasoning_display_allowed": false,
|
||||
"secret_value_display_allowed": false,
|
||||
"allowed_frontend_content": [
|
||||
"dry-run status",
|
||||
"handoff lane",
|
||||
"agent role",
|
||||
"required fields count",
|
||||
"blocked runtime action",
|
||||
"redacted evidence ref",
|
||||
"next gate"
|
||||
],
|
||||
"forbidden_frontend_content": [
|
||||
"未脫敏 payload",
|
||||
"提示內容",
|
||||
"私有推理",
|
||||
"機密值",
|
||||
"raw tool output"
|
||||
],
|
||||
"frontend_display_policy": "治理頁只顯示 dry-run 狀態、handoff lane、欄位數、阻擋動作與下一步;未脫敏 payload、提示內容、私有推理、機密值與 raw tool output 不進前端。"
|
||||
},
|
||||
"rollups": {
|
||||
"source_ref_count": 4,
|
||||
"dry_run_step_count": 5,
|
||||
"handoff_lane_count": 3,
|
||||
"contract_ready_step_ids": [
|
||||
"ack_decision_fixture",
|
||||
"dead_letter_fixture",
|
||||
"fixture_envelope_validation"
|
||||
],
|
||||
"approval_required_step_ids": [
|
||||
"consumer_group_plan",
|
||||
"replay_idempotency_fixture"
|
||||
],
|
||||
"blocked_runtime_action_count": 5,
|
||||
"required_handoff_field_count": 13,
|
||||
"forbidden_field_count": 7,
|
||||
"live_truth_count_total": 0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user