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 da658fcc6..696cf9f55 100644
--- a/apps/api/src/services/ai_agent_professional_task_expansion.py
+++ b/apps/api/src/services/ai_agent_professional_task_expansion.py
@@ -1,10 +1,10 @@
"""
AI Agent professional task expansion and Telegram runtime bridge snapshot.
-Loads the latest committed P2-405A read-only contract. The contract expands
-professional AI Agent work and defines Telegram bridge stages, but it does not
-write Telegram Gateway queues, send Telegram messages, call the Bot API, read
-secrets, or execute production changes.
+Loads the latest committed P2-405B read-only contract. The contract expands
+professional AI Agent work and defines Telegram no-send previews, 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
@@ -24,6 +24,10 @@ _EXPECTED_TASK_COUNT = 24
_EXPECTED_DOMAIN_COUNT = 8
_EXPECTED_STAGE_COUNT = 5
_EXPECTED_MESSAGE_TYPE_COUNT = 6
+_EXPECTED_NO_SEND_PREVIEW_COUNT = 6
+_EXPECTED_DEDUP_KEY_COUNT = 6
+_EXPECTED_RECEIPT_EXPECTATION_COUNT = 6
+_EXPECTED_CANARY_PACKAGE_COUNT = 1
_ZERO_ROLLUP_FIELDS = {
"current_live_count",
"gateway_queue_write_count",
@@ -35,6 +39,11 @@ _ZERO_ROLLUP_FIELDS = {
"paid_api_call_count",
"host_write_count",
"kubectl_action_count",
+ "preview_send_enabled_count",
+ "preview_queue_write_enabled_count",
+ "preview_bot_api_call_enabled_count",
+ "receipt_live_write_enabled_count",
+ "canary_live_send_enabled_count",
}
_FORBIDDEN_PUBLIC_TERMS = {
"work_window_transcript",
@@ -82,11 +91,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-405A",
- "next_task_id": "P2-405B",
+ "current_task_id": "P2-405B",
+ "next_task_id": "P2-405C",
"read_only_mode": True,
"runtime_authority": _RUNTIME_AUTHORITY,
- "overall_completion_percent": 82,
+ "overall_completion_percent": 88,
}
mismatches = _mismatches(status, expected)
if mismatches:
@@ -124,6 +133,105 @@ def _require_telegram_bridge(payload: dict[str, Any], label: str) -> None:
if len(message_types) != _EXPECTED_MESSAGE_TYPE_COUNT:
raise ValueError(f"{label}: expected {_EXPECTED_MESSAGE_TYPE_COUNT} message types")
+ _require_no_send_previews(bridge, label)
+ _require_receipt_and_canary_package(bridge, label)
+
+
+def _require_no_send_previews(bridge: dict[str, Any], label: str) -> None:
+ previews = bridge.get("no_send_message_previews") or []
+ if len(previews) != _EXPECTED_NO_SEND_PREVIEW_COUNT:
+ raise ValueError(f"{label}: expected {_EXPECTED_NO_SEND_PREVIEW_COUNT} no-send previews")
+
+ message_types = {item.get("message_type") for item in bridge.get("message_types") or []}
+ preview_message_types = [preview.get("message_type") for preview in previews]
+ if set(preview_message_types) != message_types:
+ raise ValueError(f"{label}: no-send previews must cover every message type exactly once")
+
+ dedup_keys = [preview.get("dedup_key") for preview in previews]
+ if len(set(dedup_keys)) != len(dedup_keys):
+ raise ValueError(f"{label}: no-send preview dedup_key values must be unique")
+
+ for preview in previews:
+ preview_id = preview.get("preview_id")
+ if preview.get("status") != "preview_ready_no_send":
+ raise ValueError(f"{label}: {preview_id}.status must be preview_ready_no_send")
+ if preview.get("send_enabled") is not False:
+ raise ValueError(f"{label}: {preview_id}.send_enabled must remain false")
+ if preview.get("gateway_queue_write_enabled") is not False:
+ raise ValueError(f"{label}: {preview_id}.gateway_queue_write_enabled must remain false")
+ if preview.get("bot_api_call_enabled") is not False:
+ raise ValueError(f"{label}: {preview_id}.bot_api_call_enabled must remain false")
+ if preview.get("delivery_receipt_write_enabled") is not False:
+ raise ValueError(f"{label}: {preview_id}.delivery_receipt_write_enabled must remain false")
+ if not preview.get("sanitized_body_lines"):
+ raise ValueError(f"{label}: {preview_id}.sanitized_body_lines must not be empty")
+
+ dedup_policy = bridge.get("dedup_policy") or {}
+ keys = dedup_policy.get("keys") or []
+ if dedup_policy.get("required") is not True:
+ raise ValueError(f"{label}: dedup_policy.required must be true")
+ if dedup_policy.get("live_cache_write_enabled") is not False:
+ raise ValueError(f"{label}: dedup_policy.live_cache_write_enabled must remain false")
+ if len(keys) != _EXPECTED_DEDUP_KEY_COUNT:
+ raise ValueError(f"{label}: expected {_EXPECTED_DEDUP_KEY_COUNT} dedup keys")
+
+ queue_preview = bridge.get("queue_preview_readback") or {}
+ expected_queue = {
+ "enabled": True,
+ "preview_only": True,
+ "write_enabled": False,
+ "readback_enabled": True,
+ }
+ mismatches = _mismatches(queue_preview, expected_queue)
+ if mismatches:
+ raise ValueError(f"{label}: queue_preview_readback mismatch: {mismatches}")
+
+
+def _require_receipt_and_canary_package(bridge: dict[str, Any], label: str) -> None:
+ previews = bridge.get("no_send_message_previews") or []
+ preview_ids = {preview.get("preview_id") for preview in previews}
+ preview_receipts = {preview.get("receipt_expectation_id") for preview in previews}
+
+ receipts = bridge.get("receipt_expectations") or []
+ if len(receipts) != _EXPECTED_RECEIPT_EXPECTATION_COUNT:
+ raise ValueError(f"{label}: expected {_EXPECTED_RECEIPT_EXPECTATION_COUNT} receipt expectations")
+
+ receipt_ids = {receipt.get("receipt_id") for receipt in receipts}
+ if receipt_ids != preview_receipts:
+ raise ValueError(f"{label}: receipt expectations must match preview receipt ids")
+
+ for receipt in receipts:
+ receipt_id = receipt.get("receipt_id")
+ if receipt.get("preview_id") not in preview_ids:
+ raise ValueError(f"{label}: {receipt_id}.preview_id must reference a no-send preview")
+ if receipt.get("receipt_write_enabled") is not False:
+ raise ValueError(f"{label}: {receipt_id}.receipt_write_enabled must remain false")
+ if receipt.get("production_receipt_readback_enabled") is not False:
+ raise ValueError(
+ f"{label}: {receipt_id}.production_receipt_readback_enabled must remain false"
+ )
+ if not receipt.get("required_evidence_refs"):
+ raise ValueError(f"{label}: {receipt_id}.required_evidence_refs must not be empty")
+
+ canary = bridge.get("canary_approval_package") or {}
+ expected_canary = {
+ "package_ready": True,
+ "approval_required": True,
+ "status": "blocked_until_explicit_approval",
+ "live_send_enabled": False,
+ "gateway_queue_write_enabled": False,
+ "bot_api_call_enabled": False,
+ "delivery_receipt_write_enabled": False,
+ "production_write_enabled": False,
+ }
+ mismatches = _mismatches(canary, expected_canary)
+ if mismatches:
+ raise ValueError(f"{label}: canary_approval_package mismatch: {mismatches}")
+ if not canary:
+ raise ValueError(f"{label}: expected {_EXPECTED_CANARY_PACKAGE_COUNT} canary package")
+ if not canary.get("approval_checklist"):
+ raise ValueError(f"{label}: canary_approval_package.approval_checklist is required")
+
def _require_professional_tasks(payload: dict[str, Any], label: str) -> None:
domains = payload.get("professional_task_domains") or []
@@ -212,6 +320,12 @@ def _require_rollups(payload: dict[str, Any], label: str) -> None:
"medium_risk_task_count": sum(1 for task in tasks if task.get("risk_tier") == "medium"),
"high_risk_task_count": sum(1 for task in tasks if task.get("risk_tier") == "high"),
"critical_risk_task_count": sum(1 for task in tasks if task.get("risk_tier") == "critical"),
+ "no_send_preview_count": len(bridge.get("no_send_message_previews") or []),
+ "dedup_key_count": len((bridge.get("dedup_policy") or {}).get("keys") or []),
+ "receipt_expectation_count": len(bridge.get("receipt_expectations") or []),
+ "canary_approval_package_count": 1
+ if bridge.get("canary_approval_package")
+ else 0,
}
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 d20c6430a..52d4656e1 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-405A"
- assert snapshot["program_status"]["next_task_id"] == "P2-405B"
- assert snapshot["program_status"]["overall_completion_percent"] == 82
+ assert snapshot["program_status"]["current_task_id"] == "P2-405B"
+ assert snapshot["program_status"]["next_task_id"] == "P2-405C"
+ assert snapshot["program_status"]["overall_completion_percent"] == 88
assert snapshot["program_status"]["runtime_authority"] == (
"professional_task_expansion_and_telegram_bridge_read_only_no_send"
)
@@ -36,6 +36,12 @@ def test_load_latest_ai_agent_professional_task_expansion_snapshot() -> None:
assert bridge["telegram_send_enabled"] is False
assert len(bridge["stages"]) == 5
assert len(bridge["message_types"]) == 6
+ assert len(bridge["no_send_message_previews"]) == 6
+ assert len(bridge["dedup_policy"]["keys"]) == 6
+ assert len(bridge["receipt_expectations"]) == 6
+ assert bridge["queue_preview_readback"]["write_enabled"] is False
+ assert bridge["canary_approval_package"]["status"] == "blocked_until_explicit_approval"
+ assert bridge["canary_approval_package"]["live_send_enabled"] is False
rollups = snapshot["rollups"]
assert rollups["professional_task_count"] == 24
@@ -57,6 +63,15 @@ def test_load_latest_ai_agent_professional_task_expansion_snapshot() -> None:
assert rollups["paid_api_call_count"] == 0
assert rollups["host_write_count"] == 0
assert rollups["kubectl_action_count"] == 0
+ assert rollups["no_send_preview_count"] == 6
+ assert rollups["dedup_key_count"] == 6
+ assert rollups["receipt_expectation_count"] == 6
+ assert rollups["canary_approval_package_count"] == 1
+ assert rollups["preview_send_enabled_count"] == 0
+ assert rollups["preview_queue_write_enabled_count"] == 0
+ assert rollups["preview_bot_api_call_enabled_count"] == 0
+ assert rollups["receipt_live_write_enabled_count"] == 0
+ assert rollups["canary_live_send_enabled_count"] == 0
def test_professional_tasks_cover_required_agents_and_reporting() -> None:
@@ -81,6 +96,54 @@ def test_professional_tasks_cover_required_agents_and_reporting() -> None:
assert snapshot["redaction_contract"]["raw_prompt_display_allowed"] is False
assert snapshot["redaction_contract"]["private_reasoning_display_allowed"] is False
assert snapshot["redaction_contract"]["secret_value_display_allowed"] is False
+ assert snapshot["redaction_contract"]["frontend_display_policy"]
+
+
+def test_no_send_previews_have_unique_dedup_and_no_live_flags() -> None:
+ snapshot = load_latest_ai_agent_professional_task_expansion()
+ bridge = snapshot["telegram_runtime_bridge"]
+
+ message_types = {item["message_type"] for item in bridge["message_types"]}
+ previews = bridge["no_send_message_previews"]
+ receipts = bridge["receipt_expectations"]
+
+ assert {preview["message_type"] for preview in previews} == message_types
+ assert len({preview["dedup_key"] for preview in previews}) == 6
+ assert {preview["receipt_expectation_id"] for preview in previews} == {
+ receipt["receipt_id"] for receipt in receipts
+ }
+
+ for preview in previews:
+ assert preview["status"] == "preview_ready_no_send"
+ assert preview["send_enabled"] is False
+ assert preview["gateway_queue_write_enabled"] is False
+ assert preview["bot_api_call_enabled"] is False
+ assert preview["delivery_receipt_write_enabled"] is False
+ assert preview["sanitized_body_lines"]
+
+ assert bridge["dedup_policy"]["required"] is True
+ assert bridge["dedup_policy"]["live_cache_write_enabled"] is False
+ assert bridge["queue_preview_readback"]["preview_only"] is True
+ assert bridge["queue_preview_readback"]["write_enabled"] is False
+
+
+def test_receipts_and_canary_package_remain_no_send() -> None:
+ snapshot = load_latest_ai_agent_professional_task_expansion()
+ bridge = snapshot["telegram_runtime_bridge"]
+
+ for receipt in bridge["receipt_expectations"]:
+ assert receipt["receipt_write_enabled"] is False
+ assert receipt["production_receipt_readback_enabled"] is False
+ assert receipt["required_evidence_refs"]
+
+ canary = bridge["canary_approval_package"]
+ assert canary["package_ready"] is True
+ assert canary["approval_required"] is True
+ assert canary["live_send_enabled"] is False
+ assert canary["gateway_queue_write_enabled"] is False
+ assert canary["bot_api_call_enabled"] is False
+ assert canary["delivery_receipt_write_enabled"] is False
+ assert canary["production_write_enabled"] is False
def test_rejects_telegram_send_enabled(tmp_path: Path) -> None:
@@ -101,6 +164,36 @@ def test_rejects_gateway_queue_write_count(tmp_path: Path) -> None:
load_latest_ai_agent_professional_task_expansion(tmp_path)
+def test_rejects_preview_send_enabled(tmp_path: Path) -> None:
+ snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
+ snapshot["telegram_runtime_bridge"]["no_send_message_previews"][0]["send_enabled"] = True
+ snapshot["rollups"]["preview_send_enabled_count"] = 1
+ _write_snapshot(tmp_path, snapshot)
+
+ with pytest.raises(ValueError, match="send_enabled must remain false"):
+ load_latest_ai_agent_professional_task_expansion(tmp_path)
+
+
+def test_rejects_duplicate_dedup_key(tmp_path: Path) -> None:
+ snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
+ previews = snapshot["telegram_runtime_bridge"]["no_send_message_previews"]
+ previews[1]["dedup_key"] = previews[0]["dedup_key"]
+ _write_snapshot(tmp_path, snapshot)
+
+ with pytest.raises(ValueError, match="dedup_key values must be unique"):
+ load_latest_ai_agent_professional_task_expansion(tmp_path)
+
+
+def test_rejects_canary_live_send_enabled(tmp_path: Path) -> None:
+ snapshot = copy.deepcopy(load_latest_ai_agent_professional_task_expansion())
+ snapshot["telegram_runtime_bridge"]["canary_approval_package"]["live_send_enabled"] = True
+ snapshot["rollups"]["canary_live_send_enabled_count"] = 1
+ _write_snapshot(tmp_path, snapshot)
+
+ with pytest.raises(ValueError, match="canary_approval_package 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 28d1fa2f2..b2c9eccbb 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-405A"
- assert payload["program_status"]["next_task_id"] == "P2-405B"
- assert payload["program_status"]["overall_completion_percent"] == 82
+ assert payload["program_status"]["current_task_id"] == "P2-405B"
+ assert payload["program_status"]["next_task_id"] == "P2-405C"
+ assert payload["program_status"]["overall_completion_percent"] == 88
assert payload["program_status"]["runtime_authority"] == (
"professional_task_expansion_and_telegram_bridge_read_only_no_send"
)
@@ -37,3 +37,11 @@ def test_ai_agent_professional_task_expansion_endpoint() -> None:
assert payload["rollups"]["telegram_send_count"] == 0
assert payload["rollups"]["bot_api_call_count"] == 0
assert payload["rollups"]["production_write_count"] == 0
+ assert payload["rollups"]["no_send_preview_count"] == 6
+ assert payload["rollups"]["dedup_key_count"] == 6
+ assert payload["rollups"]["receipt_expectation_count"] == 6
+ assert payload["rollups"]["canary_approval_package_count"] == 1
+ assert payload["rollups"]["preview_send_enabled_count"] == 0
+ assert payload["telegram_runtime_bridge"]["canary_approval_package"]["live_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 48c5bf1ee..94555a122 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -6448,7 +6448,7 @@
}
},
"professionalTaskExpansion": {
- "title": "P2-405A AI Agent 專業任務擴展",
+ "title": "P2-405B AI Agent 專業任務與 TG 預覽",
"source": "產生 {generated};目前 {current};下一步 {next}",
"runtime": "runtime={value}",
"telegramTitle": "Telegram Runtime Bridge",
@@ -6462,8 +6462,14 @@
"messageTypes": "訊息類型",
"approvals": "需批准",
"highCritical": "高風險 / critical",
- "liveWrites": "live / send / write"
+ "liveWrites": "live / send / write",
+ "noSendPreviews": "no-send 預覽",
+ "dedupKeys": "dedup key",
+ "receipts": "receipt expectation",
+ "previewLiveWrites": "preview 實發"
},
+ "previewTitle": "Telegram no-send 訊息預覽",
+ "canaryTitle": "Canary approval package",
"labels": {
"gateway": "Gateway required={value}",
"noSend": "no-send preview={value}",
@@ -6472,10 +6478,19 @@
"send": "Telegram send={value}",
"redaction": "脫敏鎖定={value}",
"gatewayWrites": "Gateway 寫入={value}",
+ "queueWrites": "queue 寫入={value}",
"botCalls": "Bot API={value}",
"productionWrites": "正式寫入={value}",
"approval": "需批准={value}",
- "liveCount": "live={value}"
+ "liveCount": "live={value}",
+ "dedup": "dedup={value}",
+ "receipt": "receipt={value}",
+ "previewSend": "preview send={value}",
+ "packageReady": "package ready={value}",
+ "canaryApproval": "canary approval={value}",
+ "arbiter": "仲裁={value}",
+ "owner": "owner={value}",
+ "canarySend": "canary send={value}"
},
"riskTiers": {
"low": "低風險",
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index 48c5bf1ee..94555a122 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -6448,7 +6448,7 @@
}
},
"professionalTaskExpansion": {
- "title": "P2-405A AI Agent 專業任務擴展",
+ "title": "P2-405B AI Agent 專業任務與 TG 預覽",
"source": "產生 {generated};目前 {current};下一步 {next}",
"runtime": "runtime={value}",
"telegramTitle": "Telegram Runtime Bridge",
@@ -6462,8 +6462,14 @@
"messageTypes": "訊息類型",
"approvals": "需批准",
"highCritical": "高風險 / critical",
- "liveWrites": "live / send / write"
+ "liveWrites": "live / send / write",
+ "noSendPreviews": "no-send 預覽",
+ "dedupKeys": "dedup key",
+ "receipts": "receipt expectation",
+ "previewLiveWrites": "preview 實發"
},
+ "previewTitle": "Telegram no-send 訊息預覽",
+ "canaryTitle": "Canary approval package",
"labels": {
"gateway": "Gateway required={value}",
"noSend": "no-send preview={value}",
@@ -6472,10 +6478,19 @@
"send": "Telegram send={value}",
"redaction": "脫敏鎖定={value}",
"gatewayWrites": "Gateway 寫入={value}",
+ "queueWrites": "queue 寫入={value}",
"botCalls": "Bot API={value}",
"productionWrites": "正式寫入={value}",
"approval": "需批准={value}",
- "liveCount": "live={value}"
+ "liveCount": "live={value}",
+ "dedup": "dedup={value}",
+ "receipt": "receipt={value}",
+ "previewSend": "preview send={value}",
+ "packageReady": "package ready={value}",
+ "canaryApproval": "canary approval={value}",
+ "arbiter": "仲裁={value}",
+ "owner": "owner={value}",
+ "canarySend": "canary send={value}"
},
"riskTiers": {
"low": "低風險",
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 5d0e96490..cf9ef358f 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
@@ -17,13 +17,16 @@ import {
BookOpenCheck,
Boxes,
CalendarClock,
+ ClipboardCheck,
Database,
FileText,
+ Fingerprint,
GitBranch,
Gauge,
HardDrive,
Layers3,
Lock,
+ MessageSquareText,
PackageCheck,
RefreshCw,
Route,
@@ -3700,6 +3703,15 @@ export function AutomationInventoryTab() {
&& professionalTaskExpansion.redaction_contract.redaction_required === true
)
const visibleProfessionalTasks = professionalTaskExpansion.professional_tasks.slice(0, 8)
+ const visibleTelegramPreviews = professionalTaskExpansion.telegram_runtime_bridge.no_send_message_previews.slice(0, 6)
+ const professionalTaskCanaryPackage = professionalTaskExpansion.telegram_runtime_bridge.canary_approval_package
+ const professionalTaskPreviewLiveWrites = (
+ professionalTaskExpansion.rollups.preview_send_enabled_count
+ + professionalTaskExpansion.rollups.preview_queue_write_enabled_count
+ + professionalTaskExpansion.rollups.preview_bot_api_call_enabled_count
+ + professionalTaskExpansion.rollups.receipt_live_write_enabled_count
+ + professionalTaskExpansion.rollups.canary_live_send_enabled_count
+ )
const backlogProgressPercent = backlog.progress_summary.overall_percent
const explicitApprovalItemCount = backlog.item_approval_boundary_rollup.items_requiring_explicit_approval.length
const taskBoundaryCount = snapshot.task_approval_boundary_rollup.total_tasks
@@ -4121,6 +4133,10 @@ export function AutomationInventoryTab() {
} />
} />
} />
+ } />
+ } />
+ } />
+ } />
@@ -4152,6 +4168,61 @@ export function AutomationInventoryTab() {
+ {t('professionalTaskExpansion.previewTitle')}
+
+ {visibleTelegramPreviews.map(preview => {
+ const previewTone = preview.risk_tier === 'critical' ? 'danger' : preview.risk_tier === 'high' ? 'warn' : 'neutral'
+ const previewColor = toneColor(previewTone)
+ return (
+
+
+
+ {preview.title}
+
+
+
+
+ {preview.sanitized_body_lines.slice(0, 3).map(line => (
+
+ {redactPublicText(line)}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ )
+ })}
+
+
+
+
{t('professionalTaskExpansion.canaryTitle')}
+
+ {professionalTaskCanaryPackage.package_id} · {professionalTaskCanaryPackage.status}
+
+
+
+
+
+
+
+
+
+
+ {professionalTaskCanaryPackage.approval_checklist.slice(0, 5).map(item => (
+
+ {item}
+
+ ))}
+
+
+
{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 e3bd66817..a23553752 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-405A'
- next_task_id: 'P2-405B'
+ current_task_id: 'P2-405B'
+ next_task_id: 'P2-405C'
read_only_mode: true
runtime_authority: 'professional_task_expansion_and_telegram_bridge_read_only_no_send'
status_note: string
@@ -1461,19 +1461,91 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
exit_condition: string
}>
message_types: Array<{
- message_type_id: string
- title: string
+ message_type: string
cadence: string
- risk_scope: string
- delivery_gate: string
+ risk_tier: string
+ owner_agent: string
+ send_policy: string
}>
+ no_send_message_previews: Array<{
+ preview_id: string
+ message_type: string
+ title: string
+ target_room_alias: string
+ target_room_env: string
+ owner_agent: string
+ risk_tier: 'low' | 'medium' | 'high' | 'critical'
+ status: string
+ dedup_key: string
+ receipt_expectation_id: string
+ approval_required_before_send: boolean
+ canary_required_before_live: boolean
+ send_enabled: boolean
+ gateway_queue_write_enabled: boolean
+ bot_api_call_enabled: boolean
+ delivery_receipt_write_enabled: boolean
+ sanitized_body_lines: string[]
+ redaction_checks: string[]
+ }>
+ dedup_policy: {
+ required: boolean
+ key_count: number
+ collision_policy: string
+ preview_hash_algorithm: string
+ live_cache_write_enabled: boolean
+ keys: Array<{
+ message_type: string
+ key_template: string
+ owner_agent: string
+ risk_tier: string
+ window: string
+ live_cache_write_enabled: boolean
+ }>
+ }
+ queue_preview_readback: {
+ enabled: boolean
+ preview_only: boolean
+ write_enabled: boolean
+ readback_enabled: boolean
+ envelope_fields: string[]
+ readback_checks: string[]
+ }
+ receipt_expectations: Array<{
+ receipt_id: string
+ message_type: string
+ preview_id: string
+ expected_signal: string
+ required_evidence_refs: string[]
+ receipt_write_enabled: boolean
+ production_receipt_readback_enabled: boolean
+ missing_receipt_policy: string
+ }>
+ canary_approval_package: {
+ package_id: string
+ status: string
+ package_ready: boolean
+ approval_required: boolean
+ target_room_alias: string
+ target_room_env: string
+ arbiter: string
+ owner_agent: string
+ reviewers: string[]
+ message_type_scope: string[]
+ required_approval_inputs: string[]
+ approval_checklist: string[]
+ live_send_enabled: boolean
+ gateway_queue_write_enabled: boolean
+ bot_api_call_enabled: boolean
+ delivery_receipt_write_enabled: boolean
+ production_write_enabled: boolean
+ }
+ no_send_preview_completion_percent: number
+ canary_approval_package_completion_percent: number
}
professional_task_domains: Array<{
domain_id: string
- title: string
- summary: string
- primary_owner: string
- task_count: number
+ label: string
+ owner_agent: string
}>
professional_tasks: Array<{
task_id: string
@@ -1491,8 +1563,8 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
}>
reporting_contract: Record<'daily' | 'weekly' | 'monthly' | 'action_required', {
required: boolean
- delivery_mode: string
- sections: string[]
+ owner_agent: string
+ telegram_stage: string
}>
redaction_contract: {
redaction_required: boolean
@@ -1503,6 +1575,7 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
raw_runtime_payload_display_allowed: boolean
telegram_message_must_be_sanitized: boolean
frontend_display_policy: string
+ message_preview_redaction_checks: string[]
}
rollups: {
professional_task_count: number
@@ -1524,6 +1597,18 @@ export interface AiAgentProfessionalTaskExpansionSnapshot {
paid_api_call_count: number
host_write_count: number
kubectl_action_count: number
+ no_send_preview_count: number
+ dedup_key_count: number
+ receipt_expectation_count: number
+ canary_approval_package_count: number
+ queue_preview_envelope_field_count: number
+ canary_required_preview_count: number
+ approval_required_preview_count: number
+ preview_send_enabled_count: number
+ preview_queue_write_enabled_count: number
+ preview_bot_api_call_enabled_count: number
+ receipt_live_write_enabled_count: number
+ canary_live_send_enabled_count: number
}
}
diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md
index 75282ebaf..e24e79930 100644
--- a/docs/LOGBOOK.md
+++ b/docs/LOGBOOK.md
@@ -44,6 +44,35 @@
- owner response received / accepted、live conf、rendered diff evidence、`nginx -t` evidence、route smoke evidence、maintenance window、rollback owner、Nginx reload、host write、firewall change、Docker restart、active scan、secret collection、runtime execution、action button 全部維持 `0 / false`。
- 本輪未 SSH、未讀 live conf raw payload、未改 Nginx、未重啟 Docker / service、未修改 firewall / iptables、未執行 active scan、未收 secrets 明文、未 force push。
+## 2026-06-15|P2-405B Telegram no-send 預覽、dedup、receipt 與 canary 批准包
+
+**背景**:P2-405A 已把 AI Agent 專業任務擴展與 Telegram Runtime Bridge 固定成只讀契約,並已部署到正式 API。下一步需要讓統帥在治理頁實際看到 AI Agent 將來要送到 Telegram 的訊息長相、去重鍵、回執預期與 canary 前置審核包,但仍不得實發、不得寫 Gateway queue、不得呼叫 Bot API、不得讀 secret。
+
+**完成項目**:
+- 新增 `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json`,把 P2-405B 固定為最新 snapshot。
+- `ai_agent_professional_task_expansion_v1` schema 與 API loader 已升級:目前 `current_task_id=P2-405B`、`next_task_id=P2-405C`、overall `88%`。
+- Telegram no-send preview 已建立 `6` 種訊息:日報、週報、月報、高風險審核卡、failure-only escalation、report receipt gap alert。
+- dedup policy 已建立 `6` 個 key template;receipt expectation 已建立 `6` 組;canary approval package 已建立 `1` 份。
+- `/zh-TW/governance?tab=automation-inventory` 已顯示 P2-405B 卡片:no-send preview、dedup key、receipt expectation、canary approval package、preview 實發計數與所有 live / send / write = `0`。
+- 前端 i18n 維持繁體中文;沒有把工作視窗對話、未遮罩提示、私有推理或未遮罩 runtime payload 放入前端。
+
+**完成度與狀態**:
+- P2-405B Telegram no-send preview / dedup / receipt / canary package:`100%`。
+- AI Agent 專業任務擴展整體:`82% -> 88%`。
+- Telegram preview 可視化:`0% -> 100%`。
+- Telegram 實發、Gateway queue 寫入、Bot API call、delivery receipt production write:仍維持 `0%` / `0` / `false`。
+- 下一步:P2-405C 只允許產生 approved canary send approval packet 與操作者批准欄位;不得在未批准前真正發送 Telegram。
+
+**本地驗證**:
+- `python3 -m json.tool docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json` 通過。
+- `python3 -m json.tool docs/schemas/ai_agent_professional_task_expansion_v1.schema.json` 通過。
+- `python3 -m json.tool apps/web/messages/zh-TW.json` 與 `python3 -m json.tool apps/web/messages/en.json` 通過。
+- `python3 -m py_compile apps/api/src/services/ai_agent_professional_task_expansion.py apps/api/src/api/v1/agents.py` 通過。
+- `DATABASE_URL=postgresql+asyncpg://test:test@localhost/test pytest -q apps/api/tests/test_ai_agent_professional_task_expansion.py apps/api/tests/test_ai_agent_professional_task_expansion_api.py` → `12 passed`。
+- `pnpm --filter @awoooi/web typecheck` 通過。
+
+**邊界**:本輪未 SSH、未讀 live conf、未改主機、未修改 Telegram Bot、未發 Telegram、未寫 Gateway queue、未呼叫 Bot API、未讀 secret、未啟用 paid API、未跑 kubectl、未做 production write。
+
## 2026-06-15|端口 / 防火牆事故型 Gate 與前台手機溢出收斂
**背景**:2026-06-12 14:00 左右的 110 端口關閉事件暴露「端口 / 防火牆變更」不能只用一般配置變更欄位驗收,必須要求事故等級、服務健康影響、外部 route 影響、恢復時間、操作員通知與事後補件 owner。使用者也指出前台不得揭露工作視窗對話、原始 owner / repo namespace、raw blocked 狀態或內部英文識別資訊;因此本階段同步做 production 前台敏感資訊與手機溢出驗證。
diff --git a/docs/ai/AI_AGENT_12_AGENT_WAR_ROOM_2026-06-14.md b/docs/ai/AI_AGENT_12_AGENT_WAR_ROOM_2026-06-14.md
index 8f835d17c..9f6cf4c9a 100644
--- a/docs/ai/AI_AGENT_12_AGENT_WAR_ROOM_2026-06-14.md
+++ b/docs/ai/AI_AGENT_12_AGENT_WAR_ROOM_2026-06-14.md
@@ -184,5 +184,5 @@ Telegram Ops 工位負責 Telegram Gateway、Channel Hub、日報/週報/月報
狀態變更:12 位 Agent 只讀審查全部回收並彙整;已建立 `ai_agent_12_agent_war_room_v1` schema / committed snapshot / API / tests / governance UI 區塊。
證據:`docs/schemas/ai_agent_12_agent_war_room_v1.schema.json`、`docs/evaluations/ai_agent_12_agent_war_room_2026-06-14.json`、`GET /api/v1/agents/agent-12-agent-war-room`、治理頁 12-Agent War Room 區塊、12 位 Agent 只讀回饋。
阻擋:runtime writer、Telegram send、Bot API、production write、SDK 安裝、付費 API、shadow/canary、host update、DB migration、restore 仍未批准。
-下一步:P2-405B 承接 Telegram no-send preview UI;讓統帥先看見 TG 訊息、dedup、receipt 與風險標籤長相。P2-146 owner response receipt preview 仍屬另一條 release gate 主線;兩者都不得直接打開 Gateway queue、Telegram send、Bot API 或 production write。
+下一步:P2-405C 承接 Telegram approved canary send approval packet;讓統帥先審核發送時間窗、單一訊息類型、dedup、receipt、mute / rollback plan 與停止條件。P2-146 owner response receipt preview 仍屬另一條 release gate 主線;兩者都不得直接打開 Gateway queue、Telegram send、Bot API 或 production write。
```
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 d86ca41e3..ee4854004 100644
--- a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
+++ b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md
@@ -15,7 +15,7 @@
| 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 | 84% | P2-405A 已完成本地只讀契約與治理頁 P2-405A 卡片;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-15.json`、`GET /api/v1/agents/agent-professional-task-expansion`、`/zh-TW/governance?tab=automation-inventory`、`docs/ai/AI_AGENT_PROFESSIONAL_TASK_EXPANSION_2026-06-15.md`、需批准任務 `19`、low / medium / high / critical = `3 / 10 / 6 / 5`;下一步 P2-405B 完整 no-send message preview / canary approval package |
+| AI Agent 專業任務擴展與 Telegram Runtime Bridge | 88% | P2-405B 已完成只讀契約、正式 API、治理頁 P2-405B 卡片、6 種 Telegram no-send preview、6 個 dedup key、6 組 receipt expectation 與 1 份 canary approval package;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-15_1445_p2_405b.json`、`GET /api/v1/agents/agent-professional-task-expansion`、`/zh-TW/governance?tab=automation-inventory`、`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`、preview live write `0`;下一步 P2-405C approved canary send approval packet |
| 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 文件 |
@@ -1417,7 +1417,7 @@ UI:
## 13. 立即執行順序
1. P2-004:依賴 / 供應鏈漂移監控,保持只讀觀察與批准包邊界。
-2. P2-405B:AI Agent Telegram 完整 no-send message preview / canary approval package,先讓統帥看見未來 TG 訊息、dedup、receipt 與風險標籤長相;仍不得實發。
+2. P2-405C:AI Agent Telegram approved canary send approval packet,先讓統帥審核發送時間窗、單一訊息類型、dedup、receipt、mute / rollback plan 與停止條件;仍不得在未批准前實發。
3. P3-001:外部 Agent / SDK / API 相關能力仍需證據、費用批准與 shadow / canary 關卡。
## 14. 目前風險
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 c8a428e48..ace5ffd31 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-15(台北時間)
-> 狀態:P2-405A 已完成只讀契約、snapshot、API、測試與治理頁卡片;Telegram 實發仍未啟用。
+> 狀態:P2-405B 已完成 no-send 訊息預覽、dedup key、receipt expectation、canary approval package、API guard、測試與治理頁可視化;Telegram 實發仍未啟用。
> 事實來源:`ai_agent_professional_task_expansion_v1`
## 1. 結論
-本輪把「AI Agent 還能處理哪些專業工作」正式產品化成 24 類專業任務,並把 Telegram 群組 / TG Bot 整合拆成 5 段啟動前閘門。
+本輪把「AI Agent 還能處理哪些專業工作」正式產品化成 24 類專業任務,並把 Telegram 群組 / TG Bot 整合拆成 5 段啟動前閘門。P2-405B 進一步把將來要送出的 Telegram 訊息長相、dedup key、receipt expectation 與 canary approval package 顯示到治理頁。
這不是直接讓 AI Agent 發 Telegram 或改 production;目前只允許 no-send preview、queue preview readback、owner review 與批准包。真正送到 **AwoooI SRE 戰情室** 必須先通過 approved canary、dedup、receipt、redaction、OpenClaw 仲裁、Security gate 與 QA verifier。
@@ -16,8 +16,9 @@
|---|---:|---|
| 專業任務擴展契約 | 100% | 24 類任務已定義 owner、風險、MCP、RAG、Telegram policy 與 blocked actions |
| Telegram Runtime Bridge 契約 | 100% | no-send preview、queue preview、approved canary、日週月報、action-required digest 已分段 |
+| Telegram no-send 訊息預覽 | 100% | 6 種訊息預覽、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package 已固定 |
| API / loader | 100% | `GET /api/v1/agents/agent-professional-task-expansion` 只讀輸出 |
-| 治理頁可視化 | 100% | `/zh-TW/governance?tab=automation-inventory` 顯示任務、風險、TG bridge 與 live/send/write=0 |
+| 治理頁可視化 | 100% | `/zh-TW/governance?tab=automation-inventory` 顯示任務、風險、TG bridge、preview、dedup、receipt、canary 與 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 |
@@ -31,7 +32,32 @@
| 日週月報 digest | blocked until canary receipt | Agent 工作量、完成度、阻擋項、圖表摘要 | 不洗版、不發成功噪音 |
| action-required digest | blocked until dual gate | 高風險審核卡、failure-only escalation | 不取代 runtime authorization |
-## 4. 專業任務總覽
+## 4. P2-405B no-send 預覽
+
+| 訊息類型 | 風險 | 主責 | dedup key | 發送狀態 |
+|---|---|---|---|---|
+| 日報 | low | Hermes | `awoooi:agent-report:daily:{yyyy-mm-dd}:v1` | no-send |
+| 週報 | medium | Hermes | `awoooi:agent-report:weekly:{iso-week}:v1` | no-send |
+| 月報 | medium | Hermes | `awoooi:agent-report:monthly:{yyyy-mm}:v1` | no-send |
+| 高風險審核卡 | high | OpenClaw | `awoooi:agent-approval:{risk}:{work-item-id}:v1` | no-send |
+| failure-only escalation | critical | SRE Sentinel | `awoooi:agent-failure:{alertname}:{target}:{window}:v1` | no-send |
+| report receipt gap alert | medium | Telegram Ops | `awoooi:agent-receipt-gap:{message-type}:{window}:v1` | no-send |
+
+每一種 preview 都包含脫敏 body lines、receipt expectation id、target room env ref、risk tier、approval gate 與 send / queue / bot / receipt write false flags。治理頁只顯示 env ref 與脫敏內容,不顯示 chat id value、Bot token、工作視窗對話、未遮罩 runtime payload 或可執行修復指令。
+
+## 5. Canary Approval Package
+
+目前 canary package 狀態為 `blocked_until_explicit_approval`,package ready 但尚未批准。啟用前必須取得:
+
+| 必填批准輸入 | 目的 |
+|---|---|
+| 統帥批准 canary 時間窗 | 避免非預期發送 |
+| 單一訊息類型 | 限縮第一次實發範圍 |
+| mute / rollback plan | 發生錯誤時可停止 |
+| receipt readback owner | 明確誰驗證收到 |
+| 失敗時停止條件 | 避免重試洗版 |
+
+## 6. 專業任務總覽
| 領域 | 任務數 | 代表任務 | 主責 |
|---|---:|---|---|
@@ -44,7 +70,7 @@
| 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 |
-## 5. 專業能力層級
+## 7. 專業能力層級
| 層級 | AI Agent 可自動做 | Gate |
|---|---|---|
@@ -53,7 +79,7 @@
| 高風險 | 只產批准包、rollback plan、failure-only digest 草案 | 統帥批准 |
| Critical | production write、kubectl、ArgoCD sync、Telegram 實發、secret、restore、host write | 預設 blocked |
-## 6. MCP / RAG
+## 8. MCP / RAG
首批 MCP:Gitea、Browser、Observability、Telegram Gateway、Package Registry、Database Readonly、Backup Status、ArgoCD Readonly、HTTP Probe、Fixture Store。
@@ -61,7 +87,7 @@
成長指標:KM entries、PlayBook updates、recommendations、replay score delta、blocked action prevented count、receipt missing count。
-## 7. 邊界
+## 9. 邊界
- 不直接發 Telegram。
- 不寫 Telegram Gateway queue。
@@ -70,9 +96,9 @@
- 不把工作視窗對話、未遮罩提示、私人推理或未遮罩 runtime payload 放進前端或 Telegram。
- 不做 production write、host write、kubectl、ArgoCD sync、restore、rollback、paid API、SDK install。
-## 8. 下一步
+## 10. 下一步
-1. P2-405B:把完整 no-send message preview、dedup key、receipt expectation 與 canary approval package 顯示到治理頁,讓統帥先看 TG 訊息會長什麼樣。
-2. P2-405C:產生 approved canary approval package,明確列出發送時間窗、目標群組、dedup、receipt 與 rollback / mute plan。
-3. P2-405D:canary 通過後才開日報 / 週報 / 月報 digest delivery。
-4. P2-405E:Action-required digest 只對 failure / high-risk / approval-required 事件開啟。
+1. P2-405C:產生 approved canary send approval packet,明確列出發送時間窗、單一訊息類型、目標 env ref、dedup、receipt、rollback / mute plan 與停止條件。
+2. P2-405D:canary 通過後才開日報 / 週報 / 月報 digest delivery。
+3. P2-405E:Action-required digest 只對 failure / high-risk / approval-required 事件開啟。
+4. P2-405F:把 receipt readback 與 report status board 串起來,但仍需 canary gate 後才能寫正式 receipt。
diff --git a/docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json b/docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json
new file mode 100644
index 000000000..cebd2b7d2
--- /dev/null
+++ b/docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json
@@ -0,0 +1,1337 @@
+{
+ "schema_version": "ai_agent_professional_task_expansion_v1",
+ "generated_at": "2026-06-15T14:45:00+08:00",
+ "program_status": {
+ "current_priority": "P2",
+ "current_task_id": "P2-405B",
+ "next_task_id": "P2-405C",
+ "overall_completion_percent": 88,
+ "read_only_mode": true,
+ "runtime_authority": "professional_task_expansion_and_telegram_bridge_read_only_no_send",
+ "status_note": "P2-405B 已把 Telegram no-send 訊息預覽、dedup key、receipt expectation 與 canary approval package 固定成只讀契約;目前可在治理頁看見訊息長相與驗收門檻,但仍不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不讀 secret、不做 production write。"
+ },
+ "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": "Approved canary delivery",
+ "status": "blocked_until_explicit_approval",
+ "allowed_output": "單一 approved canary 訊息與 receipt 驗證",
+ "live_send_enabled": false,
+ "exit_condition": "統帥明確批准 canary、指定時間窗與 rollback / mute plan。"
+ },
+ {
+ "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
+ },
+ "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"
+ ]
+ },
+ "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
+ }
+}
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 c7dedfb34..eaa547a75 100644
--- a/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json
+++ b/docs/schemas/ai_agent_professional_task_expansion_v1.schema.json
@@ -41,10 +41,10 @@
"enum": ["P0", "P1", "P2", "P3"]
},
"current_task_id": {
- "const": "P2-405A"
+ "const": "P2-405B"
},
"next_task_id": {
- "const": "P2-405B"
+ "const": "P2-405C"
},
"overall_completion_percent": {
"type": "integer",
@@ -86,7 +86,12 @@
"telegram_send_enabled",
"delivery_receipt_write_enabled",
"stages",
- "message_types"
+ "message_types",
+ "no_send_message_previews",
+ "dedup_policy",
+ "queue_preview_readback",
+ "receipt_expectations",
+ "canary_approval_package"
],
"properties": {
"canonical_room": {
@@ -132,9 +137,189 @@
"message_types": {
"type": "array",
"minItems": 6,
+ "maxItems": 6,
"items": {
"type": "object"
}
+ },
+ "no_send_message_previews": {
+ "type": "array",
+ "minItems": 6,
+ "maxItems": 6,
+ "items": {
+ "type": "object",
+ "required": [
+ "preview_id",
+ "message_type",
+ "title",
+ "target_room_alias",
+ "target_room_env",
+ "owner_agent",
+ "risk_tier",
+ "status",
+ "dedup_key",
+ "receipt_expectation_id",
+ "approval_required_before_send",
+ "canary_required_before_live",
+ "send_enabled",
+ "gateway_queue_write_enabled",
+ "bot_api_call_enabled",
+ "delivery_receipt_write_enabled",
+ "sanitized_body_lines",
+ "redaction_checks"
+ ],
+ "properties": {
+ "target_room_env": {
+ "const": "SRE_GROUP_CHAT_ID"
+ },
+ "status": {
+ "const": "preview_ready_no_send"
+ },
+ "send_enabled": {
+ "const": false
+ },
+ "gateway_queue_write_enabled": {
+ "const": false
+ },
+ "bot_api_call_enabled": {
+ "const": false
+ },
+ "delivery_receipt_write_enabled": {
+ "const": false
+ },
+ "sanitized_body_lines": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": true
+ }
+ },
+ "dedup_policy": {
+ "type": "object",
+ "required": ["required", "key_count", "live_cache_write_enabled", "keys"],
+ "properties": {
+ "required": {
+ "const": true
+ },
+ "key_count": {
+ "const": 6
+ },
+ "live_cache_write_enabled": {
+ "const": false
+ },
+ "keys": {
+ "type": "array",
+ "minItems": 6,
+ "maxItems": 6
+ }
+ },
+ "additionalProperties": true
+ },
+ "queue_preview_readback": {
+ "type": "object",
+ "required": ["enabled", "preview_only", "write_enabled", "readback_enabled"],
+ "properties": {
+ "enabled": {
+ "const": true
+ },
+ "preview_only": {
+ "const": true
+ },
+ "write_enabled": {
+ "const": false
+ },
+ "readback_enabled": {
+ "const": true
+ }
+ },
+ "additionalProperties": true
+ },
+ "receipt_expectations": {
+ "type": "array",
+ "minItems": 6,
+ "maxItems": 6,
+ "items": {
+ "type": "object",
+ "required": [
+ "receipt_id",
+ "message_type",
+ "preview_id",
+ "expected_signal",
+ "required_evidence_refs",
+ "receipt_write_enabled",
+ "production_receipt_readback_enabled",
+ "missing_receipt_policy"
+ ],
+ "properties": {
+ "required_evidence_refs": {
+ "type": "array",
+ "minItems": 1
+ },
+ "receipt_write_enabled": {
+ "const": false
+ },
+ "production_receipt_readback_enabled": {
+ "const": false
+ }
+ },
+ "additionalProperties": true
+ }
+ },
+ "canary_approval_package": {
+ "type": "object",
+ "required": [
+ "package_id",
+ "status",
+ "package_ready",
+ "approval_required",
+ "target_room_alias",
+ "target_room_env",
+ "arbiter",
+ "owner_agent",
+ "reviewers",
+ "message_type_scope",
+ "required_approval_inputs",
+ "approval_checklist",
+ "live_send_enabled",
+ "gateway_queue_write_enabled",
+ "bot_api_call_enabled",
+ "delivery_receipt_write_enabled",
+ "production_write_enabled"
+ ],
+ "properties": {
+ "target_room_env": {
+ "const": "SRE_GROUP_CHAT_ID"
+ },
+ "status": {
+ "const": "blocked_until_explicit_approval"
+ },
+ "package_ready": {
+ "const": true
+ },
+ "approval_required": {
+ "const": true
+ },
+ "live_send_enabled": {
+ "const": false
+ },
+ "gateway_queue_write_enabled": {
+ "const": false
+ },
+ "bot_api_call_enabled": {
+ "const": false
+ },
+ "delivery_receipt_write_enabled": {
+ "const": false
+ },
+ "production_write_enabled": {
+ "const": false
+ }
+ },
+ "additionalProperties": true
}
},
"additionalProperties": true
@@ -261,7 +446,16 @@
"secret_read_count",
"paid_api_call_count",
"host_write_count",
- "kubectl_action_count"
+ "kubectl_action_count",
+ "no_send_preview_count",
+ "dedup_key_count",
+ "receipt_expectation_count",
+ "canary_approval_package_count",
+ "preview_send_enabled_count",
+ "preview_queue_write_enabled_count",
+ "preview_bot_api_call_enabled_count",
+ "receipt_live_write_enabled_count",
+ "canary_live_send_enabled_count"
],
"properties": {
"professional_task_count": {
@@ -320,6 +514,33 @@
},
"kubectl_action_count": {
"const": 0
+ },
+ "no_send_preview_count": {
+ "const": 6
+ },
+ "dedup_key_count": {
+ "const": 6
+ },
+ "receipt_expectation_count": {
+ "const": 6
+ },
+ "canary_approval_package_count": {
+ "const": 1
+ },
+ "preview_send_enabled_count": {
+ "const": 0
+ },
+ "preview_queue_write_enabled_count": {
+ "const": 0
+ },
+ "preview_bot_api_call_enabled_count": {
+ "const": 0
+ },
+ "receipt_live_write_enabled_count": {
+ "const": 0
+ },
+ "canary_live_send_enabled_count": {
+ "const": 0
}
},
"additionalProperties": true
diff --git a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
index cb65970fe..b79e74704 100644
--- a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
+++ b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md
@@ -638,7 +638,7 @@ Alert / Sentry / SigNoz / Gitea / Market Watch / Operator
| `docs/evaluations/ai_agent_report_runtime_dry_run_2026-06-12.json` + `GET /api/v1/agents/agent-report-runtime-dry-run` | P2-403M 報表 runtime no-write dry-run 證據包;建立 5 個 dry-run artifact、3 個 SRE 戰情室 queue digest 草案、4 個 readback verifier case、3 個 Agent dry-run role 與 6 個 operator checkpoint;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 delivery receipt、不啟動 worker、不跑 verifier live readback、不讀 secret,已由 P2-403N fixture readback 承接 |
| `docs/evaluations/ai_agent_report_runtime_fixture_readback_2026-06-12.json` + `GET /api/v1/agents/agent-report-runtime-fixture-readback` | P2-403N fixture smoke / queue preview readback / verifier dry-run 證據包;建立 5 個 fixture smoke、3 個 SRE 戰情室 queue preview readback、4 個 verifier dry-run case、3 個 Agent fixture role 與 5 個 operator checkpoint;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 delivery receipt、不啟動 worker、不跑 verifier live readback、不讀 secret,下一步 P2-404 |
| `docs/evaluations/ai_agent_runtime_worker_shadow_gate_2026-06-12.json` + `GET /api/v1/agents/agent-runtime-worker-shadow-gate` | P2-404 runtime worker shadow / no-write execution evidence gate;建立 5 個 shadow candidate、4 個 no-write replay、4 個 verifier shadow case、3 個 Agent shadow role 與 6 個 operator checkpoint;shadow live worker、Gateway queue write、Telegram send、Bot API、delivery receipt、auto worker、verifier live readback、production write 與 secret read 全部 `0 / false`,下一步 P2-101 |
-| `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15.json` + `GET /api/v1/agents/agent-professional-task-expansion` | P2-405A AI Agent 專業任務擴展與 Telegram Runtime Bridge;承接 12-Agent War Room、P2-403 report/runtime 鏈與 monitoring owner response acceptance,固定 24 類專業任務、8 個任務領域、5 段 Telegram bridge、6 種訊息類型、MCP/RAG stack、日報 / 週報 / 月報 / action-required 報告契約,並接入 governance automation inventory 卡片;需批准任務 `19`、low / medium / high / critical = `3 / 10 / 6 / 5`;Gateway queue write、Telegram send、Bot API、delivery receipt、production write、secret read、paid API、host write 與 kubectl action 全部 `0 / false`,下一步 P2-405B 完整 no-send message preview / canary approval package |
+| `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json` + `GET /api/v1/agents/agent-professional-task-expansion` | P2-405B AI Agent 專業任務擴展與 Telegram Runtime Bridge;承接 12-Agent War Room、P2-403 report/runtime 鏈與 monitoring owner response acceptance,固定 24 類專業任務、8 個任務領域、5 段 Telegram bridge、6 種訊息類型、6 個 no-send preview、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package、MCP/RAG stack、日報 / 週報 / 月報 / action-required 報告契約,並接入 governance automation inventory 卡片;需批准任務 `19`、preview live write `0`;Gateway queue write、Telegram send、Bot API、delivery receipt production write、production write、secret read、paid API、host write 與 kubectl action 全部 `0 / false`,下一步 P2-405C approved canary send approval packet |
| `docs/evaluations/ai_agent_operation_permission_model_2026-06-12.json` + `GET /api/v1/agents/agent-operation-permission-model` | P2-101 操作類別權限模型;建立 5 條 permission lane、13 類 operation category、3 個 Agent permission role、8 個 gate transition 與 5 個 operator decision template;runtime execution、Gateway queue write、Telegram send、Bot API、delivery receipt、auto worker、verifier live readback、production write、secret / paid provider、host command 與 destructive action 全部 `0 / false`,已由 P2-102 承接 |
| `docs/evaluations/ai_agent_candidate_operation_dry_run_evidence_2026-06-12.json` + `GET /api/v1/agents/agent-candidate-operation-dry-run-evidence` | P2-102 候選操作 dry-run 證據;13 類候選操作全部具備 input / output evidence hash、side-effect count、verifier plan、rollback/no-op plan 與人工 handoff;6 個 verifier plan、7 個 gate evidence requirement、5 個 operator handoff;runtime、Gateway queue、Telegram、production write、secret / paid provider 與 destructive action 全部 `0 / false`,已由 P2-103 承接 |
| `docs/evaluations/ai_agent_task_result_audit_trail_2026-06-13.json` + `GET /api/v1/agents/agent-task-result-audit-trail` | P2-103 任務結果稽核軌跡;8 條 result route、6 個 writeback contract、7 個 audit checkpoint、5 個 operator handoff;把 diagnostic-only、repair candidate、execution failed、provider unmatched、report zero-signal 等結果固定到 KM 草稿、LOGBOOK 證據、audit trail、timeline 與人工下一步;KM / LOGBOOK / audit DB / timeline / PlayBook trust / Gateway queue / Telegram 寫入全為 `0 / false`,已由 P2-104 承接 |
@@ -841,7 +841,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence
64. 建立 owner response preflight 與拒收邊界。✅ P2-143 已完成正式驗證;承接 P2-141 decision input prep 與 P2-142 War Room 基線,固定 response intake lane `5`、required owner field `18`、intake validation check `6`、rejection guard `6`、operator action `5`、waiting external response `5`;owner response received / accepted / rejected、redacted payload ingested、reviewer queue write、Gateway queue write、Telegram send、Bot API、result capture、learning、PlayBook trust、production write、secret read、destructive operation 仍為 `0 / false`;feature commit `755b0a8d`、deploy marker `667d6329`、Gitea code-review `2961` / CD `2960` success、本地 P2-142 War Room + P2-139 至 P2-143 regression `37 passed`、JSON parse、Python compile、Web typecheck、guard、doc secret sanity、禁用外露值掃描、production API readback 與 desktop / mobile smoke 通過。下一步 P2-144 owner response readback。
65. 建立 owner response readback。✅ P2-144 已完成正式驗證;承接 P2-143 preflight,固定 response readback lane `5`、required owner field `18`、readback validation check `6`、readback rejection guard `6`、operator action `5`、waiting external response `5`、no external response received lane `5`;owner response received / accepted / rejected、redacted payload ingested、reviewer queue write、Gateway queue write、Telegram send、Bot API、result capture、learning、PlayBook trust、production write、secret read、destructive operation 仍為 `0 / false`;feature commit `8795f100`、deploy marker `ac938037`、Gitea code-review `2965` / CD `2964` success;本地 P2-139 至 P2-144 regression `45 passed`,rebase 後含 tenants regression 的推送前回歸 `47 passed`、JSON parse、Python compile、Web typecheck、guard、doc secret sanity、value-only 禁用外露值掃描、i18n key parity 與 diff check 通過;production API readback、desktop / mobile smoke、水平溢位 `0`、危險控制 `0`、工作溝通片語命中 `0` 已完成。下一步 P2-145 owner response acceptance gate。
66. 建立 owner response acceptance gate。✅ P2-145 已完成並正式驗證;承接 P2-144 readback,固定 acceptance gate lane `5`、required owner field `18`、acceptance validation check `6`、acceptance rejection guard `6`、operator action `5`、blocked no external response `5`、no acceptable external response `5`;owner response received / accepted / rejected、redacted payload ingested、reviewer queue write、Gateway queue write、Telegram send、Bot API、result capture、learning、PlayBook trust、production write、secret read、destructive operation 仍為 `0 / false`;feature commit `386dbd07`、deploy marker `36fbfc6b`、Gitea code-review `2969` / CD `2968` success;P2-144 + P2-145 regression `16 passed`、JSON parse、Python compile、Web typecheck、guard、doc secret sanity、顯示值工作視窗污染掃描、i18n key parity、diff check、production API readback、in-app browser smoke、desktop / mobile smoke、水平溢位 `0`、P2-145 卡片操作控制 `0`、工作溝通片語命中 `0` 已完成。下一步 P2-146 acceptance receipt preview,且必須等合格、遮罩、欄位完整、可驗證來源的外部正式回覆後才能建立 receipt preview。
-66a. 建立 AI Agent 專業任務擴展與 Telegram Runtime Bridge。✅ P2-405A 本地完成;承接 12-Agent War Room、P2-403 report/runtime 鏈與 monitoring owner response acceptance,固定 24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型與 MCP/RAG stack,並接入 governance automation inventory 卡片;需批准任務 `19`、low / medium / high / critical = `3 / 10 / 6 / 5`;Gateway queue write、Telegram send、Bot API、delivery receipt、production write、secret read、paid API、host write、kubectl action 仍為 `0 / false`。下一步 P2-405B 完整 no-send message preview / canary approval package;這不占用 P2-146 owner response receipt preview。
+66a. 建立 AI Agent 專業任務擴展與 Telegram Runtime Bridge。✅ P2-405B 本地完成;承接 12-Agent War Room、P2-403 report/runtime 鏈與 monitoring owner response acceptance,固定 24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型、6 個 no-send preview、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package 與 MCP/RAG stack,並接入 governance automation inventory 卡片;需批准任務 `19`、low / medium / high / critical = `3 / 10 / 6 / 5`;Gateway queue write、Telegram send、Bot API、delivery receipt production write、production write、secret read、paid API、host write、kubectl action 仍為 `0 / false`。下一步 P2-405C approved canary send approval packet;這不占用 P2-146 owner response receipt preview。
67. 新增 P0 配置控管優先序前台可視化。✅ 正式驗證完成;`/zh-TW/iwooos` 已集中顯示 Nginx public gateway、DNS / TLS / certbot、K8s / ArgoCD / production manifests、Workflow / runner / secret metadata、Public / admin / API runtime config、agent-bounty runtime / treasury 六類即時風險配置;owner response `0 / 0`、live evidence `0`、執行期 `0`、操作按鈕 `0`;feature commit `e992af89`、deploy marker `ed651a98`、Gitea code-review `2971` / CD `2970` success;本地與正式 in-app browser、desktop `1440x1100`、mobile `390x844` smoke 通過。這不是 Nginx live conf 讀取、`nginx -t`、reload、DNS / TLS probe、certbot renew、ArgoCD sync、kubectl、workflow / secret 修改、public route change、agent-bounty runtime、payout / withdrawal、production write 或 runtime gate。
68. 補強 P0 高價值配置 Gate path pattern、工作樹 preflight、owner packet 與 coverage snapshot。✅ 本地完成;`k8s/nginx/**`、`scripts/ops/**/*cert*`、`scripts/ops/**/*tls*` 已納入 high-value config classification,Nginx public gateway 與 DNS / TLS / certbot sample 從 `matched=0 / C0=0` 收斂到 `matched=3 / C0=2`;gate snapshot 顯示 `changed_files=6`、`matched=6`、`categories=3`、`c0=2`、`c1=0`;預設模式已可讀取 staged / unstaged / untracked,臨時 `k8s/nginx/*` smoke 命中 C0;owner packet snapshot `packets=3 / c0=2 / runtime_gate=0`;coverage snapshot `categories=14 / c0=8 / avg=67 / runtime_gate=0`;owner evidence 仍 `provided=false / complete=false`,runtime execution 仍 `false`。這不是 live config read、`nginx -t`、reload、certbot renew、DNS / TLS probe、host write、active scan、workflow 修改、secret 收集、production write 或 runtime gate。
69. 同步高價值配置 Owner Packet 前台 projection。✅ 已完成並正式驗證;`/zh-TW/iwooos` 與 `/zh-TW/awooop` 已顯示 owner packet snapshot `packet=3 / c0=2`、最高命中 `C0 / P0`、Nginx public gateway、DNS / TLS / certbot 與 security tooling 影響範圍;feature commit `e999c16b`、deploy marker `16c6b983`、Gitea code-review `2973` / CD `2972` success;request sent、received、accepted、runtime gate 與 action buttons 仍為 `0`;本地與正式 desktop / mobile / in-app browser smoke 已通過,水平溢位 `0`、卡片內操作控制 `0`、危險連結 `0`、工作溝通片語命中 `0`。不得因此調高 IwoooS headline。
@@ -894,7 +894,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence
| `docs/evaluations/ai_agent_report_runtime_dry_run_2026-06-12.json` + `GET /api/v1/agents/agent-report-runtime-dry-run` | P2-403M 報表 runtime no-write dry-run 證據包;5 個 dry-run artifact、3 個 queue digest 草案、4 個 readback verifier case、3 個 Agent dry-run role、6 個 operator checkpoint;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 delivery receipt、不啟動 worker、不跑 verifier live readback |
| `docs/evaluations/ai_agent_report_runtime_fixture_readback_2026-06-12.json` + `GET /api/v1/agents/agent-report-runtime-fixture-readback` | P2-403N fixture smoke / queue preview readback / verifier dry-run 證據包;5 個 fixture smoke、3 個 queue preview readback、4 個 verifier dry-run case、3 個 Agent fixture role、5 個 operator checkpoint;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 delivery receipt、不啟動 worker、不跑 verifier live readback |
| `docs/evaluations/ai_agent_runtime_worker_shadow_gate_2026-06-12.json` + `GET /api/v1/agents/agent-runtime-worker-shadow-gate` | P2-404 runtime worker shadow / no-write execution evidence gate;5 個 shadow candidate、4 個 no-write replay、4 個 verifier shadow case、3 個 Agent shadow role、6 個 operator checkpoint;不啟動 live worker、不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production target |
-| `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15.json` + `GET /api/v1/agents/agent-professional-task-expansion` | P2-405A AI Agent 專業任務擴展與 Telegram Runtime Bridge;24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型、MCP/RAG stack、治理頁 P2-405A 卡片;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production target、不讀 secret、不用 paid API |
+| `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json` + `GET /api/v1/agents/agent-professional-task-expansion` | P2-405B AI Agent 專業任務擴展與 Telegram Runtime Bridge;24 類專業任務、8 個領域、5 段 Telegram bridge、6 種訊息類型、6 個 no-send preview、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package、MCP/RAG stack、治理頁 P2-405B 卡片;不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production target、不讀 secret、不用 paid API |
| `docs/evaluations/ai_agent_operation_permission_model_2026-06-12.json` + `GET /api/v1/agents/agent-operation-permission-model` | P2-101 操作類別權限模型;5 條 permission lane、13 類 operation category、3 個 Agent permission role、8 個 gate transition、5 個 operator decision template;不啟動 runtime worker、不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production target、不讀 secret |
| `docs/evaluations/ai_agent_candidate_operation_dry_run_evidence_2026-06-12.json` + `GET /api/v1/agents/agent-candidate-operation-dry-run-evidence` | P2-102 候選操作 dry-run 證據;13 類候選操作、13 組 dry-run evidence、6 個 verifier plan、7 個 gate evidence requirement、5 個 operator handoff;不啟動 runtime worker、不寫 Gateway queue、不送 Telegram、不呼叫 Bot API、不寫 production target、不讀 secret、不執行 destructive action |
| `docs/evaluations/ai_agent_task_result_audit_trail_2026-06-13.json` + `GET /api/v1/agents/agent-task-result-audit-trail` | P2-103 任務結果稽核軌跡;8 條 result route、6 個 writeback contract、7 個 audit checkpoint、5 個 operator handoff;不寫 KM、不 runtime append LOGBOOK、不寫 audit DB、不寫 timeline、不更新 PlayBook trust、不寫 Gateway queue、不送 Telegram |
@@ -4993,3 +4993,15 @@ Trigger commit `f5cd37b7` 與 deploy marker `0ba92357` 已把 governance UI 的
- 任務風險 rollup 固定:總任務 `24`、需批准 `19`、low / medium / high / critical = `3 / 10 / 6 / 5`;高風險與 critical 任務必須保留 approval gate。
**裁決:** 這是專業任務與 Telegram 整合的只讀擴展契約,不是 Telegram send、Gateway queue write、Bot API call、delivery receipt write、production write、host write、kubectl action、secret read、paid API call 或 runtime authorization;下一步 P2-405B 只能做完整 no-send message preview 與 canary approval package,可讓統帥看到將來 TG 訊息長相,但仍不得實發。
+
+### 2026-06-15 14:45 (台北) — §3.2 / §5 — 新增 P2-405B Telegram no-send preview / dedup / receipt / canary approval package — 讓 TG 訊息長相可審核但不實發
+
+**觸發**:P2-405A 已部署到正式 API,統帥要求繼續推進 Telegram 群組 / TG Bot 整合。下一步必須讓治理頁看見未來 Telegram 訊息長相、dedup key、receipt expectation 與 canary approval package,同時保留 no-send guard,避免把 UI 可見誤判成實發授權。
+
+**已推進:**
+- 新增 `docs/evaluations/ai_agent_professional_task_expansion_2026-06-15_1445_p2_405b.json`,`current_task_id=P2-405B`、`next_task_id=P2-405C`、overall `88%`。
+- `ai_agent_professional_task_expansion_v1` schema 與 API loader 已要求 6 個 no-send preview、6 個 dedup key、6 組 receipt expectation、1 份 canary approval package。
+- `/zh-TW/governance?tab=automation-inventory` P2-405B 卡片顯示 Telegram no-send 訊息預覽、dedup、receipt、canary approval checklist 與 preview live write `0`。
+- 新增 / 更新測試,明確拒絕 preview send enabled、duplicate dedup key、canary live send enabled、queue write、Bot API call 或 receipt production write。
+
+**裁決:** 這是 Telegram no-send preview 與 canary approval package,不是 Telegram send、Gateway queue write、Bot API call、delivery receipt production write、approved canary、production write、secret read、host write、kubectl action 或 runtime authorization;下一步 P2-405C 只能產生 approved canary send approval packet 與人工批准欄位,未批准前不得實發。