From 4dd7f3cd8d7effc7811efa8cdd1caad65d4ed83b Mon Sep 17 00:00:00 2001 From: Edgars Date: Sun, 26 Jul 2026 10:52:58 +0100 Subject: [PATCH 1/2] test: reproduce serialized receipt metrics bug --- tests/unit/test_bug_hunt_v0_123_dev.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/unit/test_bug_hunt_v0_123_dev.py diff --git a/tests/unit/test_bug_hunt_v0_123_dev.py b/tests/unit/test_bug_hunt_v0_123_dev.py new file mode 100644 index 000000000..39c536cde --- /dev/null +++ b/tests/unit/test_bug_hunt_v0_123_dev.py @@ -0,0 +1,18 @@ +from types import SimpleNamespace + +from backend.services.usage_metrics_service import UsageMetricsService + + +def test_usage_metrics_preserves_error_from_serialized_leader_receipt(): + """Finalization metrics must not turn a VM error into a successful decision.""" + consensus_data = SimpleNamespace( + leader_receipt=[{"execution_result": "ERROR"}], + ) + + result = UsageMetricsService()._extract_execution_result( + finalization_data={}, + consensus_data=consensus_data, + consensus_history=None, + ) + + assert result == "error" From f65a5a6e4a244e664c57b7c55193863bbb536106 Mon Sep 17 00:00:00 2001 From: Edgars Date: Sun, 26 Jul 2026 12:52:42 +0100 Subject: [PATCH 2/2] fix: read serialized receipt execution results --- backend/services/usage_metrics_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/services/usage_metrics_service.py b/backend/services/usage_metrics_service.py index 8b1e09ba6..80297d2d3 100644 --- a/backend/services/usage_metrics_service.py +++ b/backend/services/usage_metrics_service.py @@ -297,7 +297,9 @@ def _extract_execution_result( if consensus_data is not None and consensus_data.leader_receipt: first_receipt = consensus_data.leader_receipt[0] if first_receipt is not None: - execution_result = getattr(first_receipt, "execution_result", None) + execution_result = self._receipt_field( + first_receipt, "execution_result" + ) if execution_result is not None: # Handle both enum and string values if hasattr(execution_result, "value"):