diff --git a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py index 3cea7632c..0082df2b8 100644 --- a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py +++ b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py @@ -116,12 +116,11 @@ def test_loader_returns_fixed_architecture_provider_order_and_agent99_bridge() - "total_items": 18, "by_priority": {"P0": 16, "P1": 2}, "by_status": { - "source_implemented_runtime_pending": 10, + "source_implemented_runtime_pending": 11, "in_progress": 3, "planned": 4, - "policy_active": 1, }, - "source_implemented_items": 10, + "source_implemented_items": 11, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial", @@ -142,6 +141,12 @@ def test_ledger_links_confirmed_runtime_gaps_without_false_closure() -> None: items["AIA-SRE-013"]["runtime_gaps"] ) assert "host99 Agent99" in " ".join(items["AIA-SRE-017"]["runtime_gaps"]) + assert items["AIA-SRE-011"]["status"] == ( + "source_implemented_runtime_pending" + ) + assert "controlledApply=false" in " ".join( + items["AIA-SRE-011"]["confirmed_truth"] + ) assert items["AIA-SRE-017"]["status"] == ( "source_implemented_runtime_pending" ) @@ -172,7 +177,7 @@ def test_projection_keeps_program_asset_and_runtime_truth_separate() -> None: payload = load_sre_k3s_controlled_automation_work_items() projection = build_sre_k3s_program_projection(payload) - assert projection["rollups"]["source_implemented_items"] == 10 + assert projection["rollups"]["source_implemented_items"] == 11 assert projection["rollups"]["runtime_closed_items"] == 0 assert projection["rollups"]["program_completion_percent"] == 0 assert projection["domain_count"] == 8 diff --git a/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json b/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json index 5e7dcb152..ec7d8516b 100644 --- a/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json +++ b/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json @@ -575,18 +575,33 @@ "title": "Backup/restore readback 與 critical break-glass", "owner_lane": "DataProtection", "risk": "critical", - "status": "policy_active", + "status": "source_implemented_runtime_pending", "dependencies": [ "AIA-SRE-004" ], "source_refs": [ - "apps/api/src/services/backup_restore_signal_automation.py" + "apps/api/src/services/backup_restore_signal_automation.py", + "apps/api/src/services/agent99_sre_bridge.py", + "apps/api/src/jobs/agent99_controlled_dispatch_reconciler_job.py", + "apps/api/src/services/agent99_controlled_dispatch_ledger.py", + "apps/api/src/services/agent99_telegram_lifecycle.py", + "apps/api/src/services/agent99_public_receipts.py", + "apps/api/src/repositories/knowledge_repository.py" ], "executor": "backup_restore_break_glass", "verifier": "backup_restore_readback_verifier", "rollback": "no-write default; destructive action requires incident-specific break-glass", "exit_condition": "freshness, offsite, escrow and restore-drill evidence close without false green", - "next_action": "bind typed route to DR scorecard without running backup/restore" + "confirmed_truth": [ + "backup alerts are typed before generic routing and dispatch only Agent99 BackupCheck with controlledApply=false", + "BackupCheck renders a read-only Telegram lifecycle receipt and never uses a controlled-apply receipt", + "same-run closure requires durable Telegram, KM, RAG, MCP, PlayBook and DR scorecard acknowledgements before terminal writeback", + "existing BackupCheck learning assets reconcile idempotently to backup_restore and no-write semantics" + ], + "runtime_gaps": [ + "no production same-run BackupCheck dispatch, freshness/offsite/escrow/restore-drill verifier receipt or recipient-visible closure is recorded for this source revision" + ], + "next_action": "deploy one exact source revision through the authorized release lane, replay one read-only backup signal through Agent99 BackupCheck and verify same-run Telegram/KM/RAG/MCP/PlayBook/DR receipts; do not run backup, restore, delete or retention changes" }, { "id": "AIA-SRE-012", @@ -832,12 +847,11 @@ "P1": 2 }, "by_status": { - "source_implemented_runtime_pending": 10, + "source_implemented_runtime_pending": 11, "in_progress": 3, - "planned": 4, - "policy_active": 1 + "planned": 4 }, - "source_implemented_items": 10, + "source_implemented_items": 11, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial",