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
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:
@@ -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
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user