feat(telegram): consume alert registry in ai loop context
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 56s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-02 20:34:31 +08:00
parent 0e7b7b704a
commit 3c620ef028
10 changed files with 600 additions and 19 deletions

View File

@@ -59,6 +59,18 @@ class _FailingContext:
return False
@pytest.fixture(autouse=True)
def _stub_telegram_alert_card_readback(monkeypatch):
async def fake_alert_card_readback(**_kwargs):
return _telegram_alert_card_readback()
monkeypatch.setattr(
consumer_module,
"list_ai_alert_card_delivery_readback",
fake_alert_card_readback,
)
def _ledger_rows() -> list[dict]:
return [
{
@@ -118,6 +130,71 @@ def _consumer_receipt_rows() -> list[dict]:
]
def _telegram_alert_card_readback() -> dict:
return {
"summary": {
"project_id": "awoooi",
"learning_registry_target_count": 6,
"learning_registry_ready_target_count": 6,
"learning_registry_missing_target_count": 0,
"learning_registry_next_action": (
"consume_telegram_alert_learning_registry_in_ai_loop_agent_context"
),
},
"items": [
{
"message_id": "msg-telegram-1",
"run_id": "run-telegram-1",
"project_id": "awoooi",
"event_type": "wazuh_dashboard_api_readback_degraded",
"lane": "siem_observability_readback_degraded",
"learning_writeback_refs": {
"receipt_id": "msg-telegram-1",
"run_id": "run-telegram-1",
"work_item_id": "CIR-P0-TG-001",
"post_verifier_ref": (
"verifier://awoooi/telegram-alert-delivery-receipt/"
"run-telegram-1"
),
"ai_agent_context_ref": (
"ai-agent://awoooi/telegram-alert-learning-context/"
"run-telegram-1/msg-telegram-1"
),
},
"learning_registry_bindings": [
{
"target": target,
"status": "ready_for_consumer_context",
"consumer_surface": surface,
"ref": f"{target}://awoooi/telegram-alert/msg-telegram-1",
"work_item_id": "CIR-P0-TG-001",
"target_write_performed": False,
"raw_payload_included": False,
}
for target, surface in [
("km", "knowledge_memory_context"),
("rag", "rag_index_candidate_context"),
("playbook", "playbook_trust_candidate_context"),
("mcp", "mcp_audit_feedback_context"),
("verifier", "post_apply_verifier_feedback_context"),
("ai_agent", "autonomous_runtime_decision_context"),
]
],
}
],
"learning_registry": {
"schema_version": "ai_alert_card_learning_registry_readback_v1",
"status": "learning_registry_ready",
"project_id": "awoooi",
"target_count": 6,
"ready_target_count": 6,
"missing_target_count": 0,
"ready_receipt_ref_count": 6,
"consumer_context_route": "ai_loop_agent.telegram_alert_learning_context",
},
}
@pytest.mark.asyncio
async def test_log_controlled_writeback_consumer_loader_reads_live_ledger(monkeypatch):
fake_db = _FakeDb(_ledger_rows())
@@ -237,6 +314,38 @@ def _assert_consumer_readback(payload: dict):
assert payload["rollups"]["mcp_consumer_binding_count"] == 1
assert payload["rollups"]["verifier_consumer_binding_count"] == 1
assert payload["rollups"]["ai_agent_consumer_binding_count"] == 1
assert payload["rollups"]["telegram_alert_learning_context_readback_ready"] is True
assert payload["rollups"]["telegram_alert_learning_context_receipt_count"] == 6
assert (
payload["rollups"]["telegram_alert_learning_ai_agent_context_receipt_count"]
== 1
)
assert payload["rollups"]["telegram_alert_learning_ready_target_count"] == 6
telegram_context = payload["telegram_alert_learning_context"]
assert telegram_context["schema_version"] == (
"telegram_alert_ai_loop_consumer_context_readback_v1"
)
assert telegram_context["status"] == "ai_loop_agent_context_receipt_ready"
assert telegram_context["consumer_context_route"] == (
"ai_loop_agent.telegram_alert_learning_context"
)
assert telegram_context["next_action"] == (
"verify_telegram_alert_learning_context_receipts_with_ai_loop_post_apply_verifier"
)
assert telegram_context["context_receipt_count"] == 6
assert telegram_context["ai_agent_context_receipt_count"] == 1
ai_agent_receipt = [
receipt
for receipt in telegram_context["context_receipts"]
if receipt["target"] == "ai_agent"
][0]
assert ai_agent_receipt["status"] == "ready_for_ai_loop_context"
assert ai_agent_receipt["work_item_id"] == "CIR-P0-TG-001"
assert ai_agent_receipt["metadata_only"] is True
assert ai_agent_receipt["target_write_performed"] is False
assert ai_agent_receipt["check_mode"]["enabled"] is True
assert ai_agent_receipt["rollback"]["required"] is True
target_rollups = {item["target"]: item for item in payload["target_rollups"]}
assert set(target_rollups) == {"km", "rag", "playbook", "mcp", "verifier", "ai_agent"}
@@ -264,6 +373,7 @@ def _assert_consumer_readback(payload: dict):
boundaries = payload["operation_boundaries"]
assert boundaries["consumer_readback_only"] is True
assert boundaries["metadata_ledger_read_performed"] is True
assert boundaries["telegram_alert_registry_metadata_read_performed"] is True
assert boundaries["km_write_performed"] is False
assert boundaries["rag_index_write_performed"] is False
assert boundaries["playbook_trust_write_performed"] is False

View File

@@ -32,7 +32,7 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
}
summary = payload["summary"]
assert summary["telegram_alert_surface_count"] == 6
assert summary["telegram_alert_surface_count"] == 7
assert summary["known_direct_send_gap_count"] == 0
assert summary["known_direct_send_gap_file_count"] == 0
assert summary["workflow_direct_send_gap_count"] == 0
@@ -54,8 +54,9 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
assert summary["ai_alert_card_delivery_readback_endpoint_count"] == 1
assert summary["ai_alert_card_learning_writeback_refs_count"] == 1
assert summary["ai_alert_card_learning_registry_readback_count"] == 1
assert summary["telegram_alert_ai_loop_consumer_context_readback_count"] == 1
assert summary["next_priority_action_id"] == (
"consume_telegram_alert_learning_registry_in_ai_loop_agent_context"
"verify_telegram_alert_learning_context_receipts_with_ai_loop_post_apply_verifier"
)
matrix = {item["surface_id"]: item for item in payload["matrix"]}
@@ -88,6 +89,12 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
assert matrix["telegram_alert_learning_registry_readback"]["learning_writeback"] == (
"ready_km_rag_playbook_mcp_verifier_ai_agent_registry"
)
assert matrix["telegram_ai_loop_agent_consumer_context"]["status"] == (
"ai_loop_context_readback_present"
)
assert matrix["telegram_ai_loop_agent_consumer_context"]["ai_route"] == (
"ready_ai_loop_agent_context_reuse"
)
assert payload["direct_send_gap_refs"] == []
assert not any(
@@ -131,6 +138,10 @@ def test_telegram_matrix_source_contract_supports_container_layout(tmp_path):
"ai_agent_context_ref\n",
encoding="utf-8",
)
(tmp_path / "src/services/ai_agent_log_controlled_writeback_consumer_readback.py").write_text(
"telegram_alert_ai_loop_consumer_context_readback_v1\n",
encoding="utf-8",
)
proof = _inspect_source_contract(tmp_path)
@@ -145,6 +156,8 @@ def test_telegram_matrix_source_contract_supports_container_layout(tmp_path):
assert proof["ai_alert_card_learning_registry_readback_present"] is True
assert proof["ai_alert_card_learning_registry_readback_count"] == 1
assert proof["ai_alert_card_ai_agent_context_ref_present"] is True
assert proof["telegram_alert_ai_loop_consumer_context_readback_present"] is True
assert proof["telegram_alert_ai_loop_consumer_context_readback_count"] == 1
def test_telegram_alert_ai_automation_matrix_endpoint_returns_readback():