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 0a89f084f..3cea7632c 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,12 @@ 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": 9, - "in_progress": 4, + "source_implemented_runtime_pending": 10, + "in_progress": 3, "planned": 4, "policy_active": 1, }, - "source_implemented_items": 9, + "source_implemented_items": 10, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial", @@ -142,13 +142,21 @@ 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-017"]["status"] == ( + "source_implemented_runtime_pending" + ) + assert "11 products and 26 typed routes" in " ".join( + items["AIA-SRE-017"]["confirmed_truth"] + ) assert items["AIA-SRE-015"]["status"] == ( "source_implemented_runtime_pending" ) assert "production same-run receipt" in " ".join( items["AIA-SRE-015"]["runtime_gaps"] ) - assert "atomic 17-file bundle" in items["AIA-SRE-017"]["next_action"] + assert "recipient-visible same-run delivery receipts" in ( + items["AIA-SRE-017"]["next_action"] + ) assert "gitea-native" in " ".join(items["AIA-SRE-018"]["runtime_gaps"]) assert payload["completion_contract"]["evidence_layers"] == { "source_test": "partial_source_evidence_only", @@ -164,7 +172,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"] == 9 + assert projection["rollups"]["source_implemented_items"] == 10 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 5dc74b17b..5e7dcb152 100644 --- a/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json +++ b/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json @@ -753,7 +753,7 @@ "title": "Telegram 與 cockpit 只呈現 canonical lifecycle truth", "owner_lane": "ProductExperience", "risk": "medium", - "status": "in_progress", + "status": "source_implemented_runtime_pending", "dependencies": [ "AIA-SRE-015" ], @@ -767,17 +767,28 @@ "agent99-sre-alert-relay.ps1", "scripts/reboot-recovery/deploy-agent99-via-windows99-ssh.sh", "apps/api/src/services/failover_alerter.py", - "apps/api/src/services/telegram_gateway.py" + "apps/api/src/services/telegram_gateway.py", + "apps/api/src/services/notification_matrix.py", + "apps/api/src/services/agent99_sre_bridge.py", + "apps/api/src/services/agent99_telegram_lifecycle.py", + "apps/api/src/services/telegram_button_registry.py", + "apps/api/src/services/callback_dispatcher.py" ], "executor": "canonical Telegram gateway", "verifier": "delivery receipt plus desktop/mobile visible smoke", "rollback": "suppress duplicate projection; retain incident ledger", "exit_condition": "no alert is sprayed across groups/bots; every card states AI/provider/Agent action, executor, verifier and receipt truth; AlertChainBroken uses Alertmanager integration-scoped delivery counters stamped with the independently tested sole-webhook receiver contract plus host99 Agent99 exact-host read-only polling independent of the broken webhook; UI status polling never emits failover alerts", + "confirmed_truth": [ + "source registry covers 11 products and 26 typed routes; only allowlisted P0/P1 operational routes resolve to the AwoooI SRE war room", + "unknown product, signal, severity or requested destination fails closed and active source contains no raw numeric Telegram destination default", + "Telegram automation cards distinguish durable AI/provider, Agent, executor, verifier and learning receipts from configured-but-unobserved components", + "information and controlled-action buttons are bound to registered callback actions instead of display-only ghost buttons" + ], "runtime_gaps": [ "the host99 Agent99 independent pull/reduced relay has no production deployment, freshness, dedupe or controlled-repair receipt", "production Alertmanager exposes integration-only notification counters; the bounded check now passes after adding a scrape-time receiver_contract label, but apply, alert resolution and same-run learning receipts remain pending" ], - "next_action": "deploy the production-schema-compatible Alertmanager runtime scrape/canonical rules, the host99 Agent99 exact-host poller and the fixed DB dispatch entrypoint through the atomic 17-file bundle; verify receiver-contract freshness, dedupe and the current firing alert resolution; then reconcile every project/product/alert class against its typed domain and canonical Telegram destination" + "next_action": "deploy one exact source revision through the authorized release lane, then verify receiver-contract freshness, host99 Agent99 exact-host polling, dedupe, callback execution, current firing alert resolution and recipient-visible same-run delivery receipts; source tests must not be counted as runtime closure" }, { "id": "AIA-SRE-018", @@ -821,12 +832,12 @@ "P1": 2 }, "by_status": { - "source_implemented_runtime_pending": 9, - "in_progress": 4, + "source_implemented_runtime_pending": 10, + "in_progress": 3, "planned": 4, "policy_active": 1 }, - "source_implemented_items": 9, + "source_implemented_items": 10, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial",