diff --git a/apps/api/src/api/v1/agents.py b/apps/api/src/api/v1/agents.py
index c6f51abc6..278e4036f 100644
--- a/apps/api/src/api/v1/agents.py
+++ b/apps/api/src/api/v1/agents.py
@@ -768,7 +768,7 @@ async def get_agent_12_agent_war_room() -> dict[str, Any]:
response_model=dict[str, Any],
summary="取得 AI Agent 專業任務擴展與 Telegram Runtime Bridge 快照",
description=(
- "讀取最新已提交的 P2-405A AI Agent 專業任務擴展與 Telegram Runtime Bridge 只讀快照;"
+ "讀取最新已提交的 P2-405F AI Agent 專業任務擴展與 Telegram Runtime Bridge 只讀快照;"
"此端點只呈現 OpenClaw、Hermes、NemoTron 與專責 Agent 可承接的專業任務、MCP/RAG、"
"風險分層、Telegram no-send preview 與後續 canary gate,"
"不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不讀 secret、不執行 production write、"
diff --git a/apps/api/src/services/ai_agent_professional_task_expansion.py b/apps/api/src/services/ai_agent_professional_task_expansion.py
index 1f84fac37..45629a011 100644
--- a/apps/api/src/services/ai_agent_professional_task_expansion.py
+++ b/apps/api/src/services/ai_agent_professional_task_expansion.py
@@ -1,11 +1,11 @@
"""
AI Agent professional task expansion and Telegram runtime bridge snapshot.
-Loads the latest committed P2-405E read-only contract. The contract expands
+Loads the latest committed P2-405F read-only contract. The contract expands
professional AI Agent work and defines Telegram no-send previews plus canary
-delivery rehearsal evidence, but it does not write Telegram Gateway queues,
-send Telegram messages, call the Bot API, read secrets, or execute production
-changes.
+delivery rehearsal and owner review gate evidence, but it does not write
+Telegram Gateway queues, send Telegram messages, call the Bot API, read secrets,
+or execute production changes.
"""
from __future__ import annotations
@@ -32,6 +32,7 @@ _EXPECTED_CANARY_PACKAGE_COUNT = 1
_EXPECTED_CANARY_APPROVAL_PACKET_COUNT = 1
_EXPECTED_CANARY_DELIVERY_GATE_COUNT = 1
_EXPECTED_CANARY_DELIVERY_REHEARSAL_COUNT = 1
+_EXPECTED_CANARY_LIVE_DELIVERY_OWNER_REVIEW_GATE_COUNT = 1
_ZERO_ROLLUP_FIELDS = {
"current_live_count",
"gateway_queue_write_count",
@@ -68,6 +69,14 @@ _ZERO_ROLLUP_FIELDS = {
"canary_delivery_rehearsal_gateway_queue_write_enabled_count",
"canary_delivery_rehearsal_bot_api_call_enabled_count",
"canary_delivery_rehearsal_receipt_write_enabled_count",
+ "canary_live_delivery_owner_review_received_count",
+ "canary_live_delivery_owner_review_accepted_count",
+ "canary_live_delivery_approved_count",
+ "canary_live_delivery_attempt_allowed_count",
+ "canary_live_delivery_gateway_queue_write_enabled_count",
+ "canary_live_delivery_bot_api_call_enabled_count",
+ "canary_live_delivery_telegram_send_enabled_count",
+ "canary_live_delivery_receipt_write_enabled_count",
}
_FORBIDDEN_PUBLIC_TERMS = {
"work_window_transcript",
@@ -115,11 +124,11 @@ def _require_schema(payload: dict[str, Any], label: str) -> None:
status = payload.get("program_status") or {}
expected = {
"current_priority": "P2",
- "current_task_id": "P2-405E",
- "next_task_id": "P2-405F",
+ "current_task_id": "P2-405F",
+ "next_task_id": "P2-406B",
"read_only_mode": True,
"runtime_authority": _RUNTIME_AUTHORITY,
- "overall_completion_percent": 98,
+ "overall_completion_percent": 99,
}
mismatches = _mismatches(status, expected)
if mismatches:
@@ -162,6 +171,7 @@ def _require_telegram_bridge(payload: dict[str, Any], label: str) -> None:
_require_canary_send_approval_packet(bridge, label)
_require_canary_delivery_gate(bridge, label)
_require_canary_delivery_rehearsal(bridge, label)
+ _require_canary_live_delivery_owner_review_gate(bridge, label)
def _require_no_send_previews(bridge: dict[str, Any], label: str) -> None:
@@ -509,6 +519,96 @@ def _require_canary_delivery_rehearsal(bridge: dict[str, Any], label: str) -> No
raise ValueError(f"{label}: canary rehearsal execution flags mismatch: {mismatches}")
+def _require_canary_live_delivery_owner_review_gate(
+ bridge: dict[str, Any], label: str
+) -> None:
+ gate = bridge.get("canary_live_delivery_owner_review_gate") or {}
+ expected = {
+ "status": "ready_for_owner_review_no_send",
+ "gate_ready": True,
+ "approval_required": True,
+ "owner_review_received": False,
+ "owner_review_accepted": False,
+ "live_canary_delivery_approved": False,
+ "delivery_attempt_allowed": False,
+ "prior_rehearsal_status": "ready_no_send_rehearsal",
+ "prior_readback_completed_check_count": 8,
+ "prior_readback_failed_check_count": 0,
+ "selected_message_type": "daily_agent_workload_digest",
+ "selected_preview_id": "p2_405b_preview_daily_agent_workload_digest_v1",
+ "selected_receipt_expectation_id": "p2_405b_receipt_daily_agent_workload_digest_v1",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "target_room_value_visible": False,
+ "owner_agent": "telegram_ops_liaison",
+ "receipt_readback_owner": "hermes",
+ "arbiter": "openclaw",
+ }
+ mismatches = _mismatches(gate, expected)
+ if mismatches:
+ raise ValueError(
+ f"{label}: canary_live_delivery_owner_review_gate mismatch: {mismatches}"
+ )
+ if not gate:
+ raise ValueError(
+ f"{label}: expected "
+ f"{_EXPECTED_CANARY_LIVE_DELIVERY_OWNER_REVIEW_GATE_COUNT} "
+ "canary live delivery owner review gate"
+ )
+
+ required_fields = gate.get("required_owner_fields") or []
+ if len(required_fields) != 9:
+ raise ValueError(f"{label}: canary live owner review must define 9 fields")
+ for field in required_fields:
+ if field.get("required") is not True:
+ raise ValueError(f"{label}: canary live owner field must be required")
+ if field.get("current_value_status") != "waiting_owner_response":
+ raise ValueError(
+ f"{label}: canary live owner field must wait for owner response"
+ )
+ if field.get("value_display_allowed") is not False:
+ raise ValueError(f"{label}: canary live owner field values must stay hidden")
+
+ if len(gate.get("acceptance_checks") or []) != 9:
+ raise ValueError(f"{label}: canary live owner review must define 9 checks")
+ if len(gate.get("rejection_reasons") or []) != 8:
+ raise ValueError(f"{label}: canary live owner review must define 8 rejections")
+ if len(gate.get("reviewer_actions") or []) != 6:
+ raise ValueError(f"{label}: canary live owner review must define 6 actions")
+
+ receipt = gate.get("receipt_readback_plan") or {}
+ if receipt.get("owner_agent") != "hermes":
+ raise ValueError(f"{label}: canary live owner receipt owner must be hermes")
+ if len(receipt.get("required_checks") or []) != 8:
+ raise ValueError(f"{label}: canary live owner receipt plan must define 8 checks")
+ if receipt.get("completed_check_count") != 0:
+ raise ValueError(f"{label}: canary live owner receipt checks must not complete yet")
+ if receipt.get("failed_check_count") != 0:
+ raise ValueError(f"{label}: canary live owner receipt failed checks must be zero")
+ if receipt.get("production_receipt_write_enabled") is not False:
+ raise ValueError(f"{label}: canary live owner receipt write must remain false")
+ if receipt.get("live_receipt_readback_enabled") is not False:
+ raise ValueError(f"{label}: canary live owner live readback must remain false")
+
+ execution_flags = gate.get("execution_flags") or {}
+ expected_execution = {
+ "live_delivery_enabled": False,
+ "gateway_queue_write_enabled": False,
+ "bot_api_call_enabled": False,
+ "telegram_send_enabled": False,
+ "delivery_receipt_write_enabled": False,
+ "production_write_enabled": False,
+ "secret_read_enabled": False,
+ "paid_api_enabled": False,
+ }
+ mismatches = _mismatches(execution_flags, expected_execution)
+ if mismatches:
+ raise ValueError(
+ f"{label}: canary live owner review execution flags mismatch: {mismatches}"
+ )
+ if gate.get("owner_decision_log") != []:
+ raise ValueError(f"{label}: canary live owner decision log must remain empty")
+
+
def _require_professional_tasks(payload: dict[str, Any], label: str) -> None:
domains = payload.get("professional_task_domains") or []
if len(domains) != _EXPECTED_DOMAIN_COUNT:
@@ -676,6 +776,42 @@ def _require_rollups(payload: dict[str, Any], label: str) -> None:
or {}
).get("failed_check_count")
),
+ "canary_live_delivery_owner_review_gate_count": 1
+ if bridge.get("canary_live_delivery_owner_review_gate")
+ else 0,
+ "canary_live_delivery_owner_review_required_field_count": len(
+ (bridge.get("canary_live_delivery_owner_review_gate") or {}).get(
+ "required_owner_fields"
+ )
+ or []
+ ),
+ "canary_live_delivery_owner_review_acceptance_check_count": len(
+ (bridge.get("canary_live_delivery_owner_review_gate") or {}).get(
+ "acceptance_checks"
+ )
+ or []
+ ),
+ "canary_live_delivery_owner_review_rejection_reason_count": len(
+ (bridge.get("canary_live_delivery_owner_review_gate") or {}).get(
+ "rejection_reasons"
+ )
+ or []
+ ),
+ "canary_live_delivery_owner_review_reviewer_action_count": len(
+ (bridge.get("canary_live_delivery_owner_review_gate") or {}).get(
+ "reviewer_actions"
+ )
+ or []
+ ),
+ "canary_live_delivery_owner_review_receipt_check_count": len(
+ (
+ (bridge.get("canary_live_delivery_owner_review_gate") or {}).get(
+ "receipt_readback_plan"
+ )
+ or {}
+ ).get("required_checks")
+ or []
+ ),
}
mismatches = _mismatches(rollups, expected)
if mismatches:
diff --git a/apps/api/tests/test_ai_agent_professional_task_expansion.py b/apps/api/tests/test_ai_agent_professional_task_expansion.py
index d7e1d0f49..6ef696b61 100644
--- a/apps/api/tests/test_ai_agent_professional_task_expansion.py
+++ b/apps/api/tests/test_ai_agent_professional_task_expansion.py
@@ -18,9 +18,9 @@ def test_load_latest_ai_agent_professional_task_expansion_snapshot() -> None:
snapshot = load_latest_ai_agent_professional_task_expansion()
assert snapshot["schema_version"] == "ai_agent_professional_task_expansion_v1"
- assert snapshot["program_status"]["current_task_id"] == "P2-405E"
- assert snapshot["program_status"]["next_task_id"] == "P2-405F"
- assert snapshot["program_status"]["overall_completion_percent"] == 98
+ assert snapshot["program_status"]["current_task_id"] == "P2-405F"
+ assert snapshot["program_status"]["next_task_id"] == "P2-406B"
+ assert snapshot["program_status"]["overall_completion_percent"] == 99
assert snapshot["program_status"]["runtime_authority"] == (
"professional_task_expansion_and_telegram_bridge_read_only_no_send"
)
@@ -117,6 +117,20 @@ def test_load_latest_ai_agent_professional_task_expansion_snapshot() -> None:
assert rollups["canary_delivery_rehearsal_gateway_queue_write_enabled_count"] == 0
assert rollups["canary_delivery_rehearsal_bot_api_call_enabled_count"] == 0
assert rollups["canary_delivery_rehearsal_receipt_write_enabled_count"] == 0
+ assert rollups["canary_live_delivery_owner_review_gate_count"] == 1
+ assert rollups["canary_live_delivery_owner_review_required_field_count"] == 9
+ assert rollups["canary_live_delivery_owner_review_acceptance_check_count"] == 9
+ assert rollups["canary_live_delivery_owner_review_rejection_reason_count"] == 8
+ assert rollups["canary_live_delivery_owner_review_reviewer_action_count"] == 6
+ assert rollups["canary_live_delivery_owner_review_receipt_check_count"] == 8
+ assert rollups["canary_live_delivery_owner_review_received_count"] == 0
+ assert rollups["canary_live_delivery_owner_review_accepted_count"] == 0
+ assert rollups["canary_live_delivery_approved_count"] == 0
+ assert rollups["canary_live_delivery_attempt_allowed_count"] == 0
+ assert rollups["canary_live_delivery_gateway_queue_write_enabled_count"] == 0
+ assert rollups["canary_live_delivery_bot_api_call_enabled_count"] == 0
+ assert rollups["canary_live_delivery_telegram_send_enabled_count"] == 0
+ assert rollups["canary_live_delivery_receipt_write_enabled_count"] == 0
def test_professional_tasks_cover_required_agents_and_reporting() -> None:
@@ -288,6 +302,46 @@ def test_canary_delivery_rehearsal_is_ready_without_live_send() -> None:
assert all(value is False for value in rehearsal["execution_flags"].values())
+def test_canary_live_delivery_owner_review_gate_waits_for_owner_response() -> None:
+ snapshot = load_latest_ai_agent_professional_task_expansion()
+ gate = snapshot["telegram_runtime_bridge"]["canary_live_delivery_owner_review_gate"]
+
+ assert gate["status"] == "ready_for_owner_review_no_send"
+ assert gate["gate_ready"] is True
+ assert gate["approval_required"] is True
+ assert gate["owner_review_received"] is False
+ assert gate["owner_review_accepted"] is False
+ assert gate["live_canary_delivery_approved"] is False
+ assert gate["delivery_attempt_allowed"] is False
+ assert gate["prior_readback_completed_check_count"] == 8
+ assert gate["prior_readback_failed_check_count"] == 0
+ assert gate["selected_message_type"] == "daily_agent_workload_digest"
+ assert gate["target_room_env"] == "SRE_GROUP_CHAT_ID"
+ assert gate["target_room_value_visible"] is False
+ assert gate["owner_agent"] == "telegram_ops_liaison"
+ assert gate["receipt_readback_owner"] == "hermes"
+ assert gate["arbiter"] == "openclaw"
+ assert len(gate["required_owner_fields"]) == 9
+ assert len(gate["acceptance_checks"]) == 9
+ assert len(gate["rejection_reasons"]) == 8
+ assert len(gate["reviewer_actions"]) == 6
+ assert gate["owner_decision_log"] == []
+
+ for field in gate["required_owner_fields"]:
+ assert field["required"] is True
+ assert field["current_value_status"] == "waiting_owner_response"
+ assert field["value_display_allowed"] is False
+
+ receipt = gate["receipt_readback_plan"]
+ assert receipt["owner_agent"] == "hermes"
+ assert len(receipt["required_checks"]) == 8
+ assert receipt["completed_check_count"] == 0
+ assert receipt["failed_check_count"] == 0
+ assert receipt["production_receipt_write_enabled"] is False
+ assert receipt["live_receipt_readback_enabled"] is False
+ assert all(value is False for value in gate["execution_flags"].values())
+
+
def test_rejects_telegram_send_enabled(tmp_path: Path) -> None:
snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
snapshot["telegram_runtime_bridge"]["telegram_send_enabled"] = True
@@ -424,6 +478,28 @@ def test_rejects_canary_delivery_rehearsal_receipt_write_enabled(tmp_path: Path)
load_latest_ai_agent_professional_task_expansion(tmp_path)
+def test_rejects_canary_live_delivery_owner_review_received(tmp_path: Path) -> None:
+ snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
+ gate = snapshot["telegram_runtime_bridge"]["canary_live_delivery_owner_review_gate"]
+ gate["owner_review_received"] = True
+ snapshot["rollups"]["canary_live_delivery_owner_review_received_count"] = 1
+ _write_snapshot(tmp_path, snapshot)
+
+ with pytest.raises(ValueError, match="canary_live_delivery_owner_review_gate mismatch"):
+ load_latest_ai_agent_professional_task_expansion(tmp_path)
+
+
+def test_rejects_canary_live_delivery_telegram_send_enabled(tmp_path: Path) -> None:
+ snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
+ gate = snapshot["telegram_runtime_bridge"]["canary_live_delivery_owner_review_gate"]
+ gate["execution_flags"]["telegram_send_enabled"] = True
+ snapshot["rollups"]["canary_live_delivery_telegram_send_enabled_count"] = 1
+ _write_snapshot(tmp_path, snapshot)
+
+ with pytest.raises(ValueError, match="canary live owner review execution flags mismatch"):
+ load_latest_ai_agent_professional_task_expansion(tmp_path)
+
+
def test_rejects_high_risk_without_approval(tmp_path: Path) -> None:
snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
high_task = next(task for task in snapshot["professional_tasks"] if task["risk_tier"] == "high")
diff --git a/apps/api/tests/test_ai_agent_professional_task_expansion_api.py b/apps/api/tests/test_ai_agent_professional_task_expansion_api.py
index 27996e91d..30dc67546 100644
--- a/apps/api/tests/test_ai_agent_professional_task_expansion_api.py
+++ b/apps/api/tests/test_ai_agent_professional_task_expansion_api.py
@@ -17,9 +17,9 @@ def test_ai_agent_professional_task_expansion_endpoint() -> None:
assert response.status_code == 200
payload = response.json()
assert payload["schema_version"] == "ai_agent_professional_task_expansion_v1"
- assert payload["program_status"]["current_task_id"] == "P2-405E"
- assert payload["program_status"]["next_task_id"] == "P2-405F"
- assert payload["program_status"]["overall_completion_percent"] == 98
+ assert payload["program_status"]["current_task_id"] == "P2-405F"
+ assert payload["program_status"]["next_task_id"] == "P2-406B"
+ assert payload["program_status"]["overall_completion_percent"] == 99
assert payload["program_status"]["runtime_authority"] == (
"professional_task_expansion_and_telegram_bridge_read_only_no_send"
)
@@ -61,6 +61,12 @@ def test_ai_agent_professional_task_expansion_endpoint() -> None:
assert payload["rollups"]["canary_delivery_rehearsal_gateway_queue_write_enabled_count"] == 0
assert payload["rollups"]["canary_delivery_rehearsal_bot_api_call_enabled_count"] == 0
assert payload["rollups"]["canary_delivery_rehearsal_receipt_write_enabled_count"] == 0
+ assert payload["rollups"]["canary_live_delivery_owner_review_gate_count"] == 1
+ assert payload["rollups"]["canary_live_delivery_owner_review_required_field_count"] == 9
+ assert payload["rollups"]["canary_live_delivery_owner_review_received_count"] == 0
+ assert payload["rollups"]["canary_live_delivery_owner_review_accepted_count"] == 0
+ assert payload["rollups"]["canary_live_delivery_approved_count"] == 0
+ assert payload["rollups"]["canary_live_delivery_telegram_send_enabled_count"] == 0
assert payload["telegram_runtime_bridge"]["canary_approval_package"]["live_send_enabled"] is False
assert payload["telegram_runtime_bridge"]["canary_send_approval_packet"]["approval_granted"] is False
assert (
@@ -81,5 +87,11 @@ def test_ai_agent_professional_task_expansion_endpoint() -> None:
]
is False
)
+ owner_gate = payload["telegram_runtime_bridge"]["canary_live_delivery_owner_review_gate"]
+ assert owner_gate["gate_ready"] is True
+ assert owner_gate["owner_review_received"] is False
+ assert owner_gate["owner_review_accepted"] is False
+ assert owner_gate["live_canary_delivery_approved"] is False
+ assert owner_gate["execution_flags"]["telegram_send_enabled"] is False
assert len(payload["telegram_runtime_bridge"]["no_send_message_previews"]) == 6
assert len(payload["telegram_runtime_bridge"]["receipt_expectations"]) == 6
diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index b67965ab0..7dce1dc00 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -6503,7 +6503,7 @@
}
},
"professionalTaskExpansion": {
- "title": "P2-405E AI Agent TG Canary 乾跑派送演練",
+ "title": "P2-405F AI Agent TG Canary 實發前 Owner Review",
"source": "產生 {generated};目前 {current};下一步 {next}",
"runtime": "runtime={value}",
"telegramTitle": "Telegram Runtime Bridge",
@@ -6532,7 +6532,10 @@
"deliveryHoldReasons": "hold reason",
"deliveryRehearsal": "派送演練",
"rehearsalChecks": "演練檢查",
- "rehearsalStops": "停止條件"
+ "rehearsalStops": "停止條件",
+ "ownerReviewGate": "Owner review gate",
+ "ownerFields": "Owner 必填欄位",
+ "ownerAcceptance": "Owner 驗收檢查"
},
"previewTitle": "Telegram no-send 訊息預覽",
"canaryTitle": "Canary 批准包",
@@ -6581,7 +6584,16 @@
"receiptWrite": "receipt write={value}",
"liveReadback": "live readback={value}",
"stopCondition": "停止={value}",
- "nextGate": "下一關={value}"
+ "nextGate": "下一關={value}",
+ "ownerReviewReceived": "owner review received={value}",
+ "ownerReviewAccepted": "owner review accepted={value}",
+ "liveDeliveryApproved": "live canary approved={value}",
+ "priorReadback": "前次 readback 完成={done} / 失敗={failed}",
+ "receiptOwner": "receipt owner={value}",
+ "reviewerCount": "reviewer={count}",
+ "acceptanceCheck": "驗收={value}",
+ "rejectionReason": "拒收={value}",
+ "reviewerAction": "reviewer action={value}"
},
"riskTiers": {
"low": "低風險",
@@ -6592,7 +6604,10 @@
"canaryDeliveryGateTitle": "P2-405D Canary 派送閘門",
"canaryDeliveryRehearsalTitle": "P2-405E Canary 乾跑派送演練",
"rehearsalEnvelopeTitle": "Gateway envelope 演練",
- "rehearsalReadbackTitle": "回執讀回演練"
+ "rehearsalReadbackTitle": "回執讀回演練",
+ "canaryLiveOwnerReviewTitle": "P2-405F Canary 實發前 Owner Review Gate",
+ "ownerReviewerActionsTitle": "Reviewer 動作",
+ "ownerReceiptReadbackTitle": "Owner 回執讀回計畫"
},
"resultCaptureReleaseVerifierOwnerReviewPacket": {
"title": "P2-137 釋出驗證器負責人審查包",
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index b67965ab0..7dce1dc00 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -6503,7 +6503,7 @@
}
},
"professionalTaskExpansion": {
- "title": "P2-405E AI Agent TG Canary 乾跑派送演練",
+ "title": "P2-405F AI Agent TG Canary 實發前 Owner Review",
"source": "產生 {generated};目前 {current};下一步 {next}",
"runtime": "runtime={value}",
"telegramTitle": "Telegram Runtime Bridge",
@@ -6532,7 +6532,10 @@
"deliveryHoldReasons": "hold reason",
"deliveryRehearsal": "派送演練",
"rehearsalChecks": "演練檢查",
- "rehearsalStops": "停止條件"
+ "rehearsalStops": "停止條件",
+ "ownerReviewGate": "Owner review gate",
+ "ownerFields": "Owner 必填欄位",
+ "ownerAcceptance": "Owner 驗收檢查"
},
"previewTitle": "Telegram no-send 訊息預覽",
"canaryTitle": "Canary 批准包",
@@ -6581,7 +6584,16 @@
"receiptWrite": "receipt write={value}",
"liveReadback": "live readback={value}",
"stopCondition": "停止={value}",
- "nextGate": "下一關={value}"
+ "nextGate": "下一關={value}",
+ "ownerReviewReceived": "owner review received={value}",
+ "ownerReviewAccepted": "owner review accepted={value}",
+ "liveDeliveryApproved": "live canary approved={value}",
+ "priorReadback": "前次 readback 完成={done} / 失敗={failed}",
+ "receiptOwner": "receipt owner={value}",
+ "reviewerCount": "reviewer={count}",
+ "acceptanceCheck": "驗收={value}",
+ "rejectionReason": "拒收={value}",
+ "reviewerAction": "reviewer action={value}"
},
"riskTiers": {
"low": "低風險",
@@ -6592,7 +6604,10 @@
"canaryDeliveryGateTitle": "P2-405D Canary 派送閘門",
"canaryDeliveryRehearsalTitle": "P2-405E Canary 乾跑派送演練",
"rehearsalEnvelopeTitle": "Gateway envelope 演練",
- "rehearsalReadbackTitle": "回執讀回演練"
+ "rehearsalReadbackTitle": "回執讀回演練",
+ "canaryLiveOwnerReviewTitle": "P2-405F Canary 實發前 Owner Review Gate",
+ "ownerReviewerActionsTitle": "Reviewer 動作",
+ "ownerReceiptReadbackTitle": "Owner 回執讀回計畫"
},
"resultCaptureReleaseVerifierOwnerReviewPacket": {
"title": "P2-137 釋出驗證器負責人審查包",
diff --git a/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx b/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
index 7796cab95..112382ea6 100644
--- a/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
+++ b/apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx
@@ -35,6 +35,7 @@ import {
ShieldCheck,
Target,
Undo2,
+ UserCheck,
} from 'lucide-react'
import { useTranslations } from 'next-intl'
import { GlassCard } from '@/components/ui/glass-card'
@@ -3725,16 +3726,25 @@ export function AutomationInventoryTab() {
+ professionalTaskExpansion.rollups.canary_delivery_rehearsal_gateway_queue_write_enabled_count
+ professionalTaskExpansion.rollups.canary_delivery_rehearsal_bot_api_call_enabled_count
+ professionalTaskExpansion.rollups.canary_delivery_rehearsal_receipt_write_enabled_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_gateway_queue_write_enabled_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_bot_api_call_enabled_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_telegram_send_enabled_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_receipt_write_enabled_count
)
const professionalTaskCanarySendPacket = professionalTaskExpansion.telegram_runtime_bridge.canary_send_approval_packet
const professionalTaskCanaryDeliveryGate = professionalTaskExpansion.telegram_runtime_bridge.canary_delivery_gate
const professionalTaskCanaryDeliveryRehearsal = professionalTaskExpansion.telegram_runtime_bridge.canary_delivery_rehearsal
+ const professionalTaskCanaryLiveOwnerReview = professionalTaskExpansion.telegram_runtime_bridge.canary_live_delivery_owner_review_gate
const professionalTaskCanaryApprovalGaps = (
professionalTaskExpansion.rollups.canary_approval_granted_count
+ professionalTaskExpansion.rollups.canary_selected_message_type_count
+ professionalTaskExpansion.rollups.canary_approved_time_window_count
+ professionalTaskExpansion.rollups.canary_delivery_approved_count
+ professionalTaskExpansion.rollups.canary_delivery_attempt_allowed_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_owner_review_received_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_owner_review_accepted_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_approved_count
+ + professionalTaskExpansion.rollups.canary_live_delivery_attempt_allowed_count
)
const backlogProgressPercent = backlog.progress_summary.overall_percent
const explicitApprovalItemCount = backlog.item_approval_boundary_rollup.items_requiring_explicit_approval.length
@@ -4473,6 +4483,9 @@ export function AutomationInventoryTab() {
} />
} />
} />
+ } />
+ } />
+ } />
@@ -4693,6 +4706,166 @@ export function AutomationInventoryTab() {
+
+
{t('professionalTaskExpansion.liveOwnerReviewTitle')}
+
+ {professionalTaskCanaryLiveOwnerReview.gate_id} · {professionalTaskCanaryLiveOwnerReview.status}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{t('professionalTaskExpansion.liveOwnerFieldsTitle')}
+
+ {professionalTaskCanaryLiveOwnerReview.required_owner_fields.slice(0, 9).map(field => (
+
+
+ {field.label}
+
+
+
+
+
+
+ ))}
+
+
+
+
{t('professionalTaskExpansion.liveOwnerReceiptTitle')}
+
+
+
+
+
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.acceptance_checks.slice(0, 9).map(check => (
+
+ {check}
+
+ ))}
+
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.rejection_reasons.map(reason => (
+
+ {t('professionalTaskExpansion.labels.rejectionReason', { value: reason })}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
{t('professionalTaskExpansion.canaryLiveOwnerReviewTitle')}
+
+ {professionalTaskCanaryLiveOwnerReview.gate_id} · {professionalTaskCanaryLiveOwnerReview.status}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.required_owner_fields.map(field => (
+
+
+ {field.label}
+
+
+
+
+
+
+
+ ))}
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.acceptance_checks.map(check => (
+
+ {t('professionalTaskExpansion.labels.acceptanceCheck', { value: check })}
+
+ ))}
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.rejection_reasons.map(reason => (
+
+ {t('professionalTaskExpansion.labels.rejectionReason', { value: reason })}
+
+ ))}
+
+
+
+
+
{t('professionalTaskExpansion.ownerReviewerActionsTitle')}
+
+ {professionalTaskCanaryLiveOwnerReview.reviewer_actions.map(action => (
+
+ {t('professionalTaskExpansion.labels.reviewerAction', { value: action })}
+
+ ))}
+
+
+
+
{t('professionalTaskExpansion.ownerReceiptReadbackTitle')}
+
+
+
+
+
+
+
+
+ {professionalTaskCanaryLiveOwnerReview.receipt_readback_plan.required_checks.map(check => (
+
+ {check}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{t('professionalTaskExpansion.tasksTitle')}
{visibleProfessionalTasks.map(task => {
diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts
index 08d2d85d5..a3d3b9c96 100644
--- a/apps/web/src/lib/api-client.ts
+++ b/apps/web/src/lib/api-client.ts
@@ -1429,8 +1429,8 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
program_status: {
overall_completion_percent: number
current_priority: 'P0' | 'P1' | 'P2' | 'P3'
- current_task_id: 'P2-405E'
- next_task_id: 'P2-405F'
+ current_task_id: 'P2-405F'
+ next_task_id: 'P2-406B'
read_only_mode: true
runtime_authority: 'professional_task_expansion_and_telegram_bridge_read_only_no_send'
status_note: string
@@ -1693,6 +1693,62 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
}
next_gate: string
}
+ canary_live_delivery_owner_review_gate: {
+ gate_id: string
+ status: string
+ gate_ready: boolean
+ approval_required: boolean
+ owner_review_received: boolean
+ owner_review_accepted: boolean
+ live_canary_delivery_approved: boolean
+ delivery_attempt_allowed: boolean
+ prior_rehearsal_id: string
+ prior_rehearsal_status: string
+ prior_readback_completed_check_count: number
+ prior_readback_failed_check_count: number
+ selected_message_type: string
+ selected_preview_id: string
+ selected_receipt_expectation_id: string
+ target_room_alias: string
+ target_room_env: string
+ target_room_value_visible: boolean
+ dedup_key: string
+ sanitized_preview_hash: string
+ owner_agent: string
+ receipt_readback_owner: string
+ arbiter: string
+ reviewers: string[]
+ required_owner_fields: Array<{
+ field_id: string
+ label: string
+ required: boolean
+ current_value_status: string
+ value_display_allowed: boolean
+ }>
+ acceptance_checks: string[]
+ rejection_reasons: string[]
+ reviewer_actions: string[]
+ receipt_readback_plan: {
+ owner_agent: string
+ required_checks: string[]
+ completed_check_count: number
+ failed_check_count: number
+ production_receipt_write_enabled: boolean
+ live_receipt_readback_enabled: boolean
+ }
+ execution_flags: {
+ live_delivery_enabled: boolean
+ gateway_queue_write_enabled: boolean
+ bot_api_call_enabled: boolean
+ telegram_send_enabled: boolean
+ delivery_receipt_write_enabled: boolean
+ production_write_enabled: boolean
+ secret_read_enabled: boolean
+ paid_api_enabled: boolean
+ }
+ owner_decision_log: unknown[]
+ next_gate: string
+ }
no_send_preview_completion_percent: number
canary_approval_package_completion_percent: number
canary_send_approval_packet_ready: boolean
@@ -1705,6 +1761,11 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
canary_delivery_gate_completion_percent: number
canary_delivery_rehearsal_ready: boolean
canary_delivery_rehearsal_completion_percent: number
+ canary_live_delivery_owner_review_ready: boolean
+ canary_live_delivery_owner_review_received: boolean
+ canary_live_delivery_owner_review_accepted: boolean
+ canary_live_delivery_approved: boolean
+ canary_live_delivery_owner_review_completion_percent: number
}
professional_task_domains: Array<{
domain_id: string
@@ -1812,6 +1873,20 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
canary_delivery_rehearsal_gateway_queue_write_enabled_count: number
canary_delivery_rehearsal_bot_api_call_enabled_count: number
canary_delivery_rehearsal_receipt_write_enabled_count: number
+ canary_live_delivery_owner_review_gate_count: number
+ canary_live_delivery_owner_review_required_field_count: number
+ canary_live_delivery_owner_review_acceptance_check_count: number
+ canary_live_delivery_owner_review_rejection_reason_count: number
+ canary_live_delivery_owner_review_reviewer_action_count: number
+ canary_live_delivery_owner_review_receipt_check_count: number
+ canary_live_delivery_owner_review_received_count: number
+ canary_live_delivery_owner_review_accepted_count: number
+ canary_live_delivery_approved_count: number
+ canary_live_delivery_attempt_allowed_count: number
+ canary_live_delivery_gateway_queue_write_enabled_count: number
+ canary_live_delivery_bot_api_call_enabled_count: number
+ canary_live_delivery_telegram_send_enabled_count: number
+ canary_live_delivery_receipt_write_enabled_count: number
}
}
diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md
index ccbc6c3bb..aee0aef00 100644
--- a/docs/LOGBOOK.md
+++ b/docs/LOGBOOK.md
@@ -1,3 +1,27 @@
+## 2026-06-18|P2-405F Telegram Canary Owner Review Gate 本地收斂
+
+**背景**:P2-405E 已完成 dry-run delivery rehearsal 與正式站驗證,但 Telegram 真正要打通不能直接從「演練通過」跳到 Bot API 實發;必須先把 owner review、receipt readback、拒收條件、mute / rollback 與單一 canary 實發邊界固定成可審核契約,避免再次出現「批准後看似執行、實際沒有自動化流程」或「只發報表但沒有 receipt / actionability」的斷鏈。
+
+**完成內容**:
+- 新增 committed snapshot `docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json`,current `P2-405F`、next `P2-406B`、completion `99%`。
+- 新增 `telegram_runtime_bridge.canary_live_delivery_owner_review_gate`,承接 P2-405E rehearsal `8 / 8` readback、failed `0`,但 `owner_review_received=false`、`owner_review_accepted=false`、`live_canary_delivery_approved=false`、`delivery_attempt_allowed=false`。
+- Owner review gate 固定 9 個 owner 必填欄位、9 個 acceptance check、8 個 rejection reason、6 個 reviewer action、8 個 receipt readback check。
+- API service guard 強制 P2-405F owner review gate 的 Gateway queue write、Bot API call、Telegram send、delivery receipt write、production write、secret read、paid API 全部維持 `false / 0`。
+- Governance automation inventory 新增 P2-405F owner review gate KPI 與卡片,顯示 owner 收件 / accepted / live approved / attempt allowed 全部為 `false`,並列出必填欄位、驗收檢查、拒收原因與 receipt readback owner。
+- i18n 兩份 locale 仍維持繁體中文鏡像,沒有引入英文 fallback 文案。
+
+**本地驗證**:
+- JSON parse:P2-405F snapshot、schema、`zh-TW.json`、`en.json` 通過。
+- `python3 -m py_compile apps/api/src/services/ai_agent_professional_task_expansion.py apps/api/src/api/v1/agents.py` 通過。
+- `PYTHONPATH=apps/api /Users/ogt/awoooi/apps/api/.venv/bin/python -m pytest apps/api/tests/test_ai_agent_professional_task_expansion.py apps/api/tests/test_ai_agent_professional_task_expansion_api.py` → `26 passed`。
+
+**完成度同步**:
+- P2-405F Telegram Canary Owner Review Gate:本地實作 `100%`,待 Gitea CD / production verification。
+- AI Agent 專業任務擴展與 Telegram Runtime Bridge:`98% -> 99%`。
+- Telegram 實發、Gateway queue 寫入、Bot API call、delivery receipt production write、AI analysis runtime、中低風險 auto worker、production optimization write:全部仍維持 `0 / false`。
+
+**邊界**:本段不送 Telegram、不寫 Gateway queue、不呼叫 Bot API、不寫讀報回執、不啟動排程、不啟動 AI analysis runtime、不啟動中低風險自動處理、不讀 secret、不新增批准或發送按鈕;不得把 owner review gate ready 解讀成 live canary 已批准或 runtime gate 已開啟。
+
## 2026-06-18|P2-405E / P2-406A AI Agent Telegram 派送演練與前段主看板
**背景**:統帥已明確指出 Telegram 告警與日週月報不能停在「報表都是 0」或「批准後沒有自動化」,也不能讓日報、週報、月報埋在長頁面後段。既有 P2-405D 已把 Canary Delivery Gate、必填欄位、preflight、hold reason 與 rollback / mute 控制固定;既有 P2-111 也已有日報、週報、月報、failure-only 摘要與讀報回執的實發批准包。本階段一方面把下一步推進成可重放的 dry-run delivery rehearsal,另一方面把 P2-111 報告派送批准包拉到治理頁前段,讓 operator 能看見單一訊息如何被選定、如何形成 Gateway envelope preview、如何由 Hermes 做 receipt readback drill、哪些條件會停止,以及報告會送往哪個 TG 戰情室。此段仍不實發 Telegram、不寫 Gateway queue、不呼叫 Bot API。
diff --git a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
index 6d2656bb0..87006ebaa 100644
--- a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
+++ b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
@@ -15,13 +15,18 @@
| OpenClaw / Hermes / NemoTron 主動溝通、學習與成長證據 | 100% | P2-401A 到 P2-144 已完成只讀證據面、runtime / report / result-capture gates、no-write readback、promotion review、writer implementation review、writer dry-run fixture、writer dry-run readback、owner promotion execution gate、owner-approved execution rehearsal、owner acceptance / maintenance window gate、owner acceptance readback / preflight hold、owner-approved preflight release package、owner-approved release readiness readback、owner release approval gate、post-release verifier / rollback gate、final release candidate readback、release authorization hold / readback gate、release verifier preflight / owner review packet、release decision hold / readback、release decision next handoff、release decision input prep、12-Agent War Room、owner response 預檢與 owner response 回讀;P2-141 基線與 S4.9 owner release packet 補強皆已正式驗證,P2-142 12-Agent War Room 已完成 production readback 與 desktop / mobile smoke,P2-143 owner response 預檢已完成 production readback 與 in-app browser smoke,P2-144 owner response 回讀已完成 production API readback 與 desktop / mobile smoke。runtime worker、DB migration、production Redis consumer group、canonical runtime readback、live query、runtime score、result capture write、Telegram 實發、delivery receipt E2E、live report delivery、reviewer queue write、Gateway queue write、AI analysis runtime、中低風險 auto worker、KM / LOGBOOK / audit DB / timeline / PlayBook trust 寫入、SDK / 付費服務仍未開 gate | `ai_agent_result_capture_release_decision_owner_response_readback_v1`、`GET /api/v1/agents/agent-result-capture-release-decision-owner-response-readback`、`docs/evaluations/ai_agent_result_capture_release_decision_owner_response_readback_2026-06-14.json`、feature commit `8795f100`、deploy marker `ac938037`、Gitea code-review `2965` / CD `2964` success、5 個回覆讀回 lane、18 個 owner 必填欄位、6 個 readback validation check、6 個 rejection guard、5 個 operator action、等待外部回覆 `5`、未收件 lane `5`、正式寫入 / 發送 `0`;P2-142 feature commit `5de4b3f3`、deploy marker `1a2c9e36`、Gitea CD run `4232` success、production API readback、desktop / mobile in-app browser smoke;P2-143 feature commit `755b0a8d`、deploy marker `667d6329`、Gitea code-review `2961` / CD `2960` success、production API readback、desktop / mobile in-app browser smoke;MASTER §3.2.1b / §3.2.1d / §3.4.3 |
| AI Agent 主動營運委派與版本生命週期 | 100% | P2-402A / P2-402B / P2-402C / P2-402D / P2-402E / P2-402F / P2-402G 已完成;已建立 repo-only 版本新鮮度快照、工具採用批准包、Telegram action-required digest policy、Gitea PR 草案 lane、host / K3s / stateful 版本只讀盤點、API 與 governance UI。定期排程、外部版本查詢、工具安裝、CI 變更、套件升級、主機更新、container pull、實際 PR creation、auto merge、Telegram 實發、SSH、kubectl、重啟仍未開 gate | `ai_agent_proactive_operations_contract_v1`、`ai_agent_version_freshness_snapshot_v1`、`ai_agent_tool_adoption_approval_package_v1`、`ai_agent_telegram_action_required_digest_policy_v1`、`ai_agent_gitea_pr_draft_lane_v1`、`ai_agent_host_stateful_version_inventory_v1`、`GET /api/v1/agents/agent-proactive-operations-contract`、`GET /api/v1/agents/agent-version-freshness-snapshot`、`GET /api/v1/agents/agent-tool-adoption-approval-package`、`GET /api/v1/agents/agent-telegram-action-required-digest-policy`、`GET /api/v1/agents/agent-gitea-pr-draft-lane`、`GET /api/v1/agents/agent-host-stateful-version-inventory`、`/zh-TW/governance?tab=automation-inventory`、MASTER §3.2.1c |
| 12-Agent War Room 編組 | 72% | 12 個邏輯工位與分批派工規則已正式部署;OpenClaw / Hermes / NemoTron / SRE / Security / DevOps / Data/DR / Supply Chain / Product/UI / QA / Market / Telegram 共 12 份只讀審查已回收;schema / committed snapshot / API / tests / governance UI 區塊 / production API readback / desktop + mobile in-app browser smoke 已完成;runtime writer、Telegram send、Bot API、production write 仍未批准 | `ai_agent_12_agent_war_room_v1`、`docs/evaluations/ai_agent_12_agent_war_room_2026-06-14.json`、`GET /api/v1/agents/agent-12-agent-war-room`、feature commit `5de4b3f3`、deploy marker `1a2c9e36`、Gitea CD run `4232` success、`/zh-TW/governance?tab=automation-inventory`、12 份 Codex sub-agent 只讀回饋 |
-| AI Agent 專業任務擴展與 Telegram Runtime Bridge | 98% | P2-405E 已完成只讀契約、正式 API、治理頁 P2-405E 乾跑派送演練卡、production API readback、desktop / mobile browser smoke、6 種 Telegram no-send preview、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package、1 份 canary send approval packet、1 份 canary delivery gate、1 份 canary dry-run delivery rehearsal、6 個乾跑步驟、8 個 receipt readback check、7 個 stop condition、5 個 rollback / mute control;P2-406A 已把 P2-111 日報 / 週報 / 月報實發批准包、AwoooI SRE 戰情室 route、TG Bot / Gateway / receipt / AI analysis 邊界拉到治理頁前段主看板;24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型、MCP/RAG stack、日報 / 週報 / 月報 / action-required 報告契約已固定;Telegram 實發、Gateway queue、Bot API、delivery receipt production write、secret read、paid API、host write、kubectl action 仍全部關閉 | `ai_agent_professional_task_expansion_v1`、`docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1200_p2_405e.json`、`GET /api/v1/agents/agent-professional-task-expansion`、`GET /api/v1/agents/agent-report-live-delivery-approval-package`、`/zh-TW/governance?tab=automation-inventory`、feature commit `2500496f`、deploy marker `f5be4cb8`、Gitea code-review `3084` / CD `3083` success、production API readback、desktop / mobile browser smoke、`docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md`、需批准任務 `19`、no-send preview `6`、dedup key `6`、receipt expectation `6`、canary package `1`、canary send approval packet `1`、delivery gate `1`、dry-run rehearsal `1`、P2-111 delivery approval packet `5`、route gate `4`、no-send receipt `4`、交付欄位 `8`、preflight `8`、hold reason `7`、preview / canary / delivery / rehearsal live write `0`;下一步 P2-405F / P2-406B receipt readback owner review |
+| AI Agent 專業任務擴展與 Telegram Runtime Bridge | 99% | P2-405F 已完成只讀契約、API service guard、治理頁 P2-405F owner review gate、9 個 owner 必填欄位、9 個 acceptance check、8 個 rejection reason、6 個 reviewer action、8 個 receipt readback check;P2-405E 已正式驗證 dry-run delivery rehearsal;P2-406A 已把 P2-111 日報 / 週報 / 月報實發批准包、AwoooI SRE 戰情室 route、TG Bot / Gateway / receipt / AI analysis 邊界拉到治理頁前段主看板;24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型、MCP/RAG stack、日報 / 週報 / 月報 / action-required 報告契約已固定;owner review received / accepted、Telegram 實發、Gateway queue、Bot API、delivery receipt production write、secret read、paid API、host write、kubectl action 仍全部關閉 | `ai_agent_professional_task_expansion_v1`、`docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json`、`docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1200_p2_405e.json`、`GET /api/v1/agents/agent-professional-task-expansion`、`GET /api/v1/agents/agent-report-live-delivery-approval-package`、`/zh-TW/governance?tab=automation-inventory`、feature commit `2500496f`、deploy marker `f5be4cb8`、Gitea code-review `3084` / CD `3083` success、P2-405E production API readback、desktop / mobile browser smoke、P2-405F local API regression `26 passed`、`docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md`、需批准任務 `19`、no-send preview `6`、dedup key `6`、receipt expectation `6`、canary package `1`、canary send approval packet `1`、delivery gate `1`、dry-run rehearsal `1`、owner review gate `1`、P2-111 delivery approval packet `5`、route gate `4`、no-send receipt `4`、owner review received / accepted `0 / 0`、live delivery approved / attempt allowed `0 / 0`、preview / canary / delivery / rehearsal / owner review live write `0`;下一步 P2-406B receipt readback owner review production verification |
| Owner response 預檢與拒收邊界 | 100% | P2-143 已完成正式部署與 production readback;承接 P2-141 input prep 與 P2-142 War Room,只建立 owner / verifier / rollback / maintenance / live-apply 五類外部回覆的 intake 預檢、必填欄位與拒收規則;正式 owner response 尚未收到、未接受、未寫入 | `ai_agent_result_capture_release_decision_owner_response_preflight_v1`、`GET /api/v1/agents/agent-result-capture-release-decision-owner-response-preflight`、feature commit `755b0a8d`、deploy marker `667d6329`、Gitea code-review `2961` / CD `2960` success、5 個 response intake lane、18 個 required owner field、6 個 validation check、6 個 rejection guard、5 個 operator action;owner response received / accepted / redacted payload / reviewer queue / Gateway / Telegram / Bot API / production write / secret read / destructive operation 全為 `0` |
| Owner response 回讀狀態 | 100% | P2-144 已完成正式部署與 production readback;承接 P2-143 preflight,只讀回五類外部回覆仍未收到、未接受、未拒絕、未保存 | `ai_agent_result_capture_release_decision_owner_response_readback_v1`、`GET /api/v1/agents/agent-result-capture-release-decision-owner-response-readback`、feature commit `8795f100`、deploy marker `ac938037`、Gitea code-review `2965` / CD `2964` success、5 個 response readback lane、18 個 required owner field、6 個 readback validation check、6 個 readback rejection guard、5 個 operator action、waiting external response `5`、no external response received `5`;owner response received / accepted / redacted payload / reviewer queue / Gateway / Telegram / Bot API / production write / secret read / destructive operation 全為 `0` |
| 本工作清單與分析報告 | 100% | 已完成 | 本 MD 文件 |
### 2026-06-18 12:00 狀態同步
+- `P2-405F` AI Agent TG Canary owner review gate 已本地完成:新增 `docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json`,current `P2-405F`、next `P2-406B`、completion `99`。
+- P2-405F 固定 1 份 owner review gate、9 個 owner 必填欄位、9 個 acceptance check、8 個 rejection reason、6 個 reviewer action、8 個 receipt readback check。
+- 治理頁 `automation-inventory` 已顯示 P2-405F owner review gate、owner 必填欄位、receipt readback owner review、acceptance checks、rejection reasons、queue / Bot API / Telegram send / receipt write 狀態。
+- 本地證據:JSON parse、Python compile、AI Agent professional task expansion API/service regression `26 passed`。
+- owner review received / accepted、live delivery approved / attempt allowed、Telegram send、Gateway queue write、Bot API call、delivery receipt production write、secret read、paid API、host write、kubectl action、production write 全部仍為 `0 / false`;P2-406B 才能進入 receipt readback owner review 正式驗證,且仍不得實發。
- `P2-405E` AI Agent TG Canary 乾跑派送演練已正式完成:新增 `docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1200_p2_405e.json`,current `P2-405E`、next `P2-405F`、completion `98`。
- P2-405E 固定 1 份 canary dry-run delivery rehearsal、6 個 dry-run step、8 個 receipt readback check、7 個 stop condition、5 個 rollback / mute control。
- 治理頁 `automation-inventory` 已顯示 P2-405E 乾跑派送演練、Gateway envelope 演練、回執讀回演練、dry-run step、stop condition、queue / Bot API / Telegram send / receipt write 狀態。
diff --git a/docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md b/docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md
index 9cf4434ad..895e86317 100644
--- a/docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md
+++ b/docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md
@@ -1,12 +1,12 @@
# AI Agent 專業任務擴展與 Telegram Runtime Bridge 工作報告
> 日期:2026-06-18(台北時間)
-> 狀態:P2-405E 已完成 Telegram Canary Dry-run Delivery Rehearsal、6 個 rehearsal step、8 個 readback check、7 個 stop condition、5 個 rollback / mute 控制、API guard、測試、治理頁可視化與正式站 API / desktop / mobile smoke;Telegram 實發仍未啟用。
+> 狀態:P2-405F 已完成 Telegram Canary Owner Review Gate、9 個 owner 必填欄位、9 個 acceptance check、8 個 rejection reason、6 個 reviewer action、8 個 receipt readback check、API guard、測試與治理頁可視化;Telegram 實發仍未啟用。
> 事實來源:`ai_agent_professional_task_expansion_v1`
## 1. 結論
-本輪把「AI Agent 還能處理哪些專業工作」正式產品化成 24 類專業任務,並把 Telegram 群組 / TG Bot 整合拆成 5 段啟動前閘門。P2-405D 已把第一次 Canary delivery 前必須由統帥確認的交付欄位、preflight、hold reason、rollback / mute 與 readback plan 顯示到治理頁;P2-405E 進一步把第一個 `daily_agent_workload_digest` dry-run delivery rehearsal 固定成可重放證據,包含 preview hash、dedup key、Gateway envelope preview、Hermes receipt readback drill 與停止條件。
+本輪把「AI Agent 還能處理哪些專業工作」正式產品化成 24 類專業任務,並把 Telegram 群組 / TG Bot 整合拆成 5 段啟動前閘門。P2-405D 已把第一次 Canary delivery 前必須由統帥確認的交付欄位、preflight、hold reason、rollback / mute 與 readback plan 顯示到治理頁;P2-405E 進一步把第一個 `daily_agent_workload_digest` dry-run delivery rehearsal 固定成可重放證據;P2-405F 再把這份演練轉成 owner review gate,要求 owner 回覆、Hermes receipt readback、OpenClaw / Security / QA 驗收與拒收條件全部清楚可見。
這不是直接讓 AI Agent 發 Telegram 或改 production;目前只允許 no-send preview、queue preview readback、owner review、canary approval package、canary send approval packet、canary delivery gate 與 dry-run delivery rehearsal。真正送到 **AwoooI SRE 戰情室** 必須先通過 owner-approved P2-405F live canary approval、dedup、receipt、redaction、OpenClaw 仲裁、Security gate 與 QA verifier。
@@ -20,8 +20,9 @@
| Canary 發送批准包 | 100% | 1 份 canary send approval packet、7 個批准欄位、6 個停止條件、5 步 mute / rollback、6 個 receipt readback check 已固定 |
| Canary Delivery Gate | 100% | 1 份 delivery gate、8 個交付必填欄位、8 個 preflight、7 個 hold reason、7 個 readback check、5 個 rollback / mute 控制已固定 |
| Canary Dry-run Delivery Rehearsal | 100% | 1 份 dry-run rehearsal、6 個 step、8 個 readback check、7 個 stop condition、5 個 rollback / mute 控制已固定 |
+| Canary Owner Review Gate | 100% | 1 份 owner review gate、9 個 owner 欄位、9 個 acceptance check、8 個 rejection reason、6 個 reviewer action、8 個 receipt check 已固定 |
| API / loader | 100% | `GET /api/v1/agents/agent-professional-task-expansion` 只讀輸出 |
-| 治理頁可視化 | 100% | `/zh-TW/governance?tab=automation-inventory` 顯示任務、風險、TG bridge、preview、dedup、receipt、canary、delivery gate、rehearsal 與 live/send/write=0 |
+| 治理頁可視化 | 100% | `/zh-TW/governance?tab=automation-inventory` 顯示任務、風險、TG bridge、preview、dedup、receipt、canary、delivery gate、rehearsal、owner review gate 與 live/send/write=0 |
| Telegram 實發 | 0% | `telegram_send_count=0`、`bot_api_call_count=0`、`gateway_queue_write_count=0` |
| Runtime 自動優化 | 0% | production write、host write、kubectl、paid API、secret read 全部維持 0 |
@@ -110,7 +111,26 @@ Canary delivery gate 固定 8 個 preflight check、7 個 hold reason、7 個 re
Rehearsal 固定 6 個 dry-run step、8 個 readback check、7 個 stop condition 與 5 個 rollback / mute control;`live_delivery_enabled`、`gateway_queue_write_enabled`、`bot_api_call_enabled`、`telegram_send_enabled`、`delivery_receipt_write_enabled`、`production_write_enabled`、`secret_read_enabled`、`paid_api_enabled` 全部仍為 `false`。
-## 9. 專業任務總覽
+## 9. P2-405F Canary Owner Review Gate
+
+目前 canary live delivery owner review gate 狀態為 `ready_for_owner_review_no_send`,`gate_ready=true`,但 `owner_review_received=false`、`owner_review_accepted=false`、`live_canary_delivery_approved=false`、`delivery_attempt_allowed=false`。它承接 P2-405E rehearsal `8 / 8` readback 與 failed `0`,但只把證據推進到 owner review,不做任何實發。
+
+| 項目 | 值 | 邊界 |
+|---|---|---|
+| selected message | `daily_agent_workload_digest` | 只允許單一訊息型別 |
+| target room | `SRE_GROUP_CHAT_ID` | 只顯示 env ref,不顯示 chat id value |
+| owner agent | `telegram_ops_liaison` | 只做 owner review gate |
+| receipt owner | `hermes` | 只做 receipt readback plan |
+| arbiter | `openclaw` | 仲裁是否可進下一關 |
+| owner fields | `9` | 全部等待 owner response |
+| acceptance checks | `9` | 未通過不得進 live canary |
+| rejection reasons | `8` | 任一命中即退回 no-send |
+| reviewer actions | `6` | 只能 approve next gate / request fix / reject / mute / manual review / hold |
+| receipt checks | `8` | completed `0`、failed `0`,尚未讀正式 receipt |
+
+Owner review gate 固定 `live_delivery_enabled`、`gateway_queue_write_enabled`、`bot_api_call_enabled`、`telegram_send_enabled`、`delivery_receipt_write_enabled`、`production_write_enabled`、`secret_read_enabled`、`paid_api_enabled` 全部為 `false`。P2-406B 才能進入 receipt readback owner review 正式驗證,仍不得直接實發。
+
+## 10. 專業任務總覽
| 領域 | 任務數 | 代表任務 | 主責 |
|---|---:|---|---|
@@ -123,7 +143,7 @@ Rehearsal 固定 6 個 dry-run step、8 個 readback check、7 個 stop conditio
| AI Governance / Replay / Market | 4 | market watch、NemoTron replay、cost forecast、runbook/postmortem | OpenClaw / NemoTron / Hermes |
| Telegram / Reports / Receipts | 3 | digest preview、report truth gate、post-action verifier | Telegram Ops / Hermes / OpenClaw |
-## 10. 專業能力層級
+## 11. 專業能力層級
| 層級 | AI Agent 可自動做 | Gate |
|---|---|---|
@@ -132,7 +152,7 @@ Rehearsal 固定 6 個 dry-run step、8 個 readback check、7 個 stop conditio
| 高風險 | 只產批准包、rollback plan、failure-only digest 草案 | 統帥批准 |
| Critical | production write、kubectl、ArgoCD sync、Telegram 實發、secret、restore、host write | 預設 blocked |
-## 11. MCP / RAG
+## 12. MCP / RAG
首批 MCP:Gitea、Browser、Observability、Telegram Gateway、Package Registry、Database Readonly、Backup Status、ArgoCD Readonly、HTTP Probe、Fixture Store。
@@ -140,7 +160,7 @@ Rehearsal 固定 6 個 dry-run step、8 個 readback check、7 個 stop conditio
成長指標:KM entries、PlayBook updates、recommendations、replay score delta、blocked action prevented count、receipt missing count。
-## 12. 邊界
+## 13. 邊界
- 不直接發 Telegram。
- 不寫 Telegram Gateway queue。
@@ -149,9 +169,9 @@ Rehearsal 固定 6 個 dry-run step、8 個 readback check、7 個 stop conditio
- 不把工作視窗對話、未遮罩提示、私人推理或未遮罩 runtime payload 放進前端或 Telegram。
- 不做 production write、host write、kubectl、ArgoCD sync、restore、rollback、paid API、SDK install。
-## 13. 下一步
+## 14. 下一步
-1. P2-405F:以 P2-405E rehearsal readback 為證據,產出 owner-approved single canary live delivery approval package。
+1. P2-406B:以 P2-405F owner review gate 為基線,做 receipt readback owner review production verification。
2. P2-405G:canary 通過後才開日報 / 週報 / 月報 digest delivery。
3. P2-405H:Action-required digest 只對 failure / high-risk / approval-required 事件開啟。
4. P2-405H:把 receipt readback 與 report status board 串起來,但仍需 canary gate 後才能寫正式 receipt。
diff --git a/docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json b/docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json
new file mode 100644
index 000000000..f6c3d4dca
--- /dev/null
+++ b/docs/evaluations/ai_agent_professional_task_expansion_2026-06-18_1430_p2_405f.json
@@ -0,0 +1,1920 @@
+{
+ "schema_version": "ai_agent_professional_task_expansion_v1",
+ "generated_at": "2026-06-18T14:30:00+08:00",
+ "program_status": {
+ "current_priority": "P2",
+ "current_task_id": "P2-405F",
+ "next_task_id": "P2-406B",
+ "overall_completion_percent": 99,
+ "read_only_mode": true,
+ "runtime_authority": "professional_task_expansion_and_telegram_bridge_read_only_no_send",
+ "status_note": "P2-405F 已建立 Telegram canary live delivery owner review gate:承接 P2-405E dry-run rehearsal 的 8/8 readback,固定 owner 必填欄位、驗收檢查、拒收條件、reviewer action、receipt readback plan 與 no-send 邊界;仍不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production receipt、不讀 secret。"
+ },
+ "source_refs": [
+ "docs/ai/AI_AGENT_12_AGENT_WAR_ROOM_2026-06-14.md",
+ "docs/ai/AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md",
+ "docs/ai/AI_AGENT_INTERACTION_LEARNING_PROOF_2026-06-11.md",
+ "docs/ai/AI_AGENT_TELEGRAM_ACTION_REQUIRED_DIGEST_POLICY_2026-06-11.md",
+ "docs/ai/AI_AGENT_DEPLOYMENT_LAYOUT_2026-06-11.md",
+ "docs/security/MONITORING-OWNER-RESPONSE-ACCEPTANCE.md",
+ "apps/api/src/services/telegram_gateway.py",
+ ".gitea/workflows/cd.yaml",
+ ".gitea/workflows/code-review.yaml"
+ ],
+ "telegram_runtime_bridge": {
+ "canonical_room": "AwoooI SRE 戰情室",
+ "canonical_room_env": "SRE_GROUP_CHAT_ID",
+ "gateway_required": true,
+ "gateway_owner": "telegram_ops_liaison",
+ "arbiter": "openclaw",
+ "receipt_owner": "hermes",
+ "replay_owner": "nemotron",
+ "no_send_preview_ready": true,
+ "queue_preview_readback_ready": true,
+ "approved_canary_required": true,
+ "direct_bot_api_allowed": false,
+ "bot_api_call_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "telegram_send_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "stages": [
+ {
+ "stage_id": "tg_bridge_01_no_send_preview",
+ "title": "Telegram no-send preview",
+ "status": "ready_for_owner_review",
+ "allowed_output": "脫敏訊息預覽、dedup key、目標群組 metadata、風險層級、需審核選項",
+ "live_send_enabled": false,
+ "exit_condition": "OpenClaw + Security + QA 確認不含 secret、raw payload、工作視窗內容與誤導性執行按鈕。"
+ },
+ {
+ "stage_id": "tg_bridge_02_queue_preview_readback",
+ "title": "Gateway queue preview readback",
+ "status": "ready_for_owner_review",
+ "allowed_output": "queue envelope hash、message type、receipt expectation、rate-limit / dedup plan",
+ "live_send_enabled": false,
+ "exit_condition": "Hermes 讀回 preview hash,QA 確認不會寫入 production queue。"
+ },
+ {
+ "stage_id": "tg_bridge_03_approved_canary",
+ "title": "Canary live delivery owner review gate",
+ "status": "owner_review_ready_no_send",
+ "allowed_output": "owner review packet、receipt readback plan、acceptance checks、rejection reasons 與 rollback / mute controls",
+ "live_send_enabled": false,
+ "exit_condition": "owner review gate 收到合格回覆且 receipt readback owner review 通過後,才可另案批准單一 Bot API canary 實發。"
+ },
+ {
+ "stage_id": "tg_bridge_04_daily_weekly_monthly_digest",
+ "title": "日報 / 週報 / 月報 digest delivery",
+ "status": "blocked_until_canary_receipt",
+ "allowed_output": "Agent 工作量、完成度、阻擋項、圖表摘要與 low-noise digest",
+ "live_send_enabled": false,
+ "exit_condition": "canary receipt 正常、dedup 有效、成功訊息壓制策略通過。"
+ },
+ {
+ "stage_id": "tg_bridge_05_action_required_digest",
+ "title": "Action-required / high-risk approval digest",
+ "status": "blocked_until_dual_gate",
+ "allowed_output": "高風險審核卡、owner response 缺口、failure-only escalation",
+ "live_send_enabled": false,
+ "exit_condition": "OpenClaw 仲裁、Security gate、QA verifier 與 Telegram receipt 全通過。"
+ }
+ ],
+ "message_types": [
+ {
+ "message_type": "daily_agent_workload_digest",
+ "cadence": "daily",
+ "risk_tier": "low",
+ "owner_agent": "hermes",
+ "send_policy": "send_after_canary_and_dedup_gate"
+ },
+ {
+ "message_type": "weekly_governance_summary",
+ "cadence": "weekly",
+ "risk_tier": "medium",
+ "owner_agent": "hermes",
+ "send_policy": "send_after_canary_and_truth_gate"
+ },
+ {
+ "message_type": "monthly_growth_report",
+ "cadence": "monthly",
+ "risk_tier": "medium",
+ "owner_agent": "hermes",
+ "send_policy": "send_after_owner_review"
+ },
+ {
+ "message_type": "high_risk_approval_card",
+ "cadence": "event",
+ "risk_tier": "high",
+ "owner_agent": "openclaw",
+ "send_policy": "approval_required_before_send"
+ },
+ {
+ "message_type": "failure_only_escalation",
+ "cadence": "event",
+ "risk_tier": "critical",
+ "owner_agent": "sre_sentinel",
+ "send_policy": "failure_only_after_route_lock"
+ },
+ {
+ "message_type": "report_receipt_gap_alert",
+ "cadence": "event",
+ "risk_tier": "medium",
+ "owner_agent": "telegram_ops_liaison",
+ "send_policy": "no_send_preview_until_receipt_contract"
+ }
+ ],
+ "no_send_message_previews": [
+ {
+ "preview_id": "p2_405b_preview_daily_agent_workload_digest_v1",
+ "message_type": "daily_agent_workload_digest",
+ "title": "AI Agent 日報 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "hermes",
+ "risk_tier": "low",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-report:daily:{yyyy-mm-dd}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_daily_agent_workload_digest_v1",
+ "approval_required_before_send": false,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI AI Agent 日報",
+ "今日完成度、工作量、阻擋項與低風險自動處理摘要。",
+ "所有成功煙霧訊號只彙整,不逐筆洗版。",
+ "live / send / write 計數維持 0,等待 canary gate。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ },
+ {
+ "preview_id": "p2_405b_preview_weekly_governance_summary_v1",
+ "message_type": "weekly_governance_summary",
+ "title": "AI Agent 週報 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "hermes",
+ "risk_tier": "medium",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-report:weekly:{iso-week}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_weekly_governance_summary_v1",
+ "approval_required_before_send": false,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI AI Agent 週報",
+ "本週專業任務、模型市場 watch、治理 gate 與未完成 owner response 摘要。",
+ "中風險項目只列 proposal / dry-run,不列正式執行結果。",
+ "任何需要批准的項目改送 action-required digest 草案。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ },
+ {
+ "preview_id": "p2_405b_preview_monthly_growth_report_v1",
+ "message_type": "monthly_growth_report",
+ "title": "AI Agent 月報 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "hermes",
+ "risk_tier": "medium",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-report:monthly:{yyyy-mm}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_monthly_growth_report_v1",
+ "approval_required_before_send": true,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI AI Agent 月報",
+ "智慧成長指標、PlayBook 更新、replay 分數變化與 blocked action 防護數。",
+ "成本、容量、版本更新與外部 Agent 市場候選以審核建議呈現。",
+ "月報首次實發前需要 owner review 與 canary receipt。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ },
+ {
+ "preview_id": "p2_405b_preview_high_risk_approval_card_v1",
+ "message_type": "high_risk_approval_card",
+ "title": "高風險審核卡 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "openclaw",
+ "risk_tier": "high",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-approval:{risk}:{work-item-id}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_high_risk_approval_card_v1",
+ "approval_required_before_send": true,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI 高風險 AI Agent 審核卡",
+ "列出候選動作、風險、rollback plan、verifier plan 與 owner 缺口。",
+ "審核卡不等於 runtime authorization,按鈕與指令預設不顯示。",
+ "OpenClaw 仲裁、Security gate 與 QA verifier 必須全部通過。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ },
+ {
+ "preview_id": "p2_405b_preview_failure_only_escalation_v1",
+ "message_type": "failure_only_escalation",
+ "title": "Failure-only 升級 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "sre_sentinel",
+ "risk_tier": "critical",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-failure:{alertname}:{target}:{window}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_failure_only_escalation_v1",
+ "approval_required_before_send": true,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI failure-only 升級通知",
+ "只在失敗、阻擋或高風險審核缺口時產生,不發成功噪音。",
+ "包含 blocker summary、下一步、owner 欄位與 verifier plan。",
+ "任何修復執行仍需獨立批准與 post-action verifier。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ },
+ {
+ "preview_id": "p2_405b_preview_report_receipt_gap_alert_v1",
+ "message_type": "report_receipt_gap_alert",
+ "title": "報表回執缺口 no-send 預覽",
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "owner_agent": "telegram_ops_liaison",
+ "risk_tier": "medium",
+ "status": "preview_ready_no_send",
+ "dedup_key": "awoooi:agent-receipt-gap:{message-type}:{window}:v1",
+ "receipt_expectation_id": "p2_405b_receipt_report_receipt_gap_alert_v1",
+ "approval_required_before_send": true,
+ "canary_required_before_live": true,
+ "send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "sanitized_body_lines": [
+ "AWOOOI 報表回執缺口提示",
+ "用來指出 preview hash、dedup key、canary receipt 或 readback evidence 不完整。",
+ "此提示本身仍是 no-send preview,不寫 delivery receipt。",
+ "修復方向只產生 owner review 項目,不自動改 Gateway。"
+ ],
+ "redaction_checks": [
+ "不含機密明文",
+ "不含未遮罩工作上下文",
+ "不含未遮罩 runtime payload",
+ "不含可執行修復指令",
+ "不含誤導性成功宣告"
+ ]
+ }
+ ],
+ "dedup_policy": {
+ "required": true,
+ "key_count": 6,
+ "collision_policy": "drop_duplicate_and_raise_preview_gap_without_send",
+ "preview_hash_algorithm": "sha256_preview_only",
+ "live_cache_write_enabled": false,
+ "keys": [
+ {
+ "message_type": "daily_agent_workload_digest",
+ "key_template": "awoooi:agent-report:daily:{yyyy-mm-dd}:v1",
+ "owner_agent": "hermes",
+ "risk_tier": "low",
+ "window": "daily",
+ "live_cache_write_enabled": false
+ },
+ {
+ "message_type": "weekly_governance_summary",
+ "key_template": "awoooi:agent-report:weekly:{iso-week}:v1",
+ "owner_agent": "hermes",
+ "risk_tier": "medium",
+ "window": "event_or_cadence_window",
+ "live_cache_write_enabled": false
+ },
+ {
+ "message_type": "monthly_growth_report",
+ "key_template": "awoooi:agent-report:monthly:{yyyy-mm}:v1",
+ "owner_agent": "hermes",
+ "risk_tier": "medium",
+ "window": "event_or_cadence_window",
+ "live_cache_write_enabled": false
+ },
+ {
+ "message_type": "high_risk_approval_card",
+ "key_template": "awoooi:agent-approval:{risk}:{work-item-id}:v1",
+ "owner_agent": "openclaw",
+ "risk_tier": "high",
+ "window": "event_or_cadence_window",
+ "live_cache_write_enabled": false
+ },
+ {
+ "message_type": "failure_only_escalation",
+ "key_template": "awoooi:agent-failure:{alertname}:{target}:{window}:v1",
+ "owner_agent": "sre_sentinel",
+ "risk_tier": "critical",
+ "window": "event_or_cadence_window",
+ "live_cache_write_enabled": false
+ },
+ {
+ "message_type": "report_receipt_gap_alert",
+ "key_template": "awoooi:agent-receipt-gap:{message-type}:{window}:v1",
+ "owner_agent": "telegram_ops_liaison",
+ "risk_tier": "medium",
+ "window": "event_or_cadence_window",
+ "live_cache_write_enabled": false
+ }
+ ]
+ },
+ "queue_preview_readback": {
+ "enabled": true,
+ "preview_only": true,
+ "write_enabled": false,
+ "readback_enabled": true,
+ "envelope_fields": [
+ "message_type",
+ "dedup_key",
+ "sanitized_preview_hash",
+ "target_room_env_ref",
+ "risk_tier",
+ "approval_gate"
+ ],
+ "readback_checks": [
+ "preview hash 必須與治理頁顯示一致",
+ "dedup key 必須唯一",
+ "target room 只能顯示 env ref",
+ "所有 send / queue / bot flags 必須為 false"
+ ]
+ },
+ "receipt_expectations": [
+ {
+ "receipt_id": "p2_405b_receipt_daily_agent_workload_digest_v1",
+ "message_type": "daily_agent_workload_digest",
+ "preview_id": "p2_405b_preview_daily_agent_workload_digest_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ },
+ {
+ "receipt_id": "p2_405b_receipt_weekly_governance_summary_v1",
+ "message_type": "weekly_governance_summary",
+ "preview_id": "p2_405b_preview_weekly_governance_summary_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ },
+ {
+ "receipt_id": "p2_405b_receipt_monthly_growth_report_v1",
+ "message_type": "monthly_growth_report",
+ "preview_id": "p2_405b_preview_monthly_growth_report_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ },
+ {
+ "receipt_id": "p2_405b_receipt_high_risk_approval_card_v1",
+ "message_type": "high_risk_approval_card",
+ "preview_id": "p2_405b_preview_high_risk_approval_card_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ },
+ {
+ "receipt_id": "p2_405b_receipt_failure_only_escalation_v1",
+ "message_type": "failure_only_escalation",
+ "preview_id": "p2_405b_preview_failure_only_escalation_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ },
+ {
+ "receipt_id": "p2_405b_receipt_report_receipt_gap_alert_v1",
+ "message_type": "report_receipt_gap_alert",
+ "preview_id": "p2_405b_preview_report_receipt_gap_alert_v1",
+ "expected_signal": "preview_hash_and_dedup_key_match_after_approved_canary",
+ "required_evidence_refs": [
+ "sanitized_preview_hash",
+ "dedup_key",
+ "target_room_env_ref",
+ "canary_window_ref",
+ "gateway_preview_readback_ref"
+ ],
+ "receipt_write_enabled": false,
+ "production_receipt_readback_enabled": false,
+ "missing_receipt_policy": "create_report_receipt_gap_alert_preview_only"
+ }
+ ],
+ "canary_approval_package": {
+ "package_id": "p2_405b_telegram_canary_approval_package_v1",
+ "status": "blocked_until_explicit_approval",
+ "package_ready": true,
+ "approval_required": true,
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "arbiter": "openclaw",
+ "owner_agent": "telegram_ops_liaison",
+ "reviewers": [
+ "security_sentinel",
+ "qa_verifier",
+ "hermes"
+ ],
+ "message_type_scope": [
+ "daily_agent_workload_digest",
+ "weekly_governance_summary",
+ "monthly_growth_report",
+ "high_risk_approval_card",
+ "failure_only_escalation",
+ "report_receipt_gap_alert"
+ ],
+ "required_approval_inputs": [
+ "統帥批准 canary 時間窗",
+ "可接受的單一訊息類型",
+ "mute / rollback plan",
+ "receipt readback owner",
+ "失敗時停止條件"
+ ],
+ "approval_checklist": [
+ "OpenClaw 仲裁通過",
+ "Security redaction gate 通過",
+ "QA verifier 確認 no-send preview 與 receipt expectation",
+ "Hermes 確認報告真實性 gate",
+ "Telegram Ops 確認 dedup 與 rate-limit plan"
+ ],
+ "live_send_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false
+ },
+ "no_send_preview_completion_percent": 100,
+ "canary_approval_package_completion_percent": 100,
+ "canary_send_approval_packet": {
+ "packet_id": "p2_405c_approved_canary_send_approval_packet_v1",
+ "status": "waiting_explicit_commander_approval",
+ "packet_ready": true,
+ "approval_required": true,
+ "approval_granted": false,
+ "recommended_first_message_type": "daily_agent_workload_digest",
+ "selected_message_type": "not_selected",
+ "eligible_message_types": [
+ "daily_agent_workload_digest",
+ "weekly_governance_summary",
+ "monthly_growth_report",
+ "high_risk_approval_card",
+ "failure_only_escalation",
+ "report_receipt_gap_alert"
+ ],
+ "target_room_alias": "awoooi_sre_war_room_env_ref",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "target_room_value_visible": false,
+ "proposed_time_window": "waiting_commander_input",
+ "owner_agent": "telegram_ops_liaison",
+ "arbiter": "openclaw",
+ "reviewers": [
+ "security_sentinel",
+ "qa_verifier",
+ "hermes"
+ ],
+ "operator_approval_fields": [
+ {
+ "field_id": "commander_approval",
+ "label": "統帥批准 canary 實發",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "selected_message_type",
+ "label": "單一訊息類型",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "scheduled_window",
+ "label": "發送時間窗",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "target_room_env_ref",
+ "label": "目標群組 env ref",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "mute_rollback_plan",
+ "label": "mute / rollback plan",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "receipt_readback_owner",
+ "label": "receipt readback owner",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "failure_stop_condition",
+ "label": "失敗停止條件",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ }
+ ],
+ "rate_limit_plan": {
+ "max_messages": 1,
+ "window": "single_canary_only",
+ "cooldown_after_attempt_minutes": 60,
+ "duplicate_policy": "dedup_key_must_drop_duplicate_before_send",
+ "live_rate_limit_write_enabled": false
+ },
+ "mute_rollback_plan": [
+ "若 preview hash 與 approval packet 不一致,停止 canary。",
+ "若 dedup key collision 或 receipt expectation 缺欄位,停止 canary。",
+ "若 Telegram Gateway 回報未知錯誤,停止後只產 report_receipt_gap_alert preview。",
+ "若訊息內容被 Security / QA 判定含敏感或誤導語意,停止 canary。",
+ "若超過指定時間窗未發送,批准自動過期。"
+ ],
+ "receipt_readback_plan": {
+ "owner_agent": "hermes",
+ "required_checks": [
+ "preview_id 對應已批准 message_type",
+ "dedup_key 對應 approved packet",
+ "target_room 只以 env ref 比對",
+ "gateway envelope hash 對應 no-send preview hash",
+ "delivery receipt 不含 token 或 chat id value",
+ "failure path 只產 no-send receipt gap preview"
+ ],
+ "production_receipt_write_enabled": false,
+ "receipt_readback_enabled_before_send": false
+ },
+ "stop_conditions": [
+ "未取得統帥明確批准",
+ "未選定單一訊息類型",
+ "未指定時間窗",
+ "redaction / QA / OpenClaw 任一 gate 失敗",
+ "dedup key 不唯一或 preview hash 不一致",
+ "Gateway、Bot API 或 receipt write 任一 flag 不是 false"
+ ],
+ "execution_flags": {
+ "canary_send_execution_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false,
+ "secret_read_enabled": false,
+ "paid_api_enabled": false
+ },
+ "approval_decision_log": []
+ },
+ "canary_send_approval_packet_ready": true,
+ "canary_send_approval_granted": false,
+ "canary_send_execution_enabled": false,
+ "canary_send_approval_packet_completion_percent": 100,
+ "canary_delivery_gate": {
+ "gate_id": "p2_405d_canary_delivery_gate_v1",
+ "status": "blocked_waiting_commander_delivery_fields",
+ "gate_ready": true,
+ "delivery_approved": false,
+ "delivery_attempt_allowed": false,
+ "selected_message_type": "not_selected",
+ "selected_message_type_source": "waiting_commander_input",
+ "target_room_alias": "AwoooI SRE 戰情室",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "target_room_value_visible": false,
+ "target_room_verified": false,
+ "proposed_time_window": "waiting_commander_input",
+ "approved_time_window": "not_approved",
+ "owner_agent": "telegram_ops_liaison",
+ "arbiter": "openclaw",
+ "reviewers": [
+ "security_sentinel",
+ "qa_verifier",
+ "hermes",
+ "sre_sentinel"
+ ],
+ "required_delivery_fields": [
+ {
+ "field_id": "commander_delivery_approval",
+ "label": "統帥批准本次 canary delivery",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "selected_message_type",
+ "label": "單一訊息類型",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "delivery_time_window",
+ "label": "交付時間窗",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "target_room_env_ref",
+ "label": "目標群組 env ref",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "receipt_readback_owner",
+ "label": "receipt readback owner",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "mute_rollback_plan",
+ "label": "mute / rollback plan",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "failure_stop_condition",
+ "label": "失敗停止條件",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "dry_run_readback_ref",
+ "label": "dry-run readback evidence ref",
+ "required": true,
+ "current_value_status": "waiting_input",
+ "value_display_allowed": false
+ }
+ ],
+ "preflight_checks": [
+ "packet_ready_true",
+ "approval_fields_complete",
+ "single_message_type_selected",
+ "time_window_approved",
+ "target_room_env_ref_only",
+ "dedup_key_reserved_preview_only",
+ "receipt_readback_owner_assigned",
+ "stop_condition_confirmed"
+ ],
+ "hold_reasons": [
+ "commander_delivery_approval_missing",
+ "selected_message_type_missing",
+ "delivery_time_window_missing",
+ "receipt_readback_owner_missing",
+ "target_room_value_hidden",
+ "gateway_queue_write_disabled",
+ "bot_api_call_disabled"
+ ],
+ "delivery_attempt_plan": {
+ "max_messages": 1,
+ "dry_run_message_type": "daily_agent_workload_digest",
+ "dedup_key_template": "awoooi:agent-report:daily:{yyyy-mm-dd}:v1",
+ "send_mode": "blocked_no_send",
+ "live_delivery_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false,
+ "secret_read_enabled": false,
+ "paid_api_enabled": false
+ },
+ "readback_after_approval_plan": {
+ "owner_agent": "hermes",
+ "enabled_before_delivery": false,
+ "production_receipt_write_enabled": false,
+ "required_checks": [
+ "approved_packet_id_matches_delivery_gate",
+ "selected_message_type_matches_preview",
+ "dedup_key_matches_reserved_template",
+ "target_room_checked_by_env_ref_only",
+ "gateway_envelope_hash_matches_preview",
+ "receipt_owner_acknowledged",
+ "failure_path_keeps_no_send_receipt_gap_preview"
+ ]
+ },
+ "rollback_mute_controls": [
+ "approval_expires_outside_time_window",
+ "mute_if_gateway_error_unknown",
+ "mute_if_receipt_missing_after_window",
+ "rollback_to_no_send_preview_only",
+ "escalate_action_required_preview_only"
+ ],
+ "execution_flags": {
+ "live_delivery_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false,
+ "secret_read_enabled": false,
+ "paid_api_enabled": false
+ },
+ "delivery_decision_log": []
+ },
+ "canary_delivery_gate_ready": true,
+ "canary_delivery_approved": false,
+ "canary_delivery_attempt_allowed": false,
+ "canary_delivery_gate_completion_percent": 100,
+ "canary_delivery_rehearsal": {
+ "rehearsal_id": "p2_405e_canary_dry_run_delivery_rehearsal_v1",
+ "status": "ready_no_send_rehearsal",
+ "rehearsal_ready": true,
+ "selected_message_type": "daily_agent_workload_digest",
+ "selected_preview_id": "p2_405b_preview_daily_agent_workload_digest_v1",
+ "selected_receipt_expectation_id": "p2_405b_receipt_daily_agent_workload_digest_v1",
+ "target_room_alias": "AwoooI SRE 戰情室",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "target_room_value_visible": false,
+ "dry_run_window": "2026-06-18T12:00:00+08:00/2026-06-18T13:00:00+08:00",
+ "preview_hash_algorithm": "sha256_preview_only",
+ "sanitized_preview_hash": "sha256:preview-only-daily-agent-workload-digest-p2-405e",
+ "dedup_key": "awoooi:agent-report:daily:2026-06-18:v1",
+ "gateway_envelope_preview": {
+ "message_type": "daily_agent_workload_digest",
+ "target_room_env_ref": "SRE_GROUP_CHAT_ID",
+ "dedup_key": "awoooi:agent-report:daily:2026-06-18:v1",
+ "preview_hash": "sha256:preview-only-daily-agent-workload-digest-p2-405e",
+ "risk_tier": "low",
+ "queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "telegram_send_enabled": false,
+ "delivery_receipt_write_enabled": false
+ },
+ "dry_run_steps": [
+ "選定 daily_agent_workload_digest 作為單一 canary rehearsal 訊息。",
+ "用 no-send preview 產生固定 preview hash 與 dedup key。",
+ "產生 Gateway envelope preview,但不寫入 Gateway queue。",
+ "Hermes 讀回 receipt expectation 與 preview hash 對應。",
+ "OpenClaw 確認此 rehearsal 不等於 runtime 授權或 Bot API 實發。",
+ "QA 確認失敗路徑只產 report_receipt_gap_alert preview。"
+ ],
+ "readback_drill": {
+ "owner_agent": "hermes",
+ "required_checks": [
+ "preview_id_matches_selected_message_type",
+ "dedup_key_is_single_use_for_window",
+ "target_room_value_hidden_env_ref_only",
+ "gateway_envelope_preview_has_all_send_flags_false",
+ "receipt_expectation_matches_selected_preview",
+ "failure_path_creates_no_send_receipt_gap_preview",
+ "no_secret_or_chat_id_value_visible",
+ "no_runtime_authorization_implied"
+ ],
+ "completed_check_count": 8,
+ "failed_check_count": 0,
+ "production_receipt_write_enabled": false,
+ "live_receipt_readback_enabled": false
+ },
+ "stop_conditions": [
+ "preview_hash_mismatch",
+ "dedup_key_collision",
+ "target_room_value_exposed",
+ "any_send_flag_true",
+ "receipt_expectation_missing",
+ "secret_or_runtime_payload_detected",
+ "operator_attempts_to_treat_rehearsal_as_delivery"
+ ],
+ "rollback_mute_controls": [
+ "keep_all_messages_no_send_preview_only",
+ "mute_daily_digest_until_new_rehearsal_hash",
+ "raise_report_receipt_gap_alert_preview_only",
+ "return_to_p2_405d_delivery_gate_if_any_check_fails",
+ "require_new_owner_review_before_p2_405f"
+ ],
+ "execution_flags": {
+ "live_delivery_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "telegram_send_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false,
+ "secret_read_enabled": false,
+ "paid_api_enabled": false
+ },
+ "next_gate": "P2-405F canary live delivery approval after rehearsal readback"
+ },
+ "canary_delivery_rehearsal_ready": true,
+ "canary_delivery_rehearsal_completion_percent": 100,
+ "canary_live_delivery_owner_review_gate": {
+ "gate_id": "p2_405f_canary_live_delivery_owner_review_gate_v1",
+ "status": "ready_for_owner_review_no_send",
+ "gate_ready": true,
+ "approval_required": true,
+ "owner_review_received": false,
+ "owner_review_accepted": false,
+ "live_canary_delivery_approved": false,
+ "delivery_attempt_allowed": false,
+ "prior_rehearsal_id": "p2_405e_canary_dry_run_delivery_rehearsal_v1",
+ "prior_rehearsal_status": "ready_no_send_rehearsal",
+ "prior_readback_completed_check_count": 8,
+ "prior_readback_failed_check_count": 0,
+ "selected_message_type": "daily_agent_workload_digest",
+ "selected_preview_id": "p2_405b_preview_daily_agent_workload_digest_v1",
+ "selected_receipt_expectation_id": "p2_405b_receipt_daily_agent_workload_digest_v1",
+ "target_room_alias": "AwoooI SRE 戰情室",
+ "target_room_env": "SRE_GROUP_CHAT_ID",
+ "target_room_value_visible": false,
+ "dedup_key": "awoooi:agent-report:daily:2026-06-18:v1",
+ "sanitized_preview_hash": "sha256:preview-only-daily-agent-workload-digest-p2-405e",
+ "owner_agent": "telegram_ops_liaison",
+ "receipt_readback_owner": "hermes",
+ "arbiter": "openclaw",
+ "reviewers": [
+ "openclaw",
+ "hermes",
+ "sre_sentinel",
+ "security_sentinel",
+ "qa_verifier"
+ ],
+ "required_owner_fields": [
+ {
+ "field_id": "commander_live_canary_approval",
+ "label": "統帥是否批准單一 canary 實發",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "approved_delivery_window",
+ "label": "批准實發時間窗",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "selected_message_type_confirmation",
+ "label": "確認只發 daily_agent_workload_digest",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "target_room_env_confirmation",
+ "label": "確認目標只使用 SRE_GROUP_CHAT_ID env ref",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "dedup_key_confirmation",
+ "label": "確認 dedup key 單一窗口使用",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "preview_hash_confirmation",
+ "label": "確認 preview hash 與 dry-run readback 一致",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "mute_rollback_owner",
+ "label": "指定 mute / rollback owner",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "receipt_readback_owner_confirmation",
+ "label": "確認 Hermes 回執讀回 owner",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ },
+ {
+ "field_id": "failure_stop_condition_confirmation",
+ "label": "確認任一失敗即停,不重試洗版",
+ "required": true,
+ "current_value_status": "waiting_owner_response",
+ "value_display_allowed": false
+ }
+ ],
+ "acceptance_checks": [
+ "owner_response_is_explicit_and_single_message_only",
+ "approved_window_is_bounded_and_future",
+ "target_room_value_remains_hidden_env_ref_only",
+ "preview_hash_matches_p2_405e_rehearsal",
+ "dedup_key_matches_p2_405e_rehearsal",
+ "mute_rollback_owner_is_named",
+ "receipt_readback_owner_is_hermes",
+ "openclaw_security_qa_review_all_pass",
+ "all_send_write_flags_remain_false_until_next_gate"
+ ],
+ "rejection_reasons": [
+ "missing_commander_explicit_approval",
+ "message_type_scope_expanded",
+ "unbounded_or_past_delivery_window",
+ "target_room_value_or_secret_visible",
+ "preview_hash_or_dedup_mismatch",
+ "rollback_mute_owner_missing",
+ "receipt_readback_owner_missing",
+ "any_send_or_write_flag_enabled"
+ ],
+ "reviewer_actions": [
+ "approve_for_next_gate_only",
+ "request_owner_field_fix",
+ "reject_and_return_to_no_send_preview",
+ "mute_canary_window",
+ "route_to_manual_telegram_ops_review",
+ "hold_until_receipt_readback_plan_updated"
+ ],
+ "receipt_readback_plan": {
+ "owner_agent": "hermes",
+ "required_checks": [
+ "owner_review_record_exists",
+ "accepted_owner_fields_match_required_fields",
+ "preview_hash_matches_rehearsal_hash",
+ "dedup_key_matches_rehearsal_key",
+ "target_room_env_ref_only_no_value",
+ "gateway_envelope_still_no_send",
+ "failure_path_has_mute_and_rollback_owner",
+ "next_gate_requires_separate_live_send_approval"
+ ],
+ "completed_check_count": 0,
+ "failed_check_count": 0,
+ "production_receipt_write_enabled": false,
+ "live_receipt_readback_enabled": false
+ },
+ "execution_flags": {
+ "live_delivery_enabled": false,
+ "gateway_queue_write_enabled": false,
+ "bot_api_call_enabled": false,
+ "telegram_send_enabled": false,
+ "delivery_receipt_write_enabled": false,
+ "production_write_enabled": false,
+ "secret_read_enabled": false,
+ "paid_api_enabled": false
+ },
+ "owner_decision_log": [],
+ "next_gate": "P2-406B receipt readback owner review before any live canary send"
+ },
+ "canary_live_delivery_owner_review_ready": true,
+ "canary_live_delivery_owner_review_received": false,
+ "canary_live_delivery_owner_review_accepted": false,
+ "canary_live_delivery_approved": false,
+ "canary_live_delivery_owner_review_completion_percent": 100
+ },
+ "professional_task_domains": [
+ {
+ "domain_id": "sre_observability",
+ "label": "SRE / Observability",
+ "owner_agent": "sre_sentinel"
+ },
+ {
+ "domain_id": "security_iwooos",
+ "label": "Security / IwoooS",
+ "owner_agent": "security_sentinel"
+ },
+ {
+ "domain_id": "devops_release",
+ "label": "DevOps / Release",
+ "owner_agent": "devops_commander"
+ },
+ {
+ "domain_id": "data_dr",
+ "label": "Data / Backup / DR",
+ "owner_agent": "data_dr_guardian"
+ },
+ {
+ "domain_id": "supply_chain",
+ "label": "Supply Chain / Versions",
+ "owner_agent": "supply_chain_scout"
+ },
+ {
+ "domain_id": "product_quality",
+ "label": "Product / UI / QA",
+ "owner_agent": "product_ui_curator"
+ },
+ {
+ "domain_id": "ai_governance",
+ "label": "AI Governance / Replay / Market",
+ "owner_agent": "openclaw"
+ },
+ {
+ "domain_id": "telegram_reporting",
+ "label": "Telegram / Reports / Receipts",
+ "owner_agent": "telegram_ops_liaison"
+ }
+ ],
+ "professional_tasks": [
+ {
+ "task_id": "pro_task_001_incident_correlation",
+ "title": "跨來源 incident correlation 與根因候選排序",
+ "domain_id": "sre_observability",
+ "owner_agent": "sre_sentinel",
+ "supporting_agents": [
+ "openclaw",
+ "hermes"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "no_write_dry_run",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "observability",
+ "gitea",
+ "browser"
+ ],
+ "required_rag": [
+ "incident_traces",
+ "runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "alert_rule_change",
+ "silence_change",
+ "restart_service"
+ ]
+ },
+ {
+ "task_id": "pro_task_002_alert_noise_budget",
+ "title": "告警噪音預算與降噪提案",
+ "domain_id": "sre_observability",
+ "owner_agent": "sre_sentinel",
+ "supporting_agents": [
+ "hermes",
+ "openclaw"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "prometheus",
+ "alertmanager"
+ ],
+ "required_rag": [
+ "alert_traces",
+ "runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "receiver_route_change",
+ "silence_policy_change",
+ "prometheus_reload"
+ ]
+ },
+ {
+ "task_id": "pro_task_003_synthetic_check_plan",
+ "title": "公開路由 synthetic check 與失敗分類計畫",
+ "domain_id": "sre_observability",
+ "owner_agent": "qa_verifier",
+ "supporting_agents": [
+ "product_ui_curator",
+ "sre_sentinel"
+ ],
+ "risk_tier": "low",
+ "automation_mode": "auto_summary_after_guard",
+ "telegram_policy": "daily_digest",
+ "required_mcp": [
+ "browser",
+ "http_probe"
+ ],
+ "required_rag": [
+ "route_runbooks"
+ ],
+ "approval_required": false,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "active_scan",
+ "production_write"
+ ]
+ },
+ {
+ "task_id": "pro_task_004_backup_restore_readiness",
+ "title": "備份 freshness、restore drill 與 DR readiness 報告",
+ "domain_id": "data_dr",
+ "owner_agent": "data_dr_guardian",
+ "supporting_agents": [
+ "hermes",
+ "openclaw"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "approval_required_before_execution",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "backup_status",
+ "gitea"
+ ],
+ "required_rag": [
+ "dr_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "restore_run",
+ "offsite_sync",
+ "credential_escrow_marker_write"
+ ]
+ },
+ {
+ "task_id": "pro_task_005_non_secret_escrow_evidence",
+ "title": "credential escrow 非敏感證據補件路由",
+ "domain_id": "data_dr",
+ "owner_agent": "data_dr_guardian",
+ "supporting_agents": [
+ "security_sentinel",
+ "hermes"
+ ],
+ "risk_tier": "critical",
+ "automation_mode": "blocked_until_owner_response",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea"
+ ],
+ "required_rag": [
+ "dr_runbooks",
+ "hard_rules"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "secret_value_collection",
+ "credential_read",
+ "marker_write_without_owner"
+ ]
+ },
+ {
+ "task_id": "pro_task_006_dependency_cve_triage",
+ "title": "依賴 CVE / EOL / license 風險分流",
+ "domain_id": "supply_chain",
+ "owner_agent": "supply_chain_scout",
+ "supporting_agents": [
+ "openclaw",
+ "security_sentinel"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "package_registry",
+ "osv"
+ ],
+ "required_rag": [
+ "dependency_policy"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "package_upgrade",
+ "lockfile_write",
+ "external_scan_without_approval"
+ ]
+ },
+ {
+ "task_id": "pro_task_007_sbom_license_drift",
+ "title": "SBOM / license / Docker surface drift 批准包",
+ "domain_id": "supply_chain",
+ "owner_agent": "supply_chain_scout",
+ "supporting_agents": [
+ "hermes",
+ "security_sentinel"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "syft",
+ "trivy"
+ ],
+ "required_rag": [
+ "supply_chain_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "tool_install",
+ "image_pull",
+ "sbom_upload"
+ ]
+ },
+ {
+ "task_id": "pro_task_008_image_digest_pin_plan",
+ "title": "Docker image digest pinning 與 rollback 計畫",
+ "domain_id": "supply_chain",
+ "owner_agent": "devops_commander",
+ "supporting_agents": [
+ "supply_chain_scout",
+ "qa_verifier"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "approval_required_before_execution",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "registry",
+ "gitea"
+ ],
+ "required_rag": [
+ "release_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "image_pull",
+ "image_push",
+ "kustomization_write_without_review"
+ ]
+ },
+ {
+ "task_id": "pro_task_009_gitops_diff_review",
+ "title": "K8s / ArgoCD manifest diff 與 blast-radius review",
+ "domain_id": "devops_release",
+ "owner_agent": "devops_commander",
+ "supporting_agents": [
+ "openclaw",
+ "qa_verifier"
+ ],
+ "risk_tier": "critical",
+ "automation_mode": "approval_required_before_execution",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea",
+ "argocd"
+ ],
+ "required_rag": [
+ "gitops_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "argocd_sync",
+ "kubectl_apply",
+ "helm_upgrade"
+ ]
+ },
+ {
+ "task_id": "pro_task_010_gateway_route_impact",
+ "title": "Nginx / public gateway route impact analysis",
+ "domain_id": "devops_release",
+ "owner_agent": "devops_commander",
+ "supporting_agents": [
+ "security_sentinel",
+ "qa_verifier"
+ ],
+ "risk_tier": "critical",
+ "automation_mode": "approval_required_before_execution",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea",
+ "browser"
+ ],
+ "required_rag": [
+ "gateway_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "nginx_reload",
+ "route_change",
+ "certbot_renew"
+ ]
+ },
+ {
+ "task_id": "pro_task_011_public_bundle_redaction",
+ "title": "前台 bundle / DOM / i18n 敏感資訊防洩漏掃描",
+ "domain_id": "security_iwooos",
+ "owner_agent": "security_sentinel",
+ "supporting_agents": [
+ "product_ui_curator",
+ "qa_verifier"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "no_write_dry_run",
+ "telegram_policy": "daily_digest",
+ "required_mcp": [
+ "browser",
+ "gitea"
+ ],
+ "required_rag": [
+ "hard_rules"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "frontend_deploy_without_smoke",
+ "secret_storage"
+ ]
+ },
+ {
+ "task_id": "pro_task_012_secret_metadata_parity",
+ "title": "Secret name parity、injection route 與 redaction gate",
+ "domain_id": "security_iwooos",
+ "owner_agent": "security_sentinel",
+ "supporting_agents": [
+ "devops_commander",
+ "openclaw"
+ ],
+ "risk_tier": "critical",
+ "automation_mode": "blocked_until_owner_response",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea"
+ ],
+ "required_rag": [
+ "secret_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "secret_value_read",
+ "secret_rotation",
+ "workflow_modification"
+ ]
+ },
+ {
+ "task_id": "pro_task_013_telegram_digest_preview",
+ "title": "AI Agent 日週月報 Telegram no-send preview",
+ "domain_id": "telegram_reporting",
+ "owner_agent": "telegram_ops_liaison",
+ "supporting_agents": [
+ "hermes",
+ "qa_verifier"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "no_write_dry_run",
+ "telegram_policy": "no_direct_telegram",
+ "required_mcp": [
+ "telegram_gateway"
+ ],
+ "required_rag": [
+ "logbook_chunks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "telegram_send",
+ "bot_api_call",
+ "gateway_queue_write"
+ ]
+ },
+ {
+ "task_id": "pro_task_014_report_truth_gate",
+ "title": "日報 / 週報 / 月報 truth gate 與可處置性審查",
+ "domain_id": "telegram_reporting",
+ "owner_agent": "hermes",
+ "supporting_agents": [
+ "openclaw",
+ "sre_sentinel"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "auto_summary_after_guard",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "gitea",
+ "observability"
+ ],
+ "required_rag": [
+ "logbook_chunks",
+ "incident_traces"
+ ],
+ "approval_required": false,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "false_green_report",
+ "report_send_without_truth_gate"
+ ]
+ },
+ {
+ "task_id": "pro_task_015_agent_market_watch",
+ "title": "主流 AI Agent / SDK / 模型版本市場雷達",
+ "domain_id": "ai_governance",
+ "owner_agent": "market_scout",
+ "supporting_agents": [
+ "openclaw",
+ "nemotron"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "web_primary_sources",
+ "gitea"
+ ],
+ "required_rag": [
+ "agent_market_evidence"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "sdk_install",
+ "paid_api_call",
+ "production_route_change"
+ ]
+ },
+ {
+ "task_id": "pro_task_016_model_replay_scorecard",
+ "title": "NemoTron / 候選模型 replay scorecard 與 failure mode 分析",
+ "domain_id": "ai_governance",
+ "owner_agent": "nemotron",
+ "supporting_agents": [
+ "openclaw",
+ "qa_verifier"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "no_write_dry_run",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "fixture_store",
+ "gitea"
+ ],
+ "required_rag": [
+ "replay_fixtures"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "shadow_route",
+ "canary_route",
+ "full_replay_without_approval"
+ ]
+ },
+ {
+ "task_id": "pro_task_017_cost_capacity_forecast",
+ "title": "AI provider、主機、K3s 與外部服務成本 / 容量預測",
+ "domain_id": "ai_governance",
+ "owner_agent": "openclaw",
+ "supporting_agents": [
+ "supply_chain_scout",
+ "sre_sentinel"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "monthly_digest",
+ "required_mcp": [
+ "observability",
+ "billing_metadata"
+ ],
+ "required_rag": [
+ "cost_policy"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "paid_provider_switch",
+ "limit_increase",
+ "paid_api_call"
+ ]
+ },
+ {
+ "task_id": "pro_task_018_db_query_triage",
+ "title": "PostgreSQL 慢查詢、索引與資料新鮮度異常 triage",
+ "domain_id": "sre_observability",
+ "owner_agent": "sre_sentinel",
+ "supporting_agents": [
+ "data_dr_guardian",
+ "openclaw"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "database_readonly",
+ "observability"
+ ],
+ "required_rag": [
+ "db_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "migration",
+ "reindex",
+ "write_query"
+ ]
+ },
+ {
+ "task_id": "pro_task_019_data_freshness_source_reliability",
+ "title": "資料來源新鮮度、fallback 與來源可信度監控",
+ "domain_id": "data_dr",
+ "owner_agent": "hermes",
+ "supporting_agents": [
+ "sre_sentinel",
+ "qa_verifier"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "auto_summary_after_guard",
+ "telegram_policy": "daily_digest",
+ "required_mcp": [
+ "http_probe",
+ "database_readonly"
+ ],
+ "required_rag": [
+ "data_quality_runbooks"
+ ],
+ "approval_required": false,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "source_switch_without_owner",
+ "data_write"
+ ]
+ },
+ {
+ "task_id": "pro_task_020_ui_accessibility_regression",
+ "title": "前後台 mobile overflow、console error、可讀性與 a11y regression",
+ "domain_id": "product_quality",
+ "owner_agent": "product_ui_curator",
+ "supporting_agents": [
+ "qa_verifier",
+ "security_sentinel"
+ ],
+ "risk_tier": "low",
+ "automation_mode": "auto_summary_after_guard",
+ "telegram_policy": "daily_digest",
+ "required_mcp": [
+ "browser"
+ ],
+ "required_rag": [
+ "frontend_guidelines"
+ ],
+ "approval_required": false,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "unrelated_redesign",
+ "public_secret_display"
+ ]
+ },
+ {
+ "task_id": "pro_task_021_runbook_postmortem_draft",
+ "title": "Runbook、postmortem 與 owner handoff 草稿",
+ "domain_id": "ai_governance",
+ "owner_agent": "hermes",
+ "supporting_agents": [
+ "openclaw",
+ "sre_sentinel"
+ ],
+ "risk_tier": "low",
+ "automation_mode": "auto_summary_after_guard",
+ "telegram_policy": "weekly_digest",
+ "required_mcp": [
+ "gitea"
+ ],
+ "required_rag": [
+ "logbook_chunks",
+ "runbooks"
+ ],
+ "approval_required": false,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "canonical_km_write_without_review",
+ "secret_in_doc"
+ ]
+ },
+ {
+ "task_id": "pro_task_022_owner_response_completeness",
+ "title": "Owner response 欄位完整性、補件與拒收分流",
+ "domain_id": "security_iwooos",
+ "owner_agent": "security_sentinel",
+ "supporting_agents": [
+ "hermes",
+ "openclaw"
+ ],
+ "risk_tier": "high",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea"
+ ],
+ "required_rag": [
+ "owner_response_templates"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "mark_accepted_without_reviewer",
+ "runtime_gate_open"
+ ]
+ },
+ {
+ "task_id": "pro_task_023_candidate_pr_draft_packaging",
+ "title": "低 / 中風險候選 PR 草案、測試與 rollback 封包",
+ "domain_id": "devops_release",
+ "owner_agent": "devops_commander",
+ "supporting_agents": [
+ "qa_verifier",
+ "openclaw"
+ ],
+ "risk_tier": "medium",
+ "automation_mode": "proposal_only",
+ "telegram_policy": "action_required_preview",
+ "required_mcp": [
+ "gitea"
+ ],
+ "required_rag": [
+ "release_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "branch_push_without_approval",
+ "auto_merge",
+ "workflow_trigger"
+ ]
+ },
+ {
+ "task_id": "pro_task_024_post_action_verifier",
+ "title": "Post-action verifier、rollback trigger 與 receipt reconciliation",
+ "domain_id": "telegram_reporting",
+ "owner_agent": "openclaw",
+ "supporting_agents": [
+ "telegram_ops_liaison",
+ "qa_verifier"
+ ],
+ "risk_tier": "critical",
+ "automation_mode": "approval_required_before_execution",
+ "telegram_policy": "failure_only_preview",
+ "required_mcp": [
+ "telegram_gateway",
+ "observability",
+ "gitea"
+ ],
+ "required_rag": [
+ "verification_runbooks"
+ ],
+ "approval_required": true,
+ "current_live_count_24h": 0,
+ "blocked_actions": [
+ "verifier_live_readback_without_gate",
+ "rollback_without_owner",
+ "telegram_send_without_receipt"
+ ]
+ }
+ ],
+ "mcp_rag_stack": {
+ "mcp_connectors": [
+ "gitea",
+ "browser",
+ "observability",
+ "telegram_gateway",
+ "package_registry",
+ "database_readonly",
+ "backup_status",
+ "argocd_readonly",
+ "http_probe",
+ "fixture_store"
+ ],
+ "rag_sources": [
+ "LOGBOOK chunks",
+ "HARD_RULES / ADR chunks",
+ "runbook chunks",
+ "incident / alert traces",
+ "agent market evidence",
+ "owner response templates"
+ ],
+ "growth_metrics": [
+ "km_entries_created",
+ "playbook_updates",
+ "recommendations_created",
+ "replay_score_delta",
+ "blocked_action_prevented_count",
+ "receipt_missing_count"
+ ]
+ },
+ "risk_policy": {
+ "low": "文件、報表、UI smoke 與只讀摘要可在 guard 後自動處理並進每日 digest。",
+ "medium": "中風險只能先產 proposal、no-write dry-run 或 PR 草案;涉及設定、外部服務、成本、路由或未知狀態時升級審核。",
+ "high": "高風險必須 OpenClaw 仲裁、QA / Security gate 與統帥批准;不得自動執行。",
+ "critical": "production write、kubectl、ArgoCD sync、Telegram 實發、secret、付費 API、restore、rollback、host write 均維持 blocked until explicit approval。"
+ },
+ "reporting_contract": {
+ "daily": {
+ "required": true,
+ "owner_agent": "hermes",
+ "telegram_stage": "tg_bridge_04_daily_weekly_monthly_digest"
+ },
+ "weekly": {
+ "required": true,
+ "owner_agent": "hermes",
+ "telegram_stage": "tg_bridge_04_daily_weekly_monthly_digest"
+ },
+ "monthly": {
+ "required": true,
+ "owner_agent": "hermes",
+ "telegram_stage": "tg_bridge_04_daily_weekly_monthly_digest"
+ },
+ "action_required": {
+ "required": true,
+ "owner_agent": "openclaw",
+ "telegram_stage": "tg_bridge_05_action_required_digest"
+ }
+ },
+ "redaction_contract": {
+ "redaction_required": true,
+ "conversation_transcript_display_allowed": false,
+ "raw_prompt_display_allowed": false,
+ "private_reasoning_display_allowed": false,
+ "secret_value_display_allowed": false,
+ "raw_runtime_payload_display_allowed": false,
+ "telegram_message_must_be_sanitized": true,
+ "forbidden_terms": [
+ "work_window_transcript",
+ "raw prompt",
+ "private reasoning",
+ "chain-of-thought",
+ "telegram token",
+ "authorization header",
+ "secret value"
+ ],
+ "frontend_display_policy": "前端與 Telegram preview 只顯示脫敏摘要、env ref、dedup key、preview hash 與審核狀態;不得顯示工作視窗對話、未遮罩提示、私有推理、機密明文或未遮罩 runtime payload。",
+ "message_preview_redaction_checks": [
+ "conversation_context_redacted",
+ "prompt_surface_redacted",
+ "runtime_payload_redacted",
+ "credential_material_absent",
+ "action_button_absent",
+ "execution_claim_absent"
+ ],
+ "canary_packet_redaction_checks": [
+ "target_room_value_hidden",
+ "bot_token_absent",
+ "operator_input_value_hidden",
+ "no_runtime_payload",
+ "collaboration_context_redacted",
+ "no_action_button"
+ ],
+ "canary_delivery_redaction_checks": [
+ "target_room_value_hidden",
+ "operator_input_value_hidden",
+ "runtime_payload_redacted",
+ "collaboration_context_redacted",
+ "credential_material_absent",
+ "action_button_absent"
+ ]
+ },
+ "rollups": {
+ "professional_task_count": 24,
+ "domain_count": 8,
+ "telegram_stage_count": 5,
+ "telegram_message_type_count": 6,
+ "approval_required_count": 19,
+ "low_risk_task_count": 3,
+ "medium_risk_task_count": 10,
+ "high_risk_task_count": 6,
+ "critical_risk_task_count": 5,
+ "current_live_count": 0,
+ "gateway_queue_write_count": 0,
+ "telegram_send_count": 0,
+ "bot_api_call_count": 0,
+ "delivery_receipt_write_count": 0,
+ "production_write_count": 0,
+ "secret_read_count": 0,
+ "paid_api_call_count": 0,
+ "host_write_count": 0,
+ "kubectl_action_count": 0,
+ "no_send_preview_count": 6,
+ "dedup_key_count": 6,
+ "receipt_expectation_count": 6,
+ "canary_approval_package_count": 1,
+ "queue_preview_envelope_field_count": 6,
+ "canary_required_preview_count": 6,
+ "approval_required_preview_count": 4,
+ "preview_send_enabled_count": 0,
+ "preview_queue_write_enabled_count": 0,
+ "preview_bot_api_call_enabled_count": 0,
+ "receipt_live_write_enabled_count": 0,
+ "canary_live_send_enabled_count": 0,
+ "canary_send_approval_packet_count": 1,
+ "canary_operator_approval_field_count": 7,
+ "canary_stop_condition_count": 6,
+ "canary_rollback_mute_step_count": 5,
+ "canary_receipt_readback_check_count": 6,
+ "canary_approval_granted_count": 0,
+ "canary_selected_message_type_count": 0,
+ "canary_approved_time_window_count": 0,
+ "canary_send_execution_enabled_count": 0,
+ "canary_gateway_queue_write_enabled_count": 0,
+ "canary_bot_api_call_enabled_count": 0,
+ "canary_delivery_receipt_write_enabled_count": 0,
+ "canary_secret_read_enabled_count": 0,
+ "canary_delivery_gate_count": 1,
+ "canary_delivery_required_field_count": 8,
+ "canary_delivery_preflight_check_count": 8,
+ "canary_delivery_hold_reason_count": 7,
+ "canary_delivery_readback_check_count": 7,
+ "canary_delivery_rollback_mute_control_count": 5,
+ "canary_delivery_approved_count": 0,
+ "canary_delivery_attempt_allowed_count": 0,
+ "canary_delivery_live_send_enabled_count": 0,
+ "canary_delivery_gateway_queue_write_enabled_count": 0,
+ "canary_delivery_bot_api_call_enabled_count": 0,
+ "canary_delivery_secret_read_enabled_count": 0,
+ "canary_delivery_paid_api_enabled_count": 0,
+ "canary_delivery_rehearsal_count": 1,
+ "canary_delivery_rehearsal_step_count": 6,
+ "canary_delivery_rehearsal_readback_check_count": 8,
+ "canary_delivery_rehearsal_stop_condition_count": 7,
+ "canary_delivery_rehearsal_rollback_mute_control_count": 5,
+ "canary_delivery_rehearsal_completed_check_count": 8,
+ "canary_delivery_rehearsal_failed_check_count": 0,
+ "canary_delivery_rehearsal_live_send_enabled_count": 0,
+ "canary_delivery_rehearsal_gateway_queue_write_enabled_count": 0,
+ "canary_delivery_rehearsal_bot_api_call_enabled_count": 0,
+ "canary_delivery_rehearsal_receipt_write_enabled_count": 0,
+ "canary_live_delivery_owner_review_gate_count": 1,
+ "canary_live_delivery_owner_review_required_field_count": 9,
+ "canary_live_delivery_owner_review_acceptance_check_count": 9,
+ "canary_live_delivery_owner_review_rejection_reason_count": 8,
+ "canary_live_delivery_owner_review_reviewer_action_count": 6,
+ "canary_live_delivery_owner_review_receipt_check_count": 8,
+ "canary_live_delivery_owner_review_received_count": 0,
+ "canary_live_delivery_owner_review_accepted_count": 0,
+ "canary_live_delivery_approved_count": 0,
+ "canary_live_delivery_attempt_allowed_count": 0,
+ "canary_live_delivery_gateway_queue_write_enabled_count": 0,
+ "canary_live_delivery_bot_api_call_enabled_count": 0,
+ "canary_live_delivery_telegram_send_enabled_count": 0,
+ "canary_live_delivery_receipt_write_enabled_count": 0
+ }
+}
diff --git a/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json b/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json
index 8e624108a..8be219b4f 100644
--- a/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json
+++ b/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json
@@ -46,10 +46,10 @@
]
},
"current_task_id": {
- "const": "P2-405E"
+ "const": "P2-405F"
},
"next_task_id": {
- "const": "P2-405F"
+ "const": "P2-406B"
},
"overall_completion_percent": {
"type": "integer",
@@ -99,7 +99,8 @@
"canary_approval_package",
"canary_send_approval_packet",
"canary_delivery_gate",
- "canary_delivery_rehearsal"
+ "canary_delivery_rehearsal",
+ "canary_live_delivery_owner_review_gate"
],
"properties": {
"canonical_room": {
@@ -710,6 +711,174 @@
}
},
"additionalProperties": true
+ },
+ "canary_live_delivery_owner_review_gate": {
+ "type": "object",
+ "required": [
+ "gate_id",
+ "status",
+ "gate_ready",
+ "approval_required",
+ "owner_review_received",
+ "owner_review_accepted",
+ "live_canary_delivery_approved",
+ "delivery_attempt_allowed",
+ "prior_rehearsal_id",
+ "prior_readback_completed_check_count",
+ "prior_readback_failed_check_count",
+ "selected_message_type",
+ "target_room_env",
+ "target_room_value_visible",
+ "dedup_key",
+ "sanitized_preview_hash",
+ "owner_agent",
+ "receipt_readback_owner",
+ "arbiter",
+ "required_owner_fields",
+ "acceptance_checks",
+ "rejection_reasons",
+ "reviewer_actions",
+ "receipt_readback_plan",
+ "execution_flags",
+ "owner_decision_log",
+ "next_gate"
+ ],
+ "properties": {
+ "status": {
+ "const": "ready_for_owner_review_no_send"
+ },
+ "gate_ready": {
+ "const": true
+ },
+ "approval_required": {
+ "const": true
+ },
+ "owner_review_received": {
+ "const": false
+ },
+ "owner_review_accepted": {
+ "const": false
+ },
+ "live_canary_delivery_approved": {
+ "const": false
+ },
+ "delivery_attempt_allowed": {
+ "const": false
+ },
+ "prior_readback_completed_check_count": {
+ "const": 8
+ },
+ "prior_readback_failed_check_count": {
+ "const": 0
+ },
+ "selected_message_type": {
+ "const": "daily_agent_workload_digest"
+ },
+ "target_room_env": {
+ "const": "SRE_GROUP_CHAT_ID"
+ },
+ "target_room_value_visible": {
+ "const": false
+ },
+ "owner_agent": {
+ "const": "telegram_ops_liaison"
+ },
+ "receipt_readback_owner": {
+ "const": "hermes"
+ },
+ "arbiter": {
+ "const": "openclaw"
+ },
+ "required_owner_fields": {
+ "type": "array",
+ "minItems": 9,
+ "maxItems": 9
+ },
+ "acceptance_checks": {
+ "type": "array",
+ "minItems": 9,
+ "maxItems": 9
+ },
+ "rejection_reasons": {
+ "type": "array",
+ "minItems": 8,
+ "maxItems": 8
+ },
+ "reviewer_actions": {
+ "type": "array",
+ "minItems": 6,
+ "maxItems": 6
+ },
+ "receipt_readback_plan": {
+ "type": "object",
+ "required": [
+ "owner_agent",
+ "required_checks",
+ "completed_check_count",
+ "failed_check_count",
+ "production_receipt_write_enabled",
+ "live_receipt_readback_enabled"
+ ],
+ "properties": {
+ "owner_agent": {
+ "const": "hermes"
+ },
+ "required_checks": {
+ "type": "array",
+ "minItems": 8,
+ "maxItems": 8
+ },
+ "completed_check_count": {
+ "const": 0
+ },
+ "failed_check_count": {
+ "const": 0
+ },
+ "production_receipt_write_enabled": {
+ "const": false
+ },
+ "live_receipt_readback_enabled": {
+ "const": false
+ }
+ },
+ "additionalProperties": true
+ },
+ "execution_flags": {
+ "type": "object",
+ "properties": {
+ "live_delivery_enabled": {
+ "const": false
+ },
+ "gateway_queue_write_enabled": {
+ "const": false
+ },
+ "bot_api_call_enabled": {
+ "const": false
+ },
+ "telegram_send_enabled": {
+ "const": false
+ },
+ "delivery_receipt_write_enabled": {
+ "const": false
+ },
+ "production_write_enabled": {
+ "const": false
+ },
+ "secret_read_enabled": {
+ "const": false
+ },
+ "paid_api_enabled": {
+ "const": false
+ }
+ },
+ "additionalProperties": true
+ },
+ "owner_decision_log": {
+ "type": "array",
+ "maxItems": 0
+ }
+ },
+ "additionalProperties": true
}
},
"additionalProperties": true
@@ -887,7 +1056,21 @@
"canary_delivery_rehearsal_live_send_enabled_count",
"canary_delivery_rehearsal_gateway_queue_write_enabled_count",
"canary_delivery_rehearsal_bot_api_call_enabled_count",
- "canary_delivery_rehearsal_receipt_write_enabled_count"
+ "canary_delivery_rehearsal_receipt_write_enabled_count",
+ "canary_live_delivery_owner_review_gate_count",
+ "canary_live_delivery_owner_review_required_field_count",
+ "canary_live_delivery_owner_review_acceptance_check_count",
+ "canary_live_delivery_owner_review_rejection_reason_count",
+ "canary_live_delivery_owner_review_reviewer_action_count",
+ "canary_live_delivery_owner_review_receipt_check_count",
+ "canary_live_delivery_owner_review_received_count",
+ "canary_live_delivery_owner_review_accepted_count",
+ "canary_live_delivery_approved_count",
+ "canary_live_delivery_attempt_allowed_count",
+ "canary_live_delivery_gateway_queue_write_enabled_count",
+ "canary_live_delivery_bot_api_call_enabled_count",
+ "canary_live_delivery_telegram_send_enabled_count",
+ "canary_live_delivery_receipt_write_enabled_count"
],
"properties": {
"professional_task_count": {
@@ -1084,6 +1267,48 @@
},
"canary_delivery_rehearsal_receipt_write_enabled_count": {
"const": 0
+ },
+ "canary_live_delivery_owner_review_gate_count": {
+ "const": 1
+ },
+ "canary_live_delivery_owner_review_required_field_count": {
+ "const": 9
+ },
+ "canary_live_delivery_owner_review_acceptance_check_count": {
+ "const": 9
+ },
+ "canary_live_delivery_owner_review_rejection_reason_count": {
+ "const": 8
+ },
+ "canary_live_delivery_owner_review_reviewer_action_count": {
+ "const": 6
+ },
+ "canary_live_delivery_owner_review_receipt_check_count": {
+ "const": 8
+ },
+ "canary_live_delivery_owner_review_received_count": {
+ "const": 0
+ },
+ "canary_live_delivery_owner_review_accepted_count": {
+ "const": 0
+ },
+ "canary_live_delivery_approved_count": {
+ "const": 0
+ },
+ "canary_live_delivery_attempt_allowed_count": {
+ "const": 0
+ },
+ "canary_live_delivery_gateway_queue_write_enabled_count": {
+ "const": 0
+ },
+ "canary_live_delivery_bot_api_call_enabled_count": {
+ "const": 0
+ },
+ "canary_live_delivery_telegram_send_enabled_count": {
+ "const": 0
+ },
+ "canary_live_delivery_receipt_write_enabled_count": {
+ "const": 0
}
},
"additionalProperties": true