fix(telegram): close ops direct sender gaps
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 2m6s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 2m6s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
This commit is contained in:
@@ -86,6 +86,12 @@ def _with_live_telegram_egress_guard(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
ai_route_missing_count = sum(
|
||||
1 for item in live_calls if item.get("ai_controlled_route_state") != "ai_controlled_gateway_route_ready"
|
||||
)
|
||||
ai_agent_next_action = (
|
||||
"create_controlled_migration_work_items_for_direct_bot_api_routes_with_db_receipt_"
|
||||
"verifier_and_km_playbook_writeback"
|
||||
if live_calls
|
||||
else "bind_gateway_alert_cards_to_learning_writeback_receipts"
|
||||
)
|
||||
|
||||
updated["telegram_egress_guard"] = {
|
||||
"schema_version": "telegram_notification_egress_no_new_bypass_guard_v1",
|
||||
@@ -136,10 +142,7 @@ def _with_live_telegram_egress_guard(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
if item.get("evidence_persistence_state")
|
||||
}
|
||||
),
|
||||
"ai_agent_next_action": (
|
||||
"create_controlled_migration_work_items_for_direct_bot_api_routes_with_db_receipt_"
|
||||
"verifier_and_km_playbook_writeback"
|
||||
),
|
||||
"ai_agent_next_action": ai_agent_next_action,
|
||||
},
|
||||
"current_direct_bot_api_calls": live_calls,
|
||||
"ai_agent_interpretation": {
|
||||
@@ -150,7 +153,11 @@ def _with_live_telegram_egress_guard(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
"all_direct_routes_have_awooop_db_receipt": receipt_missing_count == 0,
|
||||
"all_direct_routes_have_ai_controlled_route": ai_route_missing_count == 0,
|
||||
"manual_default_outcome_allowed": False,
|
||||
"next_action": "migrate_direct_bot_api_calls_to_awoooi_api_or_telegram_gateway_receipts",
|
||||
"next_action": (
|
||||
"migrate_direct_bot_api_calls_to_awoooi_api_or_telegram_gateway_receipts"
|
||||
if live_calls
|
||||
else "bind_gateway_alert_cards_to_learning_writeback_receipts"
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -336,11 +336,12 @@ _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [
|
||||
),
|
||||
"current_state": (
|
||||
"Telegram alert AI automation matrix endpoint 已實作;channel_hub API direct sender 已改走 "
|
||||
"TelegramGateway / AwoooP outbound receipt path;目前明確讀回 workflow direct send 0、"
|
||||
"ops script direct gap 4、API direct gap 0。"
|
||||
"TelegramGateway / AwoooP outbound receipt path;scripts/ops 4 條 legacy direct Bot API fallback "
|
||||
"已改為 AWOOI API / TelegramGateway receipt path;目前明確讀回 workflow direct send 0、"
|
||||
"ops script direct gap 0、API direct gap 0。"
|
||||
),
|
||||
"acceptance": "Telegram alert matrix 顯示 total、DB receipt、AI route、controlled queue、manual/default gap 與 direct send gap。",
|
||||
"next_action": "收斂 scripts/ops 內剩餘 4 條 direct Bot API sendMessage 到 AWOOI API / TelegramGateway receipt path。",
|
||||
"next_action": "把 gateway AI alert card delivery receipt 接到 KM / PlayBook learning writeback readback,驗證 Telegram 不再是人工終局。",
|
||||
"mapped_workplan_id": "P0-006",
|
||||
},
|
||||
{
|
||||
|
||||
@@ -86,6 +86,8 @@ def load_latest_telegram_alert_ai_automation_matrix(
|
||||
direct_gap_file_count = int(egress_summary["direct_bot_api_file_count"])
|
||||
api_direct_gap_count = int(egress_summary["api_direct_bot_api_call_count"])
|
||||
ops_script_gap_count = int(egress_summary["ops_script_direct_bot_api_call_count"])
|
||||
migration_candidate_count = int(migration_summary["migration_candidate_count"])
|
||||
direct_gap_closed = direct_gap_count == 0
|
||||
direct_gap_refs = [
|
||||
{
|
||||
"surface_id": item["egress_surface_id"],
|
||||
@@ -121,13 +123,37 @@ def load_latest_telegram_alert_ai_automation_matrix(
|
||||
"surface_id": "telegram_direct_bot_api_egress_gap",
|
||||
"priority_work_item_id": "CIR-P0-TG-001",
|
||||
"surface_kind": "direct_bot_api_gap",
|
||||
"status": "gap_open_requires_controlled_migration",
|
||||
"status": (
|
||||
"gap_closed_no_direct_bot_api_routes_detected"
|
||||
if direct_gap_closed
|
||||
else "gap_open_requires_controlled_migration"
|
||||
),
|
||||
"known_item_count": direct_gap_count,
|
||||
"db_or_log_receipt": "missing_or_not_proven_for_direct_path",
|
||||
"ai_route": "missing_or_not_proven_for_direct_path",
|
||||
"controlled_queue": "missing_or_not_proven_for_direct_path",
|
||||
"post_verifier": "metadata_inventory_ready",
|
||||
"learning_writeback": "migration_candidate_ready_not_applied",
|
||||
"db_or_log_receipt": (
|
||||
"ready_no_direct_routes_remaining"
|
||||
if direct_gap_closed
|
||||
else "missing_or_not_proven_for_direct_path"
|
||||
),
|
||||
"ai_route": (
|
||||
"ready_no_direct_routes_remaining"
|
||||
if direct_gap_closed
|
||||
else "missing_or_not_proven_for_direct_path"
|
||||
),
|
||||
"controlled_queue": (
|
||||
"no_direct_migration_queue_needed"
|
||||
if direct_gap_closed
|
||||
else "missing_or_not_proven_for_direct_path"
|
||||
),
|
||||
"post_verifier": (
|
||||
"metadata_inventory_clear"
|
||||
if direct_gap_closed
|
||||
else "metadata_inventory_ready"
|
||||
),
|
||||
"learning_writeback": (
|
||||
"ready_bind_gateway_receipts_to_learning_writeback"
|
||||
if direct_gap_closed
|
||||
else "migration_candidate_ready_not_applied"
|
||||
),
|
||||
"manual_default_gap_count": direct_gap_count,
|
||||
"direct_send_gap_count": direct_gap_count,
|
||||
"evidence_refs": [
|
||||
@@ -157,13 +183,37 @@ def load_latest_telegram_alert_ai_automation_matrix(
|
||||
"surface_id": "telegram_egress_controlled_migration_candidates",
|
||||
"priority_work_item_id": "CIR-P0-TG-001",
|
||||
"surface_kind": "migration_candidate",
|
||||
"status": "controlled_apply_candidates_ready",
|
||||
"known_item_count": int(migration_summary["migration_candidate_count"]),
|
||||
"db_or_log_receipt": "required_before_candidate_close",
|
||||
"ai_route": "migration_plan_ready",
|
||||
"controlled_queue": "ready_for_controlled_apply_review",
|
||||
"post_verifier": "owner_acceptance_ledger_ready",
|
||||
"learning_writeback": "candidate_acceptance_metadata_ready",
|
||||
"status": (
|
||||
"controlled_migration_complete_no_candidates"
|
||||
if migration_candidate_count == 0
|
||||
else "controlled_apply_candidates_ready"
|
||||
),
|
||||
"known_item_count": migration_candidate_count,
|
||||
"db_or_log_receipt": (
|
||||
"ready_no_direct_migration_candidates"
|
||||
if migration_candidate_count == 0
|
||||
else "required_before_candidate_close"
|
||||
),
|
||||
"ai_route": (
|
||||
"ready_no_direct_migration_candidates"
|
||||
if migration_candidate_count == 0
|
||||
else "migration_plan_ready"
|
||||
),
|
||||
"controlled_queue": (
|
||||
"no_direct_migration_queue_needed"
|
||||
if migration_candidate_count == 0
|
||||
else "ready_for_controlled_apply_review"
|
||||
),
|
||||
"post_verifier": (
|
||||
"owner_acceptance_ledger_clear"
|
||||
if migration_candidate_count == 0
|
||||
else "owner_acceptance_ledger_ready"
|
||||
),
|
||||
"learning_writeback": (
|
||||
"ready_bind_gateway_receipts_to_learning_writeback"
|
||||
if migration_candidate_count == 0
|
||||
else "candidate_acceptance_metadata_ready"
|
||||
),
|
||||
"manual_default_gap_count": 0,
|
||||
"direct_send_gap_count": direct_gap_count,
|
||||
"evidence_refs": [
|
||||
@@ -244,8 +294,16 @@ def load_latest_telegram_alert_ai_automation_matrix(
|
||||
"next_controlled_actions": next_controlled_actions,
|
||||
"operator_interpretation": [
|
||||
"TelegramGateway AI alert cards already expose AI route, controlled queue, final-exit formatter, outbound mirror metadata, and readback endpoint support.",
|
||||
"Known direct Bot API surfaces remain the concrete AI automation gap; API direct senders are clear when api_direct_send_gap_count is 0.",
|
||||
"Manual/default semantics are only acceptable for critical/break-glass or historical evidence; direct send gaps remain controlled migration candidates.",
|
||||
(
|
||||
"Known direct Bot API surfaces are clear; keep future Telegram sends on the gateway receipt path."
|
||||
if direct_gap_closed
|
||||
else "Known direct Bot API surfaces remain the concrete AI automation gap; API direct senders are clear when api_direct_send_gap_count is 0."
|
||||
),
|
||||
(
|
||||
"Manual/default semantics are only acceptable for critical/break-glass or historical evidence; the next P0 step is learning/writeback readback."
|
||||
if direct_gap_closed
|
||||
else "Manual/default semantics are only acceptable for critical/break-glass or historical evidence; direct send gaps remain controlled migration candidates."
|
||||
),
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@@ -37,22 +37,22 @@ def test_load_latest_ai_agent_report_truth_actionability_review():
|
||||
assert data["telegram_routing_consolidation"]["direct_telegram_api_send_allowed"] is False
|
||||
assert data["rollups"]["telegram_route_finding_count"] == len(data["telegram_route_findings"])
|
||||
assert data["telegram_egress_guard"]["status"] == "pass_no_new_bypass"
|
||||
assert data["telegram_egress_guard"]["summary"]["live_direct_bot_api_call_count"] == 4
|
||||
assert data["telegram_egress_guard"]["summary"]["live_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["new_bypass_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["gitea_workflow_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["ops_script_direct_bot_api_call_count"] == 4
|
||||
assert data["telegram_egress_guard"]["summary"]["ops_script_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["api_direct_bot_api_call_count"] == 0
|
||||
assert (
|
||||
data["telegram_egress_guard"]["summary"]["direct_bot_api_awooop_db_receipt_missing_count"]
|
||||
== 4
|
||||
== 0
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["summary"]["direct_bot_api_ai_controlled_route_missing_count"]
|
||||
== 4
|
||||
== 0
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"]["coverage_status"]
|
||||
== "partial_gateway_receipts_direct_routes_missing"
|
||||
== "complete_no_direct_routes_detected"
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"][
|
||||
@@ -64,24 +64,28 @@ def test_load_latest_ai_agent_report_truth_actionability_review():
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"][
|
||||
"all_direct_routes_have_awooop_db_receipt"
|
||||
]
|
||||
is False
|
||||
is True
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"][
|
||||
"all_direct_routes_have_ai_controlled_route"
|
||||
]
|
||||
is False
|
||||
is True
|
||||
)
|
||||
assert data["rollups"]["telegram_route_finding_count"] == 8
|
||||
assert data["rollups"]["legacy_or_direct_route_count"] == 8
|
||||
assert data["rollups"]["telegram_route_finding_count"] == 4
|
||||
assert data["rollups"]["legacy_or_direct_route_count"] == 4
|
||||
assert sum(
|
||||
1
|
||||
for route in data["telegram_route_findings"]
|
||||
if route["route_id"].startswith("telegram_direct_bot_api_")
|
||||
) == 4
|
||||
) == 0
|
||||
assert {
|
||||
item["surface_kind"] for item in data["telegram_egress_guard"]["current_direct_bot_api_calls"]
|
||||
} == {"ops_script_direct_bot_api"}
|
||||
} == set()
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"]["ai_agent_next_action"]
|
||||
== "bind_gateway_alert_cards_to_learning_writeback_receipts"
|
||||
)
|
||||
assert data["rollups"]["all_zero_weekly_report_confidence"] == "low_trust_actionable_anomaly"
|
||||
|
||||
|
||||
|
||||
@@ -34,29 +34,29 @@ def test_get_ai_agent_report_truth_actionability_review_api():
|
||||
assert data["telegram_routing_consolidation"]["canonical_room_env"] == "SRE_GROUP_CHAT_ID"
|
||||
assert data["telegram_routing_consolidation"]["other_bot_or_group_alerts_allowed"] is False
|
||||
assert data["telegram_routing_consolidation"]["direct_telegram_api_send_allowed"] is False
|
||||
assert data["telegram_egress_guard"]["summary"]["live_direct_bot_api_call_count"] == 4
|
||||
assert data["telegram_egress_guard"]["summary"]["live_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["new_bypass_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["gitea_workflow_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["ops_script_direct_bot_api_call_count"] == 4
|
||||
assert data["telegram_egress_guard"]["summary"]["ops_script_direct_bot_api_call_count"] == 0
|
||||
assert data["telegram_egress_guard"]["summary"]["api_direct_bot_api_call_count"] == 0
|
||||
assert (
|
||||
data["telegram_egress_guard"]["summary"]["direct_bot_api_awooop_db_receipt_missing_count"]
|
||||
== 4
|
||||
== 0
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["summary"]["direct_bot_api_ai_controlled_route_missing_count"]
|
||||
== 4
|
||||
== 0
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"][
|
||||
"all_telegram_alerts_have_db_or_log_receipts"
|
||||
]
|
||||
is False
|
||||
is True
|
||||
)
|
||||
assert (
|
||||
data["telegram_egress_guard"]["telegram_receipt_coverage"]["all_telegram_alerts_ai_controlled"]
|
||||
is False
|
||||
is True
|
||||
)
|
||||
assert data["rollups"]["telegram_route_finding_count"] == 8
|
||||
assert data["rollups"]["legacy_or_direct_route_count"] == 8
|
||||
assert data["rollups"]["telegram_route_finding_count"] == 4
|
||||
assert data["rollups"]["legacy_or_direct_route_count"] == 4
|
||||
assert data["rollups"]["operator_action_count"] == 5
|
||||
|
||||
@@ -33,10 +33,10 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
|
||||
|
||||
summary = payload["summary"]
|
||||
assert summary["telegram_alert_surface_count"] == 5
|
||||
assert summary["known_direct_send_gap_count"] == 4
|
||||
assert summary["known_direct_send_gap_file_count"] == 4
|
||||
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
|
||||
assert summary["ops_script_direct_send_gap_count"] == 4
|
||||
assert summary["ops_script_direct_send_gap_count"] == 0
|
||||
assert summary["api_direct_send_gap_count"] == 0
|
||||
assert summary["gateway_normalized_callsite_count"] >= 50
|
||||
assert summary["db_or_log_receipt_ready_surface_count"] >= 2
|
||||
@@ -44,15 +44,15 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
|
||||
assert summary["controlled_queue_ready_surface_count"] >= 2
|
||||
assert summary["post_verifier_ready_surface_count"] >= 3
|
||||
assert summary["learning_writeback_ready_surface_count"] >= 3
|
||||
assert summary["manual_default_gap_count"] == 4
|
||||
assert summary["direct_gap_migration_candidate_count"] == 4
|
||||
assert summary["owner_acceptance_candidate_count"] == 4
|
||||
assert summary["manual_default_gap_count"] == 0
|
||||
assert summary["direct_gap_migration_candidate_count"] == 0
|
||||
assert summary["owner_acceptance_candidate_count"] == 0
|
||||
assert summary["telegram_send_performed_count"] == 0
|
||||
assert summary["bot_api_call_performed_count"] == 0
|
||||
assert summary["secret_value_read_count"] == 0
|
||||
assert summary["runtime_write_performed_count"] == 0
|
||||
assert summary["ai_alert_card_delivery_readback_endpoint_count"] == 1
|
||||
assert summary["next_priority_action_id"] == "migrate_ops_script_direct_senders_to_receipt_path"
|
||||
assert summary["next_priority_action_id"] == "bind_ai_alert_cards_to_learning_writeback"
|
||||
|
||||
matrix = {item["surface_id"]: item for item in payload["matrix"]}
|
||||
assert matrix["telegram_gateway_ai_alert_cards"]["status"] == (
|
||||
@@ -62,19 +62,21 @@ def test_telegram_alert_ai_automation_matrix_loader_returns_gap_matrix():
|
||||
"ready_via_awooop_outbound_message_mirror"
|
||||
)
|
||||
assert matrix["telegram_direct_bot_api_egress_gap"]["status"] == (
|
||||
"gap_open_requires_controlled_migration"
|
||||
"gap_closed_no_direct_bot_api_routes_detected"
|
||||
)
|
||||
assert matrix["telegram_direct_bot_api_egress_gap"]["direct_send_gap_count"] == 0
|
||||
assert matrix["telegram_direct_bot_api_egress_gap"]["db_or_log_receipt"] == (
|
||||
"ready_no_direct_routes_remaining"
|
||||
)
|
||||
assert matrix["telegram_egress_controlled_migration_candidates"]["status"] == (
|
||||
"controlled_migration_complete_no_candidates"
|
||||
)
|
||||
assert matrix["telegram_direct_bot_api_egress_gap"]["direct_send_gap_count"] == 4
|
||||
assert matrix["telegram_action_required_digest_policy"]["known_item_count"] == 8
|
||||
assert matrix["telegram_ai_alert_card_delivery_readback_endpoint"][
|
||||
"db_or_log_receipt"
|
||||
] == "ready_awooop_outbound_message_query"
|
||||
|
||||
assert len(payload["direct_send_gap_refs"]) == 4
|
||||
assert all(
|
||||
ref["surface_kind"] == "ops_script_direct_bot_api"
|
||||
for ref in payload["direct_send_gap_refs"]
|
||||
)
|
||||
assert payload["direct_send_gap_refs"] == []
|
||||
assert not any(
|
||||
ref["path"] == "apps/api/src/services/channel_hub.py"
|
||||
for ref in payload["direct_send_gap_refs"]
|
||||
@@ -130,7 +132,7 @@ def test_telegram_alert_ai_automation_matrix_endpoint_returns_readback():
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["schema_version"] == "telegram_alert_ai_automation_matrix_v1"
|
||||
assert data["summary"]["known_direct_send_gap_count"] == 4
|
||||
assert data["summary"]["known_direct_send_gap_count"] == 0
|
||||
assert data["summary"]["next_priority_work_item_id"] == "CIR-P0-TG-001"
|
||||
assert data["operation_boundaries"]["telegram_send_performed"] is False
|
||||
assert data["operation_boundaries"]["secret_value_read"] is False
|
||||
|
||||
Reference in New Issue
Block a user