Some checks failed
Code Review / ai-code-review (push) Successful in 13s
CD Pipeline / tests (push) Successful in 1m39s
Ansible / Reboot Recovery Contract / validate (push) Has been cancelled
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
307 lines
11 KiB
JSON
307 lines
11 KiB
JSON
{
|
||
"schema_version": "ai_agent_live_read_model_gate_v1",
|
||
"generated_at": "2026-06-11T23:50:00+08:00",
|
||
"program_status": {
|
||
"overall_completion_percent": 55,
|
||
"current_priority": "P2",
|
||
"current_task_id": "P2-403B",
|
||
"next_task_id": "P2-403C",
|
||
"read_only_mode": true,
|
||
"runtime_authority": "gate_plan_only_no_live_worker",
|
||
"status_note": "P2-403B 已把 AgentSession / Redis Streams live read model 的唯讀查詢、worker gate、回滾與無寫入 smoke 變成可審查契約;尚未開啟 live DB query、Redis consumer group、runtime worker、learning writeback 或 Telegram 發送。"
|
||
},
|
||
"source_refs": [
|
||
"apps/api/src/db/models.py:AgentSession",
|
||
"apps/api/migrations/phase_aiops_p1_p2_p6_tables.sql:agent_sessions",
|
||
"docs/evaluations/ai_agent_interaction_learning_proof_2026-06-11.json",
|
||
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
|
||
],
|
||
"live_truth": {
|
||
"live_agent_session_readback_enabled": false,
|
||
"live_redis_stream_read_enabled": false,
|
||
"runtime_worker_enabled": false,
|
||
"telegram_receipt_send_enabled": false,
|
||
"learning_writeback_enabled": false,
|
||
"active_live_agent_sessions": 0,
|
||
"live_redis_events_24h": 0,
|
||
"live_handoffs_24h": 0,
|
||
"live_learning_writes_24h": 0,
|
||
"telegram_digest_receipts_24h": 0,
|
||
"truth_note": "目前完成的是 read model gate plan;治理頁可以看見下一步要驗證什麼,但不能把 0 筆 live session 說成 Agent 已在 production 主動互動。"
|
||
},
|
||
"existing_storage_contract": {
|
||
"db_table": "agent_sessions",
|
||
"schema_status": "existing_phase_aiops_table_detected",
|
||
"migration_delta_required": false,
|
||
"approved_for_live_query": false,
|
||
"safe_read_query_defined": true,
|
||
"safe_selected_fields": [
|
||
"id",
|
||
"session_id",
|
||
"incident_id",
|
||
"agent_role",
|
||
"input_hash",
|
||
"latency_ms",
|
||
"vote",
|
||
"degraded",
|
||
"created_at"
|
||
],
|
||
"forbidden_selected_fields": [
|
||
"output_json",
|
||
"prompt",
|
||
"raw_prompt",
|
||
"conversation_transcript",
|
||
"private_reasoning",
|
||
"chain_of_thought",
|
||
"secret_plaintext",
|
||
"credential_value"
|
||
],
|
||
"required_indexes": [
|
||
"ix_agent_sessions_session_id",
|
||
"ix_agent_sessions_incident_id",
|
||
"ix_agent_sessions_created_at",
|
||
"ix_agent_sessions_session_role"
|
||
],
|
||
"read_query_contract": "SELECT id, session_id, incident_id, agent_role, input_hash, latency_ms, vote, degraded, created_at FROM agent_sessions WHERE created_at >= :window_start ORDER BY created_at DESC LIMIT :safe_limit",
|
||
"query_limits": {
|
||
"default_window_hours": 24,
|
||
"max_limit": 50,
|
||
"order_by": "created_at DESC"
|
||
}
|
||
},
|
||
"redis_stream_contract": {
|
||
"stream_namespace": "awoooi:agent:*",
|
||
"candidate_streams": [
|
||
"awoooi:agent:events",
|
||
"awoooi:agent:handoffs",
|
||
"awoooi:agent:learning"
|
||
],
|
||
"consumer_group_allowed": false,
|
||
"xadd_allowed": false,
|
||
"xreadgroup_allowed": false,
|
||
"dead_letter_required": true,
|
||
"replay_required_before_worker": true,
|
||
"event_envelope_required_fields": [
|
||
"event_id",
|
||
"trace_id",
|
||
"session_id",
|
||
"incident_id",
|
||
"agent_id",
|
||
"event_type",
|
||
"event_status",
|
||
"created_at",
|
||
"evidence_ref"
|
||
],
|
||
"forbidden_event_fields": [
|
||
"secret_value",
|
||
"credential_value",
|
||
"raw_prompt",
|
||
"conversation_transcript",
|
||
"private_reasoning",
|
||
"chain_of_thought"
|
||
]
|
||
},
|
||
"read_model_cards": [
|
||
{
|
||
"card_id": "agent_heartbeat_readback",
|
||
"display_name": "Agent 心跳讀回",
|
||
"owner_agent": "openclaw",
|
||
"source_of_truth": "agent_sessions.created_at",
|
||
"readiness_status": "query_contract_ready",
|
||
"operator_signal": "看到各 Agent 最近一次安全欄位 readback 時間與 degraded 狀態。",
|
||
"next_gate": "P2-403C Redis dry-run 前先做 DB 無寫入 smoke。"
|
||
},
|
||
{
|
||
"card_id": "agent_vote_quality",
|
||
"display_name": "投票與降級品質",
|
||
"owner_agent": "openclaw",
|
||
"source_of_truth": "agent_sessions.vote + degraded + latency_ms",
|
||
"readiness_status": "query_contract_ready",
|
||
"operator_signal": "看到 approve / reject / request_revision / degraded 的聚合趨勢。",
|
||
"next_gate": "P2-403C 加上 message receipt 後才能判斷互相接手。"
|
||
},
|
||
{
|
||
"card_id": "agent_role_turns",
|
||
"display_name": "Agent role turn 摘要",
|
||
"owner_agent": "hermes",
|
||
"source_of_truth": "agent_sessions.session_id + agent_role",
|
||
"readiness_status": "query_contract_ready",
|
||
"operator_signal": "看到同一 session 內哪些角色參與,但不顯示未脫敏執行細節。",
|
||
"next_gate": "P2-403C 定義 handoff envelope。"
|
||
},
|
||
{
|
||
"card_id": "redis_message_receipts",
|
||
"display_name": "Redis 訊息收據",
|
||
"owner_agent": "hermes",
|
||
"source_of_truth": "Redis Streams event envelope",
|
||
"readiness_status": "approval_required",
|
||
"operator_signal": "看到 XADD / ack / dead-letter 的脫敏收據;目前尚未允許讀寫 Redis。",
|
||
"next_gate": "P2-403C consumer group dry-run approval。"
|
||
},
|
||
{
|
||
"card_id": "learning_receipt_bridge",
|
||
"display_name": "學習收據橋接",
|
||
"owner_agent": "nemotron",
|
||
"source_of_truth": "knowledge_entries + playbook_trust_history + replay_results",
|
||
"readiness_status": "blocked_by_writeback_gate",
|
||
"operator_signal": "看到學習回寫與 replay 分數改善的聚合摘要;目前 writeback 未批准。",
|
||
"next_gate": "P2-403D learning writeback approval package。"
|
||
}
|
||
],
|
||
"worker_gate_plan": [
|
||
{
|
||
"gate_id": "db_read_model_no_write_smoke",
|
||
"display_name": "DB read model 無寫入 smoke",
|
||
"owner_agent": "openclaw",
|
||
"status": "approval_required",
|
||
"required_evidence": "pytest loader + API endpoint + SQL read-only query review;確認未 import DB session writer、未 INSERT / UPDATE / DELETE。",
|
||
"blocked_action": "live_db_query"
|
||
},
|
||
{
|
||
"gate_id": "redis_stream_replay_dry_run",
|
||
"display_name": "Redis Streams replay dry-run",
|
||
"owner_agent": "hermes",
|
||
"status": "approval_required",
|
||
"required_evidence": "固定 fixture 重放 event envelope,確認 ack / dead-letter / replay idempotency。",
|
||
"blocked_action": "redis_consumer_group"
|
||
},
|
||
{
|
||
"gate_id": "worker_kill_switch",
|
||
"display_name": "worker 熔斷與停用開關",
|
||
"owner_agent": "openclaw",
|
||
"status": "blocked",
|
||
"required_evidence": "環境變數預設關閉、runtime health gate、回滾腳本與告警降噪規則。",
|
||
"blocked_action": "runtime_worker"
|
||
},
|
||
{
|
||
"gate_id": "frontend_redaction_readback",
|
||
"display_name": "前端 readback 脫敏驗證",
|
||
"owner_agent": "hermes",
|
||
"status": "approval_required",
|
||
"required_evidence": "只顯示 safe fields、聚合數、event id、來源與 gate;未核准上下文與未脫敏執行細節不得進前端。",
|
||
"blocked_action": "unsafe_frontend_display"
|
||
},
|
||
{
|
||
"gate_id": "telegram_receipt_dry_run_gate",
|
||
"display_name": "Telegram receipt dry-run gate",
|
||
"owner_agent": "openclaw",
|
||
"status": "blocked",
|
||
"required_evidence": "Gateway dry-run、token 注入 E2E、failure-only / action-required policy、送達收據與 fallback。",
|
||
"blocked_action": "telegram_send"
|
||
}
|
||
],
|
||
"rollback_plan": [
|
||
{
|
||
"rollback_id": "disable_feature_flag",
|
||
"step": "若 read model API 發生異常,先關閉前端顯示與 runtime feature flag,保留 P2-403A 證據面。",
|
||
"owner_agent": "openclaw"
|
||
},
|
||
{
|
||
"rollback_id": "stop_worker_before_queue",
|
||
"step": "若 P2-403C 後 worker 開始 dry-run,先停 worker,再檢查 Redis pending / dead-letter,不刪資料。",
|
||
"owner_agent": "hermes"
|
||
},
|
||
{
|
||
"rollback_id": "freeze_learning_writeback",
|
||
"step": "若 learning bridge 發現髒資料,維持 writeback gate 關閉,只保留候選學習報告。",
|
||
"owner_agent": "nemotron"
|
||
},
|
||
{
|
||
"rollback_id": "telegram_send_lock",
|
||
"step": "若 Telegram gateway 有錯誤,保留 queue / receipt evidence,但直接發送維持關閉。",
|
||
"owner_agent": "openclaw"
|
||
}
|
||
],
|
||
"no_write_smoke_plan": [
|
||
{
|
||
"smoke_id": "loader_rejects_live_flags",
|
||
"status": "defined",
|
||
"writes_allowed": false,
|
||
"assertion": "loader 會拒絕任何 live DB query、runtime worker、Redis consumer、Telegram 或 learning writeback allowed=true。"
|
||
},
|
||
{
|
||
"smoke_id": "safe_field_projection",
|
||
"status": "defined",
|
||
"writes_allowed": false,
|
||
"assertion": "safe_selected_fields 不包含 output_json、prompt、逐字稿、未核准推理或機密欄位。"
|
||
},
|
||
{
|
||
"smoke_id": "api_returns_gate_only",
|
||
"status": "defined",
|
||
"writes_allowed": false,
|
||
"assertion": "API 只回傳 committed snapshot,不連 DB、不連 Redis、不送 Telegram。"
|
||
},
|
||
{
|
||
"smoke_id": "frontend_redaction_scan",
|
||
"status": "defined",
|
||
"writes_allowed": false,
|
||
"assertion": "前端只顯示狀態、safe fields 數量、gate、聚合指標與下一步。"
|
||
},
|
||
{
|
||
"smoke_id": "rollback_plan_present",
|
||
"status": "defined",
|
||
"writes_allowed": false,
|
||
"assertion": "每個 future runtime gate 都有停用或凍結策略。"
|
||
}
|
||
],
|
||
"display_redaction_contract": {
|
||
"redaction_required": true,
|
||
"work_window_conversation_display_allowed": false,
|
||
"agent_raw_output_display_allowed": false,
|
||
"secret_value_display_allowed": false,
|
||
"allowed_frontend_content": [
|
||
"狀態",
|
||
"聚合數",
|
||
"safe field 名稱",
|
||
"來源表",
|
||
"event id",
|
||
"gate id",
|
||
"下一步",
|
||
"回滾步驟摘要"
|
||
],
|
||
"forbidden_frontend_content": [
|
||
"未公開上下文",
|
||
"未脫敏執行細節",
|
||
"提示內容",
|
||
"未核准推理",
|
||
"機密值",
|
||
"未脫敏 payload"
|
||
],
|
||
"frontend_display_policy": "治理頁只顯示 gate、safe fields、聚合數、來源與下一步;未公開上下文、未脫敏執行細節、提示內容、機密值與未脫敏 payload 一律不進前端。"
|
||
},
|
||
"approval_boundaries": {
|
||
"db_migration_allowed": false,
|
||
"live_db_query_allowed": false,
|
||
"redis_xadd_allowed": false,
|
||
"redis_consumer_group_allowed": false,
|
||
"runtime_worker_allowed": false,
|
||
"telegram_direct_send_allowed": false,
|
||
"learning_writeback_allowed": false,
|
||
"secret_plaintext_allowed": false,
|
||
"conversation_transcript_display_allowed": false,
|
||
"private_reasoning_display_allowed": false,
|
||
"agent_raw_output_display_allowed": false
|
||
},
|
||
"rollups": {
|
||
"source_ref_count": 4,
|
||
"read_model_card_count": 5,
|
||
"gate_count": 5,
|
||
"approval_required_gate_ids": [
|
||
"db_read_model_no_write_smoke",
|
||
"frontend_redaction_readback",
|
||
"redis_stream_replay_dry_run",
|
||
"telegram_receipt_dry_run_gate",
|
||
"worker_kill_switch"
|
||
],
|
||
"query_contract_ready_card_ids": [
|
||
"agent_heartbeat_readback",
|
||
"agent_role_turns",
|
||
"agent_vote_quality"
|
||
],
|
||
"rollback_step_count": 4,
|
||
"no_write_smoke_count": 5,
|
||
"forbidden_frontend_content_count": 6,
|
||
"live_truth_count_total": 0
|
||
}
|
||
}
|