fix(agent99): require durable queue receipt
This commit is contained in:
@@ -802,10 +802,12 @@ async def test_safe_failed_generation_advances_bounded_and_keeps_one_flight_key(
|
||||
monkeypatch.setattr(
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda _payload: {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"delivery_certainty": "delivered",
|
||||
},
|
||||
)
|
||||
|
||||
@@ -21,10 +21,12 @@ async def test_telegram_projects_correlated_receipt_without_dispatch(
|
||||
"idempotency_key": "agent99-controlled:stable-key",
|
||||
},
|
||||
"dispatch_receipt": {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
"receipt_persisted": True,
|
||||
"runtime_execution_authorized": False,
|
||||
|
||||
@@ -333,7 +333,7 @@ def test_post_agent99_sre_alert_to_relay(monkeypatch) -> None:
|
||||
assert seen["headers"]["X-agent99-relay-token"] == "relay-token"
|
||||
|
||||
|
||||
def test_dispatch_receipt_keeps_relay_acceptance_without_raw_body(monkeypatch) -> None:
|
||||
def test_dispatch_receipt_requires_queue_receipt_without_raw_body(monkeypatch) -> None:
|
||||
payload = build_agent99_sre_alert(
|
||||
alert_id="receipt-smoke",
|
||||
alertname="ColdStartGateBlocked",
|
||||
@@ -356,24 +356,64 @@ def test_dispatch_receipt_keeps_relay_acceptance_without_raw_body(monkeypatch) -
|
||||
|
||||
receipt = dispatch_agent99_sre_alert_with_receipt(payload)
|
||||
|
||||
assert receipt == {
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v1",
|
||||
"status": "accepted_inbox_triggered",
|
||||
"transport": "relay",
|
||||
"alert_id": "awoooi-alertmanager-receipt-smoke",
|
||||
"kind": "host_recovery",
|
||||
"target_resource": "cold-start-gate",
|
||||
"suggested_mode": "Recover",
|
||||
"controlled_apply_requested": True,
|
||||
"http_status": 202,
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"delivery_certainty": "delivered",
|
||||
"stores_raw_response": False,
|
||||
}
|
||||
assert receipt["schema_version"] == "agent99_sre_dispatch_receipt_v2"
|
||||
assert receipt["status"] == "transport_accepted_queue_receipt_pending"
|
||||
assert receipt["transport_accepted"] is True
|
||||
assert receipt["accepted"] is False
|
||||
assert receipt["inbox_triggered"] is True
|
||||
assert receipt["queue_receipt_found"] is False
|
||||
assert receipt["queue_accepted"] is False
|
||||
assert receipt["dispatch_identity_matched"] is False
|
||||
assert receipt["delivery_certainty"] == "unknown"
|
||||
assert receipt["stores_raw_response"] is False
|
||||
assert "private-path" not in str(receipt)
|
||||
|
||||
|
||||
def test_dispatch_receipt_promotes_only_persisted_identity_bound_queue_item(
|
||||
monkeypatch,
|
||||
) -> None:
|
||||
payload = build_agent99_sre_alert(
|
||||
alert_id="receipt-queued",
|
||||
alertname="ColdStartGateBlocked",
|
||||
severity="critical",
|
||||
namespace="awoooi-prod",
|
||||
target_resource="cold-start-gate",
|
||||
message="cold-start gate blocked",
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"src.services.agent99_sre_bridge.settings.AGENT99_SRE_ALERT_RELAY_URL",
|
||||
"http://192.168.0.99:8787/agent99/sre-alert/",
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"src.services.agent99_sre_bridge.post_agent99_sre_alert",
|
||||
lambda _payload: {
|
||||
"status": 202,
|
||||
"body": json.dumps(
|
||||
{
|
||||
"ok": True,
|
||||
"alertId": "awoooi-alertmanager-receipt-queued",
|
||||
"inboxTriggered": True,
|
||||
"queueReceiptFound": True,
|
||||
"queueAccepted": True,
|
||||
"queueReceiptStatus": "queued",
|
||||
"queueReceiptId": "agent99-relay-" + "a" * 32,
|
||||
"queueId": "sre-alert-receipt-queued",
|
||||
"dispatchIdentityMatched": True,
|
||||
}
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
receipt = dispatch_agent99_sre_alert_with_receipt(payload)
|
||||
|
||||
assert receipt["status"] == "accepted_queue_persisted"
|
||||
assert receipt["accepted"] is True
|
||||
assert receipt["queue_accepted"] is True
|
||||
assert receipt["dispatch_identity_matched"] is True
|
||||
assert receipt["alert_id_matched"] is True
|
||||
assert receipt["delivery_certainty"] == "delivered"
|
||||
|
||||
|
||||
def test_agent99_single_flight_key_does_not_expose_fingerprint() -> None:
|
||||
key = agent99_sre_single_flight_key("private/source/fingerprint")
|
||||
|
||||
@@ -395,10 +435,12 @@ async def test_agent99_bridge_suppresses_duplicate_single_flight(monkeypatch) ->
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -431,10 +473,12 @@ async def test_agent99_bridge_dispatches_single_flight_winner(monkeypatch) -> No
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -708,12 +752,14 @@ async def test_mutating_dispatch_is_deduplicated_by_postgres_identity(
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(payload["id"]),
|
||||
"kind": str(payload["kind"]),
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
)
|
||||
common = {
|
||||
@@ -832,13 +878,15 @@ async def test_backupcheck_read_only_dispatch_has_durable_same_run_receipt(
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v1",
|
||||
"status": "accepted_inbox_triggered",
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v2",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(payload["id"]),
|
||||
"kind": str(payload["kind"]),
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"delivery_certainty": "delivered",
|
||||
},
|
||||
)
|
||||
@@ -938,12 +986,14 @@ async def test_accepted_transport_with_receipt_write_failure_is_not_replayed(
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(payload["id"]),
|
||||
"kind": str(payload["kind"]),
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"delivery_certainty": "delivered",
|
||||
},
|
||||
)
|
||||
@@ -1007,12 +1057,14 @@ async def test_safe_not_delivered_failure_advances_generation_before_dispatch(
|
||||
"src.services.agent99_sre_bridge.dispatch_agent99_sre_alert_with_receipt",
|
||||
lambda payload: dispatched.append(payload)
|
||||
or {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(payload["id"]),
|
||||
"kind": str(payload["kind"]),
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"delivery_certainty": "delivered",
|
||||
},
|
||||
)
|
||||
|
||||
@@ -1307,13 +1307,15 @@ def test_backup_item_consumes_agent99_dispatch_receipt_without_faking_outcome()
|
||||
},
|
||||
"agent99_dispatch_receipt": {
|
||||
"schema_version": "telegram_agent99_dispatch_receipt_projection_v1",
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": "backup-alert-1",
|
||||
"kind": "backup_health",
|
||||
"suggested_mode": "BackupCheck",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"receipt_persisted": True,
|
||||
"runtime_closure_verified": False,
|
||||
"run_id": "agent99-run-1",
|
||||
@@ -1387,13 +1389,15 @@ def test_backup_item_consumes_real_bridge_and_ledger_identity() -> None:
|
||||
current_receipt = build_agent99_dispatch_receipt_envelope(
|
||||
identity=identity,
|
||||
dispatch_receipt={
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v1",
|
||||
"status": "accepted",
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v2",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(alert["id"]),
|
||||
"kind": "backup_health",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
)
|
||||
public_identity = identity.public_dict()
|
||||
@@ -1417,6 +1421,8 @@ def test_backup_item_consumes_real_bridge_and_ledger_identity() -> None:
|
||||
"suggested_mode": "BackupCheck",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"incident_id": "INC-BACKUP-REAL",
|
||||
"run_id": public_identity["run_id"],
|
||||
"trace_id": public_identity["trace_id"],
|
||||
@@ -1495,6 +1501,8 @@ def test_backup_item_advances_from_current_durable_ledger_terminal() -> None:
|
||||
"suggested_mode": "BackupCheck",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"incident_id": "INC-BACKUP",
|
||||
**stage_identity,
|
||||
"receipt_persisted": True,
|
||||
@@ -1514,6 +1522,8 @@ def test_backup_item_advances_from_current_durable_ledger_terminal() -> None:
|
||||
"kind": "backup_health",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
"dispatch_accepted": True,
|
||||
"post_verifier_passed": True,
|
||||
|
||||
@@ -774,13 +774,15 @@ async def test_backup_bridge_postgres_identity_deduplicates_transport(
|
||||
lambda payload: (
|
||||
transported.append(payload)
|
||||
or {
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v1",
|
||||
"status": "accepted_inbox_triggered",
|
||||
"schema_version": "agent99_sre_dispatch_receipt_v2",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": str(payload["id"]),
|
||||
"kind": str(payload["kind"]),
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"delivery_certainty": "delivered",
|
||||
}
|
||||
),
|
||||
|
||||
@@ -154,13 +154,15 @@ def test_backup_restore_work_item_clusters_recurrence_but_receipts_stay_unique()
|
||||
def test_backup_dispatch_requires_accepted_triggered_backupcheck_receipt() -> None:
|
||||
receipt = {
|
||||
"schema_version": "telegram_agent99_dispatch_receipt_projection_v1",
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"transport": "relay",
|
||||
"alert_id": "awoooi-backup-alert",
|
||||
"kind": "backup_health",
|
||||
"suggested_mode": "BackupCheck",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
"receipt_persisted": True,
|
||||
"runtime_closure_verified": False,
|
||||
"run_id": "agent99-run-123",
|
||||
@@ -178,7 +180,7 @@ def test_backup_dispatch_requires_accepted_triggered_backupcheck_receipt() -> No
|
||||
)
|
||||
|
||||
dispatch = contract["candidate"]["agent99_dispatch"]
|
||||
assert dispatch["status"] == "accepted_inbox_triggered"
|
||||
assert dispatch["status"] == "accepted_queue_persisted"
|
||||
assert dispatch["dispatched"] is True
|
||||
assert dispatch["receipt_persisted"] is True
|
||||
assert dispatch["identity_complete"] is True
|
||||
|
||||
@@ -179,9 +179,11 @@ async def test_webhook_router_never_queues_generic_ansible_for_cold_start(
|
||||
"idempotency_key": "agent99-controlled:stable-key",
|
||||
},
|
||||
"dispatchReceipt": {
|
||||
"status": "accepted_inbox_triggered",
|
||||
"status": "accepted_queue_persisted",
|
||||
"accepted": True,
|
||||
"inbox_triggered": True,
|
||||
"queue_accepted": True,
|
||||
"dispatch_identity_matched": True,
|
||||
},
|
||||
"correlatedReceipt": {
|
||||
"status": "dispatch_accepted_verifier_pending",
|
||||
|
||||
Reference in New Issue
Block a user