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

This commit is contained in:
Your Name
2026-07-02 19:32:30 +08:00
parent 8cfede071b
commit b191f8e9fe
26 changed files with 330 additions and 2642 deletions

View File

@@ -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"
),
},
}

View File

@@ -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 pathscripts/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",
},
{

View File

@@ -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."
),
],
}

View File

@@ -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"

View File

@@ -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

View File

@@ -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