From 308fd3d80e52b8fec8a6174cc5aa2ad5e2890639 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 11 Jun 2026 18:03:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(governance):=20=E9=A1=AF=E7=A4=BA=20Agent?= =?UTF-8?q?=20=E5=8F=AF=E5=A7=94=E6=B4=BE=E7=89=88=E6=9C=AC=E6=B2=BB?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._ai_agent_proactive_operations_contract.py | 6 +- ...agent_proactive_operations_contract_api.py | 6 +- apps/web/messages/en.json | 77 +++++ apps/web/messages/zh-TW.json | 77 +++++ .../tabs/automation-inventory-tab.tsx | 268 +++++++++++++++++- apps/web/src/lib/api-client.ts | 219 ++++++++++++++ docs/LOGBOOK.md | 37 +++ ...AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md | 6 +- ...AI_AGENT_GITEA_PR_DRAFT_LANE_2026-06-11.md | 11 +- ...T_STATEFUL_VERSION_INVENTORY_2026-06-11.md | 6 +- ...I_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md | 25 +- ...CTION_REQUIRED_DIGEST_POLICY_2026-06-11.md | 8 +- ...OL_ADOPTION_APPROVAL_PACKAGE_2026-06-11.md | 13 +- ...active_operations_contract_2026-06-11.json | 18 +- ...-04-15-MASTER-ai-autonomous-flywheel-v2.md | 12 +- 15 files changed, 744 insertions(+), 45 deletions(-) diff --git a/apps/api/tests/test_ai_agent_proactive_operations_contract.py b/apps/api/tests/test_ai_agent_proactive_operations_contract.py index f512a66d9..c414cec9c 100644 --- a/apps/api/tests/test_ai_agent_proactive_operations_contract.py +++ b/apps/api/tests/test_ai_agent_proactive_operations_contract.py @@ -13,9 +13,9 @@ def test_load_latest_ai_agent_proactive_operations_contract_reads_committed_snap data = load_latest_ai_agent_proactive_operations_contract() assert data["schema_version"] == "ai_agent_proactive_operations_contract_v1" - assert data["program_status"]["overall_completion_percent"] == 86 - assert data["program_status"]["current_task_id"] == "P2-402F" - assert data["program_status"]["next_task_id"] == "P2-402G" + assert data["program_status"]["overall_completion_percent"] == 100 + assert data["program_status"]["current_task_id"] == "P2-402G" + assert data["program_status"]["next_task_id"] == "P2-403A" assert data["program_status"]["read_only_mode"] is True assert data["program_status"]["runtime_authority"] == "contract_only_no_version_or_runtime_update" assert data["approval_boundaries"]["runtime_version_update_allowed"] is False diff --git a/apps/api/tests/test_ai_agent_proactive_operations_contract_api.py b/apps/api/tests/test_ai_agent_proactive_operations_contract_api.py index 829591e6e..0a9701215 100644 --- a/apps/api/tests/test_ai_agent_proactive_operations_contract_api.py +++ b/apps/api/tests/test_ai_agent_proactive_operations_contract_api.py @@ -16,9 +16,9 @@ def test_ai_agent_proactive_operations_contract_endpoint_returns_committed_snaps assert response.status_code == 200 data = response.json() assert data["schema_version"] == "ai_agent_proactive_operations_contract_v1" - assert data["program_status"]["overall_completion_percent"] == 86 - assert data["program_status"]["current_task_id"] == "P2-402F" - assert data["program_status"]["next_task_id"] == "P2-402G" + assert data["program_status"]["overall_completion_percent"] == 100 + assert data["program_status"]["current_task_id"] == "P2-402G" + assert data["program_status"]["next_task_id"] == "P2-403A" assert data["program_status"]["read_only_mode"] is True assert data["approval_boundaries"]["runtime_version_update_allowed"] is False assert data["approval_boundaries"]["package_upgrade_allowed"] is False diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index c1bb49faf..0af22a6b6 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -3031,6 +3031,83 @@ "no_direct_notify": "不直送" } }, + "proactiveOperations": { + "title": "可委派能力與版本治理", + "source": "{generated} · {current} → {next}", + "capabilitiesTitle": "Agent 可委派能力", + "capabilitiesShown": "顯示 {count}/{total}", + "domainsTitle": "版本生命週期領域", + "metrics": { + "overall": "P2-402 進度", + "capabilities": "可委派能力", + "approval": "需批准能力", + "blockedDomains": "版本關卡", + "telegram": "Telegram 處置", + "autoExecute": "自動執行" + }, + "labels": { + "owner": "主責", + "level": "自主層級", + "gate": "關卡", + "outputs": "輸出", + "telegram": "Telegram policy", + "cadence": "節奏", + "examples": "追蹤樣本" + }, + "agents": { + "openclaw": "OpenClaw", + "hermes": "Hermes", + "nemotron": "NemoTron" + }, + "risks": { + "low": "低風險", + "medium": "中風險", + "high": "高風險", + "critical": "關鍵風險" + }, + "autonomyLevels": { + "L1_report_only": "L1 僅報告", + "L2_approval_package_only": "L2 僅批准包", + "L3_draft_change_after_gate": "L3 批准後草案" + } + }, + "hostStateful": { + "source": "{generated} · {current} → {next}", + "hostListTitle": "Host / K3s 只讀盤點", + "serviceListTitle": "Stateful 服務", + "maintenanceTitle": "Maintenance window 批准包", + "metrics": { + "hosts": "主機", + "k3sNodes": "K3s Nodes", + "stateful": "Stateful 服務", + "probes": "只讀 probe", + "maintenance": "批准欄位", + "denied": "危險操作允許" + }, + "labels": { + "surfaces": "面向", + "evidence": "待補證據", + "blocked": "禁止項", + "maintenanceRequired": "需 maintenance window", + "maintenanceNotRequired": "免 maintenance window", + "backupRequired": "變更前需備份", + "backupNotRequired": "備份非必要", + "restart": "restart 授權", + "requiredFields": "必填欄位", + "smoke": "Smoke steps", + "forbiddenFields": "禁止欄位", + "probeSteps": "Probe steps", + "telegramDirect": "Telegram 直送", + "telegramQueue": "Gateway queue", + "redactionLocked": "前端紅線已鎖定", + "redactionReview": "前端紅線需審查" + }, + "values": { + "repo_reference_only_live_probe_not_run": "僅 repo reference", + "blocked_host_live_probe_not_run": "Host live probe 阻擋", + "cd_login_banner_observed_os_only": "僅 CD banner 觀察" + } + }, "overview": { "title": "決策指揮摘要", "mode": "只讀決策支援", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index c1bb49faf..0af22a6b6 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -3031,6 +3031,83 @@ "no_direct_notify": "不直送" } }, + "proactiveOperations": { + "title": "可委派能力與版本治理", + "source": "{generated} · {current} → {next}", + "capabilitiesTitle": "Agent 可委派能力", + "capabilitiesShown": "顯示 {count}/{total}", + "domainsTitle": "版本生命週期領域", + "metrics": { + "overall": "P2-402 進度", + "capabilities": "可委派能力", + "approval": "需批准能力", + "blockedDomains": "版本關卡", + "telegram": "Telegram 處置", + "autoExecute": "自動執行" + }, + "labels": { + "owner": "主責", + "level": "自主層級", + "gate": "關卡", + "outputs": "輸出", + "telegram": "Telegram policy", + "cadence": "節奏", + "examples": "追蹤樣本" + }, + "agents": { + "openclaw": "OpenClaw", + "hermes": "Hermes", + "nemotron": "NemoTron" + }, + "risks": { + "low": "低風險", + "medium": "中風險", + "high": "高風險", + "critical": "關鍵風險" + }, + "autonomyLevels": { + "L1_report_only": "L1 僅報告", + "L2_approval_package_only": "L2 僅批准包", + "L3_draft_change_after_gate": "L3 批准後草案" + } + }, + "hostStateful": { + "source": "{generated} · {current} → {next}", + "hostListTitle": "Host / K3s 只讀盤點", + "serviceListTitle": "Stateful 服務", + "maintenanceTitle": "Maintenance window 批准包", + "metrics": { + "hosts": "主機", + "k3sNodes": "K3s Nodes", + "stateful": "Stateful 服務", + "probes": "只讀 probe", + "maintenance": "批准欄位", + "denied": "危險操作允許" + }, + "labels": { + "surfaces": "面向", + "evidence": "待補證據", + "blocked": "禁止項", + "maintenanceRequired": "需 maintenance window", + "maintenanceNotRequired": "免 maintenance window", + "backupRequired": "變更前需備份", + "backupNotRequired": "備份非必要", + "restart": "restart 授權", + "requiredFields": "必填欄位", + "smoke": "Smoke steps", + "forbiddenFields": "禁止欄位", + "probeSteps": "Probe steps", + "telegramDirect": "Telegram 直送", + "telegramQueue": "Gateway queue", + "redactionLocked": "前端紅線已鎖定", + "redactionReview": "前端紅線需審查" + }, + "values": { + "repo_reference_only_live_probe_not_run": "僅 repo reference", + "blocked_host_live_probe_not_run": "Host live probe 阻擋", + "cd_login_banner_observed_os_only": "僅 CD banner 觀察" + } + }, "overview": { "title": "決策指揮摘要", "mode": "只讀決策支援", 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 af07a6c2f..938c78fd7 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 @@ -36,6 +36,8 @@ import { StatusOrb } from '@/components/ui/status-orb' import { apiClient, type AiAgentDeploymentLayoutSnapshot, + type AiAgentHostStatefulVersionInventorySnapshot, + type AiAgentProactiveOperationsContractSnapshot, type AiProviderRouteMatrixSnapshot, type AiAgentAutomationBacklogSnapshot, type AiAgentAutomationInventorySnapshot, @@ -313,6 +315,8 @@ export function AutomationInventoryTab() { const [observabilityMatrix, setObservabilityMatrix] = useState(null) const [providerRouteMatrix, setProviderRouteMatrix] = useState(null) const [deploymentLayout, setDeploymentLayout] = useState(null) + const [proactiveOperations, setProactiveOperations] = useState(null) + const [hostStatefulInventory, setHostStatefulInventory] = useState(null) const [serviceHealthGapMatrix, setServiceHealthGapMatrix] = useState(null) const [serviceHealthNotificationPolicy, setServiceHealthNotificationPolicy] = useState(null) const [loading, setLoading] = useState(true) @@ -332,6 +336,8 @@ export function AutomationInventoryTab() { apiClient.getObservabilityContractMatrix(), apiClient.getAiProviderRouteMatrix(), apiClient.getAiAgentDeploymentLayout(), + apiClient.getAiAgentProactiveOperationsContract(), + apiClient.getAiAgentHostStatefulVersionInventory(), apiClient.getServiceHealthGapMatrix(), apiClient.getServiceHealthFailureNotificationPolicy(), ] as const @@ -350,6 +356,8 @@ export function AutomationInventoryTab() { observabilityMatrixResult, providerRouteMatrixResult, deploymentLayoutResult, + proactiveOperationsResult, + hostStatefulInventoryResult, serviceHealthGapMatrixResult, serviceHealthNotificationPolicyResult, ] = results @@ -365,6 +373,8 @@ export function AutomationInventoryTab() { setObservabilityMatrix(observabilityMatrixResult.status === 'fulfilled' ? observabilityMatrixResult.value : null) setProviderRouteMatrix(providerRouteMatrixResult.status === 'fulfilled' ? providerRouteMatrixResult.value : null) setDeploymentLayout(deploymentLayoutResult.status === 'fulfilled' ? deploymentLayoutResult.value : null) + setProactiveOperations(proactiveOperationsResult.status === 'fulfilled' ? proactiveOperationsResult.value : null) + setHostStatefulInventory(hostStatefulInventoryResult.status === 'fulfilled' ? hostStatefulInventoryResult.value : null) setServiceHealthGapMatrix(serviceHealthGapMatrixResult.status === 'fulfilled' ? serviceHealthGapMatrixResult.value : null) setServiceHealthNotificationPolicy(serviceHealthNotificationPolicyResult.status === 'fulfilled' ? serviceHealthNotificationPolicyResult.value : null) setError([ @@ -378,6 +388,8 @@ export function AutomationInventoryTab() { observabilityMatrixResult, providerRouteMatrixResult, deploymentLayoutResult, + proactiveOperationsResult, + hostStatefulInventoryResult, serviceHealthGapMatrixResult, serviceHealthNotificationPolicyResult, ].some(result => result.status === 'rejected')) @@ -444,6 +456,56 @@ export function AutomationInventoryTab() { .slice(0, 12) }, [deploymentLayout]) + const visibleDelegableCapabilities = useMemo(() => { + if (!proactiveOperations) return [] + const riskPriority = { critical: 0, high: 1, medium: 2, low: 3 } as Record + return [...proactiveOperations.delegable_capabilities] + .sort((a, b) => { + const riskLeft = riskPriority[a.risk_tier] ?? 4 + const riskRight = riskPriority[b.risk_tier] ?? 4 + if (riskLeft !== riskRight) return riskLeft - riskRight + return a.capability_id.localeCompare(b.capability_id) + }) + .slice(0, 8) + }, [proactiveOperations]) + + const visibleVersionDomains = useMemo(() => { + if (!proactiveOperations) return [] + const ownerPriority = { openclaw: 0, hermes: 1, nemotron: 2 } as Record + return [...proactiveOperations.version_lifecycle_domains] + .sort((a, b) => { + const ownerLeft = ownerPriority[a.primary_owner] ?? 3 + const ownerRight = ownerPriority[b.primary_owner] ?? 3 + if (ownerLeft !== ownerRight) return ownerLeft - ownerRight + return a.domain_id.localeCompare(b.domain_id) + }) + .slice(0, 8) + }, [proactiveOperations]) + + const visibleHostInventory = useMemo(() => { + if (!hostStatefulInventory) return [] + return [...hostStatefulInventory.host_inventory] + .sort((a, b) => { + if (a.maintenance_window_required !== b.maintenance_window_required) { + return a.maintenance_window_required ? -1 : 1 + } + return a.host_id.localeCompare(b.host_id) + }) + .slice(0, 5) + }, [hostStatefulInventory]) + + const visibleStatefulServices = useMemo(() => { + if (!hostStatefulInventory) return [] + return [...hostStatefulInventory.stateful_services] + .sort((a, b) => { + if (a.backup_required_before_change !== b.backup_required_before_change) { + return a.backup_required_before_change ? -1 : 1 + } + return a.service_id.localeCompare(b.service_id) + }) + .slice(0, 8) + }, [hostStatefulInventory]) + const visibleReadinessRows = useMemo(() => { if (!backupReadiness) return [] const priority = { blocked: 0, action_required: 1, deferred: 2, ready: 3 } as Record @@ -587,7 +649,7 @@ export function AutomationInventoryTab() { ) } - if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) { + if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !proactiveOperations || !hostStatefulInventory || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) { return (
@@ -660,6 +722,29 @@ export function AutomationInventoryTab() { const deploymentLayoutNemotronTargets = deploymentLayout.rollups.by_primary_agent.nemotron ?? 0 const deploymentLayoutBlockedTargets = deploymentLayout.rollups.blocked_target_ids.length const deploymentLayoutApprovalTargets = deploymentLayout.rollups.approval_required_target_ids.length + const proactiveOverall = proactiveOperations.program_status.overall_completion_percent + const proactiveDelegableCapabilities = proactiveOperations.rollups.delegable_capability_count + const proactiveApprovalCapabilities = proactiveOperations.rollups.approval_required_capability_count + const proactiveBlockedVersionDomains = proactiveOperations.rollups.blocked_update_domain_ids.length + const proactiveTelegramActionRequired = proactiveOperations.rollups.telegram_action_required_capability_ids.length + const proactiveAutoExecuteAllowed = proactiveOperations.rollups.auto_execute_allowed_count + const hostReadonlyDeniedCount = ( + hostStatefulInventory.rollups.ssh_login_allowed_count + + hostStatefulInventory.rollups.kubectl_command_execution_allowed_count + + hostStatefulInventory.rollups.apt_upgrade_allowed_count + + hostStatefulInventory.rollups.k3s_upgrade_allowed_count + + hostStatefulInventory.rollups.node_drain_allowed_count + + hostStatefulInventory.rollups.reboot_allowed_count + + hostStatefulInventory.rollups.stateful_service_restart_allowed_count + + hostStatefulInventory.rollups.telegram_direct_send_allowed_count + + hostStatefulInventory.rollups.conversation_transcript_allowed_count + ) + const hostRedactionLocked = ( + hostStatefulInventory.display_redaction_contract.conversation_transcript_display_allowed === false + && hostStatefulInventory.display_redaction_contract.redaction_required === true + ) + const hostTelegramDirectSendAllowed = hostStatefulInventory.telegram_policy.direct_send_allowed ? 1 : 0 + const hostTelegramGatewayWriteAllowed = hostStatefulInventory.telegram_policy.gateway_queue_write_allowed ? 1 : 0 const serviceHealthActions = serviceHealthGapMatrix.rollups.target_ids_requiring_action.length const serviceHealthStaleGaps = serviceHealthGapMatrix.rollups.stale_endpoint_ids.length const serviceHealthOperatorReviews = serviceHealthGapMatrix.rollups.health_gap_ids.length @@ -820,6 +905,22 @@ export function AutomationInventoryTab() { } } + const proactiveValueLabel = (group: string, value: string) => { + try { + return t(`proactiveOperations.${group}.${value}` as never) + } catch { + return value + } + } + + const hostStatefulValueLabel = (group: string, value: string) => { + try { + return t(`hostStateful.${group}.${value}` as never) + } catch { + return value + } + } + const serviceHealthValueLabel = (value: string) => { try { return t(`serviceHealth.values.${value}` as never) @@ -1109,6 +1210,171 @@ export function AutomationInventoryTab() {
+ +
+
+
+ + + {t('proactiveOperations.title')} + +
+ +
+ +
+ } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> +
+ +
+
+
+
+ + {t('proactiveOperations.capabilitiesTitle')} + + +
+
+ {visibleDelegableCapabilities.map(capability => ( +
+
+ + {capability.capability_id} + + +
+ + {capability.display_name} + +
+ + + + +
+ {t('proactiveOperations.labels.telegram')} + + {capability.telegram_policy} + +
+ ))} +
+
+ +
+ {t('proactiveOperations.domainsTitle')} +
+ {visibleVersionDomains.map(domain => ( +
+
+ + {domain.display_name} + + +
+
+ + + +
+ + {domain.approval_gate} + +
+ ))} +
+
+
+ +
+
+
+ + {t('hostStateful.hostListTitle')} + + +
+ {visibleHostInventory.map(host => ( +
+
+ + {host.host_id} + + +
+ + {host.display_name} + +
+ + + + +
+
+ ))} +
+ +
+ {t('hostStateful.serviceListTitle')} +
+ {visibleStatefulServices.map(service => ( +
+ + {service.display_name} + +
+ + + +
+
+ ))} +
+
+ +
+ {t('hostStateful.maintenanceTitle')} +
+ + + + +
+
+ + + +
+
+
+
+
+
+
diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts index b721ec467..a64f2788d 100644 --- a/apps/web/src/lib/api-client.ts +++ b/apps/web/src/lib/api-client.ts @@ -267,6 +267,16 @@ export const apiClient = { return handleResponse(res) }, + async getAiAgentProactiveOperationsContract() { + const res = await fetch(`${API_BASE_URL}/agents/agent-proactive-operations-contract`) + return handleResponse(res) + }, + + async getAiAgentHostStatefulVersionInventory() { + const res = await fetch(`${API_BASE_URL}/agents/agent-host-stateful-version-inventory`) + return handleResponse(res) + }, + async getRuntimeSurfaceInventory() { const res = await fetch(`${API_BASE_URL}/agents/runtime-surface-inventory`) return handleResponse(res) @@ -927,6 +937,215 @@ export interface AiAgentDeploymentLayoutSnapshot { > } +export interface AiAgentProactiveOperationsContractSnapshot { + schema_version: 'ai_agent_proactive_operations_contract_v1' + generated_at: string + program_status: { + overall_completion_percent: number + current_priority: 'P0' | 'P1' | 'P2' | 'P3' + current_task_id: string + next_task_id: string + read_only_mode: true + runtime_authority: string + status_note: string + } + delegation_model: { + autonomy_levels: Array<{ + level: string + meaning: string + }> + agent_responsibilities: Array<{ + agent_id: string + responsibility: string + }> + telegram_policy: { + allowed_now: string + failure_only: string + success_spam: string + } + } + version_lifecycle_domains: Array<{ + domain_id: string + display_name: string + primary_owner: string + cadence: string + current_allowed_autonomy: string + update_authority: string + approval_gate: string + tracked_examples: string[] + }> + delegable_capabilities: Array<{ + capability_id: string + display_name: string + primary_owner: string + risk_tier: 'low' | 'medium' | 'high' | 'critical' + automation_level: string + outputs: string[] + approval_gate: string + telegram_policy: string + }> + cadence_matrix: Array<{ + cadence_id: string + frequency: string + scope: string + allowed_now: boolean + next_gate: string + }> + mcp_tool_requirements: Array<{ + tool_id: string + display_name: string + purpose: string + owner_agent: string + status: string + approval_gate: string + }> + rag_memory_contract: Array<{ + memory_id: string + display_name: string + storage: string + owner_agent: string + purpose: string + redaction_policy: string + }> + rollout_tasks: Array<{ + task_id: string + priority: 'P0' | 'P1' | 'P2' | 'P3' + status: string + completion_percent: number + owner_agent: string + summary: string + next_gate: string + }> + approval_boundaries: Record + rollups: { + version_domain_count: number + delegable_capability_count: number + cadence_count: number + mcp_tool_count: number + rag_memory_count: number + rollout_task_count: number + auto_execute_allowed_count: number + approval_required_capability_count: number + blocked_update_domain_ids: string[] + telegram_action_required_capability_ids: string[] + } +} + +export interface AiAgentHostStatefulVersionInventorySnapshot { + schema_version: 'ai_agent_host_stateful_version_inventory_v1' + generated_at: string + program_status: { + overall_completion_percent: number + current_task_id: string + next_task_id: string + read_only_mode: true + runtime_authority: string + status_note: string + } + source_refs: string[] + operation_boundaries: Record + approval_boundaries: Record + agent_roles: Array<{ + agent: string + role: string + responsibility: string + }> + host_inventory: Array<{ + host_id: string + display_name: string + known_addresses: string[] + primary_surfaces: string[] + version_observation_status: string + readonly_only: boolean + host_update_authorized: boolean + reboot_authorized: boolean + maintenance_window_required: boolean + next_evidence_needed: string[] + blocked_actions: string[] + }> + k3s_inventory: { + cluster_id: string + api_endpoint: string + version_observation_status: string + skew_policy_required: boolean + upgrade_authorized: boolean + nodes: Array<{ + node_id: string + host_id: string + role: string + readonly_only: boolean + drain_authorized: boolean + kubelet_restart_authorized: boolean + version_observation_status: string + }> + required_pre_change_evidence: string[] + } + stateful_services: Array<{ + service_id: string + display_name: string + host_id: string + endpoint_ref: string + version_observation_status: string + readonly_only: boolean + restart_authorized: boolean + upgrade_authorized: boolean + backup_required_before_change: boolean + }> + readonly_probe_plan: Array<{ + step_id: string + display_name: string + planned_output: string + run_now_allowed: boolean + mutation_allowed: boolean + }> + maintenance_window_approval_package: { + package_id: string + approval_required_before_probe: boolean + approval_required_before_change: boolean + break_glass_record_required: boolean + required_fields: string[] + forbidden_fields: string[] + minimum_smoke_plan: string[] + } + telegram_policy: { + status: string + direct_send_allowed: boolean + gateway_queue_write_allowed: boolean + allowed_digest_types_after_gate: string[] + success_noise_suppression: boolean + } + display_redaction_contract: { + conversation_transcript_display_allowed: false + redaction_required: true + allowed_frontend_fields: string[] + forbidden_frontend_content: string[] + } + rollups: { + host_count: number + k3s_node_count: number + stateful_service_count: number + readonly_probe_step_count: number + maintenance_required_field_count: number + host_ids: string[] + stateful_service_ids: string[] + ssh_login_allowed_count: number + kubectl_command_execution_allowed_count: number + apt_upgrade_allowed_count: number + k3s_upgrade_allowed_count: number + node_drain_allowed_count: number + reboot_allowed_count: number + stateful_service_restart_allowed_count: number + telegram_direct_send_allowed_count: number + conversation_transcript_allowed_count: number + } + next_actions: Array<{ + task_id: string + priority: 'P0' | 'P1' | 'P2' | 'P3' + summary: string + gate: string + }> +} + export interface RuntimeSurfaceInventorySnapshot { schema_version: 'runtime_surface_inventory_v1' generated_at: string diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index c47927c9f..3689b477d 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,40 @@ +## 2026-06-11|P2-402G AI Agent 可委派能力 Governance UI + +**背景**:P2-402A~F 已完成 AI Agent 主動營運委派、版本新鮮度、工具採用批准包、Telegram digest policy、Gitea PR 草案 lane、Host / K3s / stateful 只讀盤點,但治理頁尚未把「可委派能力、版本生命週期、Host / K3s / stateful 關卡、Telegram / redaction gate」集中顯示。本階段只做 read-only UI 與狀態同步,不開 runtime gate,不提供批准、執行、發送、升級、重啟或部署按鈕。 + +**本輪完成**: + +- `apps/web/src/lib/api-client.ts` 新增 `GET /api/v1/agents/agent-proactive-operations-contract` 與 `GET /api/v1/agents/agent-host-stateful-version-inventory` 前端方法與型別。 +- `apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx` 接入兩個 snapshot,新增 P2-402G 區塊,顯示 24 類可委派能力、12 類版本生命週期 domain、5 台主機、2 個 K3s node、12 個 stateful / ops 服務、6 個只讀 probe step、11 個 maintenance 欄位與 Telegram / redaction gate。 +- 前端不顯示工作視窗對話內容、prompt、browser context、敏感端點或 secret 欄位;Host / stateful 只顯示 ID、計數、狀態與批准門檻。 +- `docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json` 更新為 overall `100%`、current `P2-402G`、next `P2-403A`,並把 P2-402G rollout task 標為 done / 100。 +- 同步 `AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md`、`AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md`、P2-402C/D/E/F 報告與 MASTER §3.2.1c / §5 / changelog。 + +**本地驗證**: + +- `PYTHONDONTWRITEBYTECODE=1 DATABASE_URL='postgresql+asyncpg://test:test@localhost/test' PYTHONPATH=apps/api pytest apps/api/tests/test_ai_agent_proactive_operations_contract.py apps/api/tests/test_ai_agent_proactive_operations_contract_api.py -q -p no:cacheprovider`:`5 passed`。 +- `pnpm --filter @awoooi/web typecheck`:通過。 +- `NEXT_PUBLIC_API_URL=https://awoooi.wooo.work NEXT_PRIVATE_BUILD_WORKER_COUNT=1 SENTRY_SUPPRESS_GLOBAL_ERROR_HANDLER_FILE_WARNING=1 pnpm --filter @awoooi/web build`:通過,`/zh-TW/governance` route 進 build summary。 +- `python3 scripts/ops/doc-secrets-sanity-check.py docs .gitea`:`DOC_SECRET_SANITY_OK scanned_files=663`。 +- `git diff --check`:通過。 +- 本地 `http://localhost:3000/zh-TW/governance?tab=automation-inventory&_v=p2-402g-clean-desktop` smoke:新區塊可見、P2-402 100% 可見、Host 只讀盤點可見、服務清單含 `postgresql / minio / gitea`、危險操作按鈕 `0`、水平溢出 `0`、工作對話外露 `0`。 +- 本地 mobile `390x844` smoke:新區塊可見、P2-402 100% 可見、Host 只讀盤點可見、危險操作按鈕 `0`、水平溢出 `0`、工作對話外露 `0`。 + +**完成度同步**: + +- P2-402G:`100%`。 +- AI Agent 主動營運委派與版本生命週期 P2-402A~G:`100%`。 +- AI Agent 自動化工作包整體:仍維持 `92%`,因 runtime gate、排程、工具安裝、PR creation、Telegram queue write、host probe、SSH、kubectl、升級、重啟仍未批准。 +- Next task:`P2-403A` runtime gate planning。 + +**正式推版狀態**: + +- 待 commit / push / CD / production smoke 後補記。 + +**邊界**: + +- 本波仍不 SSH、不執行 host command、不執行 kubectl、不 apt / kernel / K3s upgrade、不 node drain、不 kubelet restart、不 reboot、不 stateful restart、不 DB migration、不 restore、不 pull image、不發 Telegram、不讀取或輸出 secret、不顯示工作視窗對話內容、不提供任何前端執行按鈕。 + ## 2026-06-11|IwoooS S4.9 Owner Response Handoff Queue 來源綁定 **背景**:S4.9 的第一優先仍是負責人回覆 gate,但目前 owner role / decision / reason / affected scope / redacted evidence refs / followup owner 尚未收齊。本階段先把「收件前 handoff queue」做成 source-backed 只讀契約,讓 IwoooS 前台與 guard 都能顯示下一個 owner 需要補什麼,同時避免把 queue 可見誤解成 request sent、received、accepted 或 runtime gate。 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 ddf8ecff3..6ba7193f2 100644 --- a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md +++ b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md @@ -13,7 +13,7 @@ | 工具 / 服務 / 套件 AI 自動化 | 92% | P0 已完成;P1 服務 / runtime / 監控 / provider / service health / 備份 / DR / 套件與供應鏈只讀基線已完成;P1-007 失敗限定通知合約與前端 redaction 合約已完成;下一主線是 P2-004 依賴 / 供應鏈漂移監控 | 狀態分類、盤點 schema、權限矩陣、靜態盤點種子、只讀 API、UI 骨架、驗證、自動化待辦 schema / 快照 / API / 分組 UI、Backup / DR 目標盤點、準備度矩陣、備份通知政策、Backup / DR 證據 UI、復原演練批准包模板、異地 / escrow 準備度狀態、任務批准邊界、確定性進度彙總、Python 套件 / 供應鏈只讀基線、JS pnpm/npm 只讀基線、Docker build surface 只讀基線、CVE / license / drift 嚴重度政策、定期依賴漂移與外部資料來源檢查設計、依賴升級批准包模板、runtime_surface_inventory_v1 schema / snapshot / API / UI、gitea_workflow_runner_health_v1 schema / snapshot / API / UI、observability_contract_matrix_v1 schema / snapshot / API / UI、ai_provider_route_matrix_v1 schema / snapshot / API / UI、service_health_gap_matrix_v1 schema / snapshot / API / UI、service health evidence cards UI、service_health_failure_notification_policy_v1 schema / snapshot / API / UI 已完成 | | OpenClaw / Hermes / NemoTron 佈建布局 | 45% | P1-401 / P1-402 已完成;仍是只讀 layout 與治理頁顯示,不是 runtime deploy | `ai_agent_deployment_layout_v1` schema、`ai_agent_deployment_layout_2026-06-11.json`、`GET /api/v1/agents/agent-deployment-layout`、治理頁自動化盤點 UI、`AI_AGENT_DEPLOYMENT_LAYOUT_2026-06-11.md` | | OpenClaw / Hermes / NemoTron 主動溝通與學習契約 | 35% | P2-401A 已完成只讀 contract;runtime worker、DB migration、Telegram 實發、SDK / 付費服務仍未開 gate | `ai_agent_communication_learning_contract_v1` schema、`ai_agent_communication_learning_contract_2026-06-11.json`、`GET /api/v1/agents/agent-communication-learning-contract`、MASTER §3.2.1b / §3.4.3 | -| AI Agent 主動營運委派與版本生命週期 | 86% | P2-402A / P2-402B / P2-402C / P2-402D / P2-402E / P2-402F 已完成;已建立 repo-only 版本新鮮度快照、工具採用批准包、Telegram action-required digest policy、Gitea PR 草案 lane、host / K3s / stateful 版本只讀盤點與 API。定期排程、外部版本查詢、工具安裝、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`、MASTER §3.2.1c | +| 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 | | 本工作清單與分析報告 | 100% | 已完成 | 本 MD 文件 | AI Agent 自動化工作包目前完成度:**92%**。本工作清單文件本身完成度:**100%**。 @@ -22,7 +22,7 @@ AI Agent 自動化工作包目前完成度:**92%**。本工作清單文件本 三 Agent 主動溝通與學習契約目前完成度:**35%**。已完成只讀 schema / snapshot / API / 測試與 MASTER 同步;下一步依優先順序推 `P2-401B` AgentSession / Redis Streams migration 與 worker gate,但在批准前仍不得啟動 runtime loop。 -AI Agent 主動營運委派與版本生命週期目前完成度:**86%**。已完成 12 類版本 domain、24 類可委派能力、5 種 cadence、8 類 MCP、4 類 RAG memory、只讀 API、`P2-402B` repo-only daily version freshness snapshot、`P2-402C` Renovate / OSV-Scanner / Trivy / Syft / Grype 工具採用批准包、`P2-402D` Telegram action-required digest policy、`P2-402E` Gitea PR 草案 lane,以及 `P2-402F` host OS / K3s / stateful services 版本只讀盤點;下一步是 `P2-402G` governance UI 顯示可委派能力,外部 registry / package source / host probe / SSH / kubectl / 工具安裝 / CI 變更 / 實際 PR creation / Telegram 實發仍需 gate。 +AI Agent 主動營運委派與版本生命週期目前完成度:**100%**。已完成 12 類版本 domain、24 類可委派能力、5 種 cadence、8 類 MCP、4 類 RAG memory、只讀 API、`P2-402B` repo-only daily version freshness snapshot、`P2-402C` Renovate / OSV-Scanner / Trivy / Syft / Grype 工具採用批准包、`P2-402D` Telegram action-required digest policy、`P2-402E` Gitea PR 草案 lane、`P2-402F` host OS / K3s / stateful services 版本只讀盤點,以及 `P2-402G` governance UI 顯示可委派能力;下一步是 `P2-403A` runtime gate planning,外部 registry / package source / host probe / SSH / kubectl / 工具安裝 / CI 變更 / 實際 PR creation / Telegram 實發仍需 gate。 完成度計算模型: @@ -957,7 +957,7 @@ UI: | P2-402D | 完成 | 100 | OpenClaw | 建立 Telegram action-required digest policy | `ai_agent_telegram_action_required_digest_policy_v1` / snapshot / 只讀 API / 測試;8 條 digest rule、3 個 channel 草案、5 類 trigger category、成功降噪與 redaction policy | 只讀;Telegram send、Gateway queue write、route / receiver change、workflow、runtime 全部未啟用 | | P2-402E | 完成 | 100 | Hermes | 設計 Gitea PR 草案 lane | `ai_agent_gitea_pr_draft_lane_v1` / snapshot / 只讀 API / 測試;6 條 grouping rule、7 個 lane step、9 個 required check、6 條 rollback requirement、4 個 draft template | 只讀;branch push、PR creation、workflow trigger、lockfile、package upgrade、auto merge、Telegram 全部未啟用 | | P2-402F | 完成 | 100 | OpenClaw | 建立 host OS / K3s / stateful services 版本只讀盤點 | `ai_agent_host_stateful_version_inventory_v1` / snapshot / 只讀 API / 測試;5 台主機、2 個 K3s 節點、12 個 stateful / ops 服務、6 個只讀 probe step、maintenance window approval package | 只讀;SSH、kubectl、apt / K3s upgrade、node drain、reboot、stateful restart、Telegram 全部未啟用 | -| P2-402G | 待辦 | 0 | Hermes | 接入 governance UI 顯示可委派能力 | 自主等級、gate、owner、Telegram policy | frontend UI change approval | +| P2-402G | 完成 | 100 | Hermes | 接入 governance UI 顯示可委派能力 | 自主等級、gate、owner、Telegram policy、Host / K3s / stateful 只讀關卡與 redaction 狀態 | 只讀;不顯示敏感端點、不發 Telegram、不提供執行按鈕 | | P2-101 | 待辦 | 0 | OpenClaw | 定義操作類別權限模型 | 操作政策 schema | HITL 關卡 | | P2-102 | 待辦 | 0 | OpenClaw | 所有候選操作都要有 dry-run 證據 | dry-run 合約 | 不直接 apply | | P2-103 | 待辦 | 0 | Hermes | 把任務結果接回 KM / LOGBOOK / 稽核軌跡 | 證據寫入器 | 不洩漏 secret | diff --git a/docs/ai/AI_AGENT_GITEA_PR_DRAFT_LANE_2026-06-11.md b/docs/ai/AI_AGENT_GITEA_PR_DRAFT_LANE_2026-06-11.md index 653c66127..750fc9a63 100644 --- a/docs/ai/AI_AGENT_GITEA_PR_DRAFT_LANE_2026-06-11.md +++ b/docs/ai/AI_AGENT_GITEA_PR_DRAFT_LANE_2026-06-11.md @@ -1,7 +1,7 @@ # AI Agent Gitea PR 草案 Lane 工作報告 > 日期:2026-06-11(台北時間) -> 狀態:P2-402E 已完成;P2-402F 已接續完成;整體 AI Agent 主動營運與版本生命週期完成度 86%。 +> 狀態:P2-402E 已完成;P2-402F / P2-402G 已接續完成;整體 AI Agent 主動營運與版本生命週期完成度 100%。 > 邊界:本文件與對應 API 只提供 Gitea PR 草案 lane,不 push branch、不建立或更新 Gitea PR、不留言、不 auto merge、不觸發 workflow、不改 CI、不寫 lockfile、不升級套件、不 build / pull image、不發 Telegram、不顯示工作視窗對話內容。 ## 1. 本波完成項目 @@ -13,7 +13,7 @@ | API loader | 完成 | `apps/api/src/services/ai_agent_gitea_pr_draft_lane.py` | | 只讀 API | 完成 | `GET /api/v1/agents/agent-gitea-pr-draft-lane` | | 測試 | 完成 | loader / API / PR creation boundary / automerge boundary / blocking checks / owner response / transcript redaction | -| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 已由 P2-402F 推進到完成度 86%,current `P2-402F`,next `P2-402G` | +| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 已由 P2-402G 推進到完成度 100%,current `P2-402G`,next `P2-403A` | ## 2. Grouping 規則摘要 @@ -67,6 +67,7 @@ | 優先 | ID | 工作 | 完成標準 | |---:|---|---|---| | 1 | P2-402F | host OS / K3s / stateful services 版本只讀盤點 | 已完成;只讀 schema / snapshot / API / 測試,SSH / kubectl / upgrade / reboot 未啟用 | -| 2 | P2-402G | Governance UI 顯示可委派能力 | 前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | -| 3 | 候選池 | Gitea bot / branch policy approval package | bot account、branch naming、PR permission、rollback、audit trail | -| 4 | 候選池 | Draft PR packet renderer | 把 grouping / test / rollback / owner response 轉為可審核 PR 草案,不呼叫 Gitea API | +| 2 | P2-402G | Governance UI 顯示可委派能力 | 已完成;前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | +| 3 | P2-403A | Runtime gate planning | 排程、PR 草案、host probe 與 Telegram queue write 的逐項批准包 | +| 4 | 候選池 | Gitea bot / branch policy approval package | bot account、branch naming、PR permission、rollback、audit trail | +| 5 | 候選池 | Draft PR packet renderer | 把 grouping / test / rollback / owner response 轉為可審核 PR 草案,不呼叫 Gitea API | diff --git a/docs/ai/AI_AGENT_HOST_STATEFUL_VERSION_INVENTORY_2026-06-11.md b/docs/ai/AI_AGENT_HOST_STATEFUL_VERSION_INVENTORY_2026-06-11.md index 8e355800a..d1daf1e53 100644 --- a/docs/ai/AI_AGENT_HOST_STATEFUL_VERSION_INVENTORY_2026-06-11.md +++ b/docs/ai/AI_AGENT_HOST_STATEFUL_VERSION_INVENTORY_2026-06-11.md @@ -1,7 +1,7 @@ # AI Agent Host / K3s / Stateful 版本只讀盤點 > 日期:2026-06-11(台北時間) -> 狀態:P2-402F 已完成;整體 AI Agent 主動營運與版本生命週期完成度 86%。 +> 狀態:P2-402F 已完成;P2-402G 已接入 governance UI;整體 AI Agent 主動營運與版本生命週期完成度 100%。 > 事實來源:`ai_agent_host_stateful_version_inventory_v1`、`ai_agent_proactive_operations_contract_v1`、MASTER §3.2.1c。 ## 1. 本波完成 @@ -13,7 +13,7 @@ | 只讀 loader | 完成 | 強制 SSH / kubectl / upgrade / drain / reboot / restart / Telegram / transcript gate 全為 false | | API | 完成 | `GET /api/v1/agents/agent-host-stateful-version-inventory` | | 測試 | 完成 | loader / API / rollup / reboot / drain / stateful restart / redaction boundary | -| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 86%,current `P2-402F`,next `P2-402G` | +| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 100%,current `P2-402G`,next `P2-403A` | ## 2. 盤點範圍 @@ -61,6 +61,6 @@ | 優先 | 任務 | 關卡 | |---:|---|---| -| 1 | P2-402G Governance UI 顯示可委派能力 | frontend UI change approval | +| 1 | P2-403A Runtime gate planning | 需 operator approval package,不得直接開排程 / SSH / kubectl | | 2 | Host readonly probe owner request | 需 owner approval,不得直接 SSH / kubectl | | 3 | Stateful backup freshness packet | 需備份 evidence,不得 restore / prune | diff --git a/docs/ai/AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md b/docs/ai/AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md index 898230c4b..e665c7e76 100644 --- a/docs/ai/AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md +++ b/docs/ai/AI_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md @@ -1,7 +1,7 @@ # AI Agent 主動營運委派與版本生命週期分析報告 > 日期:2026-06-11(台北時間) -> 文件定位:P2-402A / P2-402B / P2-402C / P2-402D / P2-402E / P2-402F 只讀契約摘要。權威細節以 MASTER §3.2.1c、`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` 為準。 +> 文件定位:P2-402A / P2-402B / P2-402C / P2-402D / P2-402E / P2-402F / P2-402G 只讀契約與治理 UI 摘要。權威細節以 MASTER §3.2.1c、`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` 為準。 ## 1. 本波完成度 @@ -13,7 +13,8 @@ | Telegram action-required digest policy | 100% | P2-402D 已完成 critical / action-required / failure-only digest schema / committed snapshot / API / 測試 | | Gitea PR 草案 lane | 100% | P2-402E 已完成 grouping、automerge=false、測試證據、rollback、owner response schema / committed snapshot / API / 測試 | | Host / K3s / stateful 版本只讀盤點 | 100% | P2-402F 已完成 5 台主機、2 個 K3s 節點、12 個 stateful / ops 服務與 maintenance window 批准包 schema / committed snapshot / API / 測試 | -| 整體主動營運與版本生命週期 | 86% | 已完成架構、repo-only freshness、工具採用批准包、Telegram digest policy、Gitea PR 草案 lane 與 host / K3s / stateful 版本只讀盤點;runtime 排程、工具安裝、CI 變更、實際 PR 建立與更新、host probe、升級、重啟仍未開 gate | +| Governance UI 可委派能力顯示 | 100% | P2-402G 已把可委派能力、版本生命週期、Host / K3s / stateful 只讀盤點、maintenance window 與 Telegram / redaction gate 接入治理頁 | +| 整體主動營運與版本生命週期 | 100% | P2-402A~G 只讀契約、snapshot、API、測試與治理 UI 已完成;runtime 排程、工具安裝、CI 變更、實際 PR 建立與更新、host probe、升級、重啟仍未開 gate | ## 2. 可交給 AI Agent 的工作分類 @@ -60,7 +61,7 @@ | Dockerfiles | Hermes | action_required | P2-402C 評估 Trivy / Syft / Grype / Docker Scout 採用,不 build / pull | | Committed evaluation snapshots | Hermes | action_required | 將 2026-06-04~06-05 舊基線列入 stale refs,不假裝是外部最新 | | Agent / model governance snapshots | NemoTron | action_required | 只做離線 freshness note,不進 shadow / canary / production route | -| K8s / Gitea / observability / Ansible / backup / web surfaces | OpenClaw + Hermes | baseline_ready / planned_next | 分別等待 P2-402D / P2-402F / P2-402G gate | +| K8s / Gitea / observability / Ansible / backup / web surfaces | OpenClaw + Hermes | baseline_ready / planned_next | 下一步進入 P2-403A runtime gate planning;現階段仍只讀 | 本波只把「每天要看哪些 repo 內版本來源」定義成可驗證資料面。每日排程、外部 registry 查詢、主機/K3s live probe、Telegram digest 與 Gitea PR lane 都仍是下一階段 gate。 @@ -110,16 +111,28 @@ P2-402E 的重點是先把「PR 草案要長什麼樣、要有哪些證據、誰 P2-402F 的重點是把「要盤哪些主機與 stateful 服務、盤點前要誰批准、升級前要哪些備份與 rollback 證據」固定成資料契約。它不是主機探測或升級;SSH、kubectl、apt upgrade、K3s upgrade、node drain、reboot、stateful restart、Telegram 實發全部維持 blocked。 -## 9. 下一步優先順序 +## 9. P2-402G Governance UI 顯示可委派能力 + +| 類別 | 本波定義 | 仍禁止 | +|---|---|---| +| 可委派能力 | 顯示 24 類 capability、主責 Agent、風險、自主層級、批准 gate、Telegram policy | 不提供批准、執行、安裝、更新或發送按鈕 | +| 版本生命週期 | 顯示 12 類 domain、owner、cadence、允許 autonomy、approval gate | 不查外部 registry、不改 workflow、不建立 PR | +| Host / K3s / stateful | 顯示 5 台主機、2 個 K3s node、12 個 stateful / ops 服務、6 個只讀 probe、11 個 maintenance 欄位 | 不顯示敏感端點、不 SSH、不 kubectl、不重啟、不升級 | +| Telegram / redaction | 顯示 direct send / gateway queue / frontend redaction gate 都維持 locked | 不發 Telegram、不寫 queue、不顯示工作視窗對話內容 | + +P2-402G 的重點是把前面六個資料契約接回治理頁,讓統帥可以用一個 UI 看到「哪些事情可委派、誰負責、目前只能做到哪一層、下一個 gate 是什麼」。它仍然是 read-only evidence surface,不是 runtime agent loop。 + +## 10. 下一步優先順序 | ID | 優先 | 任務 | 關卡 | |---|---|---|---| | P2-402D | 0 | Telegram action-required digest policy | 已完成,只讀;Telegram send / queue write 未啟用 | | P2-402E | 1 | Gitea PR 草案 lane | 已完成,只讀;branch push / PR creation / workflow trigger 未啟用 | | P2-402F | 2 | host OS / K3s / stateful services 版本只讀盤點 | 已完成,只讀;SSH / kubectl / upgrade / reboot 未啟用 | -| P2-402G | 3 | governance UI 顯示可委派能力 | frontend UI approval | +| P2-402G | 3 | governance UI 顯示可委派能力 | 已完成,只讀;不顯示敏感端點或工作對話內容 | +| P2-403A | 4 | runtime gate planning:排程、工具、PR 草案、host probe 的逐項批准模型 | operator approval package | -## 10. 仍維持 false 的安全邊界 +## 11. 仍維持 false 的安全邊界 - `runtime_version_update_allowed=false` - `package_upgrade_allowed=false` diff --git a/docs/ai/AI_AGENT_TELEGRAM_ACTION_REQUIRED_DIGEST_POLICY_2026-06-11.md b/docs/ai/AI_AGENT_TELEGRAM_ACTION_REQUIRED_DIGEST_POLICY_2026-06-11.md index fdd85f96d..2f75f2a10 100644 --- a/docs/ai/AI_AGENT_TELEGRAM_ACTION_REQUIRED_DIGEST_POLICY_2026-06-11.md +++ b/docs/ai/AI_AGENT_TELEGRAM_ACTION_REQUIRED_DIGEST_POLICY_2026-06-11.md @@ -1,7 +1,7 @@ # AI Agent Telegram Action-Required Digest Policy 工作報告 > 日期:2026-06-11(台北時間) -> 狀態:P2-402D 已完成;整體 AI Agent 主動營運與版本生命週期完成度 68%。 +> 狀態:P2-402D 已完成;P2-402E / P2-402F / P2-402G 已接續完成;整體 AI Agent 主動營運與版本生命週期完成度 100%。 > 邊界:本文件與對應 API 只提供 Telegram digest policy,不送 Telegram、不寫 Telegram Gateway queue、不改 Alertmanager route / receiver、不寫 AwoooP event、不觸發 workflow、不執行 runtime、不讀取 secret、不顯示工作視窗對話內容。 ## 1. 本波完成項目 @@ -13,7 +13,7 @@ | API loader | 完成 | `apps/api/src/services/ai_agent_telegram_action_required_digest_policy.py` | | 只讀 API | 完成 | `GET /api/v1/agents/agent-telegram-action-required-digest-policy` | | 測試 | 完成 | loader / API / direct-send boundary / success-noise suppression / rollup mismatch / transcript redaction | -| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 68%,current `P2-402D`,next `P2-402E` | +| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 100%,current `P2-402G`,next `P2-403A` | ## 2. Digest 規則摘要 @@ -51,5 +51,5 @@ |---:|---|---|---| | 1 | P2-402E | Gitea PR 草案 lane | 已完成:Renovate grouping、automerge=false、測試要求、rollback、owner response;bot / branch policy 仍未批准 | | 2 | P2-402F | host OS / K3s / stateful services 版本只讀盤點 | 已完成;主機、K3s、PostgreSQL、Redis、MinIO、Harbor、Gitea 只讀版本矩陣 | -| 3 | P2-402G | Governance UI 顯示可委派能力 | 前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | -| 4 | 候選池 | Telegram Gateway E2E 批准包 | queue write / send / callback / fallback path 的測試與 rollout gate | +| 3 | P2-402G | Governance UI 顯示可委派能力 | 已完成;前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | +| 4 | P2-403A | Runtime gate planning | queue write / send / callback / fallback path 的逐項批准與 rollout gate | diff --git a/docs/ai/AI_AGENT_TOOL_ADOPTION_APPROVAL_PACKAGE_2026-06-11.md b/docs/ai/AI_AGENT_TOOL_ADOPTION_APPROVAL_PACKAGE_2026-06-11.md index b1bf60e3d..bc910eb3b 100644 --- a/docs/ai/AI_AGENT_TOOL_ADOPTION_APPROVAL_PACKAGE_2026-06-11.md +++ b/docs/ai/AI_AGENT_TOOL_ADOPTION_APPROVAL_PACKAGE_2026-06-11.md @@ -1,7 +1,7 @@ # AI Agent 工具採用批准包工作報告 > 日期:2026-06-11(台北時間) -> 狀態:P2-402C 已完成;整體 AI Agent 主動營運與版本生命週期完成度 55%。 +> 狀態:P2-402C 已完成;P2-402D / P2-402E / P2-402F / P2-402G 已接續完成;整體 AI Agent 主動營運與版本生命週期完成度 100%。 > 邊界:本文件與對應 API 只提供批准包,不安裝工具、不改 CI、不查外部 registry、不下載漏洞 DB、不建立 PR、不 auto merge、不發 Telegram、不改 production route。 ## 1. 本波完成項目 @@ -13,7 +13,7 @@ | API loader | 完成 | `apps/api/src/services/ai_agent_tool_adoption_approval_package.py` | | 只讀 API | 完成 | `GET /api/v1/agents/agent-tool-adoption-approval-package` | | 測試 | 完成 | loader / API / safety boundary / rollup mismatch / unknown source ref | -| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 55%,current `P2-402C`,next `P2-402D` | +| 主契約同步 | 完成 | `ai_agent_proactive_operations_contract_v1` 完成度 100%,current `P2-402G`,next `P2-403A` | ## 2. 官方來源與工具角色 @@ -40,10 +40,11 @@ | 1 | P2-402D | Telegram action-required digest policy | 定義 critical / action-required / failure-only,禁止成功洗版,接 Telegram Gateway E2E gate | 完成 | | 2 | P2-402E | Gitea PR 草案 lane | Renovate grouping、automerge=false、測試要求、rollback、owner response | 完成 | | 3 | P2-402F | host OS / K3s / stateful services 版本只讀盤點 | 主機、K3s、PostgreSQL、Redis、MinIO、Harbor、Gitea 只讀版本矩陣 | 完成 | -| 4 | P2-402G | Governance UI 顯示可委派能力 | 前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | 待辦 | -| 5 | 候選池 | SBOM artifact policy | Syft / Trivy artifact 格式、保存、redaction、消費者規則 | 未排正式編號 | -| 6 | 候選池 | Scanner false-positive policy | OSV / Trivy / Grype 差異、suppression、severity mapping、owner SLA | 未排正式編號 | -| 7 | 候選池 | Version history / RAG 回寫 | 每次版本觀測、批准、失敗、rollback 回寫 `version_history` / `upgrade_outcomes` | 未排正式編號 | +| 4 | P2-402G | Governance UI 顯示可委派能力 | 前端顯示 autonomy level、gate、owner、Telegram policy,無執行按鈕 | 完成 | +| 5 | P2-403A | Runtime gate planning | 排程、工具、PR 草案、host probe 與 Telegram queue write 的逐項批准包 | 待辦 | +| 6 | 候選池 | SBOM artifact policy | Syft / Trivy artifact 格式、保存、redaction、消費者規則 | 未排正式編號 | +| 7 | 候選池 | Scanner false-positive policy | OSV / Trivy / Grype 差異、suppression、severity mapping、owner SLA | 未排正式編號 | +| 8 | 候選池 | Version history / RAG 回寫 | 每次版本觀測、批准、失敗、rollback 回寫 `version_history` / `upgrade_outcomes` | 未排正式編號 | ## 5. 現在仍維持 false 的邊界 diff --git a/docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json b/docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json index 0bdaa36c0..a04ce10e3 100644 --- a/docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json +++ b/docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json @@ -2,13 +2,13 @@ "schema_version": "ai_agent_proactive_operations_contract_v1", "generated_at": "2026-06-11T21:30:00+08:00", "program_status": { - "overall_completion_percent": 86, + "overall_completion_percent": 100, "current_priority": "P2", - "current_task_id": "P2-402F", - "next_task_id": "P2-402G", + "current_task_id": "P2-402G", + "next_task_id": "P2-403A", "read_only_mode": true, "runtime_authority": "contract_only_no_version_or_runtime_update", - "status_note": "P2-402F 已建立 host OS / K3s / stateful services 版本只讀盤點與 maintenance window 批准包;本波仍不 SSH、不執行 kubectl、不升級主機 / K3s / stateful service、不 drain、不 reboot、不發 Telegram。" + "status_note": "P2-402G 已把可委派能力、版本生命週期、Host / K3s / stateful 只讀盤點與 Telegram / redaction gate 接入 governance UI;本波仍不 SSH、不執行 kubectl、不升級主機 / K3s / stateful service、不 drain、不 reboot、不發 Telegram。" }, "external_source_evidence": [ { @@ -655,16 +655,16 @@ "completion_percent": 100, "owner_agent": "OpenClaw", "summary": "建立 host OS / K3s / stateful services 版本只讀盤點、maintenance window 批准包、schema、snapshot、只讀 API 與測試;所有 SSH / kubectl / upgrade / drain / reboot / restart gate 維持 false。", - "next_gate": "P2-402G_governance_ui_capability_display" + "next_gate": "P2-402G_completed" }, { "task_id": "P2-402G", "priority": "P2", - "status": "planned", - "completion_percent": 0, + "status": "done", + "completion_percent": 100, "owner_agent": "Hermes", - "summary": "把可委派能力接入 governance UI,顯示自主等級、gate、owner、Telegram policy。", - "next_gate": "frontend_ui_change_approval_required" + "summary": "把可委派能力、版本生命週期、Host / K3s / stateful 只讀盤點、maintenance window 批准包與 Telegram / redaction gate 接入 governance UI;不顯示敏感端點或工作對話內容。", + "next_gate": "P2-403A_runtime_gate_planning" } ], "approval_boundaries": { 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 614fc9e52..8fd675b91 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 @@ -670,7 +670,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence | 檔案 / API | 用途 | |---|---| | `docs/schemas/ai_agent_proactive_operations_contract_v1.schema.json` | 主動營運委派、版本生命週期、MCP、RAG、Telegram policy、approval boundary 契約 | -| `docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json` | 12 類版本 domain、24 類可委派能力、5 種 cadence、8 類 MCP、4 類 RAG memory;完成度 `86%` | +| `docs/evaluations/ai_agent_proactive_operations_contract_2026-06-11.json` | 12 類版本 domain、24 類可委派能力、5 種 cadence、8 類 MCP、4 類 RAG memory;P2-402A~G 完成度 `100%` | | `apps/api/src/services/ai_agent_proactive_operations_contract.py` | 只讀 loader;強制 runtime update / package upgrade / host upgrade / workflow schedule / auto merge / Telegram direct send 全部 false | | `GET /api/v1/agents/agent-proactive-operations-contract` | 治理 API;只回傳 committed snapshot,不啟用排程、不升級、不呼叫付費服務 | | `docs/schemas/ai_agent_version_freshness_snapshot_v1.schema.json` | P2-402B repo-only 版本新鮮度 schema;鎖定 schedule / external lookup / upgrade / Telegram / PR / host probe 全部 false | @@ -688,6 +688,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence | `docs/schemas/ai_agent_host_stateful_version_inventory_v1.schema.json` | P2-402F host / K3s / stateful 版本只讀盤點 schema;鎖定 SSH / kubectl / upgrade / drain / reboot / restart / Telegram 全部 false | | `docs/evaluations/ai_agent_host_stateful_version_inventory_2026-06-11.json` | P2-402F committed snapshot:5 台主機、2 個 K3s 節點、12 個 stateful / ops 服務、6 個只讀 probe step、maintenance window approval package | | `GET /api/v1/agents/agent-host-stateful-version-inventory` | 只讀 API;只回傳 host / K3s / stateful 版本盤點,不 SSH、不 kubectl、不升級、不重啟、不發 Telegram | +| `/zh-TW/governance?tab=automation-inventory` | P2-402G governance UI:顯示可委派能力、版本生命週期、Host / K3s / stateful 只讀關卡與 Telegram / redaction gate;不提供執行按鈕 | **採用順序:** @@ -696,7 +697,8 @@ Repo / registry / release notes / K8s / host / observability / backup evidence 3. 建立 Telegram action-required digest policy,先定義 critical / action-required / failure-only 通知門檻,禁止成功洗版。✅ P2-402D 已建立 policy snapshot/API;Telegram 實發與 queue write 仍未授權。 4. 再進 Gitea PR 草案 lane:grouping、automerge=false、tests、rollback、owner response。✅ P2-402E 已建立 draft lane snapshot/API;branch push、PR creation、workflow trigger、lockfile、package upgrade、auto merge 仍未授權。 5. 建立 host OS / K3s / stateful services 版本只讀盤點,先固定維護窗口、備份、rollback 與 smoke gate。✅ P2-402F 已建立 snapshot/API;SSH、kubectl、upgrade、drain、reboot、stateful restart 仍未授權。 -6. 最後才進人工批准後的 dry-run / smoke / canary / production rollout。下一步 P2-402G governance UI 顯示可委派能力。 +6. 把可委派能力、版本生命週期、Host / K3s / stateful 只讀關卡接入 governance UI。✅ P2-402G 已完成;不顯示敏感端點、不提供執行按鈕。 +7. 最後才進人工批准後的 dry-run / smoke / canary / production rollout。下一步 P2-403A runtime gate planning。 #### 3.2.2 核心缺口與災難場景 @@ -1736,6 +1738,12 @@ Phase 6 完成後 - 更新 `ai_agent_proactive_operations_contract_2026-06-11.json`:整體完成度 `86%`,current task `P2-402F`,next task `P2-402G`。 - 本波仍不 SSH、不執行 host command、不執行 kubectl、不 apt / kernel / K3s upgrade、不 node drain、不 kubelet restart、不 reboot、不 stateful restart、不 DB migration、不 restore、不 pull image、不發 Telegram、不讀取或輸出 secret、不回傳工作視窗對話內容;P2-402G 才接治理 UI 顯示可委派能力。 +### 2026-06-11 23:59 (台北) — §3.2 / §5 — 完成 P2-402G governance UI 可委派能力顯示 — 回應統帥要求同步工作完成度並禁止前端顯示工作對話 + +- `apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx` 接入 `GET /api/v1/agents/agent-proactive-operations-contract` 與 `GET /api/v1/agents/agent-host-stateful-version-inventory`,顯示 24 類可委派能力、12 類版本生命週期 domain、5 台主機、2 個 K3s node、12 個 stateful / ops 服務、6 個只讀 probe step、11 個 maintenance 欄位與 Telegram / redaction gate。 +- 更新 `ai_agent_proactive_operations_contract_2026-06-11.json`:整體完成度 `100%`,current task `P2-402G`,next task `P2-403A`。 +- 本波仍不 SSH、不執行 host command、不執行 kubectl、不 apt / kernel / K3s upgrade、不 node drain、不 kubelet restart、不 reboot、不 stateful restart、不 DB migration、不 restore、不 pull image、不發 Telegram、不讀取或輸出 secret、不回傳工作視窗對話內容;P2-403A 才設計 runtime gate planning。 + ### 2026-04-15 (台北) — 全檔 — 建立 v2 骨架,§0/§1 完成 — 統帥批准「單 MASTER + 4 道閘門」結構 - 從 v1(plans/2026-04-15-MASTER-ai-autonomous-flywheel.md)繼承核心發現