From f4930956ddc755371d1128023aa0ca5572bbd106 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 12 Jun 2026 05:50:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(governance):=20=E6=96=B0=E5=A2=9E=20runtim?= =?UTF-8?q?e=20verifier=20evidence=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/src/api/v1/agents.py | 31 ++ ..._agent_runtime_verifier_evidence_review.py | 152 +++++++ ...est_ai_agent_interaction_learning_proof.py | 12 +- ...ai_agent_interaction_learning_proof_api.py | 12 +- ..._ai_agent_proactive_operations_contract.py | 6 +- ...agent_proactive_operations_contract_api.py | 6 +- ..._agent_runtime_verifier_evidence_review.py | 76 ++++ ...nt_runtime_verifier_evidence_review_api.py | 25 ++ apps/web/messages/en.json | 27 ++ apps/web/messages/zh-TW.json | 27 ++ .../tabs/automation-inventory-tab.tsx | 156 ++++++- apps/web/src/lib/api-client.ts | 86 ++++ docs/LOGBOOK.md | 33 ++ ...AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md | 6 +- ...T_INTERACTION_LEARNING_PROOF_2026-06-11.md | 16 +- ...I_AGENT_PROACTIVE_OPERATIONS_2026-06-11.md | 10 +- ...interaction_learning_proof_2026-06-11.json | 44 +- ...active_operations_contract_2026-06-11.json | 26 +- ...e_verifier_evidence_review_2026-06-12.json | 227 ++++++++++ ...me_verifier_evidence_review_v1.schema.json | 403 ++++++++++++++++++ ...-04-15-MASTER-ai-autonomous-flywheel-v2.md | 15 +- 21 files changed, 1349 insertions(+), 47 deletions(-) create mode 100644 apps/api/src/services/ai_agent_runtime_verifier_evidence_review.py create mode 100644 apps/api/tests/test_ai_agent_runtime_verifier_evidence_review.py create mode 100644 apps/api/tests/test_ai_agent_runtime_verifier_evidence_review_api.py create mode 100644 docs/evaluations/ai_agent_runtime_verifier_evidence_review_2026-06-12.json create mode 100644 docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json diff --git a/apps/api/src/api/v1/agents.py b/apps/api/src/api/v1/agents.py index ec897e9a6..2662aaae6 100644 --- a/apps/api/src/api/v1/agents.py +++ b/apps/api/src/api/v1/agents.py @@ -88,6 +88,9 @@ from src.services.ai_agent_redis_dry_run_gate import ( from src.services.ai_agent_runtime_write_gate_review import ( load_latest_ai_agent_runtime_write_gate_review, ) +from src.services.ai_agent_runtime_verifier_evidence_review import ( + load_latest_ai_agent_runtime_verifier_evidence_review, +) from src.services.ai_agent_telegram_action_required_digest_policy import ( load_latest_ai_agent_telegram_action_required_digest_policy, ) @@ -819,6 +822,34 @@ async def get_agent_post_write_verifier_package() -> dict[str, Any]: ) from exc +@router.get( + "/agent-runtime-verifier-evidence-review", + response_model=dict[str, Any], + summary="取得 AI Agent runtime verifier evidence review", + description=( + "讀取最新已提交的 runtime verifier evidence implementation review;此端點只回傳 " + "evidence checks、implementation review lanes、redaction policy 與人工操作選項," + "不實作或執行 verifier、不讀 canonical target、不寫 rollback work item、不發 Telegram、" + "不寫 KM / PlayBook trust / timeline / replay score、不啟動 runtime worker。" + ), +) +async def get_agent_runtime_verifier_evidence_review() -> dict[str, Any]: + """Return the latest read-only AI Agent runtime verifier evidence review.""" + try: + return await asyncio.to_thread(load_latest_ai_agent_runtime_verifier_evidence_review) + except FileNotFoundError as exc: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=str(exc), + ) from exc + except (json.JSONDecodeError, ValueError) as exc: + logger.error("ai_agent_runtime_verifier_evidence_review_invalid", error=str(exc)) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="AI Agent runtime verifier evidence review 無效", + ) from exc + + @router.get( "/agent-owner-approved-fixture-dry-run", response_model=dict[str, Any], diff --git a/apps/api/src/services/ai_agent_runtime_verifier_evidence_review.py b/apps/api/src/services/ai_agent_runtime_verifier_evidence_review.py new file mode 100644 index 000000000..633a5076f --- /dev/null +++ b/apps/api/src/services/ai_agent_runtime_verifier_evidence_review.py @@ -0,0 +1,152 @@ +""" +AI Agent runtime verifier evidence review snapshot. + +Loads the latest committed P2-403I runtime verifier evidence implementation +review. This module never implements or executes the verifier, reads canonical +targets, writes rollback work items, sends Telegram receipts, or starts a +runtime worker. +""" + +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any + +from src.services.snapshot_paths import default_evaluations_dir + +_DEFAULT_EVALUATIONS_DIR = default_evaluations_dir(Path(__file__)) +_SNAPSHOT_PATTERN = "ai_agent_runtime_verifier_evidence_review_*.json" +_SCHEMA_VERSION = "ai_agent_runtime_verifier_evidence_review_v1" + + +def load_latest_ai_agent_runtime_verifier_evidence_review( + evaluations_dir: Path | None = None, +) -> dict[str, Any]: + """Load the newest committed AI Agent runtime verifier evidence review.""" + directory = evaluations_dir or _DEFAULT_EVALUATIONS_DIR + candidates = sorted(directory.glob(_SNAPSHOT_PATTERN)) + if not candidates: + raise FileNotFoundError( + f"no AI Agent runtime verifier evidence review snapshots found in {directory}" + ) + + latest = candidates[-1] + with latest.open(encoding="utf-8") as handle: + payload = json.load(handle) + + if not isinstance(payload, dict): + raise ValueError(f"{latest}: expected JSON object") + _require_schema(payload, str(latest)) + _require_runtime_boundaries(payload, str(latest)) + _require_review_contract(payload, str(latest)) + _require_rollup_consistency(payload, str(latest)) + return payload + + +def _require_schema(payload: dict[str, Any], label: str) -> None: + if payload.get("schema_version") != _SCHEMA_VERSION: + raise ValueError(f"{label}: expected schema_version={_SCHEMA_VERSION}") + status = payload.get("program_status") or {} + if status.get("read_only_mode") is not True: + raise ValueError(f"{label}: program_status.read_only_mode must be true") + if status.get("runtime_authority") != "runtime_verifier_evidence_review_only_no_live_execution": + raise ValueError( + f"{label}: runtime_authority must remain runtime_verifier_evidence_review_only_no_live_execution" + ) + + +def _require_runtime_boundaries(payload: dict[str, Any], label: str) -> None: + boundaries = payload.get("approval_boundaries") or {} + enabled = sorted(key for key, value in boundaries.items() if value is not False) + if enabled: + raise ValueError(f"{label}: approval boundaries must remain false: {enabled}") + + truth = payload.get("review_truth") or {} + false_flags = { + "runtime_verifier_implementation_allowed", + "post_write_verifier_execution_allowed", + "canonical_readback_allowed", + } + unsafe = sorted(flag for flag in false_flags if truth.get(flag) is not False) + if unsafe: + raise ValueError(f"{label}: verifier review runtime flags must remain false: {unsafe}") + + zero_counts = { + "runtime_verifier_executed_count", + "canonical_readback_executed_count", + "rollback_work_item_created_count", + "telegram_failure_receipt_sent_count", + "learning_writeback_after_verifier_count", + } + non_zero = sorted(key for key in zero_counts if truth.get(key) != 0) + if non_zero: + raise ValueError(f"{label}: verifier review counts must remain zero: {non_zero}") + + +def _require_review_contract(payload: dict[str, Any], label: str) -> None: + package = payload.get("review_package") or {} + required_evidence = set(package.get("required_evidence") or []) + required_minimum = { + "approved_write_event_id", + "dry_run_preview_hash", + "target_write_surface", + "canonical_readback_query_plan", + "rollback_work_item_template", + "failure_receipt_template", + "redacted_evidence_refs", + } + missing = sorted(required_minimum - required_evidence) + if missing: + raise ValueError(f"{label}: runtime verifier review missing required evidence: {missing}") + + if not payload.get("evidence_checks"): + raise ValueError(f"{label}: evidence checks must not be empty") + if not payload.get("implementation_review_lanes"): + raise ValueError(f"{label}: implementation review lanes must not be empty") + if not payload.get("operator_actions"): + raise ValueError(f"{label}: operator actions must not be empty") + + redaction = payload.get("display_redaction_contract") or {} + if redaction.get("redaction_required") is not True: + raise ValueError(f"{label}: frontend redaction must be required") + for flag in ("raw_payload_display_allowed", "private_reasoning_display_allowed", "secret_value_display_allowed"): + if redaction.get(flag) is not False: + raise ValueError(f"{label}: {flag} must remain false") + + +def _require_rollup_consistency(payload: dict[str, Any], label: str) -> None: + rollups = payload.get("rollups") or {} + checks = payload.get("evidence_checks") or [] + lanes = payload.get("implementation_review_lanes") or [] + actions = payload.get("operator_actions") or [] + package = payload.get("review_package") or {} + expected_counts = { + "evidence_check_count": len(checks), + "implementation_review_lane_count": len(lanes), + "operator_action_count": len(actions), + "blocked_runtime_action_count": len({ + *(check.get("blocked_runtime_action") for check in checks), + *(lane.get("blocked_runtime_action") for lane in lanes), + *(action.get("blocked_runtime_action") for action in actions), + }), + "required_evidence_count": len(package.get("required_evidence") or []), + "forbidden_evidence_count": len(package.get("forbidden_evidence") or []), + } + mismatched = { + key: {"expected": expected, "actual": rollups.get(key)} + for key, expected in expected_counts.items() + if rollups.get(key) != expected + } + if mismatched: + raise ValueError(f"{label}: rollup counts must match payload sections: {mismatched}") + + approval_required = sorted( + action.get("action_id") + for action in actions + if action.get("status") == "approval_required" + ) + if sorted(rollups.get("approval_required_action_ids") or []) != approval_required: + raise ValueError(f"{label}: rollups.approval_required_action_ids mismatch") + if rollups.get("live_verifier_execution_count") != 0: + raise ValueError(f"{label}: live verifier execution count must remain zero") diff --git a/apps/api/tests/test_ai_agent_interaction_learning_proof.py b/apps/api/tests/test_ai_agent_interaction_learning_proof.py index 0c2f2efc0..f4f356ccd 100644 --- a/apps/api/tests/test_ai_agent_interaction_learning_proof.py +++ b/apps/api/tests/test_ai_agent_interaction_learning_proof.py @@ -13,9 +13,9 @@ def test_load_latest_ai_agent_interaction_learning_proof_reads_committed_snapsho data = load_latest_ai_agent_interaction_learning_proof() assert data["schema_version"] == "ai_agent_interaction_learning_proof_v1" - assert data["program_status"]["overall_completion_percent"] == 97 - assert data["program_status"]["current_task_id"] == "P2-403H" - assert data["program_status"]["next_task_id"] == "P2-403I" + assert data["program_status"]["overall_completion_percent"] == 99 + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" assert data["program_status"]["read_only_mode"] is True assert data["program_status"]["runtime_authority"] == "proof_surface_only_no_live_worker" assert data["live_truth"]["runtime_loop_enabled"] is False @@ -26,10 +26,10 @@ def test_load_latest_ai_agent_interaction_learning_proof_reads_committed_snapsho assert data["frontend_redaction"]["raw_prompt_display_allowed"] is False assert data["approval_boundaries"]["runtime_worker_allowed"] is False assert data["approval_boundaries"]["telegram_direct_send_allowed"] is False - assert data["rollups"]["proof_level_count"] == len(data["proof_ladder"]) == 7 - assert data["rollups"]["signal_count"] == len(data["proof_signals"]) == 9 + assert data["rollups"]["proof_level_count"] == len(data["proof_ladder"]) == 8 + assert data["rollups"]["signal_count"] == len(data["proof_signals"]) == 10 assert data["rollups"]["operator_surface_count"] == len(data["operator_surfaces"]) == 5 - assert data["rollups"]["runtime_gate_count"] == len(data["runtime_gates"]) == 5 + assert data["rollups"]["runtime_gate_count"] == len(data["runtime_gates"]) == 6 assert data["rollups"]["live_signal_count"] == 0 assert data["rollups"]["live_pending_level_ids"] == [] assert {lane["agent_id"] for lane in data["agent_lanes"]} == { diff --git a/apps/api/tests/test_ai_agent_interaction_learning_proof_api.py b/apps/api/tests/test_ai_agent_interaction_learning_proof_api.py index 99e0dad82..5d55aa0ef 100644 --- a/apps/api/tests/test_ai_agent_interaction_learning_proof_api.py +++ b/apps/api/tests/test_ai_agent_interaction_learning_proof_api.py @@ -16,9 +16,9 @@ def test_ai_agent_interaction_learning_proof_endpoint_returns_committed_snapshot assert response.status_code == 200 data = response.json() assert data["schema_version"] == "ai_agent_interaction_learning_proof_v1" - assert data["program_status"]["overall_completion_percent"] == 97 - assert data["program_status"]["current_task_id"] == "P2-403H" - assert data["program_status"]["next_task_id"] == "P2-403I" + assert data["program_status"]["overall_completion_percent"] == 99 + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" assert data["program_status"]["read_only_mode"] is True assert data["live_truth"]["runtime_loop_enabled"] is False assert data["live_truth"]["active_live_agent_sessions"] == 0 @@ -26,9 +26,9 @@ def test_ai_agent_interaction_learning_proof_endpoint_returns_committed_snapshot assert data["frontend_redaction"]["operator_conversation_display_allowed"] is False assert data["approval_boundaries"]["conversation_transcript_display_allowed"] is False assert data["approval_boundaries"]["telegram_direct_send_allowed"] is False - assert data["rollups"]["proof_level_count"] == 7 - assert data["rollups"]["contract_ready_level_count"] == 5 - assert data["rollups"]["signal_count"] == 9 + assert data["rollups"]["proof_level_count"] == 8 + assert data["rollups"]["contract_ready_level_count"] == 6 + assert data["rollups"]["signal_count"] == 10 assert data["rollups"]["live_signal_count"] == 0 assert data["rollups"]["operator_surface_count"] == 5 assert any(lane["agent_id"] == "openclaw" for lane in data["agent_lanes"]) 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 c13ec2085..c832b7bb0 100644 --- a/apps/api/tests/test_ai_agent_proactive_operations_contract.py +++ b/apps/api/tests/test_ai_agent_proactive_operations_contract.py @@ -14,8 +14,8 @@ def test_load_latest_ai_agent_proactive_operations_contract_reads_committed_snap assert data["schema_version"] == "ai_agent_proactive_operations_contract_v1" assert data["program_status"]["overall_completion_percent"] == 100 - assert data["program_status"]["current_task_id"] == "P2-403H" - assert data["program_status"]["next_task_id"] == "P2-403I" + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" 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 @@ -25,7 +25,7 @@ def test_load_latest_ai_agent_proactive_operations_contract_reads_committed_snap assert data["approval_boundaries"]["telegram_direct_send_allowed"] is False assert data["rollups"]["version_domain_count"] == len(data["version_lifecycle_domains"]) == 12 assert data["rollups"]["delegable_capability_count"] == len(data["delegable_capabilities"]) == 24 - assert data["rollups"]["rollout_task_count"] == len(data["rollout_tasks"]) == 15 + assert data["rollups"]["rollout_task_count"] == len(data["rollout_tasks"]) == 16 assert data["rollups"]["auto_execute_allowed_count"] == 0 assert any(domain["domain_id"] == "ai_agents_models" for domain in data["version_lifecycle_domains"]) assert any( 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 6de04d09c..21d8386f0 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 @@ -17,8 +17,8 @@ def test_ai_agent_proactive_operations_contract_endpoint_returns_committed_snaps data = response.json() assert data["schema_version"] == "ai_agent_proactive_operations_contract_v1" assert data["program_status"]["overall_completion_percent"] == 100 - assert data["program_status"]["current_task_id"] == "P2-403H" - assert data["program_status"]["next_task_id"] == "P2-403I" + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" 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 @@ -26,7 +26,7 @@ def test_ai_agent_proactive_operations_contract_endpoint_returns_committed_snaps assert data["approval_boundaries"]["telegram_direct_send_allowed"] is False assert data["rollups"]["version_domain_count"] == 12 assert data["rollups"]["delegable_capability_count"] == 24 - assert data["rollups"]["rollout_task_count"] == 15 + assert data["rollups"]["rollout_task_count"] == 16 assert data["rollups"]["auto_execute_allowed_count"] == 0 assert any(domain["domain_id"] == "host_os_packages" for domain in data["version_lifecycle_domains"]) assert any( diff --git a/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review.py b/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review.py new file mode 100644 index 000000000..5ba884d72 --- /dev/null +++ b/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review.py @@ -0,0 +1,76 @@ +import copy +import json + +import pytest + +from src.services.ai_agent_runtime_verifier_evidence_review import ( + load_latest_ai_agent_runtime_verifier_evidence_review, +) + + +def _write_snapshot(tmp_path, payload): + path = tmp_path / "ai_agent_runtime_verifier_evidence_review_2026-06-12.json" + path.write_text(json.dumps(payload), encoding="utf-8") + return path + + +def test_load_latest_ai_agent_runtime_verifier_evidence_review(): + data = load_latest_ai_agent_runtime_verifier_evidence_review() + + assert data["schema_version"] == "ai_agent_runtime_verifier_evidence_review_v1" + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" + assert data["program_status"]["overall_completion_percent"] == 99 + assert data["review_truth"]["runtime_verifier_implementation_allowed"] is False + assert data["review_truth"]["post_write_verifier_execution_allowed"] is False + assert data["review_truth"]["runtime_verifier_executed_count"] == 0 + assert data["review_truth"]["canonical_readback_executed_count"] == 0 + assert data["review_truth"]["rollback_work_item_created_count"] == 0 + assert data["review_truth"]["telegram_failure_receipt_sent_count"] == 0 + assert data["rollups"]["evidence_check_count"] == len(data["evidence_checks"]) + assert data["rollups"]["implementation_review_lane_count"] == len(data["implementation_review_lanes"]) + assert data["rollups"]["operator_action_count"] == len(data["operator_actions"]) + assert data["rollups"]["live_verifier_execution_count"] == 0 + + +def test_rejects_runtime_verifier_implementation_allowed(tmp_path): + data = load_latest_ai_agent_runtime_verifier_evidence_review() + bad = copy.deepcopy(data) + bad["review_truth"]["runtime_verifier_implementation_allowed"] = True + _write_snapshot(tmp_path, bad) + + with pytest.raises(ValueError, match="verifier review runtime flags"): + load_latest_ai_agent_runtime_verifier_evidence_review(tmp_path) + + +def test_rejects_live_verifier_execution_count(tmp_path): + data = load_latest_ai_agent_runtime_verifier_evidence_review() + bad = copy.deepcopy(data) + bad["review_truth"]["runtime_verifier_executed_count"] = 1 + _write_snapshot(tmp_path, bad) + + with pytest.raises(ValueError, match="verifier review counts"): + load_latest_ai_agent_runtime_verifier_evidence_review(tmp_path) + + +def test_rejects_missing_required_evidence(tmp_path): + data = load_latest_ai_agent_runtime_verifier_evidence_review() + bad = copy.deepcopy(data) + bad["review_package"]["required_evidence"] = [ + field for field in bad["review_package"]["required_evidence"] if field != "canonical_readback_query_plan" + ] + bad["rollups"]["required_evidence_count"] = len(bad["review_package"]["required_evidence"]) + _write_snapshot(tmp_path, bad) + + with pytest.raises(ValueError, match="missing required evidence"): + load_latest_ai_agent_runtime_verifier_evidence_review(tmp_path) + + +def test_rejects_rollup_mismatch(tmp_path): + data = load_latest_ai_agent_runtime_verifier_evidence_review() + bad = copy.deepcopy(data) + bad["rollups"]["evidence_check_count"] = 999 + _write_snapshot(tmp_path, bad) + + with pytest.raises(ValueError, match="rollup counts"): + load_latest_ai_agent_runtime_verifier_evidence_review(tmp_path) diff --git a/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review_api.py b/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review_api.py new file mode 100644 index 000000000..d467baafa --- /dev/null +++ b/apps/api/tests/test_ai_agent_runtime_verifier_evidence_review_api.py @@ -0,0 +1,25 @@ +from fastapi.testclient import TestClient + +from src.main import app + + +def test_get_ai_agent_runtime_verifier_evidence_review_api(): + client = TestClient(app) + response = client.get("/api/v1/agents/agent-runtime-verifier-evidence-review") + + assert response.status_code == 200 + data = response.json() + assert data["schema_version"] == "ai_agent_runtime_verifier_evidence_review_v1" + assert data["program_status"]["current_task_id"] == "P2-403I" + assert data["program_status"]["next_task_id"] == "P2-403J" + assert data["program_status"]["overall_completion_percent"] == 99 + assert data["review_truth"]["runtime_verifier_implementation_allowed"] is False + assert data["review_truth"]["post_write_verifier_execution_allowed"] is False + assert data["review_truth"]["runtime_verifier_executed_count"] == 0 + assert data["review_truth"]["canonical_readback_executed_count"] == 0 + assert data["review_truth"]["rollback_work_item_created_count"] == 0 + assert data["review_truth"]["telegram_failure_receipt_sent_count"] == 0 + assert data["rollups"]["evidence_check_count"] == 5 + assert data["rollups"]["implementation_review_lane_count"] == 4 + assert data["rollups"]["operator_action_count"] == 4 + assert data["rollups"]["live_verifier_execution_count"] == 0 diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 2830f787b..c8d94ee8a 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -3967,6 +3967,33 @@ "failurePolicy": "failure policy: {value}", "packageMode": "只讀 package" } + }, + "runtimeVerifierEvidenceReview": { + "title": "P2-403I Runtime Verifier Evidence Review", + "source": "{generated} · {current} → {next}", + "packageTitle": "Runtime verifier evidence package", + "truthTitle": "目前 review 真相", + "policyTitle": "批准與退回策略", + "metrics": { + "overall": "P2-403I 進度", + "checks": "證據 checks", + "lanes": "review lanes", + "actions": "人工選項", + "approval": "需批准動作", + "blocked": "阻擋動作 {count}", + "live": "Live verifier" + }, + "flags": { + "implementation": "implementation allowed: {value}", + "execution": "verifier execution: {value}", + "rollback": "rollback work item: {value}", + "telegram": "failure receipt: {value}" + }, + "labels": { + "requiredEvidence": "必填證據 {count}", + "forbiddenEvidence": "禁止證據 {count}", + "reviewMode": "只讀 review" + } } } }, diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 2830f787b..c8d94ee8a 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -3967,6 +3967,33 @@ "failurePolicy": "failure policy: {value}", "packageMode": "只讀 package" } + }, + "runtimeVerifierEvidenceReview": { + "title": "P2-403I Runtime Verifier Evidence Review", + "source": "{generated} · {current} → {next}", + "packageTitle": "Runtime verifier evidence package", + "truthTitle": "目前 review 真相", + "policyTitle": "批准與退回策略", + "metrics": { + "overall": "P2-403I 進度", + "checks": "證據 checks", + "lanes": "review lanes", + "actions": "人工選項", + "approval": "需批准動作", + "blocked": "阻擋動作 {count}", + "live": "Live verifier" + }, + "flags": { + "implementation": "implementation allowed: {value}", + "execution": "verifier execution: {value}", + "rollback": "rollback work item: {value}", + "telegram": "failure receipt: {value}" + }, + "labels": { + "requiredEvidence": "必填證據 {count}", + "forbiddenEvidence": "禁止證據 {count}", + "reviewMode": "只讀 review" + } } } }, 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 835633355..a908cba7a 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 @@ -45,6 +45,7 @@ import { type AiAgentPostWriteVerifierPackageSnapshot, type AiAgentProactiveOperationsContractSnapshot, type AiAgentRedisDryRunGateSnapshot, + type AiAgentRuntimeVerifierEvidenceReviewSnapshot, type AiAgentRuntimeWriteGateReviewSnapshot, type AiAgentTelegramReceiptApprovalPackageSnapshot, type AiProviderRouteMatrixSnapshot, @@ -333,6 +334,7 @@ export function AutomationInventoryTab() { const [ownerApprovedLearningDryRun, setOwnerApprovedLearningDryRun] = useState(null) const [runtimeWriteGateReview, setRuntimeWriteGateReview] = useState(null) const [postWriteVerifierPackage, setPostWriteVerifierPackage] = useState(null) + const [runtimeVerifierEvidenceReview, setRuntimeVerifierEvidenceReview] = useState(null) const [ownerDryRunPackage, setOwnerDryRunPackage] = useState(null) const [hostStatefulInventory, setHostStatefulInventory] = useState(null) const [serviceHealthGapMatrix, setServiceHealthGapMatrix] = useState(null) @@ -363,6 +365,7 @@ export function AutomationInventoryTab() { apiClient.getAiAgentOwnerApprovedLearningDryRun(), apiClient.getAiAgentRuntimeWriteGateReview(), apiClient.getAiAgentPostWriteVerifierPackage(), + apiClient.getAiAgentRuntimeVerifierEvidenceReview(), apiClient.getAiAgentOwnerApprovedFixtureDryRun(), apiClient.getAiAgentHostStatefulVersionInventory(), apiClient.getServiceHealthGapMatrix(), @@ -392,6 +395,7 @@ export function AutomationInventoryTab() { ownerApprovedLearningDryRunResult, runtimeWriteGateReviewResult, postWriteVerifierPackageResult, + runtimeVerifierEvidenceReviewResult, ownerDryRunPackageResult, hostStatefulInventoryResult, serviceHealthGapMatrixResult, @@ -418,6 +422,7 @@ export function AutomationInventoryTab() { setOwnerApprovedLearningDryRun(ownerApprovedLearningDryRunResult.status === 'fulfilled' ? ownerApprovedLearningDryRunResult.value : null) setRuntimeWriteGateReview(runtimeWriteGateReviewResult.status === 'fulfilled' ? runtimeWriteGateReviewResult.value : null) setPostWriteVerifierPackage(postWriteVerifierPackageResult.status === 'fulfilled' ? postWriteVerifierPackageResult.value : null) + setRuntimeVerifierEvidenceReview(runtimeVerifierEvidenceReviewResult.status === 'fulfilled' ? runtimeVerifierEvidenceReviewResult.value : null) setOwnerDryRunPackage(ownerDryRunPackageResult.status === 'fulfilled' ? ownerDryRunPackageResult.value : null) setHostStatefulInventory(hostStatefulInventoryResult.status === 'fulfilled' ? hostStatefulInventoryResult.value : null) setServiceHealthGapMatrix(serviceHealthGapMatrixResult.status === 'fulfilled' ? serviceHealthGapMatrixResult.value : null) @@ -442,6 +447,7 @@ export function AutomationInventoryTab() { ownerApprovedLearningDryRunResult, runtimeWriteGateReviewResult, postWriteVerifierPackageResult, + runtimeVerifierEvidenceReviewResult, ownerDryRunPackageResult, hostStatefulInventoryResult, serviceHealthGapMatrixResult, @@ -792,6 +798,42 @@ export function AutomationInventoryTab() { }) }, [postWriteVerifierPackage]) + const visibleRuntimeVerifierEvidenceChecks = useMemo(() => { + if (!runtimeVerifierEvidenceReview) return [] + const priority = { approval_required: 0, blocked_by_runtime_gate: 1, contract_ready: 2, ready_for_owner: 3 } as Record + return [...runtimeVerifierEvidenceReview.evidence_checks] + .sort((a, b) => { + const left = priority[a.status] ?? 4 + const right = priority[b.status] ?? 4 + if (left !== right) return left - right + return a.check_id.localeCompare(b.check_id) + }) + }, [runtimeVerifierEvidenceReview]) + + const visibleRuntimeVerifierReviewLanes = useMemo(() => { + if (!runtimeVerifierEvidenceReview) return [] + const priority = { approval_required: 0, blocked_by_runtime_gate: 1, contract_ready: 2, ready_for_owner: 3 } as Record + return [...runtimeVerifierEvidenceReview.implementation_review_lanes] + .sort((a, b) => { + const left = priority[a.status] ?? 4 + const right = priority[b.status] ?? 4 + if (left !== right) return left - right + return a.lane_id.localeCompare(b.lane_id) + }) + }, [runtimeVerifierEvidenceReview]) + + const visibleRuntimeVerifierActions = useMemo(() => { + if (!runtimeVerifierEvidenceReview) return [] + const priority = { approval_required: 0, ready_for_owner: 1, blocked_by_runtime_gate: 2 } as Record + return [...runtimeVerifierEvidenceReview.operator_actions] + .sort((a, b) => { + const left = priority[a.status] ?? 3 + const right = priority[b.status] ?? 3 + if (left !== right) return left - right + return a.action_id.localeCompare(b.action_id) + }) + }, [runtimeVerifierEvidenceReview]) + const visibleOwnerDryRunGates = useMemo(() => { if (!ownerDryRunPackage) return [] const priority = { approval_required: 0, approved_for_fixture_only: 1, fixture_only: 2, ready: 3 } as Record @@ -971,7 +1013,7 @@ export function AutomationInventoryTab() { ) } - if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !proactiveOperations || !interactionLearningProof || !liveReadModelGate || !redisDryRunGate || !learningWritebackPackage || !telegramReceiptPackage || !ownerApprovedLearningDryRun || !runtimeWriteGateReview || !postWriteVerifierPackage || !ownerDryRunPackage || !hostStatefulInventory || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) { + if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !proactiveOperations || !interactionLearningProof || !liveReadModelGate || !redisDryRunGate || !learningWritebackPackage || !telegramReceiptPackage || !ownerApprovedLearningDryRun || !runtimeWriteGateReview || !postWriteVerifierPackage || !runtimeVerifierEvidenceReview || !ownerDryRunPackage || !hostStatefulInventory || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) { return (
@@ -1103,6 +1145,13 @@ export function AutomationInventoryTab() { const postWriteVerifierApprovals = postWriteVerifierPackage.rollups.approval_required_action_ids.length const postWriteVerifierBlockedActions = postWriteVerifierPackage.rollups.blocked_runtime_action_count const postWriteVerifierLiveTotal = postWriteVerifierPackage.rollups.live_verifier_execution_count + const runtimeVerifierReviewOverall = runtimeVerifierEvidenceReview.program_status.overall_completion_percent + const runtimeVerifierEvidenceChecks = runtimeVerifierEvidenceReview.rollups.evidence_check_count + const runtimeVerifierReviewLanes = runtimeVerifierEvidenceReview.rollups.implementation_review_lane_count + const runtimeVerifierActions = runtimeVerifierEvidenceReview.rollups.operator_action_count + const runtimeVerifierApprovals = runtimeVerifierEvidenceReview.rollups.approval_required_action_ids.length + const runtimeVerifierBlockedActions = runtimeVerifierEvidenceReview.rollups.blocked_runtime_action_count + const runtimeVerifierLiveTotal = runtimeVerifierEvidenceReview.rollups.live_verifier_execution_count const ownerDryRunOverall = ownerDryRunPackage.program_status.overall_completion_percent const ownerDryRunFixtures = ownerDryRunPackage.rollups.fixture_set_count const ownerDryRunGates = ownerDryRunPackage.rollups.dry_run_gate_count @@ -1902,6 +1951,111 @@ export function AutomationInventoryTab() {
+
+
+
+ + + {t('runtimeVerifierEvidenceReview.title')} + +
+ +
+ +
+ } /> + } /> + } /> + } /> + 0 ? 'danger' : 'ok'} icon={} /> + } /> +
+ +
+
+
+ {t('runtimeVerifierEvidenceReview.packageTitle')} + + {runtimeVerifierEvidenceReview.review_package.operator_meaning} + +
+ + + +
+
+ +
+ {t('runtimeVerifierEvidenceReview.truthTitle')} + + {runtimeVerifierEvidenceReview.review_truth.truth_note} + +
+ + + + +
+
+ +
+ {t('runtimeVerifierEvidenceReview.policyTitle')} + + {runtimeVerifierEvidenceReview.review_package.approval_policy} + + +
+
+ +
+ {visibleRuntimeVerifierEvidenceChecks.map(check => ( +
+
+ + {check.check_id} + + +
+ + {check.display_name} + + + {check.review_question} + +
+ + +
+
+ ))} +
+
+ +
+ {[...visibleRuntimeVerifierReviewLanes, ...visibleRuntimeVerifierActions].map(item => ( +
+
+ + {item.display_name} + + +
+ + {'trigger' in item ? item.trigger : item.operator_instruction} + + +
+ ))} +
+
+
diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts index c359b2612..9925d124d 100644 --- a/apps/web/src/lib/api-client.ts +++ b/apps/web/src/lib/api-client.ts @@ -312,6 +312,11 @@ export const apiClient = { return handleResponse(res) }, + async getAiAgentRuntimeVerifierEvidenceReview() { + const res = await fetch(`${API_BASE_URL}/agents/agent-runtime-verifier-evidence-review`) + return handleResponse(res) + }, + async getAiAgentOwnerApprovedFixtureDryRun() { const res = await fetch(`${API_BASE_URL}/agents/agent-owner-approved-fixture-dry-run`) return handleResponse(res) @@ -1757,6 +1762,87 @@ export interface AiAgentPostWriteVerifierPackageSnapshot { } } +export interface AiAgentRuntimeVerifierEvidenceReviewSnapshot { + schema_version: 'ai_agent_runtime_verifier_evidence_review_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: 'runtime_verifier_evidence_review_only_no_live_execution' + status_note: string + } + source_refs: string[] + review_truth: { + review_packet_ready: true + runtime_verifier_implementation_allowed: false + post_write_verifier_execution_allowed: false + runtime_verifier_executed_count: number + canonical_readback_allowed: false + canonical_readback_executed_count: number + rollback_work_item_created_count: number + telegram_failure_receipt_sent_count: number + learning_writeback_after_verifier_count: number + truth_note: string + } + review_package: { + required_evidence: string[] + forbidden_evidence: string[] + operator_meaning: string + approval_policy: string + failure_policy: string + } + evidence_checks: Array<{ + check_id: string + display_name: string + status: string + owner_agent: 'openclaw' | 'hermes' | 'nemotron' + required_evidence: string + review_question: string + blocked_runtime_action: string + }> + implementation_review_lanes: Array<{ + lane_id: string + display_name: string + status: string + owner_agent: 'openclaw' | 'hermes' | 'nemotron' + trigger: string + operator_instruction: string + blocked_runtime_action: string + }> + operator_actions: Array<{ + action_id: string + display_name: string + action_type: 'review' | 'collect_evidence' | 'approve_implementation' | 'reject_or_rework' + status: string + owner_agent: 'openclaw' | 'hermes' | 'nemotron' + operator_instruction: string + blocked_runtime_action: string + }> + approval_boundaries: Record + display_redaction_contract: { + redaction_required: true + raw_payload_display_allowed: false + private_reasoning_display_allowed: false + secret_value_display_allowed: false + allowed_frontend_content: string[] + forbidden_frontend_content: string[] + frontend_display_policy: string + } + rollups: { + evidence_check_count: number + implementation_review_lane_count: number + operator_action_count: number + approval_required_action_ids: string[] + blocked_runtime_action_count: number + required_evidence_count: number + forbidden_evidence_count: number + live_verifier_execution_count: number + } +} + export interface AiAgentOwnerApprovedFixtureDryRunSnapshot { schema_version: 'ai_agent_owner_approved_fixture_dry_run_v1' generated_at: string diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index ca2c9a746..1807267a1 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -51,7 +51,40 @@ - IwoooS 整體仍維持 `64%`;active runtime gate 仍 `0`。 **邊界**:本段未 SSH、未讀 live Nginx conf、未執行 `nginx -t`、未 reload Nginx、未改 reverse proxy、未改 DNS、未做 TLS probe、未執行 certbot renew、未改 ACME challenge、未跑 route smoke、未改主機、未收 secret value、未新增任何前端執行按鈕。 +## 2026-06-12|P2-403I Runtime Verifier Evidence Review +**背景**:P2-403H 已把 post-write verifier package、canonical readback、rollback lane、failure lane 與人工操作選項固定成只讀契約。下一步不能直接跳到 live verifier 或 Telegram,而是要先把 implementation 前必看的 evidence review、redaction review、rollback template、failure receipt template 與 NemoTron replay fixture 固定成可審查證據,避免 approval resolved 後被誤讀成 runtime 可執行。 + +**完成**: + +- 新增 `ai_agent_runtime_verifier_evidence_review_v1` schema、committed snapshot、只讀 loader、API route 與測試。 +- 新增 `GET /api/v1/agents/agent-runtime-verifier-evidence-review`,只回傳 evidence checks、implementation review lanes、redaction policy 與人工操作選項;不實作或執行 verifier、不讀 canonical target、不寫 rollback work item、不發 Telegram、不寫 KM / PlayBook trust / timeline / replay score、不啟動 runtime worker。 +- Snapshot 固定 `5` 個 evidence check、`4` 個 implementation review lane、`4` 個 operator action、`8` 個必填證據、`6` 個禁止證據、`7` 個 blocked runtime action 與 live verifier execution `0`。 +- Governance automation inventory 頁新增 P2-403I 區塊,顯示 runtime verifier evidence package、目前 review 真相、批准策略、evidence checks、review lanes 與人工操作選項,仍不提供任何執行按鈕。 +- `agent-interaction-learning-proof` 與 `agent-proactive-operations-contract` 已同步 current / next:`P2-403I -> P2-403J`;三 Agent 互動學習證據完成度 `97% -> 99%`。 +- MASTER §3.2.1c / §3.2.1d、AI Agent 自動化工作清單、互動學習證據報告與主動營運報告已同步 P2-403I;下一步為 `P2-403J` 成長趨勢週報與 operator feedback applied 指標。 + +**本地驗證**: + +- JSON parse:P2-403I schema / snapshot、P2-403 interaction snapshot、P2-403 proactive snapshot、`zh-TW.json`、`en.json` 通過。 +- `python3 -m py_compile apps/api/src/services/ai_agent_runtime_verifier_evidence_review.py apps/api/src/api/v1/agents.py`:通過。 +- `DATABASE_URL='postgresql+asyncpg://test:test@localhost/test' PYTHONPATH=apps/api pytest -q apps/api/tests/test_ai_agent_runtime_verifier_evidence_review.py apps/api/tests/test_ai_agent_runtime_verifier_evidence_review_api.py apps/api/tests/test_ai_agent_interaction_learning_proof.py apps/api/tests/test_ai_agent_interaction_learning_proof_api.py apps/api/tests/test_ai_agent_proactive_operations_contract.py apps/api/tests/test_ai_agent_proactive_operations_contract_api.py`:`17 passed`;僅既有 prompt escape warning。 +- zh-TW / en message mirror:`True`;`cmp -s` 通過。 +- `security-mirror-progress-guard.py`、`source-control-owner-response-guard.py`、`doc-secrets-sanity-check.py docs .gitea`:通過;doc sanity scanned files `705`。 +- `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`:通過;`92/92` static pages,`/zh-TW/governance` First Load JS `398 kB`。 + +**Gitea / deploy**:待推送。 + +**正式站驗證**:待 code commit 觸發 Gitea CD 後補。 + +**完成度同步**: + +- P2-403I Runtime verifier evidence review:本地進行中,正式站待驗證。 +- 三 Agent 主動溝通、學習與成長證據:`97% -> 99%`。 +- IwoooS 整體仍維持 `64%`;active runtime gate 仍 `0`。 + +**邊界**:本段未實作或執行 verifier、未讀 canonical target、未寫 rollback work item、未發 Telegram、未寫 KM、未更新 PlayBook trust、未寫 timeline learning、未寫 replay score、未啟動 runtime worker、未讀 secret value、未新增任何前端執行按鈕。 ## 2026-06-12|P2-403H Governance UI / i18n 顯示修補 **背景**:P2-403H Post-write Verifier Package API 已在正式站回傳新快照後,治理頁正式 DOM / console 驗證發現兩個顯示層缺口:`postWriteVerifierPackage.verifier_package.owner_agent` 不存在但前端仍嘗試渲染,造成 `redisDryRunGate.agents.undefined`;P2-402 proactive approval gate 新增多個 gate id,但訊息檔尚未補齊,造成 `MISSING_MESSAGE`。 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 3bca7751b..c118e7f11 100644 --- a/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md +++ b/docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md @@ -12,7 +12,7 @@ | Nemotron 實際整合應用 | 30% | 完整回放前仍被關卡擋下 | `blocked_needs_evidence`,下一關是 `refresh_source_evidence_then_5_record_smoke_only` | | 工具 / 服務 / 套件 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 主動溝通、學習與成長證據 | 97% | P2-401A 已完成只讀 contract;P2-403A 已完成互動 / 接手 / 學習 / 成長證據面板;P2-403B 已完成 AgentSession / Redis Streams live read model gate;P2-403C 已完成 Redis Streams consumer group dry-run、handoff envelope、ack / dead-letter / replay gate;P2-403D 已完成 learning writeback approval package;P2-403E 已完成 Telegram receipt approval package;P2-403F 已完成 owner-approved learning dry-run preview、人工操作選項與 fixture-only dry-run 總包;P2-403G 已完成 runtime write gate review,固定雙重批准、dry-run hash、post-write verifier 與 redaction 欄位;P2-403H 已完成 post-write verifier implementation package、rollback lane、failure lane 與人工操作選項。runtime worker、DB migration、production Redis consumer group、Telegram 實發、KM / PlayBook trust / timeline / replay score 寫入、SDK / 付費服務仍未開 gate | `ai_agent_communication_learning_contract_v1`、`ai_agent_interaction_learning_proof_v1`、`ai_agent_live_read_model_gate_v1`、`ai_agent_redis_dry_run_gate_v1`、`ai_agent_learning_writeback_approval_package_v1`、`ai_agent_telegram_receipt_approval_package_v1`、`ai_agent_owner_approved_learning_dry_run_v1`、`ai_agent_owner_approved_fixture_dry_run_v1`、`GET /api/v1/agents/agent-communication-learning-contract`、`GET /api/v1/agents/agent-interaction-learning-proof`、`GET /api/v1/agents/agent-live-read-model-gate`、`GET /api/v1/agents/agent-redis-dry-run-gate`、`GET /api/v1/agents/agent-learning-writeback-approval-package`、`GET /api/v1/agents/agent-telegram-receipt-approval-package`、`GET /api/v1/agents/agent-owner-approved-learning-dry-run`、`GET /api/v1/agents/agent-owner-approved-fixture-dry-run`、`ai_agent_runtime_write_gate_review_v1`、`GET /api/v1/agents/agent-runtime-write-gate-review`、`ai_agent_post_write_verifier_package_v1`、`GET /api/v1/agents/agent-post-write-verifier-package`、`/zh-TW/governance?tab=automation-inventory`、MASTER §3.2.1b / §3.2.1d / §3.4.3 | +| OpenClaw / Hermes / NemoTron 主動溝通、學習與成長證據 | 99% | P2-401A 已完成只讀 contract;P2-403A 已完成互動 / 接手 / 學習 / 成長證據面板;P2-403B 已完成 AgentSession / Redis Streams live read model gate;P2-403C 已完成 Redis Streams consumer group dry-run、handoff envelope、ack / dead-letter / replay gate;P2-403D 已完成 learning writeback approval package;P2-403E 已完成 Telegram receipt approval package;P2-403F 已完成 owner-approved learning dry-run preview、人工操作選項與 fixture-only dry-run 總包;P2-403G 已完成 runtime write gate review,固定雙重批准、dry-run hash、post-write verifier 與 redaction 欄位;P2-403H 已完成 post-write verifier implementation package、rollback lane、failure lane 與人工操作選項;P2-403I 已完成 runtime verifier evidence implementation review、redaction review、rollback / failure receipt gate 與人工操作選項。runtime worker、DB migration、production Redis consumer group、Telegram 實發、KM / PlayBook trust / timeline / replay score 寫入、SDK / 付費服務仍未開 gate | `ai_agent_communication_learning_contract_v1`、`ai_agent_interaction_learning_proof_v1`、`ai_agent_live_read_model_gate_v1`、`ai_agent_redis_dry_run_gate_v1`、`ai_agent_learning_writeback_approval_package_v1`、`ai_agent_telegram_receipt_approval_package_v1`、`ai_agent_owner_approved_learning_dry_run_v1`、`ai_agent_owner_approved_fixture_dry_run_v1`、`GET /api/v1/agents/agent-communication-learning-contract`、`GET /api/v1/agents/agent-interaction-learning-proof`、`GET /api/v1/agents/agent-live-read-model-gate`、`GET /api/v1/agents/agent-redis-dry-run-gate`、`GET /api/v1/agents/agent-learning-writeback-approval-package`、`GET /api/v1/agents/agent-telegram-receipt-approval-package`、`GET /api/v1/agents/agent-owner-approved-learning-dry-run`、`GET /api/v1/agents/agent-owner-approved-fixture-dry-run`、`ai_agent_runtime_write_gate_review_v1`、`GET /api/v1/agents/agent-runtime-write-gate-review`、`ai_agent_post_write_verifier_package_v1`、`GET /api/v1/agents/agent-post-write-verifier-package`、`ai_agent_runtime_verifier_evidence_review_v1`、`GET /api/v1/agents/agent-runtime-verifier-evidence-review`、`/zh-TW/governance?tab=automation-inventory`、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 | | 本工作清單與分析報告 | 100% | 已完成 | 本 MD 文件 | @@ -20,9 +20,9 @@ AI Agent 自動化工作包目前完成度:**92%**。本工作清單文件本 三 Agent 佈建布局目前完成度:**45%**。第一波已完成只讀 schema / snapshot / API / 測試 / 報告,第二波已接入治理頁自動化盤點 UI;正式 runtime 佈署、Telegram E2E 發送與 AgentSession 工作流仍需逐項 gate。 -三 Agent 主動溝通、學習與成長證據目前完成度:**97%**。已完成只讀契約、互動 / 接手 / 學習 / 成長證據面板、P2-403B live read model gate、P2-403C Redis dry-run gate、P2-403D learning writeback approval package、P2-403E Telegram receipt approval package、P2-403F owner-approved learning dry-run preview、人工操作選項與 fixture-only dry-run 總包、P2-403G runtime write gate review、P2-403H post-write verifier implementation package、API、治理頁顯示、測試與 MASTER 同步;目前 live AgentSession、Agent message、handoff、learning write、Telegram receipt、Gateway queue write 與 Telegram send 仍全部為 `0`,下一步依優先順序推 `P2-403I` runtime verifier evidence implementation review,但在批准前仍不得啟動 runtime loop。 +三 Agent 主動溝通、學習與成長證據目前完成度:**99%**。已完成只讀契約、互動 / 接手 / 學習 / 成長證據面板、P2-403B live read model gate、P2-403C Redis dry-run gate、P2-403D learning writeback approval package、P2-403E Telegram receipt approval package、P2-403F owner-approved learning dry-run preview、人工操作選項與 fixture-only dry-run 總包、P2-403G runtime write gate review、P2-403H post-write verifier implementation package、P2-403I runtime verifier evidence implementation review、API、治理頁顯示、測試與 MASTER 同步;目前 live AgentSession、Agent message、handoff、learning write、Telegram receipt、Gateway queue write、runtime verifier execution 與 Telegram send 仍全部為 `0`,下一步依優先順序推 `P2-403J` 成長趨勢週報與 operator feedback applied 指標,但在批准前仍不得啟動 runtime loop。 -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`、`P2-403B`、`P2-403C`、`P2-403D`、`P2-403E`、`P2-403F` 、`P2-403G` 與 `P2-403H` 已先補互動、學習證據面、live read model gate、Redis dry-run gate、learning writeback approval package、Telegram receipt approval package、owner-approved learning dry-run preview、runtime write gate review 與 post-write verifier package。下一步是 `P2-403I` runtime verifier evidence implementation review,外部 registry / package source / host probe / SSH / kubectl / 工具安裝 / CI 變更 / 實際 PR creation / Telegram 實發與 learning write 仍需 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`、`P2-403B`、`P2-403C`、`P2-403D`、`P2-403E`、`P2-403F` 、`P2-403G`、`P2-403H` 與 `P2-403I` 已先補互動、學習證據面、live read model gate、Redis dry-run gate、learning writeback approval package、Telegram receipt approval package、owner-approved learning dry-run preview、runtime write gate review、post-write verifier package 與 runtime verifier evidence review。下一步是 `P2-403J` 成長趨勢週報與 operator feedback applied 指標,外部 registry / package source / host probe / SSH / kubectl / 工具安裝 / CI 變更 / 實際 PR creation / Telegram 實發與 learning write 仍需 gate。 完成度計算模型: diff --git a/docs/ai/AI_AGENT_INTERACTION_LEARNING_PROOF_2026-06-11.md b/docs/ai/AI_AGENT_INTERACTION_LEARNING_PROOF_2026-06-11.md index eac858509..847a008bb 100644 --- a/docs/ai/AI_AGENT_INTERACTION_LEARNING_PROOF_2026-06-11.md +++ b/docs/ai/AI_AGENT_INTERACTION_LEARNING_PROOF_2026-06-11.md @@ -1,12 +1,12 @@ # AI Agent 互動、溝通、學習與成長證據報告 > 日期:2026-06-11(台北時間) -> 文件定位:P2-403A 證據面 + P2-403B AgentSession / Redis Streams live read model gate + P2-403C Redis dry-run gate + P2-403D learning writeback approval package + P2-403E Telegram receipt approval package + P2-403F owner-approved learning dry-run / fixture dry-run、P2-403G runtime write gate review、P2-403H post-write verifier package、API 與治理頁 UI。 +> 文件定位:P2-403A 證據面 + P2-403B AgentSession / Redis Streams live read model gate + P2-403C Redis dry-run gate + P2-403D learning writeback approval package + P2-403E Telegram receipt approval package + P2-403F owner-approved learning dry-run / fixture dry-run、P2-403G runtime write gate review、P2-403H post-write verifier package、P2-403I runtime verifier evidence implementation review、API 與治理頁 UI。 > 事實邊界:本波只建立可見證據面與 read model gate,不啟動 runtime worker、不建立 DB migration、不開 Redis consumer group、不發 Telegram、不顯示工作視窗對話內容。 ## 1. 結論 -已完成 P2-403A、P2-403B、P2-403C、P2-403D、P2-403E、P2-403F、P2-403G 與 P2-403H:讓統帥能在治理頁看到 OpenClaw / Hermes / NemoTron 的互動、接手、學習與成長是否真的有證據,並看到 live read model、Redis dry-run、handoff envelope、ack / dead-letter / replay、learning writeback approval、Telegram receipt approval、fixture dry-run、runtime write gate review 與 post-write verifier package 下一步要通過哪些 gate。 +已完成 P2-403A、P2-403B、P2-403C、P2-403D、P2-403E、P2-403F、P2-403G、P2-403H 與 P2-403I:讓統帥能在治理頁看到 OpenClaw / Hermes / NemoTron 的互動、接手、學習與成長是否真的有證據,並看到 live read model、Redis dry-run、handoff envelope、ack / dead-letter / replay、learning writeback approval、Telegram receipt approval、fixture dry-run、runtime write gate review、post-write verifier package 與 runtime verifier evidence review 下一步要通過哪些 gate。 目前真相: @@ -19,6 +19,7 @@ | AgentSession safe read fields | 已定義,未查 live DB | | Redis Streams envelope / consumer gate | 已定義,consumer group 未啟用 | | rollback plan / no-write smoke | 已定義 | +| runtime verifier evidence review | 已定義,只讀 review | | live AgentSession readback | 未啟用,數量 `0` | | Agent message / handoff receipts | 未啟用,數量 `0` | | learning writeback | 未啟用,數量 `0` | @@ -51,7 +52,7 @@ | 產物 | 內容 | |---|---| | `docs/schemas/ai_agent_interaction_learning_proof_v1.schema.json` | 強制 live flags / counts / Telegram / transcript / 私有推理維持安全邊界 | -| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | P2-403A + P2-403B + P2-403C + P2-403D + P2-403E + P2-403F + P2-403G + P2-403H committed snapshot,完成度 `97%`,live count 全為 `0` | +| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | P2-403A + P2-403B + P2-403C + P2-403D + P2-403E + P2-403F + P2-403G + P2-403H + P2-403I committed snapshot,完成度 `99%`,live count 全為 `0` | | `docs/schemas/ai_agent_live_read_model_gate_v1.schema.json` | 強制 DB / Redis / worker / Telegram / learning writeback gate 維持未批准 | | `docs/evaluations/ai_agent_live_read_model_gate_2026-06-11.json` | P2-403B committed snapshot,完成度 `55%`,live count 全為 `0` | | `docs/evaluations/ai_agent_redis_dry_run_gate_2026-06-11.json` | P2-403C committed snapshot,完成度 `65%`,live count 全為 `0` | @@ -63,18 +64,21 @@ | `docs/schemas/ai_agent_post_write_verifier_package_v1.schema.json` | P2-403H post-write verifier package schema;強制 canonical readback、rollback work item、Telegram failure receipt 與 verifier execution 全部維持未授權 | | `docs/evaluations/ai_agent_post_write_verifier_package_2026-06-12.json` | P2-403H committed snapshot,完成度 `97%`,4 個 verification target、3 個 failure lane、4 個 operator action 與 live verifier execution `0` | | `GET /api/v1/agents/agent-post-write-verifier-package` | 只讀 API;不讀 canonical target、不寫 rollback work item、不發 Telegram、不寫 KM / PlayBook trust / timeline / replay score | +| `docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json` | P2-403I runtime verifier evidence review schema;強制 verifier implementation、canonical readback、rollback work item、Telegram failure receipt 與 live verifier execution 全部維持未授權 | +| `docs/evaluations/ai_agent_runtime_verifier_evidence_review_2026-06-12.json` | P2-403I committed snapshot,完成度 `99%`,5 個 evidence check、4 個 implementation review lane、4 個 operator action 與 live verifier execution `0` | +| `GET /api/v1/agents/agent-runtime-verifier-evidence-review` | 只讀 API;不實作或執行 verifier、不讀 canonical target、不寫 rollback work item、不發 Telegram | | `apps/api/src/services/ai_agent_interaction_learning_proof.py` | 只讀 loader 與安全驗證 | | `apps/api/src/services/ai_agent_live_read_model_gate.py` | P2-403B 只讀 loader;拒絕 live DB query、Redis consumer、unsafe fields、Telegram 與 writeback | | `GET /api/v1/agents/agent-interaction-learning-proof` | 只讀 API,不啟動 worker、不碰 Redis / DB runtime、不發 Telegram | | `GET /api/v1/agents/agent-live-read-model-gate` | 只讀 API,不連 DB、不讀寫 Redis、不發 Telegram | -| governance UI | 新增證據階梯、目前真相、P2-403B live read gate、P2-403C Redis dry-run gate、P2-403D learning writeback approval package、P2-403E Telegram receipt approval package、P2-403F owner-approved learning dry-run / fixture dry-run、P2-403G runtime write gate review、P2-403H post-write verifier package、Agent lane、可觀測訊號、runtime gates、前端 redaction | +| governance UI | 新增證據階梯、目前真相、P2-403B live read gate、P2-403C Redis dry-run gate、P2-403D learning writeback approval package、P2-403E Telegram receipt approval package、P2-403F owner-approved learning dry-run / fixture dry-run、P2-403G runtime write gate review、P2-403H post-write verifier package、P2-403I runtime verifier evidence review、Agent lane、可觀測訊號、runtime gates、前端 redaction | ## 5. 後續優先順序 | 優先 | ID | 工作 | gate | |---:|---|---|---| -| 1 | P2-403I | runtime verifier evidence implementation review、rollback work item 與 failure receipt gate | post-write verifier package | -| 2 | P2-403J | 成長趨勢週報與 operator feedback applied 指標 | trend evidence | +| 1 | P2-403J | 成長趨勢週報與 operator feedback applied 指標 | trend evidence | +| 2 | P2-404 | runtime worker shadow / no-write execution evidence gate | runtime shadow evidence | ## 6. 紅線 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 fefc7b71d..8fee86be4 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 / P2-402G / P2-403A / P2-403B / P2-403C / P2-403D / P2-403E / P2-403F / P2-403G / P2-403H 只讀契約與治理 UI 摘要。權威細節以 MASTER §3.2.1c / §3.2.1d、`ai_agent_proactive_operations_contract_v1`、`ai_agent_interaction_learning_proof_v1`、`ai_agent_live_read_model_gate_v1`、`ai_agent_redis_dry_run_gate_v1`、`ai_agent_learning_writeback_approval_package_v1`、`ai_agent_telegram_receipt_approval_package_v1`、`ai_agent_owner_approved_learning_dry_run_v1`、`ai_agent_owner_approved_fixture_dry_run_v1`、`ai_agent_runtime_write_gate_review_v1`、`ai_agent_post_write_verifier_package_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 / P2-403A / P2-403B / P2-403C / P2-403D / P2-403E / P2-403F / P2-403G / P2-403H / P2-403I 只讀契約與治理 UI 摘要。權威細節以 MASTER §3.2.1c / §3.2.1d、`ai_agent_proactive_operations_contract_v1`、`ai_agent_interaction_learning_proof_v1`、`ai_agent_live_read_model_gate_v1`、`ai_agent_redis_dry_run_gate_v1`、`ai_agent_learning_writeback_approval_package_v1`、`ai_agent_telegram_receipt_approval_package_v1`、`ai_agent_owner_approved_learning_dry_run_v1`、`ai_agent_owner_approved_fixture_dry_run_v1`、`ai_agent_runtime_write_gate_review_v1`、`ai_agent_post_write_verifier_package_v1`、`ai_agent_runtime_verifier_evidence_review_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. 本波完成度 @@ -17,7 +17,7 @@ | Agent 互動與學習證據面 | 100% | P2-403A 已把目前真相、證據階梯、三 Agent lane、可觀測訊號、runtime gates 與 redaction policy 接入治理頁;live counts 全為 `0` | | Redis dry-run gate | 100% | P2-403C 已把 consumer group dry-run、handoff envelope、ack / dead-letter / replay idempotency 與治理頁顯示接入;live counts 全為 `0` | | Learning writeback approval package | 100% | P2-403D 已把 KM / PlayBook trust / timeline learning / replay score 的 owner review、rollback、redaction 與 blocked write actions 接入;live writes 全為 `0` | -| 整體主動營運與版本生命週期 | 100% | P2-402A~G、P2-403A、P2-403B、P2-403C、P2-403D、P2-403E、P2-403F、P2-403G 與 P2-403H 只讀契約、snapshot、API、測試與治理 UI 已完成;runtime 排程、工具安裝、CI 變更、實際 PR 建立與更新、host probe、升級、重啟、learning write、Telegram receipt、post-write verifier execution 仍未開 gate | +| 整體主動營運與版本生命週期 | 100% | P2-402A~G、P2-403A、P2-403B、P2-403C、P2-403D、P2-403E、P2-403F、P2-403G、P2-403H 與 P2-403I 只讀契約、snapshot、API、測試與治理 UI 已完成;runtime 排程、工具安裝、CI 變更、實際 PR 建立與更新、host probe、升級、重啟、learning write、Telegram receipt、post-write verifier execution 仍未開 gate | ## 2. 可交給 AI Agent 的工作分類 @@ -55,10 +55,12 @@ | `docs/evaluations/ai_agent_host_stateful_version_inventory_2026-06-11.json` | 5 台主機、2 個 K3s 節點、12 個 stateful / ops 服務、6 個只讀 probe 步驟、maintenance window approval package | | `GET /api/v1/agents/agent-host-stateful-version-inventory` | 只讀 API;不 SSH、不 kubectl、不升級、不 drain、不 reboot、不重啟 stateful、不發 Telegram | | `docs/schemas/ai_agent_interaction_learning_proof_v1.schema.json` | P2-403A Agent 互動、接手、學習、成長與 Telegram receipt 證據面 schema | -| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | 證據階梯、live truth、三 Agent lane、可觀測訊號、runtime gates;P2-403H 後完成度 `97%`,live counts 全部 `0` | +| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | 證據階梯、live truth、三 Agent lane、可觀測訊號、runtime gates;P2-403I 後完成度 `99%`,live counts 全部 `0` | | `GET /api/v1/agents/agent-interaction-learning-proof` | 只讀 API;不啟動 worker、不開 Redis consumer、不 DB migration、不發 Telegram、不顯示工作視窗對話 | | `docs/schemas/ai_agent_post_write_verifier_package_v1.schema.json` | P2-403H post-write verifier package schema;canonical readback、rollback work item、Telegram failure receipt 與 live verifier execution 全部 false | | `GET /api/v1/agents/agent-post-write-verifier-package` | 只讀 API;只回傳 verifier package、failure lane 與人工操作選項,不讀 canonical target、不寫 rollback、不發 Telegram | +| `docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json` | P2-403I runtime verifier evidence review schema;runtime verifier implementation、canonical readback、rollback work item、Telegram failure receipt 與 live verifier execution 全部 false | +| `GET /api/v1/agents/agent-runtime-verifier-evidence-review` | 只讀 API;只回傳 evidence checks、implementation lanes 與人工操作選項,不實作或執行 verifier | | `docs/schemas/ai_agent_live_read_model_gate_v1.schema.json` | P2-403B AgentSession / Redis Streams live read model gate schema | | `docs/evaluations/ai_agent_live_read_model_gate_2026-06-11.json` | AgentSession safe fields、Redis envelope、worker gate、rollback plan、no-write smoke、frontend redaction;live counts 全部 `0` | | `GET /api/v1/agents/agent-live-read-model-gate` | 只讀 API;不連 DB、不讀寫 Redis、不啟動 worker、不發 Telegram | @@ -72,7 +74,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-403I runtime verifier evidence implementation review;現階段仍只讀 | +| K8s / Gitea / observability / Ansible / backup / web surfaces | OpenClaw + Hermes | baseline_ready / planned_next | 下一步進入 P2-403J 成長趨勢週報與 operator feedback applied 指標;現階段仍只讀 | 本波只把「每天要看哪些 repo 內版本來源」定義成可驗證資料面。每日排程、外部 registry 查詢、主機/K3s live probe、Telegram digest 與 Gitea PR lane 都仍是下一階段 gate。 diff --git a/docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json b/docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json index 8de65f491..6764b6fec 100644 --- a/docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json +++ b/docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json @@ -2,13 +2,13 @@ "schema_version": "ai_agent_interaction_learning_proof_v1", "generated_at": "2026-06-11T23:20:00+08:00", "program_status": { - "overall_completion_percent": 97, + "overall_completion_percent": 99, "current_priority": "P2", - "current_task_id": "P2-403H", - "next_task_id": "P2-403I", + "current_task_id": "P2-403I", + "next_task_id": "P2-403J", "read_only_mode": true, "runtime_authority": "proof_surface_only_no_live_worker", - "status_note": "P2-403H 已把 post-write verifier implementation package 接入;verifier package、rollback lane、failure lane 與人工操作選項齊備,但 live AgentSession、message、handoff、learning write、Telegram receipt 與 verifier execution 仍全部為 0。" + "status_note": "P2-403I 已把 runtime verifier evidence implementation review 接入;review checks、implementation lanes、rollback / failure receipt redaction 與人工操作選項齊備,但 live AgentSession、message、handoff、learning write、Telegram receipt 與 verifier execution 仍全部為 0。" }, "live_truth": { "runtime_loop_enabled": false, @@ -69,6 +69,15 @@ "source_of_truth": "ai_agent_redis_dry_run_gate_v1", "next_gate": "P2-403D learning writeback approval package。" }, + { + "level_id": "runtime_verifier_evidence_review", + "display_name": "Runtime verifier evidence review", + "status": "contract_ready", + "completion_percent": 100, + "operator_meaning": "已定義 runtime verifier implementation 前必看的 readback plan、rollback template、failure receipt redaction 與 NemoTron replay fixture;尚未實作或執行 verifier。", + "source_of_truth": "ai_agent_runtime_verifier_evidence_review_v1", + "next_gate": "P2-403J 成長趨勢週報與 operator feedback applied 指標。" + }, { "level_id": "learning_growth", "display_name": "學習回寫與成長曲線", @@ -222,6 +231,16 @@ "current_state": "contract_defined", "operator_interpretation": "你按下接受、拒絕或要求補證後,Agent 要能把結果回寫成後續策略。", "next_gate": "P2-403F" + }, + { + "signal_id": "runtime_verifier_review_packet", + "display_name": "Runtime verifier review package", + "category": "verifier", + "source_of_truth": "ai_agent_runtime_verifier_evidence_review_v1", + "visible_surface": "governance_agent_proof_panel", + "current_state": "contract_defined", + "operator_interpretation": "你會看到 verifier implementation 前需要哪些脫敏證據、誰審查、哪些 runtime action 仍被阻擋。", + "next_gate": "P2-403J" } ], "operator_surfaces": [ @@ -297,6 +316,14 @@ "next_task_id": "P2-403E", "next_gate": "P2-403E Telegram receipt approval package 已接入;實際 receipt write 仍需 owner approval。" }, + { + "gate_id": "runtime_verifier_evidence_review_gate", + "display_name": "Runtime verifier evidence implementation review", + "status": "approval_required", + "required_before_green": "P2-403I 已完成只讀 evidence review package;實作或執行 verifier 前仍需 owner approval、redaction review、rollback owner 與 sanitized replay gate。", + "next_task_id": "P2-403J", + "next_gate": "下一步只做成長趨勢與 operator feedback applied 指標,不啟動 live verifier。" + }, { "gate_id": "frontend_redaction_gate", "display_name": "前端脫敏與內容紅線", @@ -366,17 +393,18 @@ "autonomous_self_modify_allowed": false }, "rollups": { - "proof_level_count": 7, - "contract_ready_level_count": 5, + "proof_level_count": 8, + "contract_ready_level_count": 6, "live_pending_level_ids": [], - "signal_count": 9, + "signal_count": 10, "live_signal_count": 0, "operator_surface_count": 5, - "runtime_gate_count": 5, + "runtime_gate_count": 6, "blocked_gate_ids": [ "frontend_redaction_gate", "learning_writeback_gate", "redis_stream_consumer_gate", + "runtime_verifier_evidence_review_gate", "telegram_receipt_gate" ], "active_live_agent_sessions": 0, 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 3dd89e9f5..b72d11356 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 @@ -4,11 +4,11 @@ "program_status": { "overall_completion_percent": 100, "current_priority": "P2", - "current_task_id": "P2-403H", - "next_task_id": "P2-403I", + "current_task_id": "P2-403I", + "next_task_id": "P2-403J", "read_only_mode": true, "runtime_authority": "contract_only_no_version_or_runtime_update", - "status_note": "P2-403H 已把 post-write verifier implementation package 接入治理證據;live AgentSession / Redis consumer / runtime worker / learning write / Telegram receipt / verifier execution 目前全為 0,下一步是 P2-403I runtime verifier evidence implementation review。" + "status_note": "P2-403I 已把 runtime verifier evidence implementation review 接入治理證據;live AgentSession / Redis consumer / runtime worker / learning write / Telegram receipt / verifier execution 目前全為 0,下一步是 P2-403J 成長趨勢週報與 operator feedback applied 指標。" }, "external_source_evidence": [ { @@ -920,6 +920,24 @@ "incident_timeline_learning_write", "agent_replay_score_write" ] + }, + { + "task_id": "P2-403I", + "sequence": 12, + "display_name": "Runtime verifier evidence implementation review", + "status": "done", + "owner_agent": "openclaw", + "completion_percent": 100, + "runtime_authority": "runtime_verifier_evidence_review_only_no_live_execution", + "blocked_runtime_actions": [ + "runtime_verifier_implementation", + "post_write_verifier_runtime_execution", + "canonical_readback_query_execution", + "rollback_work_item_write", + "telegram_send_or_receipt_write", + "runtime_learning_write", + "agent_replay_score_write" + ] } ], "approval_boundaries": { @@ -940,7 +958,7 @@ "cadence_count": 5, "mcp_tool_count": 8, "rag_memory_count": 4, - "rollout_task_count": 15, + "rollout_task_count": 16, "auto_execute_allowed_count": 0, "approval_required_capability_count": 23, "blocked_update_domain_ids": [ diff --git a/docs/evaluations/ai_agent_runtime_verifier_evidence_review_2026-06-12.json b/docs/evaluations/ai_agent_runtime_verifier_evidence_review_2026-06-12.json new file mode 100644 index 000000000..cf82c85af --- /dev/null +++ b/docs/evaluations/ai_agent_runtime_verifier_evidence_review_2026-06-12.json @@ -0,0 +1,227 @@ +{ + "schema_version": "ai_agent_runtime_verifier_evidence_review_v1", + "generated_at": "2026-06-12T02:05:00+08:00", + "program_status": { + "overall_completion_percent": 99, + "current_priority": "P2", + "current_task_id": "P2-403I", + "next_task_id": "P2-403J", + "read_only_mode": true, + "runtime_authority": "runtime_verifier_evidence_review_only_no_live_execution", + "status_note": "P2-403I 已把 runtime verifier implementation 前必看的證據、redaction、rollback 與 failure receipt review 固定成只讀契約;尚未實作或執行 verifier、尚未讀 canonical target、尚未建立 rollback work item、尚未發 Telegram。" + }, + "source_refs": [ + "docs/evaluations/ai_agent_post_write_verifier_package_2026-06-12.json", + "docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json", + "docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md" + ], + "review_truth": { + "review_packet_ready": true, + "runtime_verifier_implementation_allowed": false, + "post_write_verifier_execution_allowed": false, + "runtime_verifier_executed_count": 0, + "canonical_readback_allowed": false, + "canonical_readback_executed_count": 0, + "rollback_work_item_created_count": 0, + "telegram_failure_receipt_sent_count": 0, + "learning_writeback_after_verifier_count": 0, + "truth_note": "目前只建立 runtime verifier evidence implementation review;未通過 owner approval、redaction review 與 runtime gate 前,不能執行 verifier、不能讀 canonical target、不能寫 rollback work item、不能發 Telegram failure receipt。" + }, + "review_package": { + "required_evidence": [ + "approved_write_event_id", + "dry_run_preview_hash", + "target_write_surface", + "canonical_readback_query_plan", + "redacted_expected_diff", + "rollback_work_item_template", + "failure_receipt_template", + "redacted_evidence_refs" + ], + "forbidden_evidence": [ + "secret_value", + "authorization_header", + "raw_tool_output", + "private_reasoning", + "raw_telegram_payload", + "unredacted_canonical_payload" + ], + "operator_meaning": "這份 review package 用來審查 runtime verifier implementation 是否可以進下一階段;它不是 verifier 實作,也不是 live write 授權。", + "approval_policy": "只有 OpenClaw owner 明確批准、Hermes redaction review 通過、NemoTron replay regression fixture 完成後,下一階段才能討論 runtime verifier implementation。", + "failure_policy": "若 readback plan、rollback template、failure receipt template 或 redaction 不完整,必須退回 P2-403H package 重修,不能啟動 runtime worker。" + }, + "evidence_checks": [ + { + "check_id": "canonical_readback_query_plan", + "display_name": "Canonical readback query plan", + "status": "approval_required", + "owner_agent": "hermes", + "required_evidence": "只收 query plan、target surface、expected hash 與 redacted evidence refs;不執行 live query。", + "review_question": "讀回計畫是否足以證明 post-write 結果,而且不會暴露 secret 或未脫敏 payload?", + "blocked_runtime_action": "canonical_readback_query_execution" + }, + { + "check_id": "runtime_verifier_adapter_contract", + "display_name": "Runtime verifier adapter contract", + "status": "approval_required", + "owner_agent": "openclaw", + "required_evidence": "列出 adapter input、output、idempotency key、timeout、retry、rollback owner 與 no-action guard。", + "review_question": "Verifier adapter 是否只驗證已批准 write,且 no-action 不會被誤加分?", + "blocked_runtime_action": "post_write_verifier_runtime_execution" + }, + { + "check_id": "rollback_work_item_template", + "display_name": "Rollback work item template", + "status": "contract_ready", + "owner_agent": "hermes", + "required_evidence": "模板需含 target、diff summary、rollback owner、deadline、failure reason 與 redacted refs。", + "review_question": "Verifier failed 時是否能產生可審查 rollback 草案,而不是靜默標記成功?", + "blocked_runtime_action": "rollback_work_item_write" + }, + { + "check_id": "failure_receipt_draft_redaction", + "display_name": "Failure receipt redaction", + "status": "approval_required", + "owner_agent": "openclaw", + "required_evidence": "Telegram failure receipt 只允許摘要、風險、批准連結、evidence id 與下一步。", + "review_question": "失敗通知是否不含 raw payload、private reasoning、authorization header 或 secret value?", + "blocked_runtime_action": "telegram_send_or_receipt_write" + }, + { + "check_id": "nemotron_replay_regression_fixture", + "display_name": "NemoTron replay regression fixture", + "status": "blocked_by_runtime_gate", + "owner_agent": "nemotron", + "required_evidence": "使用 sanitized replay fixture 比較 baseline 與 candidate verifier outcome,不讀 live incident payload。", + "review_question": "Verifier implementation 是否會讓 replay score 或 failure classification 變差?", + "blocked_runtime_action": "agent_replay_score_write" + } + ], + "implementation_review_lanes": [ + { + "lane_id": "pre_implementation_owner_review", + "display_name": "Pre-implementation owner review", + "status": "approval_required", + "owner_agent": "openclaw", + "trigger": "approve_verifier_implementation requested", + "operator_instruction": "確認 evidence checks、rollback owner、redaction 與 no-action guard 完整後,才可批准下一階段 implementation。", + "blocked_runtime_action": "runtime_verifier_implementation" + }, + { + "lane_id": "evidence_redaction_review", + "display_name": "Evidence redaction review", + "status": "contract_ready", + "owner_agent": "hermes", + "trigger": "new evidence refs attached", + "operator_instruction": "檢查 evidence refs 僅含脫敏 id / hash / summary,不含 secret、raw tool output 或完整對話。", + "blocked_runtime_action": "canonical_readback_query_execution" + }, + { + "lane_id": "no_action_result_guard", + "display_name": "No-action result guard", + "status": "contract_ready", + "owner_agent": "openclaw", + "trigger": "diagnostic-only or verifier skipped", + "operator_instruction": "未執行 write 或 verifier skipped 時,必須產生 no-action evidence,不得更新 trust 或 learning score。", + "blocked_runtime_action": "runtime_learning_write" + }, + { + "lane_id": "regression_replay_review", + "display_name": "Regression replay review", + "status": "blocked_by_runtime_gate", + "owner_agent": "nemotron", + "trigger": "verifier adapter candidate changed", + "operator_instruction": "NemoTron 只能跑 sanitized replay fixture;不得接 production payload 或直接改模型路由。", + "blocked_runtime_action": "agent_replay_score_write" + } + ], + "operator_actions": [ + { + "action_id": "review_runtime_verifier_evidence_package", + "display_name": "審查 runtime verifier evidence package", + "action_type": "review", + "status": "ready_for_owner", + "owner_agent": "openclaw", + "operator_instruction": "檢查 readback、rollback、failure receipt、redaction 與 no-action guard 是否齊備。", + "blocked_runtime_action": "post_write_verifier_runtime_execution" + }, + { + "action_id": "collect_missing_redacted_evidence", + "display_name": "補齊脫敏證據", + "action_type": "collect_evidence", + "status": "ready_for_owner", + "owner_agent": "hermes", + "operator_instruction": "補 evidence id、hash、summary 與 owner refs;不得補 secret value 或 raw payload。", + "blocked_runtime_action": "canonical_readback_query_execution" + }, + { + "action_id": "approve_runtime_verifier_implementation", + "display_name": "批准 runtime verifier implementation", + "action_type": "approve_implementation", + "status": "approval_required", + "owner_agent": "openclaw", + "operator_instruction": "只批准下一階段 implementation review 進入實作;不是批准 live execution 或 live write。", + "blocked_runtime_action": "runtime_verifier_implementation" + }, + { + "action_id": "reject_runtime_verifier_implementation", + "display_name": "退回 runtime verifier implementation", + "action_type": "reject_or_rework", + "status": "ready_for_owner", + "owner_agent": "nemotron", + "operator_instruction": "若 replay regression、redaction 或 rollback lane 不完整,退回 P2-403H package 重修。", + "blocked_runtime_action": "runtime_learning_write" + } + ], + "approval_boundaries": { + "runtime_verifier_implementation_allowed": false, + "post_write_verifier_execution_allowed": false, + "canonical_readback_allowed": false, + "rollback_work_item_write_allowed": false, + "telegram_failure_receipt_send_allowed": false, + "learning_writeback_allowed": false, + "km_write_allowed": false, + "playbook_trust_write_allowed": false, + "timeline_learning_write_allowed": false, + "agent_replay_score_write_allowed": false, + "runtime_worker_allowed": false, + "secret_plaintext_allowed": false + }, + "display_redaction_contract": { + "redaction_required": true, + "raw_payload_display_allowed": false, + "private_reasoning_display_allowed": false, + "secret_value_display_allowed": false, + "allowed_frontend_content": [ + "evidence check", + "implementation review lane", + "operator action", + "required evidence count", + "forbidden evidence count", + "blocked runtime action", + "approval policy", + "failure policy" + ], + "forbidden_frontend_content": [ + "secret value", + "authorization header", + "raw tool output", + "private reasoning", + "raw Telegram payload", + "unredacted canonical payload" + ], + "frontend_display_policy": "治理頁只顯示 evidence check、implementation lane、operator action、blocked runtime action 與 policy;不顯示 secret、authorization header、raw tool output、private reasoning、raw Telegram payload 或未脫敏 canonical payload。" + }, + "rollups": { + "evidence_check_count": 5, + "implementation_review_lane_count": 4, + "operator_action_count": 4, + "approval_required_action_ids": [ + "approve_runtime_verifier_implementation" + ], + "blocked_runtime_action_count": 7, + "required_evidence_count": 8, + "forbidden_evidence_count": 6, + "live_verifier_execution_count": 0 + } +} diff --git a/docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json b/docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json new file mode 100644 index 000000000..c1243bdfb --- /dev/null +++ b/docs/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json @@ -0,0 +1,403 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://awoooi.local/schemas/ai_agent_runtime_verifier_evidence_review_v1.schema.json", + "title": "AI Agent Runtime Verifier Evidence Review", + "type": "object", + "required": [ + "schema_version", + "generated_at", + "program_status", + "source_refs", + "review_truth", + "review_package", + "evidence_checks", + "implementation_review_lanes", + "operator_actions", + "approval_boundaries", + "display_redaction_contract", + "rollups" + ], + "properties": { + "schema_version": { + "const": "ai_agent_runtime_verifier_evidence_review_v1" + }, + "generated_at": { + "type": "string" + }, + "program_status": { + "type": "object", + "required": [ + "overall_completion_percent", + "current_priority", + "current_task_id", + "next_task_id", + "read_only_mode", + "runtime_authority", + "status_note" + ], + "properties": { + "overall_completion_percent": { + "const": 99 + }, + "current_priority": { + "enum": [ + "P0", + "P1", + "P2", + "P3" + ] + }, + "current_task_id": { + "const": "P2-403I" + }, + "next_task_id": { + "const": "P2-403J" + }, + "read_only_mode": { + "const": true + }, + "runtime_authority": { + "const": "runtime_verifier_evidence_review_only_no_live_execution" + }, + "status_note": { + "type": "string" + } + }, + "additionalProperties": false + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "review_truth": { + "type": "object", + "required": [ + "review_packet_ready", + "runtime_verifier_implementation_allowed", + "post_write_verifier_execution_allowed", + "runtime_verifier_executed_count", + "canonical_readback_allowed", + "canonical_readback_executed_count", + "rollback_work_item_created_count", + "telegram_failure_receipt_sent_count", + "learning_writeback_after_verifier_count", + "truth_note" + ], + "properties": { + "review_packet_ready": { + "const": true + }, + "runtime_verifier_implementation_allowed": { + "const": false + }, + "post_write_verifier_execution_allowed": { + "const": false + }, + "runtime_verifier_executed_count": { + "const": 0 + }, + "canonical_readback_allowed": { + "const": false + }, + "canonical_readback_executed_count": { + "const": 0 + }, + "rollback_work_item_created_count": { + "const": 0 + }, + "telegram_failure_receipt_sent_count": { + "const": 0 + }, + "learning_writeback_after_verifier_count": { + "const": 0 + }, + "truth_note": { + "type": "string" + } + }, + "additionalProperties": false + }, + "review_package": { + "type": "object", + "required": [ + "required_evidence", + "forbidden_evidence", + "operator_meaning", + "approval_policy", + "failure_policy" + ], + "properties": { + "required_evidence": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "forbidden_evidence": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "operator_meaning": { + "type": "string" + }, + "approval_policy": { + "type": "string" + }, + "failure_policy": { + "type": "string" + } + }, + "additionalProperties": false + }, + "evidence_checks": { + "type": "array", + "items": { + "type": "object", + "required": [ + "check_id", + "display_name", + "status", + "owner_agent", + "required_evidence", + "review_question", + "blocked_runtime_action" + ], + "properties": { + "check_id": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "status": { + "enum": [ + "contract_ready", + "approval_required", + "blocked_by_runtime_gate", + "ready_for_owner" + ] + }, + "owner_agent": { + "enum": [ + "openclaw", + "hermes", + "nemotron" + ] + }, + "required_evidence": { + "type": "string" + }, + "review_question": { + "type": "string" + }, + "blocked_runtime_action": { + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + }, + "implementation_review_lanes": { + "type": "array", + "items": { + "type": "object", + "required": [ + "lane_id", + "display_name", + "status", + "owner_agent", + "trigger", + "operator_instruction", + "blocked_runtime_action" + ], + "properties": { + "lane_id": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "status": { + "enum": [ + "contract_ready", + "approval_required", + "blocked_by_runtime_gate", + "ready_for_owner" + ] + }, + "owner_agent": { + "enum": [ + "openclaw", + "hermes", + "nemotron" + ] + }, + "trigger": { + "type": "string" + }, + "operator_instruction": { + "type": "string" + }, + "blocked_runtime_action": { + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + }, + "operator_actions": { + "type": "array", + "items": { + "type": "object", + "required": [ + "action_id", + "display_name", + "action_type", + "status", + "owner_agent", + "operator_instruction", + "blocked_runtime_action" + ], + "properties": { + "action_id": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "action_type": { + "enum": [ + "review", + "collect_evidence", + "approve_implementation", + "reject_or_rework" + ] + }, + "status": { + "enum": [ + "ready_for_owner", + "approval_required", + "blocked_by_runtime_gate" + ] + }, + "owner_agent": { + "enum": [ + "openclaw", + "hermes", + "nemotron" + ] + }, + "operator_instruction": { + "type": "string" + }, + "blocked_runtime_action": { + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + }, + "approval_boundaries": { + "type": "object", + "additionalProperties": { + "const": false + } + }, + "display_redaction_contract": { + "type": "object", + "required": [ + "redaction_required", + "raw_payload_display_allowed", + "private_reasoning_display_allowed", + "secret_value_display_allowed", + "allowed_frontend_content", + "forbidden_frontend_content", + "frontend_display_policy" + ], + "properties": { + "redaction_required": { + "const": true + }, + "raw_payload_display_allowed": { + "const": false + }, + "private_reasoning_display_allowed": { + "const": false + }, + "secret_value_display_allowed": { + "const": false + }, + "allowed_frontend_content": { + "type": "array", + "items": { + "type": "string" + } + }, + "forbidden_frontend_content": { + "type": "array", + "items": { + "type": "string" + } + }, + "frontend_display_policy": { + "type": "string" + } + }, + "additionalProperties": false + }, + "rollups": { + "type": "object", + "required": [ + "evidence_check_count", + "implementation_review_lane_count", + "operator_action_count", + "approval_required_action_ids", + "blocked_runtime_action_count", + "required_evidence_count", + "forbidden_evidence_count", + "live_verifier_execution_count" + ], + "properties": { + "evidence_check_count": { + "type": "integer" + }, + "implementation_review_lane_count": { + "type": "integer" + }, + "operator_action_count": { + "type": "integer" + }, + "approval_required_action_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "blocked_runtime_action_count": { + "type": "integer" + }, + "required_evidence_count": { + "type": "integer" + }, + "forbidden_evidence_count": { + "type": "integer" + }, + "live_verifier_execution_count": { + "const": 0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} 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 4b0a55357..865fb3fbc 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 @@ -634,7 +634,7 @@ Alert / Sentry / SigNoz / Gitea / Market Watch / Operator | `docs/evaluations/ai_agent_communication_learning_contract_2026-06-11.json` | 2026-06-11 committed snapshot;完成度 `35%`,runtime worker / DB migration / Telegram direct send 全部 false | | `apps/api/src/services/ai_agent_communication_learning_contract.py` | 只讀 loader;強制驗證 runtime / migration / Telegram / SDK / route 權限都未開 | | `GET /api/v1/agents/agent-communication-learning-contract` | 治理 API;只回傳 committed contract,不啟動 worker、不碰 DB/Redis、不呼叫外部服務 | -| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` + `GET /api/v1/agents/agent-interaction-learning-proof` | P2-403A / P2-403B / P2-403C / P2-403D / P2-403E / P2-403F / P2-403G / P2-403H 互動、接手、學習、成長、read model gate、Redis dry-run gate、learning writeback approval package、Telegram receipt approval package、owner-approved learning dry-run、fixture dry-run 與 runtime write gate review 與 post-write verifier package 證據面;目前 live session、message、handoff、learning write、Gateway queue、Telegram send、verifier execution 全部 `0`,下一步 P2-403I | +| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` + `GET /api/v1/agents/agent-interaction-learning-proof` | P2-403A / P2-403B / P2-403C / P2-403D / P2-403E / P2-403F / P2-403G / P2-403H / P2-403I 互動、接手、學習、成長、read model gate、Redis dry-run gate、learning writeback approval package、Telegram receipt approval package、owner-approved learning dry-run、fixture dry-run、runtime write gate review、post-write verifier package 與 runtime verifier evidence review 證據面;目前 live session、message、handoff、learning write、Gateway queue、Telegram send、verifier execution 全部 `0`,下一步 P2-403J | | `docs/evaluations/ai_agent_live_read_model_gate_2026-06-11.json` + `GET /api/v1/agents/agent-live-read-model-gate` | P2-403B AgentSession / Redis Streams live read model gate;定義 safe fields、Redis envelope、worker gate、rollback plan 與 no-write smoke,不連 DB、不讀寫 Redis、不啟動 worker | #### 3.2.1c 2026-06-11 AI Agent 主動營運委派與版本生命週期契約 @@ -717,7 +717,8 @@ Repo / registry / release notes / K8s / host / observability / backup evidence 12. 建立 owner-approved learning dry-run preview,先固定批准後可產生的 dry-run preview、人工操作選項、驗證與 rollback。✅ P2-403F 已完成;owner approval received、dry-run preview generated、KM / PlayBook trust / timeline / replay score write、Telegram send 仍為 `0 / false`。 13. 建立 owner-approved fixture dry-run 總包,將 learning writeback、Telegram receipt、handoff replay、operator feedback 的乾跑證據收斂到治理頁。✅ P2-403F 補強完成;Gateway queue、Telegram send、Redis consumer、runtime worker 仍為 `0 / false`。 14. 建立 runtime write gate review,固定雙重批准、dry-run hash、post-write verifier、rollback 與 redaction 欄位。✅ P2-403G 已完成;KM / PlayBook trust / timeline / replay score / Telegram live write 仍為 `0 / false`。 -15. 建立 post-write verifier implementation package,固定 canonical readback、rollback lane、failure lane 與人工操作選項。✅ P2-403H 已完成;canonical readback、rollback work item、Telegram failure receipt 與 verifier execution 仍為 `0 / false`。下一步 P2-403I runtime verifier evidence implementation review。 +15. 建立 post-write verifier implementation package,固定 canonical readback、rollback lane、failure lane 與人工操作選項。✅ P2-403H 已完成;canonical readback、rollback work item、Telegram failure receipt 與 verifier execution 仍為 `0 / false`。 +16. 建立 runtime verifier evidence implementation review,固定 implementation 前的 evidence checks、redaction review、rollback template、failure receipt template、NemoTron replay fixture 與人工操作選項。✅ P2-403I 已完成;verifier implementation、canonical readback、rollback work item、Telegram failure receipt、learning writeback 與 verifier execution 仍為 `0 / false`。下一步 P2-403J 成長趨勢週報與 operator feedback applied 指標。 #### 3.2.1d 2026-06-11 Agent 互動、學習與成長證據面 @@ -740,7 +741,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence | 檔案 / API | 用途 | |---|---| | `docs/schemas/ai_agent_interaction_learning_proof_v1.schema.json` | 互動、接手、學習、成長、Telegram receipt 與前端 redaction schema | -| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | P2-403A + P2-403B + P2-403C + P2-403D + P2-403E + P2-403F + P2-403G + P2-403H committed snapshot;完成度 `97%`,live truth counts 全部 `0` | +| `docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json` | P2-403A + P2-403B + P2-403C + P2-403D + P2-403E + P2-403F + P2-403G + P2-403H + P2-403I committed snapshot;完成度 `99%`,live truth counts 全部 `0` | | `apps/api/src/services/ai_agent_interaction_learning_proof.py` | 只讀 loader;強制 live flags / DB / Redis / Telegram / transcript / 私有推理全部關閉 | | `GET /api/v1/agents/agent-interaction-learning-proof` | 治理 API;只回傳證據面,不啟動 worker、不碰 live DB/Redis、不發 Telegram | | `docs/schemas/ai_agent_live_read_model_gate_v1.schema.json` | P2-403B live read model gate schema;強制 DB / Redis / worker / Telegram / learning writeback 仍需批准 | @@ -1865,6 +1866,14 @@ Phase 6 完成後 - 更新 `ai_agent_proactive_operations_contract_2026-06-11.json`:新增 rollout task `P2-403H`,blocked runtime actions 包含 canonical readback、rollback work item、Telegram failure receipt、KM / PlayBook trust / timeline / replay score write。 - 本波仍不讀 canonical target、不寫 rollback work item、不發 Telegram、不寫 KM、不更新 PlayBook trust、不寫 timeline learning、不寫 replay score、不啟動 runtime worker、不讀取或輸出 secret;下一步 P2-403I 才進 runtime verifier evidence implementation review。 +### 2026-06-12 02:05 (台北) — §3.2 / §5 — 完成 P2-403I Runtime Verifier Evidence Review — 把 verifier implementation 前的證據審查固定成可見 gate + +- 新增 `ai_agent_runtime_verifier_evidence_review_v1` schema / committed snapshot / loader / API / 測試,定義 evidence checks、implementation review lanes、rollback template、failure receipt template、redaction review、NemoTron replay fixture 與 operator actions。 +- `apps/web/src/app/[locale]/governance/tabs/automation-inventory-tab.tsx` 接入 `GET /api/v1/agents/agent-runtime-verifier-evidence-review`,顯示 5 個 evidence check、4 個 implementation review lane、4 個人工操作選項、truth flags 與 live verifier execution `0`。 +- 更新 `ai_agent_interaction_learning_proof_2026-06-11.json`:整體完成度 `99%`,current task `P2-403I`,next task `P2-403J`;live AgentSession / Redis events / handoff / learning write / Telegram digest receipt / verifier execution 全部仍為 `0`。 +- 更新 `ai_agent_proactive_operations_contract_2026-06-11.json`:新增 rollout task `P2-403I`,blocked runtime actions 包含 runtime verifier implementation、canonical readback、rollback work item、Telegram failure receipt、runtime learning write 與 agent replay score write。 +- 本波仍不實作或執行 verifier、不讀 canonical target、不寫 rollback work item、不發 Telegram、不寫 KM、不更新 PlayBook trust、不寫 timeline learning、不寫 replay score、不啟動 runtime worker、不讀取或輸出 secret;下一步 P2-403J 才做成長趨勢週報與 operator feedback applied 指標。 + ### 2026-06-12 00:35 (台北) — §3.2 / §5 — 完成 P2-403G Runtime Write Gate Review — 把批准後可寫入前的最後安全閘門固定成可審查契約 - 新增 `ai_agent_runtime_write_gate_review_v1` schema / committed snapshot / loader / API / 測試,定義雙重批准、dry-run hash、post-write verifier、rollback owner、target write surface 與 redaction 欄位。