feat(governance): 新增 Redis dry-run gate
Some checks failed
CD Pipeline / tests (push) Successful in 1m26s
Code Review / ai-code-review (push) Successful in 13s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-06-11 21:04:28 +08:00
parent 3a3a6283c8
commit 9ffcca737d
21 changed files with 1506 additions and 112 deletions

View File

@@ -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,

View File

@@ -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": [

View 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
}
}