fix(agent99): require durable queue receipt

This commit is contained in:
ogt
2026-07-15 07:07:22 +08:00
parent 5c0c5f6da2
commit 4b18c2062b
16 changed files with 476 additions and 59 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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